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

  FORUM HardWare.fr
  Programmation
  C

  [C] Nom de variable inconnu lors de la compilation

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Nom de variable inconnu lors de la compilation

n°1094626
maestun
Posté le 24-05-2005 à 11:22:25  profilanswer
 

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

mood
Publicité
Posté le 24-05-2005 à 11:22:25  profilanswer
 

n°1094634
WhatDe
Posté le 24-05-2005 à 11:26:38  profilanswer
 

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


?


---------------
[:whatde]
n°1094682
maestun
Posté le 24-05-2005 à 11:45:47  profilanswer
 

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

n°1094729
skelter
Posté le 24-05-2005 à 12:08:07  profilanswer
 

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

n°1094817
maestun
Posté le 24-05-2005 à 12:53:04  profilanswer
 

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
n°1094858
afbilou
pouet your life
Posté le 24-05-2005 à 13:29:00  profilanswer
 

Les pointeurs sont fait pour ca ...

n°1094863
maestun
Posté le 24-05-2005 à 13:32:28  profilanswer
 

C'est à dire ?

n°1094865
Tarabiscot​e
Posté le 24-05-2005 à 13:33:47  profilanswer
 

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}  
};

n°1094883
maestun
Posté le 24-05-2005 à 13:43:46  profilanswer
 

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 ?

n°1094902
skelter
Posté le 24-05-2005 à 13:52:34  profilanswer
 

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

mood
Publicité
Posté le 24-05-2005 à 13:52:34  profilanswer
 

n°1094934
Emmanuel D​elahaye
C is a sharp tool
Posté le 24-05-2005 à 14:08:55  profilanswer
 

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/
n°1095024
maestun
Posté le 24-05-2005 à 14:48:24  profilanswer
 

>>> 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
n°1095040
skelter
Posté le 24-05-2005 à 14:54:37  profilanswer
 

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

n°1095177
Emmanuel D​elahaye
C is a sharp tool
Posté le 24-05-2005 à 16:03:00  profilanswer
 

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/
n°1095299
Tarabiscot​e
Posté le 24-05-2005 à 17:06:39  profilanswer
 

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

n°1095300
maestun
Posté le 24-05-2005 à 17:07:25  profilanswer
 

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.

n°1095308
maestun
Posté le 24-05-2005 à 17:09:20  profilanswer
 

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

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

  [C] Nom de variable inconnu lors de la compilation

 

Sujets relatifs
Undefined variable incessante...[Makefile] Affecter le `stdout' d'une commande shell a une variable
Pb CompilationPasser une variable au travers une balise de lien...
[PERL] traduction variable dans chaine de caractèreiframe passage de variable
[vba excel] recuperer le nom d'une feuille dans une variableconserver une variable
[VBA pour Excel] Nom de userformQuel type de variable utiliser?
Plus de sujets relatifs à : [C] Nom de variable inconnu lors de la compilation


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