Reputation: 31
The following code compiles fine on Linux using gcc -std=c99 but gets the following errors on the Visual Studio 2010 C compiler:
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. fib.c fib.c(42) : error C2057: expected constant expression fib.c(42) : error C2466: cannot allocate an array of constant size 0 fib.c(42) : error C2133: 'num' : unknown size
The user inputs the amount of Fibonacci numbers to generate. I'm curious as to why the Microsoft compiler doesn't like this code.
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
void fib(int max);
int main(int argc, char *argv[])
{
int argument;
if (argc != 2)
{
puts("You must supply exactly one command line argument.");
return 0;
}
argument = atoi(argv[1]);
if (argument == 0)
{
puts("You gave us 0 or an invalid integer.");
return 0;
}
else if (argument < 0)
{
puts("You gave us a negative integer.");
return 0;
}
else if (argument == INT_MAX)
{
puts("You gave us a number that's too big to fit in an integer.");
return 0;
}
printf("%d\n", argument);
fib(argument);
return 0;
}
void fib(int max)
{
int num[max]; /// <- Line 42
int i;
for (i = 0; i < max; i++)
{
if (i == 0)
num[i] = 0;
else if (i == 1)
num[i] = 1;
else
num[i] = num[i-1] + num[i-2];
printf("%d\t%d\n", i, num[i]);
}
}
Upvotes: 2
Views: 1203
Reputation: 411
The Problem lies in the fib function.
The line "int num[max];" is the problem. This is because, compiler tries to allocate space of max number of integers, but the token max is not defined properly to the compiler at the compilation time.
You can use the dynamic memory allocation to resolve this issue.
But i wonder why you might need such huge space (when max large) as you need only previous numbers to generate the sequence.
void fib(int max)
{
int a = 0, b = 1; // first 2 numbers of the sequence.
int c, i;
for (i = 0; i < max; i++)
{
if (i == 0)
printf ("%d %d",i,a);
else if (i == 1)
printf ("%d %d",i,b);
else{
c = a+b;
printf ("%d %d",i,c);
a = b;
b = c;
}
}
}
Upvotes: 4
Reputation: 18652
You can change your function to dynamically allocate the array and then release the memory when finished. The rest of your function will work without change.
void fib(int max)
{
int *num = malloc(max * sizeof(int));
int i;
for (i = 0; i < max; i++)
{
/* Your code here */
}
free(num);
}
Upvotes: 3
Reputation:
void fib(int max)
{
int num[max];
Microsoft's C compiler doesn't support C99, and I believe they've said it never will. That means that arrays can only be declared with constant size.
Upvotes: 7