Probleme de declaration d'un tableau

Probleme de declaration d'un tableau - C - Programmation

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
 

Code :
  1. ...
  2. Shape truc;
  3. Shape tab[4][4];
  4. main()
  5. /*-----*/
  6. {
  7. tab[4][4] = {
  8.     {NULL,NULL,NULL,NULL},
  9.     {NULL,NULL,NULL,ShapeCreate(truc)},
  10.     {NULL,NULL,NULL,ShapeCreate(truc)},
  11.     {NULL,NULL,NULL,ShapeCreate(truc)}
  12.     }; 
  13. }


 
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 !
Reply

Marsh Posté le 25-12-2004 à 21:30:09   

Reply

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].

Reply

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 :/


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

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
 

Code :
  1. ...
  2. Shape truc;
  3. Shape tab[4][4];
  4. main()
  5. /*-----*/
  6. {
  7. tab[4][4] = {
  8.     {NULL,NULL,NULL,NULL},
  9.     {NULL,NULL,NULL,ShapeCreate(truc)},
  10.     {NULL,NULL,NULL,ShapeCreate(truc)},
  11.     {NULL,NULL,NULL,ShapeCreate(truc)}
  12.     }; 
  13. }


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 ?


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 :
  1. Shape truc; /* vaut 0 ou {0,0,0,etc.} */
  2. Shape tab[4][4]; /* pareil */
  3. int main (void)
  4. {
  5.     tab[1][3] = ShapeCreate(truc);
  6.     tab[2][3] = ShapeCreate(truc);
  7.     tab[3][3] = ShapeCreate(truc);
  8. }



---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 25-12-2004 à 22:09:47    

Le C, c'est pas fait pour être pratique :o
 
;)

Reply

Marsh Posté le 25-12-2004 à 22:13:07    

Oui je l'attendais celle là :)


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

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 ?
Je tient tellement à cette maniere "pratique" uniquement pour les cas ou j'ai de grands tableau a affecter


On doit pouvoir bidouiller quelque chose, mais définir un grand tableau en mémoire automatique (locale), c'est pas conseillé...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 25-12-2004 à 22:16:39    

Ok bon je vais changer de tactique alors :) Merci pour ces precisions Emmanuel.


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 25-12-2004 à 22:16:39   

Reply

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.

Reply

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 :


©ISO/IEC ISO/IEC 9899:1999 (E)
6.7.8 Initialization
<...>
Constraints
<...>
5 If the declaration of an identifier has block scope, and the identifier has external or internal linkage, the declaration shall have no initializer for the identifier.
<...>
10 <...> If an object that has static storage duration is not initialized explicitly,
then:
— if it has pointer type, it is initialized to a null pointer;
— if it has arithmetic type, it is initialized to (positive or unsigned) zero;
— if it is an aggregate, every member is initialized (recursively) according to these rules;
— if it is a union, the first named member is initialized (recursively) according to these
rules.


mais j'ai connu un contre-exemple avec un compilateur Texas Instrument pour DSP TMS320C54.
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 26-12-2004 à 14:07:26    

Une autre question :
 
Si je declare un tableau en global dans mon main.h :
 

Code :
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <time.h>
  4. #include <string.h>
  5. #include "graphics.h"
  6. #include "shape.h"
  7. /* Variables globales */
  8. int lvl_1[4][4]=
  9. {
  10.   {0,0,0,0},
  11.   {0,0,0,1},
  12.   {0,0,0,0},
  13.   {0,0,0,1}
  14. };


 
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 :
  1. ... /* dans main.c */
  2. Draw_level(lvl_1);
  3. ...


 
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.


Message édité par Chronoklazm le 26-12-2004 à 14:07:48

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

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.

Reply

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.


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 26-12-2004 à 14:46:54    

Peux-tu poster la déclaration de ta fonction Draw_level ?

