Comment déclarer un tableau dans un fichier entête .h ?

  • Auteur de la discussion FireBird
  • Date de début

FireBird

Grand Maître
[cpp]#define K {1, 2}[/cpp]

quand je compile ça donne ça
toto.c: In function ‘cnv_encd’:
toto.c:58: erreur: expected expression before ‘{’ token

biensûr c'est quand je veux accèder aux élément de K genre
[cpp]for (i=0; i < 2; i++)
b = K;[/cpp]
 

batchy

Grand Maître
faut savoir ce que c'est un #define : c'est un ''prend K et remplace le par {1, 2}''
ton code deviens :
Code:
for (i=0;i<2;i++)
	b = {1, 2}[i];
les accolades en C ne servent que pour l'initialisation d'un tableau, et rien qu'a ça.

si ce que tu veux c'est une constante tableau, alors dans ton .h met un tableau du genre

Code:
const LeType K[]={1, 2};
 

boub popsyteam

Grand Maître
Le define que tu as mis veut dire qu'il faut remplacer K par {1, 2} dans tout ton programme !

il faut mettre

Code:
int K[]={1,2};


edit: grilled avec une réponse de qualité par batchy :merci:
 

FireBird

Grand Maître
Le define que tu as mis veut dire qu'il faut remplacer K par {1, 2} dans tout ton programme !

il faut mettre

Code:
int K[]={1,2};


edit: grilled avec une réponse de qualité par batchy :merci:
en fait je veux mettre toutes les constantes dans un fichier .h, et seront utilisées par plusieurs fichier .c
ta solution marche pas. ça me donne ça à la compilation
[cpp]gcc -g -O2 -I. -Wall -march=i686 -c -o main.o main.c
gcc -g -O2 -I. -Wall -march=i686 -c -o stats.o stats.c
gcc -g -O2 -I. -Wall -march=i686 -c -o gen01dat.o gen01dat.c
gcc -g -O2 -I. -Wall -march=i686 -c -o cnv_encd.o cnv_encd.c
gcc -g -O2 -I. -Wall -march=i686 -c -o addnoise.o addnoise.c
gcc -g -O2 -I. -Wall -march=i686 -c -o sdvd.o sdvd.c
gcc -g -O2 -I. -Wall -march=i686 -o stats main.o stats.o gen01dat.o cnv_encd.o addnoise.o sdvd.o -lm
gen01dat.o:(.data+0x0): multiple definition of `K'
stats.o:(.data+0x0): first defined here
cnv_encd.o:(.data+0x0): multiple definition of `K'
stats.o:(.data+0x0): first defined here
addnoise.o:(.data+0x0): multiple definition of `K'
stats.o:(.data+0x0): first defined here
sdvd.o:(.data+0x0): multiple definition of `K'
stats.o:(.data+0x0): first defined here
collect2: ld a retourné 1 code d'état d'exécution
make: *** [stats] Erreur 1[/cpp]
idem avec const memes erreurs
 

boub popsyteam

Grand Maître
Bah faut pas le redefinir plein de fois ...

Code:
#ifndef __K
#define __K
const int K[]={1, 2};
#endif
 

batchy

Grand Maître
c'est pas ça le problème. le problème c'est que le même symbole est défini dans plusieurs fichiers.o et donc dans plusieurs fichiers.c

pour corriger ça, y a le choix :
définir le tableau comme ''statique'' : c'est à dire qu'il n'est visible que pour le fichier.c qui l'inclu. c'est la solution la plus simple, le seul désavantage c'est que ce tableau va se retrouver dans tout les .o et donc peut se retrouver plusieurs fois dans l'exécutable final.
Code:
static const int K[]={1,2};

l'autre solution mieux c'est de déclarer ce tableau dans le .h mais de le définir que dans un seul fichier.c

dans le .h :
Code:
extern const int K[];
dans un seul fichier.c :
Code:
const int K[]={1, 2};
 

FireBird

Grand Maître
C'est faux, il est pas défini dans plusieurs fichiers. Je sais pas pourquoi vous dites qu'il est défini plein de fois :heink:
il est utilisé plein de fois, oui, ce qui explique les "first defined", justement par ce que K est mal défini dans le .h
 

batchy

Grand Maître
quand dans un fichier.c tu fait
Code:
#include "fichier.h"
le préprocesseur remplace cette ligne par le contenu de fichier.h
si tu a deux fichier.c comme ça :
Code:
#include "fichier.h"
int UneFonction(int truc) {
   return K[truc];
}
Code:
#include "fichier.h"
int UneAutreFonction(int autretruc) {
   return K[1+autretruc];
}
et un fichier.h comme ça :
Code:
const int K[]={1,2}
alors une fois le préprocesseur passé, les fichiers deviennent :
Code:
const int K[]={1,2}
int UneFonction(int truc) {
   return K[truc];
}
Code:
const int K[]={1,2}
int UneAutreFonction(int autretruc) {
   return K[1+autretruc];
}
une fois les deux fichiers compilé, le tableau est défini dans les deux fichiers.o et après le linker rale, car il à deux définition du tableau.

la première solution, c'est de dire dans le fichier.h ''ceci est un tableau qui sera utilisé et défini que pour le fichier courant'', la deuxième c'est de dire dans le fichier.h ''Il y a un tableau d'entiers constants qui est défini quelque part que vous pouvez utiliser'' et de définir ce tableau dans un seul fichier.c
 

FireBird

Grand Maître


OK, j'ai compris. ça marche ta solution. Merci beaucoup.
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 136
Messages
6 718 120
Membres
1 586 397
Dernier membre
Chachabidou
Partager cette page
Haut