Se connecter avec
S'enregistrer | Connectez-vous

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

Dernière réponse : dans Programmation
Lassé par la pub ? Créez un compte
Expert Programmation

faut savoir ce que c'est un #define : c'est un ''prend K et remplace le par {1, 2}''
ton code deviens :
  1. for (i=0;i<2;i++)
  2. 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

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

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

il faut mettre

  1. int K[]={1,2};



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

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
  1. gcc -g -O2 -I. -Wall -march=i686 -c -o main.o main.c
  2. gcc -g -O2 -I. -Wall -march=i686 -c -o stats.o stats.c
  3. gcc -g -O2 -I. -Wall -march=i686 -c -o gen01dat.o gen01dat.c
  4. gcc -g -O2 -I. -Wall -march=i686 -c -o cnv_encd.o cnv_encd.c
  5. gcc -g -O2 -I. -Wall -march=i686 -c -o addnoise.o addnoise.c
  6. gcc -g -O2 -I. -Wall -march=i686 -c -o sdvd.o sdvd.c
  7. gcc -g -O2 -I. -Wall -march=i686 -o stats main.o stats.o gen01dat.o cnv_encd.o addnoise.o sdvd.o -lm
  8. gen01dat.o:(.data+0x0): multiple definition of `K'
  9. stats.o:(.data+0x0): first defined here
  10. cnv_encd.o:(.data+0x0): multiple definition of `K'
  11. stats.o:(.data+0x0): first defined here
  12. addnoise.o:(.data+0x0): multiple definition of `K'
  13. stats.o:(.data+0x0): first defined here
  14. sdvd.o:(.data+0x0): multiple definition of `K'
  15. stats.o:(.data+0x0): first defined here
  16. collect2: ld a retourné 1 code d'état d'exécution
  17. make: *** [stats] Erreur 1

idem avec const memes erreurs
Expert Programmation

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.
  1. 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 :
  1. extern const int K[];

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

elch a dit :
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.
  1. 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 :
  1. extern const int K[];

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

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
Expert Programmation

quand dans un fichier.c tu fait
  1. #include "fichier.h"

le préprocesseur remplace cette ligne par le contenu de fichier.h
si tu a deux fichier.c comme ça :
  1. #include "fichier.h"
  2. int UneFonction(int truc) {
  3. return K[truc];
  4. }

  1. #include "fichier.h"
  2. int UneAutreFonction(int autretruc) {
  3. return K[1+autretruc];
  4. }

et un fichier.h comme ça :
  1. const int K[]={1,2}

alors une fois le préprocesseur passé, les fichiers deviennent :
  1. const int K[]={1,2}
  2. int UneFonction(int truc) {
  3. return K[truc];
  4. }

  1. const int K[]={1,2}
  2. int UneAutreFonction(int autretruc) {
  3. return K[1+autretruc];
  4. }

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

elch a dit :
quand dans un fichier.c tu fait
  1. #include "fichier.h"

le préprocesseur remplace cette ligne par le contenu de fichier.h
si tu a deux fichier.c comme ça :
  1. #include "fichier.h"
  2. int UneFonction(int truc) {
  3. return K[truc];
  4. }

  1. #include "fichier.h"
  2. int UneAutreFonction(int autretruc) {
  3. return K[1+autretruc];
  4. }

et un fichier.h comme ça :
  1. const int K[]={1,2}

alors une fois le préprocesseur passé, les fichiers deviennent :
  1. const int K[]={1,2}
  2. int UneFonction(int truc) {
  3. return K[truc];
  4. }

  1. const int K[]={1,2}
  2. int UneAutreFonction(int autretruc) {
  3. return K[1+autretruc];
  4. }

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


OK, j'ai compris. ça marche ta solution. Merci beaucoup.
Lassé par la pub ? Créez un compte