Reply

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 :
  1. Draw_level(int lvl_1[][]){
  2.   printf("==> %d",lvl_1[1][1]); /* meme pas ca marche */
  3.   int i;
  4.   int j;
  5.   for(i=0 ; i<3 ; i++){
  6.     for(j=0 ; j<3 ;j++){
  7.       if(lvl_1[i][j] == 1)
  8. draw_rectangle(10+(30*(i+1)), 10+(15*(j+1)), 30, 15);
  9.     }
  10.   }
  11. }


Message édité par Chronoklazm le 26-12-2004 à 14:51:24

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

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) {...}


Message édité par pains-aux-raisins le 26-12-2004 à 14:50:30
Reply

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


Message édité par Chronoklazm le 26-12-2004 à 14:55:41

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 26-12-2004 à 14:57:22    

Ah non, j'ai rien dit :) Ca marche :) Merci beacoup !


Message édité par Chronoklazm le 26-12-2004 à 14:58:23

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

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 ?

Reply

Marsh Posté le 26-12-2004 à 15:00:35    

Chronoklazm a écrit :

Ah non, j'ai rien dit :) Ca marche :) Merci beacoup !


Je me disais aussi... :p

Reply

Marsh Posté le 26-12-2004 à 15:04:25    

pains-aux-raisins a écrit :

A ouai... c'est bien ce que je craignais.
Restons simple.
Mets plutôt

Draw_level(int** lvl_1) {...}



int** lvl_1 n'est en aucun cas le type de int lvl_1[4][4]


Message édité par Emmanuel Delahaye le 26-12-2004 à 15:26:42

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 26-12-2004 à 15:05:32    

int **lvl_1 alors non ? ou c'est exactement la meme chose ?


Message édité par Chronoklazm le 26-12-2004 à 15:06:11

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 26-12-2004 à 15:10:13    

Je crois qu'on a un puriste...

Reply

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.

Reply

Marsh Posté le 26-12-2004 à 15:15:50    

Chronoklazm a écrit :

Une autre question :
 
Si je declare un tableau en global dans mon main.h :
 

Code :
  1. <...>
  2. /* Variables globales */
  3. int lvl_1[4][4]=
  4. {
  5.   {0,0,0,0},
  6.   {0,0,0,1},
  7.   {0,0,0,0},
  8.   {0,0,0,1}
  9. };




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 :  


/* globals.h */
#ifndef H_GLOBALS
#define H_GLOBALS
 
extern int lvl_1[4][4];
 
#endif /* guard */



/* globals.c */
#include "globals.h"
 
int lvl_1[][]=
{
  {0,0,0,0},
  {0,0,0,1},
  {0,0,0,0},
  {0,0,0,1}
};


Citation :


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 :
  1. ... /* dans main.c */
  2. Draw_level(lvl_1);
  3. ...




Le prototype de Draw_level() doit être:

Draw_level(int a[][4]);


Message édité par Emmanuel Delahaye le 26-12-2004 à 15:25:21

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 26-12-2004 à 15:16:25    

Taz => C'est vrai :)
 
Emmanuel => D'accord je vais corriger ca.


Message édité par Chronoklazm le 26-12-2004 à 15:17:53

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 26-12-2004 à 15:20:19    

Emmanuel Delahaye a écrit :

Le prototype de Draw_level() doit être:

Draw_level(int a[][4]);



Haaeummm...
Ca c'est vachement pratique si tu change la dimension de ton tableau...

Reply

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.


Message édité par Emmanuel Delahaye le 26-12-2004 à 15:24:28

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 26-12-2004 à 15:23:53    

pains-aux-raisins a écrit :

Haaeummm...
Ca c'est vachement pratique si tu change la dimension de ton tableau...


Au lieu d'ironiser, montre moi plutôt une autre solution qui fonctionne. C'est pas moi qui ai choisi un tableau statique.


Message édité par Emmanuel Delahaye le 26-12-2004 à 15:24:08

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 26-12-2004 à 15:24:54    

Comme il te plaira... Je n'entrerai pas dans la polémique..

Reply

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!
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 26-12-2004 à 15:31:49    

Halte aux querelles mes amis vos solutions respectives marchent  
super bien, merci messieurs :)


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed