Forum Clubic

C, pb avec différentes versions de gcc á la compilation

Bonjour,
je suis debutant en programmation. J’ai laborieusement ficelé un peit programme (sous fedora 5), que je compile avec gcc 4.1.1 ou 4.0.0, ok.
Seulement ce programme doit être envoyé sur un ordi isolé á 300 km (ssh) et compilé lá bas, cet ordinateur a gcc 2.96 (et j’ai aucune idée de son systéme) que j’utilise donc, mais cette fois j’ai plein de problémes á la compilation, notamment “char undeclared”. (alors que tout est nickel sous mes yeux avec gcc 4.1.1).
Il est hors de question de changer quoi que ce soit sur cet ordinateur á distance (il est dans l’arriére pays islandais). Auriez-vous une explication ?
Un autre inconvenient est que mes capacités limitées en programmation ne me permettent de faire un truc trop tordu pour contourner ce probléme .

merci, j’ai vraiment besoin d’aide.

mathieu
Edité le 09/07/2008 à 13:17

char undeclared? C’est étonnant, puisque c’est un type de base.

Affiche voir les logs d’erreur, genre make > stdlog.txt 2> stderr.txt pour récupérer les résultats.

Je m’excuse, mais je n’arrive pas á avoir les “logs dérreur”, tu peux être plus précis ? (il y a 3 semaines, je ne savais méme pas créer un répertoire, je reviens de loin … )
Le pb se pose avec toutes les variables d’ailleurs, rien n’est déclaré avec succés.
Edité le 09/07/2008 à 14:28

Hé bien quand tu compiles… tu as des messages d’erreur, je suppose?

Oups, bien sûr. Rien de bien exotique :
tilt_processM5.c: In function main': tilt_processM5.c:230: parse error beforechar’
tilt_processM5.c:242: E_upp' undeclared (first use in this function) tilt_processM5.c:242: (Each undeclared identifier is reported only once tilt_processM5.c:242: for each function it appears in.) tilt_processM5.c:243:E_nidur’ undeclared (first use in this function)
tilt_processM5.c:244: N_upp' undeclared (first use in this function) tilt_processM5.c:245:N_nidur’ undeclared (first use in this function)
tilt_processM5.c:246: name_temp' undeclared (first use in this function) tilt_processM5.c:249:Eu_out’ undeclared (first use in this function)
tilt_processM5.c:250: En_out' undeclared (first use in this function) tilt_processM5.c:251:Nu_out’ undeclared (first use in this function)
tilt_processM5.c:252: Nn_out' undeclared (first use in this function) tilt_processM5.c:256: parse error beforeint’
tilt_processM5.c:262: size_temp' undeclared (first use in this function) tilt_processM5.c:262:begin_temp’ undeclared (first use in this function)
tilt_processM5.c:279: parse error before int' tilt_processM5.c:280:temp’ undeclared (first use in this function)
tilt_processM5.c:281: parse error before int' tilt_processM5.c:282:time_flag’ undeclared (first use in this function)
tilt_processM5.c:282: sampl' undeclared (first use in this function) tilt_processM5.c:285: parse error beforeint’
tilt_processM5.c:286: end' undeclared (first use in this function) tilt_processM5.c:287:i’ undeclared (first use in this function)
tilt_processM5.c:290: truc' undeclared (first use in this function) tilt_processM5.c:296: parse error beforefloat’
tilt_processM5.c:297: E_u' undeclared (first use in this function) tilt_processM5.c:298: parse error beforefloat’
tilt_processM5.c:299: E_n' undeclared (first use in this function) tilt_processM5.c:300: parse error beforefloat’
tilt_processM5.c:301: N_u' undeclared (first use in this function) tilt_processM5.c:302: parse error beforefloat’
tilt_processM5.c:303: N_n' undeclared (first use in this function) tilt_processM5.c:304: parse error beforeint’
tilt_processM5.c:312: a' undeclared (first use in this function) tilt_processM5.c:313:b’ undeclared (first use in this function)
tilt_processM5.c:314: c' undeclared (first use in this function) tilt_processM5.c:315:d’ undeclared (first use in this function)

Et le code associé? (juste le fichier C)

Voila :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

/* ###########################################/
float S_cal=0.999;
float T_cal=25; /for the number 6208/
float K_s=0.05/100;
float K_z= 3;
float SV=0.21; /
1 bit = 0.210 mV */
float ST=0.1; /scale foctor for temperature/

float convert (int value, int temp)
{
float angle;
angle = (S_cal*(1+K_s*(SVtemp-T_cal)))SVvalue-K_z(STSVtemp-T_cal);
/return the value in micro radian/
return angle;

}

/* ###########################################*/
void lecture (char *file_name,int *count,int *begin)
{
FILE *fid;

char chaine[20];
char id[20];
int debut;

if ((fid = fopen(file_name,“r”)) == NULL)
{
printf("\n Error: Impossible to read the file");
}
fscanf(fid,"%d",&debut);
fscanf(fid,"%s",&id);

while (!feof(fid))
{
fscanf(fid,"%s",&chaine);
if (strcmp(chaine,id)==0) *count=*count-2;
*count=*count+1;
}
*count=*count-1;

*begin=debut;

fclose(fid);
}
/* ########################################## */
int lecture_temp (char *file_name,int *tab)
{
FILE *fid;

char chaine[20],s[20];
char id[20];
int debut,time;
int i=0;

if ((fid = fopen(file_name,“r”)) == NULL)
{
printf("\n Error: Impossible to read the file");
}

fscanf(fid,"%d",&debut);
fscanf(fid,"%s",&id);

while (!feof(fid))
{
fscanf(fid,"%s",&chaine);
if (strcmp(chaine,id)==0) i–;
else
{
tab[i]=atoi(chaine);
i++;
}
}
fclose(fid);
return i-1;
}

/* ######################################*/

int lecture_data ( char *name,int sampl, int *temp,int begin_temp,int end,int *time_flag,float *OUT )
{

FILE *fid;

int z1,z2,z3,z4,j=0,time,NB,data,NB_BLOCS=0,NB_DATA=0,MISS=0,NB_TOT=0;
float value,max,min,sum;
char chaine[20],id[8],s[20];
long pos;
int k=0;
int indice=0,i=0,rest;
int m=0;

if ((fid = fopen(name,“r”)) == NULL)
printf("\n Error: Impossible to read the file");

printf(" \n reading file %s \n",name);

z1=fscanf(fid,"%d",&time);
z2=fscanf(fid,"%s",&id);

if (z1!=1||z2!=1) printf("\n erreur format debut du fichier");
rewind(fid);

if (begin_temp<time) /* i.e -> temperature starts at first /
{
i=((time-begin_temp)4)/(4sampl)+1;
k=i
sampl4;/ -> nb of data to skip */
}

if (begin_temp>time) /* i.e -> data starts at first */
{
k=0;i=0;
}
OUT[0]=k;m++;
while (!feof(fid))
{

NB=0;
sum=0;
while ((NB<4*sampl)&&(!feof(fid)))
	{
	pos=ftell(fid);
	z3=fscanf(fid,"%d",&data);
	if (z3==0)  /*i.e. its a id number*/
		{
		fseek(fid,pos,SEEK_SET);
		fscanf(fid,"%s",&chaine);
		if(strcmp(chaine,id)==0) NB_BLOCS++;
		/*else printf("\n erreur format dans le fichier bloc %d %s",NB_BLOCS,id);*/
		}

	/*if (z3!=0 && data>=time) i.e. its a time flag
		{
		z4=0;		
		if (data!=(time+(NB_DATA)/4)) 
			{MISS++;
			printf("\n %d \t %d \t %d",data,time,time+(NB_DATA)/4);
			time=data;}
		else {z4=1;time=data;NB_DATA=0;}
		time=data;
		continue;
		}*/

	if (z3!=0 && data<time) /*its a data*/
		{
		NB_DATA++;NB_TOT++;
		if (data<0) value=convert(-data,temp[k]);
		if (data>=0) value=convert(data,temp[k]);
		k++;NB++;
		sum+=value;
		if (k>end) break;
		}
	}


OUT[m]=sum/(NB);
i++;m++;
if(k>end) break;
}

fclose(fid);

printf("\n number of read data %d “,NB_TOT-1);
printf(”\n re-sampling rate : %d",sampl);
printf("\n number of written data: %d",i);
printf("\n number of data in the last block: %d",NB-1);
printf("\n");
return m-1;
}

void writing ( char *name, int *time_flag, float *data,int stop,int sampl )

{
FILE fout;
int i,k=(int)data[0]/(4
sampl);
char s[50];
if ((fout = fopen(name,“w”)) == NULL)
printf("\n Error: Impossible to read the file");

for (i=1;i<=stop;i++)
{
sprintf(s,"%d\t%f\n",time_flag[k+i]+sampl/2,data[i]);
fprintf(fout,"%s",s);
}

fclose(fout);
}

/* ###########################################*/

main (int argc, char **argv)
{
printf ("\n %s %s",argv[1],argv[2]);

char id[7],chaine[20];
int time,data,i;

int sampl=300;
int z1,z2,z3,z4;

/*for files name */
char name_temp[150],E_upp[150],E_nidur[150],N_upp[150],N_nidur[150];
char Eu_out[50],En_out[50],Nu_out[50],Nn_out[50];

/*Creation of the strings where files names are strored */
sprintf(E_upp,"%s/E_upp",argv[1]);
sprintf(E_nidur,"%s/E_nidur",argv[1]);
sprintf(N_upp,"%s/N_upp",argv[1]);
sprintf(N_nidur,"%s/N_nidur",argv[1]);
sprintf(name_temp,"%s/Hiti_tilts",argv[1]);

/*Creation of strings for outputs name */
sprintf(Eu_out,"%s_E_upp",argv[2]);
sprintf(En_out,"%s_E_nidur",argv[2]);
sprintf(Nu_out,"%s_N_upp",argv[2]);
sprintf(Nn_out,"%s_N_nidur",argv[2]);

/* for files information */
int begin_temp=0, size_temp=0;
/int begin_E_nidur=0, size_E_nidur=0;
int begin_E_upp=0, size_E_upp=0;
int begin_N_nidur=0, size_N_nidur=0;
int begin_N_upp=0, size_N_upp=0;
/

lecture (name_temp,&size_temp,&begin_temp);
/lecture (E_nidur,&size_E_nidur,&begin_E_nidur);
lecture (E_upp,&size_E_upp,&begin_E_upp);
lecture (N_nidur,&size_N_nidur,&begin_N_nidur);
lecture (N_upp,&size_N_upp,&begin_N_upp);
/

printf ("\n temp : %d %d", begin_temp,size_temp);
/printf("\n E_nidur : %d %d",begin_E_nidur, size_E_nidur);
printf("\n E_upp : %d %d",begin_E_upp, size_E_upp);
printf("\n N_nidur : %d %d",begin_N_nidur, size_N_nidur);
printf("\n N_upp : %d %d",begin_N_upp, size_N_upp);
/
printf("\n\n");

/for temperature datas/
int temp;
temp= (int
)malloc(size_temp*sizeof(int)+1);
int time_flag;
time_flag= (int
)malloc((size_temp/sampl+1)*sizeof(int)+1);
/*temperature reading */

int end,truc=0;
end=lecture_temp(name_temp,temp);
i=1;
time_flag[0]=begin_temp;

while (truc<size_temp)
{time_flag[i]=time_flag[i-1]+sampl;
truc=i*sampl;
i++;
}

float E_u;
E_u= (float
)malloc((truc+sampl)4sizeof(float));
float E_n;
E_n= (float
)malloc((truc+sampl)4sizeof(float));
float N_u;
N_u= (float
)malloc((truc+sampl)4sizeof(float));
float N_n;
N_n= (float
)malloc((truc+sampl)4sizeof(float));
int a,b,c,d;

/* ###### end of declarations ##### */

if (size_temp>0)
{
a=lecture_data (E_upp,sampl,temp,begin_temp,end,time_flag, E_u );
b=lecture_data (E_nidur,sampl,temp,begin_temp,end,time_flag, E_n );
c=lecture_data (N_upp,sampl,temp,begin_temp,end,time_flag, N_u );
d=lecture_data (N_nidur,sampl,temp,begin_temp,end,time_flag, N_n );

writing(Eu_out,time_flag,E_u,a,sampl);
writing(En_out,time_flag,E_n,b,sampl);
writing(Nu_out,time_flag,N_u,c,sampl);
writing(Nn_out,time_flag,N_n,d,sampl);
}
/* ########################################### */
}

J’aime pas ce:

main (int argc, char **argv)

ça doit être

int main (int argc, char **argv)

Et pas autre chose.

J´ai fait la modification. Ca n’a toutefois rien changé au probléme, ca ne fonctionne pas sur l’autre poste.
Malheureusement je ne sais rien sur la fiabilité de ce dernier.

ma foi, je ne vois qu’une seule solution: passe à gcc 4.4 sur l’autre machine? Y a eu des apports entre les deux.

(ceci étant, vu que je suis sous Windows, avec mingw, et que j’ai plus fait de C depuis longtemps…)

Merci quand même d’avoir jeté un oeil. Upgrader gcc n’est pas de mon ressort, je ne suis qu’un stagiaire et il me faut éviter de saborder les mesures en cours traitées par la machine !

C’est un problème de norme : avec les anciens compilateurs, tu dois d’abord créer tes variable puis appeler tes méthodes.
Exemple :

  • erreur : [quote=""]
    tilt_processM5.c `E_upp’ undeclared (first use in this function)
    [/quote]
  • lignes en erreur :
  • résolution : il suffit, dans ce cas, de déplacer l’appel de printf() (couper/coller), plus bas, apres toutes tes variables.

Idem, si tu fais ça mais que tu déclares une autre variable plus bas, ça ne fonctionnera pas.