[C] Nom de variable inconnu lors de la compilation

Nom de variable inconnu lors de la compilation [C] - C - Programmation

Marsh Posté le 24-05-2005 à 11:22:25    

Bonjour,
 
Je me demandais s'il était possible de faire en C une opération particulière...
 
J'ai un fichier h de ce type :

Code :
  1. // data.h
  2. const unsigned short TAB1[10] = {
  3. 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
  4. };
  5. const unsigned short TAB2[10] = {
  6. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  7. };


 
Je souhaite, par exemple, récupérer le 1er unsigned short d'un tableau, mais je ne sais pas encore lequel des deux !
 
Le code suivant est faux, mais c'est juste pour me faire comprendre :D

Code :
  1. // main.c
  2. #include "data.h"
  3. int main(void)
  4. {
  5.     char tempstr[20];
  6.     unsigned short num;
  7.     tempstr = "TAB1";
  8.     /* code faux car tempstr[0] vaut "T", mais je voudrais justement récupérer la 1ere cellule du tableau "TAB1" !! */
  9.     num = tempstr[0];
  10.     return 0;
  11. }


 
J'espère me faire comprendre...
Je veux récupérer le contenu d'une variable dont je ne connaîtrai le nom que lors de l'exécution !
 
Est-il possible de le faire ?
 
Merci beaucoup :)

Reply

Marsh Posté le 24-05-2005 à 11:22:25   

Reply

Marsh Posté le 24-05-2005 à 11:26:38    

