gcc 4.6.1 error: variably modified at file scope

Iniciado por mpoloureiro, 25 de Outubro de 2011, 10:45

tópico anterior - próximo tópico

mpoloureiro

Prezados,

Ontem formatei minha maquina e substitui o Ubuntu 10.10 pelo 11.10. O fato é que o 11.10 vem com
o gcc 4.6.1 e esta versão do compilador está considerando como erro definições que as versões mais
antigas não considerava.

O principal problema é na definição do tamanho de um vetor. Tenho algumas variáveis definidas como:
#define TIME_FACTOR        7
#define STARTIN               63
#define T1STEP         ((int)(pow(2,TIME_FACTOR))-(int)(STARTIN)+1)

int t[T1STEP];

Na hora de compilar,
gcc -ansi -Wall -I  -g -O3 -o saida.out programa.c -lm

da o seguinte erro:
error: variably modified 't1' at file scope

Se eu simplesmente defino
#define T1STEP   66
o erro desaparece.

Lembrando que nas versões anteriores o programa não dava erro algum.
Alguém sabe como resolver isso?

Obrigado

Marcos


fpissarra

O GCC 4.6.1 trata isso da forma correta... A primeira declaração de T1STEP realiza a substituição na declaração da variável 't', pelo pre-compilador, para:
int t[((int)(pow(2, 7))-(int)(63)+1)];
Mas um array, numa variável global, não pode ter tamanho variável - por causa do uso da função pow().

Uma variável LOCAL pode ter tamanho variável, segundo a especificação C99 (chama-se VLA, Variable Length Array). mas não uma global...

Ao eliminar a chamada à função pow() seu código compila perfeitamente, de acordo com a especificação...

mpoloureiro

Citação de: fpissarra online 25 de Outubro de 2011, 22:54
O GCC 4.6.1 trata isso da forma correta... A primeira declaração de T1STEP realiza a substituição na declaração da variável 't', pelo pre-compilador, para:
int t[((int)(pow(2, 7))-(int)(63)+1)];
Mas um array, numa variável global, não pode ter tamanho variável - por causa do uso da função pow().

Uma variável LOCAL pode ter tamanho variável, segundo a especificação C99 (chama-se VLA, Variable Length Array). mas não uma global...

Ao eliminar a chamada à função pow() seu código compila perfeitamente, de acordo com a especificação...

Obrigado pela resposta fpissara.

Mas como eu elimino a variavel pow()? Isso porque o tamanho do array é relativo, dependendo da potencia.

fpissarra

Citação de: mpoloureiro online 26 de Outubro de 2011, 05:58
Obrigado pela resposta fpissara.

Mas como eu elimino a variavel pow()? Isso porque o tamanho do array é relativo, dependendo da potencia.

pow() não é uma varíavel... é uma função.
Se o tamanho do array é variável, recomendo o uso de alocação dinâmica.

[]s

mpoloureiro

Citação de: fpissarra online 26 de Outubro de 2011, 11:14
pow() não é uma varíavel... é uma função.
Se o tamanho do array é variável, recomendo o uso de alocação dinâmica.

[]s

Funcionou!!! Fiz a alocação dinâmica e deu certo.
Muito obrigado fpissarra!
Vlw

fpissarra

Citação de: mpoloureiro online 26 de Outubro de 2011, 12:26
Citação de: fpissarra online 26 de Outubro de 2011, 11:14
pow() não é uma varíavel... é uma função.
Se o tamanho do array é variável, recomendo o uso de alocação dinâmica.

[]s

Funcionou!!! Fiz a alocação dinâmica e deu certo.
Muito obrigado fpissarra!
Vlw

Que bom que consegui ajudá-lo... Coloca ai o fragmento de código que você criou... de repente podemos dar mais algumas dicas...

[]s
Fred