Erros em C: "error: expected ‘)’ before ‘;’ token" [Resolvido]

Iniciado por rudregues, 05 de Agosto de 2012, 21:16

tópico anterior - próximo tópico

rudregues

Pessoal, to tentando compilar esse código em C, mas tá dando esse erro. Pesquisei no google e vi que é um erro que parece sempre ter diversas causas. Acho que no caso desse programa nem é preciso entender o que o algoritmo está fazendo, provável que seja sintaxe. Esse erro apareceu para três linhas: 94, 132 e 150. Deixei elas em vermelho no código abaixo.
O comando para compilar utilizado foi:
gcc -Wall programadepolinomio.c -o programpoli -lm
->o parâmetro lm serve para linkar a math.h

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define  TOL 0.003;
#define NMI 200;

/*algoritmo de Newton-Bairstow, para calcular raízes de polinômios
/*exercício do Dieguez x^9 - 44x^8 + 21x^7 - 13x^6 + 15.1x^5 - 3x^4 + 2x^2 - 11x + 2.4 = 0
/*float a9=1, a8=-44, a7=21, a6=-13, a5=15.1, a4=-3, a3=0, a2=2, a1=-11, a0=2.4;*/


int main ()
{

/*pegando o polinômio*/
int N, i, j;
puts("Grau do polinômio?");
scanf("%d", &N);
float coef[N];
float pr[N], pi[N];    /*será usado no final, raízes parte real 1, parte imaginaria 1 etc*/
for (i=N; i>=0; i=i-1)
{
printf ("coloque o coeficiente do %d º termo\n", i);
scanf("%f", &coef[i]);
}
/*pegando o polinômio (FIM)*/


/*função troca float, troca X por*/
void troca_float (float X, float Y)
{
float Z=X;
X=Y;
Y=Z;
}
/*função troca float (FIM)*/


/*função EQ2GPQ que retorna parte real e imaginária de uma eq. do 2º grau*/
void eq2gpq (float P, float Q)
{
float R, IM;
float delta=P*P-4*Q;
R=-P/2;
IM=sqrt(fabs(delta))/2;
if (delta >=0)
{
pr[j]=R+IM;
pr[j+1]=R-IM;
pi[j]=pi[j+1]=0;
}
else
{
pr[j]=pr[j+1]=R;
pi[j]=IM;
pi[j+1]=-IM;
}
j=j+2;
}
/*função EQ2GPQ(FIM)]]]]]]]]]]]]]*/


void exec ()
{
/*Newton-Bairstow*/
float T, V[N];
T=coef[N];
for (i=N; i>=0; i=i-1)
{
coef[i]=coef[i]/T;
V[i]=coef[i];
}
int M;
M=N;
for (i=0; i<=M; i=i+1)
{
for (j=0; j<=M-i; j=j+1);
{
if (fabs(V[j])>fabs(V[j+1])) troca_float(V[j],V[j+1]);
}
}

float p0=V[M+1]/V[M-1];
float q0=V[M]/V[M-1];
float p, q, b[M+2], c[M+2], dp, dq;

while (M>2)
{
b[M+2]=b[M+1]=c[M+2]=c[M+1]=0;
p=p0; q=q0;
dp=dq=1;
j=0;

[color=red]while((fabs(dp)+fabs(dq))>TOL && j<=NMI) //-->> linha94[/color]
{
for (i=M; i>=0; i--)
{
b[i]=coef[i]-p*b[i+1]-q*b[i+2];
c[i]=b[i]-p*c[i+1]-q*c[i+2];
}
b[0]=coef[0]-p*b[1]-q*b[2];
c[1]=c[1]-b[1];
float d=c[2]*c[2]-c[1]*c[3];
if (fabs(d)>0)
{
dp=(b[1]*c[2]-b[0]*c[3])/d;
dq=(b[0]*c[2]-b[1]*c[1])/d;
p=p+dp; q=q+dq;
}
else
{
M=0;
}
j=j+1;
}




if (M!=0)
{
eq2gpq(p,q);
M=M-2;
for (i=0; i<=M; i=i+1)
{
coef[M-i]=b[M+2-i];
}
p0=V[M+1]/V[M-1];
q0=V[M]/V[M-1];
}
}
[color=red]if (M!=0 && j<=NMI) //-->>linha132[/color]
{
if (M==2)
{
p=b[3];
q=b[2];
eq2gpq(p,q);
}
else
{
pr[N]=-b[2];
pr[N]=0;
}
for (i=1; i<=N; i=i+1)
{
printf("P\nR=%f\nPI=%f\n", pr[i], pi[i]);
}
}
[color=red]if (j>NMI) //-->>linha150[/color]
{
puts("Ultrapassou NMI");
}
if (M==0)
{
puts("Não convergiu com valores iniciais de P0 e Q0");
}

}
return 0;
}



[ ]'s
Gentoo — Controle total sobre o sistema.

irtigor

A tag code não permite formatação. Você escreveu isso? Pergunto porque funções aninhadas não fazem parte do padrão, ou seja, o compilador pode implementar da forma que quiser (ou simplesmente não implementar).

No gcc é assim: http://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html

Não tenho certeza se esse é o problema (achei muito estranho, posso ter deixado algo passar), mas eu reescreveria.

rudregues

Consegui resolver o problema, se tratava das contantes. Eu fiz assim no código:
#define  TOL 0.003;
#define NMI 200;

Mas era pra ter feito assim:
#define  TOL 0.003
#define NMI 200

Ou seja, ele tava jogando o ';' pra dentro dos laços e condicionais, por isso o erro.

irtigor, dei uma pesquisada e percebi que essa prática de usar funções aninhadas normalmente não é muito interessante, mesmo em C, vou dar uma editada no código e tentar colocar as funções para fora da função main. Obrigado pela dica.
Gentoo — Controle total sobre o sistema.