Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3034 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Probleme de declaration d'un tableau

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Probleme de declaration d'un tableau

n°931851
Chronoklaz​m
Posté le 25-12-2004 à 21:30:09  profilanswer
 

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 !
mood
Publicité
Posté le 25-12-2004 à 21:30:09  profilanswer
 

n°931854
matafan
Posté le 25-12-2004 à 21:37:23  profilanswer
 

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

n°931855
Chronoklaz​m
Posté le 25-12-2004 à 21:43:05  profilanswer
 

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 !
n°931857
Emmanuel D​elahaye
C is a sharp tool
Posté le 25-12-2004 à 21:45:04  profilanswer
 

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/
n°931858
Emmanuel D​elahaye
C is a sharp tool
Posté le 25-12-2004 à 21:48:25  profilanswer
 

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/
n°931862
Chronoklaz​m
Posté le 25-12-2004 à 22:00:33  profilanswer
 

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 !
n°931870
pains-aux-​raisins
Fatal error
Posté le 25-12-2004 à 22:09:47  profilanswer
 

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

n°931872
Chronoklaz​m
Posté le 25-12-2004 à 22:13:07  profilanswer
 

Oui je l'attendais celle là :)


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
n°931873
Emmanuel D​elahaye
C is a sharp tool
Posté le 25-12-2004 à 22:13:45  profilanswer
 

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/
n°931875
Chronoklaz​m
Posté le 25-12-2004 à 22:16:39  profilanswer
 

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 !
mood
Publicité
Posté le 25-12-2004 à 22:16:39  profilanswer
 

n°931929
matafan
Posté le 26-12-2004 à 03:49:06  profilanswer
 

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.

n°931932
Emmanuel D​elahaye
C is a sharp tool
Posté le 26-12-2004 à 09:31:27  profilanswer
 

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/
n°932015
Chronoklaz​m
Posté le 26-12-2004 à 14:07:26  profilanswer
 

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 !
n°932028
pains-aux-​raisins
Fatal error
Posté le 26-12-2004 à 14:34:56  profilanswer
 

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.

n°932031
Chronoklaz​m
Posté le 26-12-2004 à 14:44:46  profilanswer
 

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 !
n°932032
pains-aux-​raisins
Fatal error
Posté le 26-12-2004 à 14:46:54  profilanswer
 

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

n°932033
Chronoklaz​m
Posté le 26-12-2004 à 14:48:29  profilanswer
 

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 !
n°932034
pains-aux-​raisins
Fatal error
Posté le 26-12-2004 à 14:50:02  profilanswer
 

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
n°932038
Chronoklaz​m
Posté le 26-12-2004 à 14:54:19  profilanswer
 

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 !
n°932040
Chronoklaz​m
Posté le 26-12-2004 à 14:57:22  profilanswer
 

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 !
n°932043
pains-aux-​raisins
Fatal error
Posté le 26-12-2004 à 14:59:44  profilanswer
 

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 ?

n°932044
pains-aux-​raisins
Fatal error
Posté le 26-12-2004 à 15:00:35  profilanswer
 

Chronoklazm a écrit :

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


Je me disais aussi... :p

n°932048
Emmanuel D​elahaye
C is a sharp tool
Posté le 26-12-2004 à 15:04:25  profilanswer
 

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/
n°932049
Chronoklaz​m
Posté le 26-12-2004 à 15:05:32  profilanswer
 

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 !
n°932050
pains-aux-​raisins
Fatal error
Posté le 26-12-2004 à 15:10:13  profilanswer
 

Je crois qu'on a un puriste...

n°932052
Taz
bisounours-codeur
Posté le 26-12-2004 à 15:12:10  profilanswer
 

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.

n°932055
Emmanuel D​elahaye
C is a sharp tool
Posté le 26-12-2004 à 15:15:50  profilanswer
 

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/
n°932056
Chronoklaz​m
Posté le 26-12-2004 à 15:16:25  profilanswer
 

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 !
n°932059
pains-aux-​raisins
Fatal error
Posté le 26-12-2004 à 15:20:19  profilanswer
 

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

n°932061
Emmanuel D​elahaye
C is a sharp tool
Posté le 26-12-2004 à 15:22:02  profilanswer
 

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/
n°932063
Emmanuel D​elahaye
C is a sharp tool
Posté le 26-12-2004 à 15:23:53  profilanswer
 

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/
n°932065
pains-aux-​raisins
Fatal error
Posté le 26-12-2004 à 15:24:54  profilanswer
 

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

n°932069
Emmanuel D​elahaye
C is a sharp tool
Posté le 26-12-2004 à 15:28:15  profilanswer
 

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/
n°932071
Chronoklaz​m
Posté le 26-12-2004 à 15:31:49  profilanswer
 

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 !
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Probleme de declaration d'un tableau

 

Sujets relatifs
Problème affichage caractères spéciauxProblème avec clock()
Probleme de listing alphabétique et LIMIT avec jointures 1:nproblème de formulaire qui enregistre rien -> 2è problème :(
help: probleme de fonction .h en Crequete sql probleme avec accent é
problème d'inclusion des header MFCProbleme Argument mysql_num_rows
[QT] affichage de fenêtre et problème de classequestion bete : probleme dans la déclaration d'un tableau
Plus de sujets relatifs à : Probleme de declaration d'un tableau


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR