Генерация чисел Фибоначчи с использованием массивов переменной длины Ошибка компилятора кода - PullRequest
1 голос
/ 15 июня 2010

Ошибка компиляции в vs2010 (шаблон консольного приложения Win32) для приведенного ниже кода. Как я могу это исправить.

unsigned long long int Fibonacci[numFibs]; // error occurred here

ошибка C2057: ожидаемое постоянное выражение

ошибка C2466: невозможно выделить массив постоянного размера 0

ошибка C2133: «Фибоначчи»: неизвестный размер

Полный код прилагается (Это пример кода из программирования в книге c-3E. Никаких изменений)

int main()
{

 int i, numFibs;

 printf("How may Fibonacci numbers do you want (between 1 to 75)? ");
 scanf("%i", &numFibs);

 if ( numFibs < 1 || numFibs > 75){
  printf("Bad number, sorry!\n");
  return 1;
 }

 unsigned long long int Fibonacci[numFibs];

 Fibonacci[0] = 0; // by definition
 Fibonacci[1] = 1; // ditto

 for ( i = 2; i < numFibs; ++i)
  Fibonacci[i] = Fibonacci[i-2] + Fibonacci[i-1];

 for ( i = 0; i < numFibs; ++i)
  printf("%11u",Fibonacci[i]);

 printf("\n");

 return 0;

}

Ответы [ 4 ]

2 голосов
/ 15 июня 2010

VS2010 по умолчанию является компилятором C ++, а C ++ не поддерживает массивы переменной длины. Вы можете изменить свой проект, чтобы компилировать код как код C, но VS2010 все еще не поддерживает C99.

Я бы порекомендовал вам использовать gcc для кода C, он гораздо более совместим.

1 голос
/ 15 июня 2010

Какой компилятор вы используете?И вы компилируете как C или C ++?Массивы переменной длины допустимы в C начиная с C99 , но если вы используете более старый компилятор (или компилируете как C ++), они не будут работать.

В качестве обходного пути вы можете перейти к использованию динамического выделения:

typedef unsigned long long uint64; // just for convenience
uint64* Fibonacci = (uint64*)malloc(sizeof(uint64)*numFibs);
// {code here}
// then at the end:    
free(Fibonacci);
return 0;
1 голос
/ 15 июня 2010

Либо динамически распределяйте массив, либо используйте постоянный размер массива.

#define kMaxFibs 75
...
if ( numFibs < 1 || numFibs > kMaxFibs){
...
unsigned long long int Fibonacci[kMaxFibs];
1 голос
/ 15 июня 2010

Вы не можете иметь массив переменной длины. Использовать указатель возврата динамического размещения (malloc)

...