Autor Tópico: gcc 4.6.1 error: variably modified at file scope  (Lida 3757 vezes)

Offline mpoloureiro

  • Usuário Ubuntu
  • *
  • Mensagens: 35
    • Ver perfil
gcc 4.6.1 error: variably modified at file scope
« Online: 25 de Outubro de 2011, 10:45 »
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


Offline fpissarra

  • Usuário Ubuntu
  • *
  • Mensagens: 246
    • Ver perfil
    • Lost in the e-Jungle
Re: gcc 4.6.1 error: variably modified at file scope
« Resposta #1 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:
Código: [Selecionar]
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...

Offline mpoloureiro

  • Usuário Ubuntu
  • *
  • Mensagens: 35
    • Ver perfil
Re: gcc 4.6.1 error: variably modified at file scope
« Resposta #2 Online: 26 de Outubro de 2011, 05:58 »
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:
Código: [Selecionar]
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.

Offline fpissarra

  • Usuário Ubuntu
  • *
  • Mensagens: 246
    • Ver perfil
    • Lost in the e-Jungle
Re: gcc 4.6.1 error: variably modified at file scope
« Resposta #3 Online: 26 de Outubro de 2011, 11:14 »
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

Offline mpoloureiro

  • Usuário Ubuntu
  • *
  • Mensagens: 35
    • Ver perfil
Re: gcc 4.6.1 error: variably modified at file scope
« Resposta #4 Online: 26 de Outubro de 2011, 12:26 »
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

Offline fpissarra

  • Usuário Ubuntu
  • *
  • Mensagens: 246
    • Ver perfil
    • Lost in the e-Jungle
Re: gcc 4.6.1 error: variably modified at file scope
« Resposta #5 Online: 27 de Outubro de 2011, 13:33 »
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