Code :
  1. if(test de la chaine)
  2.            TAB1[...
  3.      else
  4.            TAB2[...


?


---------------
[:whatde]
Reply

Marsh Posté le 24-05-2005 à 11:45:47    

:hello:
J'ai effectivement pensé à un switch/case, mais le nombre de tableaux "TABx" ne serait pas fixe : j'aurai à rajouter des fichiers "DATAx.h" relativement souvent !

Reply

Marsh Posté le 24-05-2005 à 12:08:07    

si le nombre de tableaux n'est pas fixes tu devrais les mettres dans un fichier de données lu a l'execution.
 

Code :
  1. const unsigned short TAB[2][10] = {
  2. {
  3. 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
  4. },
  5. {
  6. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  7. }
  8. };


 
essaye de faire
 

Code :
  1. size_t i;
  2. if( sscanf( tempstr, "TAB%u", i ) != 1 )
  3. {
  4. /* erreur */
  5. }
  6. num = TAB[i][0]; /* ou i-1 ? */


 
en partant de ton code, mais il doit y avoir de meilleurs solutions

Reply

Marsh Posté le 24-05-2005 à 12:53:04    

J'y ai pensé ;) du genre un fichier INI :
 
[TAB1]
SIZE=10
DATA=0,1,0,1,0,1,0,1,0,1
 
C'est une alternative intéressante, seulement voilà, je veux justement éviter d'allouer de la mémoire (pas de tempstr = malloc() etc.) car je programme sur GameBoy Advance et la RAM est limitée :/ (et y'a pas de système de fichiers non plus, enfin, en théorie ;) )
Mes tableaux sont définis dans un fichier H car ce sont en fait des fichiers de maps bien plus gros, codés en dur dans la ROM une fois compilée...


Message édité par maestun le 24-05-2005 à 12:53:59
Reply

Marsh Posté le 24-05-2005 à 13:29:00    

Les pointeurs sont fait pour ca ...

Reply

Marsh Posté le 24-05-2005 à 13:32:28    

C'est à dire ?

Reply

Marsh Posté le 24-05-2005 à 13:33:47    

Les pointeurs, c'est une bonne idée mais faudra sans doute quand même un switch.
Et pourquoi pas :
const unsigned short TAB[2][10] = {
  {0, 1, 0, 1, 0, 1, 0, 1, 0, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}  
};

Reply

Marsh Posté le 24-05-2005 à 13:43:46    

J'ai laissé tomber les tabs 2D car j'avais pondu l'algo de "lecture" du map avant de penser à passer de 1D -> 2D :whistle: et j'ai la flemme de le refaire :D
 
Pour les pointeurs en revanche, je ne vois toujours pas de quoi vous voulez parler... un pointeur de fonction ?

Reply

Marsh Posté le 24-05-2005 à 13:52:34    

maestun a écrit :

J'ai laissé tomber les tabs 2D car j'avais pondu l'algo de "lecture" du map avant de penser à passer de 1D -> 2D :whistle: et j'ai la flemme de le refaire :D


 
utilises un tableau 2D, il n'y a rien a refaire

Reply

Marsh Posté le 24-05-2005 à 13:52:34   

Reply

Marsh Posté le 24-05-2005 à 14:08:55    

maestun a écrit :

Bonjour,
 
Je me demandais s'il était possible de faire en C une opération particulière...
 
J'ai un fichier h de ce type :

Code :
  1. // data.h
  2. const unsigned short TAB1[10] = {
  3. 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
  4. };
  5. const unsigned short TAB2[10] = {
  6. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  7. };




Mauvaise conception. On ne met pas de définition d'objet dans un header.

Citation :


Je souhaite, par exemple, récupérer le 1er unsigned short d'un tableau, mais je ne sais pas encore lequel des deux !
Je veux récupérer le contenu d'une variable dont je ne connaîtrai le nom que lors de l'exécution !
Est-il possible de le faire ?


Oui, avec un pointeur, c'est fait pour....


#include <stdio.h>
 
const unsigned short TAB1[10] =
{
   0, 1, 0, 1, 0, 1, 0, 1, 0, 1
};
 
const unsigned short TAB2[10] =
{
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1
};
 
int main (void)
{
   const unsigned short *tempstr;
   unsigned short num;
 
   tempstr = TAB1;
 
   num = tempstr[0];
 
   printf ("%d\n", num);
 
   tempstr = TAB2;
 
   num = tempstr[0];
 
   printf ("%d\n", num);
 
   return 0;
}


Message édité par Emmanuel Delahaye le 24-05-2005 à 16:20:31

---------------
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 24-05-2005 à 14:48:24    

>>> Emmanuel :

Citation :


Mauvaise conception. On ne met pas de définition d'objet dans un header.


Comment puis-je faire alors, dans un source C directement ?
Je procède ainsi car je n'ai ni OS ni système de fichiers : j'inclus tout en dur...
 

Citation :


Oui, avec un pointeur, c'est fait pour....


Justement, je ne veux pas faire  

Code :
  1. tempstr = TAB1[0]


 
mais

Code :
  1. const unsigned short NewMap[10] = {0, 1, 1, 1, 1, 1, 1, 1, 0, 0};
  2. MapStruct LoadMap(char * name) // name vaut "New" à l'appel
  3. {
  4.     MapStruct map;
  5.     char * tempstr;
  6.     tempstr = (char *)malloc(32 * sizeof(char));
  7.     strcpy(tempstr, name);
  8.     strcat(tempstr, "Map" );
  9.     map->data = tempstr; // (façon de parler bien sûr :)
  10. }


 
En fait, je ne connais pas à l'avance le nom du tableau à utiliser...
 
 
AJOUT >>>
Dans le code que tu m'as fourni, tempstr devrait être de type (unsigned short *) plutôt que (char *) non ?


Message édité par maestun le 24-05-2005 à 14:55:20
Reply

Marsh Posté le 24-05-2005 à 14:54:37    

c'est justement le cas pour utiliser un tableau 2D, défini le dans un .c

Reply

Marsh Posté le 24-05-2005 à 16:03:00    

maestun a écrit :

>>> Emmanuel :

Citation :


Mauvaise conception. On ne met pas de définition d'objet dans un header.


Comment puis-je faire alors, dans un source C directement ?
Je procède ainsi car je n'ai ni OS ni système de fichiers : j'inclus tout en dur...


Tu n'as pas d'OS où ça sur ta cible ? Ok. Mais sur la plateforme de développement, tu as tout ce qu'il faut (compilateur, linker, make etc.) donc tu peux créer un executable composé de plusieurs sources.
 
http://mapage.noos.fr/emdel/codage [...] ser_source
 
Si ce n'est pas le cas, décrit ton environnement de développement.

Citation :


Oui, avec un pointeur, c'est fait pour....


Citation :

Justement, je ne veux pas faire  

Code :
  1. tempstr = TAB1[0]




J'ai pas écrit ça, mais

tempstr = TAB1;


mais

Citation :


Code :
  1. const unsigned short NewMap[10] = {0, 1, 1, 1, 1, 1, 1, 1, 0, 0};
  2. MapStruct LoadMap(char * name) // name vaut "New" à l'appel
  3. {
  4.     MapStruct map;
  5.     char * tempstr;
  6.     tempstr = (char *)malloc(32 * sizeof(char));
  7.     strcpy(tempstr, name);
  8.     strcat(tempstr, "Map" );
  9.     map->data = tempstr; // (façon de parler bien sûr :)
  10. }


 
En fait, je ne connais pas à l'avance le nom du tableau à utiliser...


On ne peut pas construire de nom de variable en C.
 
Par contre, on peux 'lier' une chaine avec un objet dans un tableau de structure, mais c'est évidemment déterministe. Si le nom est inconnu, on n eva pas créer l'objet associé ex-nohilo, à moins qu'on demande à faire une sorte de création dynamique d'objet nommé... Pour quoi faire, avec quels bvaeirs ? Je ne vois pas bien encore...
 
Tu m'as l'air d'avoir beaucoup utilisé les langages interprétés, et d'avoir du mal avec le coté 'monolithique' d'une application écrite en C...
 
Que veux-tu faire exactement ? La solution est probablement plus simple que tu ne le penses si le problème est exposé clairement.
 

Citation :

AJOUT >>>
Dans le code que tu m'as fourni, tempstr devrait être de type (unsigned short *) plutôt que (char *) non ?

Oui! J'ai tapé un peu vite, désolé. Comme ça, je vois que tu ne dors pas. C'est bien. Code corrigé.


Message édité par Emmanuel Delahaye le 24-05-2005 à 16:21:14

---------------
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 24-05-2005 à 17:06:39    

Je pense, qu'il a une variable "i" (par exemple) qui contient le numéro de TAB à utiliser
Donc tableau 1D :

Code :
  1. const unsigned short TAB1[10] =
  2. {
  3.    0, 1, 0, 1, 0, 1, 0, 1, 0, 1
  4. };
  5. const unsigned short TAB2[10] =
  6. {
  7.    1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  8. };
  9. int main()
  10. {
  11.   const unsigned short *tempstr;
  12.   int i = 1;
  13.   switch (i)
  14.   {
  15.     case 1:
  16.       tempstr = TAB1;
  17.       break;
  18.     case 2:
  19.       tempstr = TAB2;
  20.       break;
  21.   }
  22.   // utilisation
  23.   tempstr[0];
  24.   tempstr[1];
  25.   ...
  26. }


Et tableau 2D :

Code :
  1. const unsigned short TAB[2][10] = {
  2.   {0, 1, 0, 1, 0, 1, 0, 1, 0, 1},
  3.   {1, 1, 1, 1, 1, 1, 1, 1, 1, 1} 
  4. };
  5. int main()
  6. {
  7.   int i = 0;
  8.   const unsigned short *tempstr = TAB[i]; // éventuellement i - 1
  9.   // utilisation comme au dessus
  10.   tempstr[0];
  11.   tempstr[1];
  12.   ...
  13. }

Reply

Marsh Posté le 24-05-2005 à 17:07:25    

Emmanuel Delahaye a écrit :


On ne peut pas construire de nom de variable en C.


Ben voilà topic clos, c'est surtout ça que je cherchais à savoir :D
 
Sinon pour info, mon environnement de dev : cross-compiler GCC 3.0 / cible ARM7, éditeur propriétaire.
Le cible est une GBA, donc ni OS ni système de fichier (encore que...)
 
Du coup, je pense que je vais opter pour la solution du "je connais mon nom de variable à l'avance", car la lecture dans un fichier du genre INI me bouffe trop de RAM (32 ko dispo seulement), c'est d'autant plus dommage que j'ai beaucoup de place en ROM... Je pensais meme, à un moment, utiliser ta lib ;)
 
Je pense que ça simplifiera les choses comme ça.

Reply

Marsh Posté le 24-05-2005 à 17:09:20    

Tarabiscote a écrit :

Je pense, qu'il a une variable "i" (par exemple) qui contient le numéro de TAB à utiliser


 
Voilà, je pense que je vais utiliser cette solution, la "1D" :)
Je n'utiliserai pas l'autre car, meme si elle correspond davantage à ce que je voulais, le contenu de mes tableaux sont générés par un éditeur graphique de maps, c'est plus simple ainsi ;)


Message édité par maestun le 24-05-2005 à 17:10:08
Reply

Sujets relatifs:

Leave a Replay

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