import UIKit
class Foo {
@objc func buttonClicked() {
print("clicked")
}
}
class ViewController: UIViewController {
let foo = Foo()
override func viewDidLoad() {
super.viewDidLoad()
let button = UIButton(frame: CGRect(x: 50, y: 200, width: 100, height: 30))
button.setTitle("Press me", for: .normal)
button.setTitleColor(.blue, for: .normal)
button.addTarget(foo, action: #selector(Foo.buttonClicked), for: .touchUpInside)
self.view.addSubview(button)
}
}
我正在尝试编写一个函数,该函数将返回斐波那契数列的结果直到最大点。问题是编译器说声明数组时max必须具有一个恒定值。我怎样才能解决这个问题?
答案 0 :(得分:1)
认识到您只需要跟踪三个数字并实现该功能而无需数组:
int fibonacci(int max)
{
if (max < 2)
return max;
int a = 1;
int b = 1;
int c;
int result = 1;
for (int i = 0; i < max - 2; i++) {
switch (i % 3) {
case 0:
result = c = b + a;
break;
case 1:
result = a = c + b;
break;
case 2:
result = b = c + a;
break;
}
}
return result;
}
答案 1 :(得分:1)
您遇到了所谓的动态数组或STL-Vectors存在的原因。
编译器抛出该错误的原因是由于 在标准数组实现中必须在声明期间精确指定数组大小 。
float a[100] <- correct
float a[] <- incorrect
这是正确的,因为编译器完全知道必须将特定数据类型的内存分配给此数组集合。
现在让我们进入动态数组-原始指针和STL向量,它使您可以在运行时确定数组大小。
方法1:原始指针
#include <cstddef> // std::size_t
int evenFibonacciSum(int max)
{
int *fib=NULL;
fib = new int[max+2];
fib[0] = 0;
fib[1] = 1;
for (std::size_t i = 2; i <= max; i++)
fib[i] = fib[i - 1] + fib[i - 2];
int result = fib[max];
delete [] fib;
return result;
}
方法2:STL向量
#include <cstddef>
#include <vector>
int evenFibonacciSum(int max)
{
std::vector<int> fib(max+2);
fib[0] = 0;
fib[1] = 1;
for (std::size_t i = 2; i <= max; i++)
fib[i] = fib[i - 1] + fib[i - 2];
return fib[max];
}
我建议您使用方法2:STL向量,因为它可以自动处理这种动态分配所引起的内存管理问题。
祝您有美好的一天!
Arul Verman