Probleme de declaration d'un tableau - C - Programmation
Marsh Posté le 25-12-2004 à 21:37:23
Tu le déclares avec "Shape tab[4][4] = {0};" puis dans main() tu affectes tab[1][4], tab[2][4] et tab[3][4].
Marsh Posté le 25-12-2004 à 21:43:05
Ok merci, mais il y a plus moyen de l'affecter directement avec des choses entre crochets une fois que l'on la declaré en global ? C'est pas pratique ca
Marsh Posté le 25-12-2004 à 21:45:04
Chronoklazm a écrit : Voila j'ai un tableau tab[4][4] que je veux declarer en global et le combler dans mon main mais le compilo (gcc) me renvoi une erreur
|
Le tableau étant définit en dehors d'un bloc, tous les éléments sont automatiquement initialisés à 0 (NULL pour le pointeurs, 0.0 pour les flottants). Il ne te reste plus, dans le main(), qu'à affecter 'à la main' les données qui sont le résultat de l'exécution d'une fonction :
Code :
|
Marsh Posté le 25-12-2004 à 21:48:25
Chronoklazm a écrit : Ok merci, mais il y a plus moyen de l'affecter directement avec des choses entre crochets une fois que l'on la declaré en global ? C'est pas pratique ca |
Pas si la valeur découle d'une exécution. Le premier code a être exécuté est main(). Pas d'alternative.
Si tu veux une explication 'normative' :
Les valeurs d'initialisation d'un tableau doivent être des expression constantes. Le résultat d'une fonction n'est pas une expression constante.
Marsh Posté le 25-12-2004 à 22:00:33
Ok merci mais alors est-il possible d'affecter d'une maniere "pratique" cad entre {} les elements d'un tableau ou il y a des expression "non-constantes" (dans le main donc) et de faire pointer sur ce tableau un pointeur definit globalement pour pouvoir le reutiliser apres ?
Je tient tellement à cette maniere "pratique" uniquement pour les cas ou j'ai de grands tableau a affecter
Marsh Posté le 25-12-2004 à 22:13:07
Oui je l'attendais celle là
Marsh Posté le 25-12-2004 à 22:13:45
Chronoklazm a écrit : Ok merci mais alors est-il possible d'affecter d'une maniere "pratique" cad entre {} les elements d'un tableau ou il y a des expression "non-constantes" (dans le main donc) et de faire pointer sur ce tableau un pointeur definit globalement pour pouvoir le reutiliser apres ? |
On doit pouvoir bidouiller quelque chose, mais définir un grand tableau en mémoire automatique (locale), c'est pas conseillé...
Marsh Posté le 25-12-2004 à 22:16:39
Ok bon je vais changer de tactique alors Merci pour ces precisions Emmanuel.
Marsh Posté le 26-12-2004 à 03:49:06
Emmanuel Delahaye a écrit : Le tableau étant définit en dehors d'un bloc, tous les éléments sont automatiquement initialisés à 0 (NULL pour le pointeurs, 0.0 pour les flottants). |
Un tableau global n'est pas initialisé à 0. Il faut écrire explicitement "type tab[dim] = {0};" pour qu'il le soit.
Marsh Posté le 26-12-2004 à 09:31:27
matafan a écrit : Un tableau global n'est pas initialisé à 0. Il faut écrire explicitement "type tab[dim] = {0};" pour qu'il le soit. |
La norme dit que si,
Citation : |
mais j'ai connu un contre-exemple avec un compilateur Texas Instrument pour DSP TMS320C54.
Marsh Posté le 26-12-2004 à 14:07:26
Une autre question :
Si je declare un tableau en global dans mon main.h :
Code :
|
Puis dans mon main.c dans l'une des methodes (en dehors du main()) j'appelle une fonction (qui se trouve dans shape.c) avec pour argument le dit tableau :
Code :
|
Mais le probleme est que j'ai un messsage d'erreur me disant
"shape.c:94: error: invalid use of array with unspecified bounds" Pourtant je ne fait qu'un simple printf dessus ?
Et autre chose je ne peux meme pas faire un #include "main.h" dans le shape.c, il me canarde avec des erreurs dans les fichiers .o ... Une aide serais la bienvenue.
Marsh Posté le 26-12-2004 à 14:34:56
Hmmm, un main.h ... Original.
Je ne sais pas trop où tu veux en venir avec tes includes et tes tableaux mais
1/ faire un lvl_1 sans préciser les indices, ca ne doit pas lui plaire.
2/ pour utililser une variable globale, il faut la déclarer extern dans les autres includes.
Marsh Posté le 26-12-2004 à 14:44:46
Mais pourquoi je dois preciser des indices ? Je veux simplement
envoyer tout mon tableau lvl_1 en tant que parametre de la fonction Draw_level ... mais cette fonction (qui se trouve dans le shape.c ) semble ne pas "capter" ce tableau.
Marsh Posté le 26-12-2004 à 14:46:54
Peux-tu poster la déclaration de ta fonction Draw_level ?
Marsh Posté le 26-12-2004 à 14:48:29
Et dan shape.h je la declare en extern.
extern Draw_level(int lvl_1[][]);
Dans shape.c donc.
Code :
|
Marsh Posté le 26-12-2004 à 14:50:02
A ouai... c'est bien ce que je craignais.
Restons simple.
Mets plutôt
Draw_level(int** lvl_1) {...} |
Marsh Posté le 26-12-2004 à 14:54:19
Non rien a faire, ca marche pas J'ai testé l'appel de Draw_level avec &lvl_1[0][0] marche pas non plus.
Il me sort
shape.c:95: error: invalid use of array with unspecified bounds
shape.c:100: error: invalid use of array with unspecified bounds
shape.c:100: warning: comparison between pointer and integer
Marsh Posté le 26-12-2004 à 14:57:22
Ah non, j'ai rien dit Ca marche Merci beacoup !
Marsh Posté le 26-12-2004 à 14:59:44
Il est conseillé de préciser le type d'une fonction en C.
void Draw_level(int** lvl_1) |
Quelles sont les lignes 95 et 100 de shape.c ?
Marsh Posté le 26-12-2004 à 15:00:35
ReplyMarsh Posté le 26-12-2004 à 15:04:25
pains-aux-raisins a écrit : A ouai... c'est bien ce que je craignais.
|
int** lvl_1 n'est en aucun cas le type de int lvl_1[4][4]
Marsh Posté le 26-12-2004 à 15:05:32
int **lvl_1 alors non ? ou c'est exactement la meme chose ?
Marsh Posté le 26-12-2004 à 15:12:10
je débarque... approche simpliste : mais c'est quoi l'intérêt de la variable globale si tu la passes en paramètres ? à ce moment là, plus besoin de globale.
Marsh Posté le 26-12-2004 à 15:15:50
Chronoklazm a écrit : Une autre question :
|
Problème, ceci n'est pas une déclaration, mais une définition. Bien que ce soit techniquement possible, les regles de conception les plus élémentaires interdisent de placer une définition d'objet ou de fonction (sauf inline) dans un .h. La globale doit être définie dans un fichier (main.c ou autre, par exemple globals.c), et sa déclaration dans un globals.h.
http://mapage.noos.fr/emdel/notes.htm#globales
Par exemple :
|
|
Citation :
|
Le prototype de Draw_level() doit être:
Draw_level(int a[][4]); |
Marsh Posté le 26-12-2004 à 15:16:25
Taz => C'est vrai
Emmanuel => D'accord je vais corriger ca.
Marsh Posté le 26-12-2004 à 15:20:19
Emmanuel Delahaye a écrit : Le prototype de Draw_level() doit être:
|
Haaeummm...
Ca c'est vachement pratique si tu change la dimension de ton tableau...
Marsh Posté le 26-12-2004 à 15:22:02
pains-aux-raisins a écrit : Je crois qu'on a un puriste... |
Rien à voir avec ça. Le code est incorrect, c'est tout.
Dans le cadre d'un paramètre de fonction :
'int **' est le type d'un tableau de pointeurs sur des tableaux d'int (non linéaire) Ca se construit dynamiquement à coup de malloc() imbriqués.
'int[][4]' est le type d'un tableau de n x 4 int. (linéaire, définition statique possible comme dans le cas qui nous interesse)
Ce sont des notions de C élémentaires.
Marsh Posté le 26-12-2004 à 15:23:53
pains-aux-raisins a écrit : Haaeummm... |
Au lieu d'ironiser, montre moi plutôt une autre solution qui fonctionne. C'est pas moi qui ai choisi un tableau statique.
Marsh Posté le 26-12-2004 à 15:24:54
Comme il te plaira... Je n'entrerai pas dans la polémique..
Marsh Posté le 26-12-2004 à 15:28:15
pains-aux-raisins a écrit : Comme il te plaira... Je n'entrerai pas dans la polémique.. |
MOUARF!
Marsh Posté le 26-12-2004 à 15:31:49
Halte aux querelles mes amis vos solutions respectives marchent
super bien, merci messieurs
Marsh Posté le 25-12-2004 à 21:30:09
Voila j'ai un tableau tab[4][4] que je veux declarer en global et le combler dans mon main mais le compilo (gcc) me renvoi une erreur
Seulement voila ca marche pô Et comme je peux pas l'affecter en dehors du main je suis zébé J'ai testé de le declarer en tant que pointeur puis de l'affecter avec un & et que dalle. Que faire ?
Message édité par Chronoklazm le 25-12-2004 à 21:31:58
---------------
Scheme is a programmable programming language ! I heard it through the grapevine !