π
<-

Problème utilisation va_list et conversion double/float

C, C++, ASM...

Problème utilisation va_list et conversion double/float

Unread postby Lepzulnag » 24 Sep 2012, 16:02

Bonjour ! :)

J'utilise dans un de mes programmes la structure va_list qui permet d'envoyer un nombre variable d'éléments à une fonction, comme on le fait avec printf. J'attends trois types de valeurs : des int, des char * (des strings), et des float.

Cependant mon compilateur se plaignait qu'il ne pouvait pas prendre en compte des int, mais seulement des floats. Voici donc ce que j'ai fait :

Code: Select all
      char c;

      while ((c=elements[x++])) {
         if (c == '-') {
            if (!(c=elements[x++]))
               break;
            if         (c == 'i') Table_AddInt(va_arg(v1, int));
            else if   (c == 'f')   Table_AddFloat((float) va_arg(v1, double));
            else if   (c == 's')   Table_AddString(va_arg(v1, char *));
         }
      }


Par exemple, si elements = "-i -i -s -f -i", alors les arguments sont 2 entiers, 1 chaîne de caractères, 1 flottant et 1 entier.

Cela marche parfaitement avec les entiers et les chaînes de caractères, mais avec les flottants cela bug complètement, bien que le compilo soit content. Il enregistre dans le flottant 0.0000000 et les valeurs suivantes sont erronées.

Ce qui m'étonne le plus, c'est que les valeurs qui suivent sont fausses. :~o

Bref, j'ai retourné ce problème nombre de fois et je n'en trouve pas la solution. Je viens mendier un peu de savoir sur les va_list et l'utilisation des double. Peut-être fais-je quelque chose de mal ?

Merci d'avance.
User avatar
Lepzulnag
Niveau 9: IC (Compteur Infatigable)
Niveau 9: IC (Compteur Infatigable)
Level up: 78.5%
 
Posts: 151
Joined: 02 Aug 2012, 21:15
Location: Bretagne
Gender: Not specified
Calculator(s):
MyCalcs profile
Class: M2 Maths

Re: Problème utilisation va_list et conversion double/float

Unread postby Lionel Debroux » 24 Sep 2012, 17:38

Il faudrait que tu nous postes le code complet (et le Makefile), puis vérifier le code assembleur généré - mais je crains que tu soies en train de te heurter à une des limitations de la programmation en code natif sur Nspire.
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
User avatar
Lionel DebrouxSuper Modo
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 11.3%
 
Posts: 6869
Joined: 23 Dec 2009, 00:00
Location: France
Gender: Male
Calculator(s):
MyCalcs profile
Class: -
GitHub: debrouxl

Re: Problème utilisation va_list et conversion double/float

Unread postby critor » 24 Sep 2012, 18:21

Les va_list du code source Doom, j'ai du les supprimer/contourner pour nDoom.

J'ai eu beau tourner dans tous les sens, j'ai eu absolument tout et n'importe quoi, sauf ce que j'attendais.
Image
User avatar
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Level up: 51.4%
 
Posts: 42257
Images: 16712
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
MyCalcs profile
YouTube: critor3000
Twitter: critor2000
GitHub: critor

Re: Problème utilisation va_list et conversion double/float

Unread postby Lepzulnag » 24 Sep 2012, 20:08

Bon alors voici le code concerné (on enregistre les données fournies par l'utilisateur dans 1--,2--, 3-- et 4--. A 5-- on affiche ce qui a été enregistré) :

1-- on utilise la va_list :

Code: Select all
      char c;
      va_list v1;
      va_start(v1, elements);
      
      while ((c=elements[x++])) {
         if (c == '-') {
            if (!(c=elements[x++]))
               break;
            if         (c == 'i') Table_AddInt(w, va_arg(v1, int));
            else if   (c == 'f') Table_AddFloat(w, (float) va_arg(v1, double));
            else if   (c == 's') Table_AddString(w, va_arg(v1, char *));
         }
      }
      
      va_end(v1);


2-- la fonction Table_AddFloat (les fonctions Table_AddInt et Table_AddStr sont similaires) :

Code: Select all
int Table_AddFloat(Widget *table, float value)
{
   return Table_AddExFloat(table, value, -1, NULL, 0);
}


3-- la fonction Table_AddExFloat (les fonctions Table_AddExInt et Table_AddExStr sont similaires) :

Code: Select all
int Table_AddExFloat(Widget *table, float value, int alignment, nSDL_Font *font, Uint32 background)
{
   char val[4];
   memcpy(val, &value, 4);
   return Table_AddElement(table, ELEMENT_FLOAT, val, alignment, font, background);
}


4-- En gros, table_AddElement fait ceci :

Code: Select all
   memcpy(newElement->value, value, 4);

où value est val fournie parTable_AddExFloat.

5-- Ecriture à l'écran des données :

Code: Select all
      void *val = el->value;
      char str[100];
      int el_w;
      int str_x;
      int alignment;

      if (el->type == ELEMENT_INT)
         sprintf(str, "%100i", *((int *) val));
      else if (el->type == ELEMENT_FLOAT)
         sprintf(str, "%100f", *((float *) val));
      else if (el->type == ELEMENT_STRING)
         sprintf(str, "%100s", *((char **) val));

...

      nSDL_DrawString(scr, el->font? el->font : theme->font, str_x, cell.y + 2, str);


Je n'ai pas tout explicité dans cette dernière fonction, seulement mis ce qui importait.


-- Et enfin le makefile :

Code: Select all
SOURCES = test.c Label.c common.c BasicLayout.c Check.c theme.c keys.c Panel.c scrollbar.c Table.c Pixmap.c
TARGET = test.tns
OBJECTS = $(SOURCES:.c=.o)

CC = nspire-gcc
LD = nspire-ld
OBJCOPY = arm-none-eabi-objcopy
CFLAGS = -Wall -Wextra -Ofast
LDFLAGS =
LIBS = -lSDL

all: $(TARGET)

$(TARGET): $(OBJECTS)
   $(LD) $(LDFLAGS) $^ $(LIBS) -o $(@:.tns=.elf)
   $(OBJCOPY) -O binary $(@:.tns=.elf) $(TARGET)

.c.o:
   $(CC) $(CFLAGS) -c $< -o $@

clean:
   rm -f $(OBJECTS) $(TARGET:.tns=.elf) $(TARGET)
User avatar
Lepzulnag
Niveau 9: IC (Compteur Infatigable)
Niveau 9: IC (Compteur Infatigable)
Level up: 78.5%
 
Posts: 151
Joined: 02 Aug 2012, 21:15
Location: Bretagne
Gender: Not specified
Calculator(s):
MyCalcs profile
Class: M2 Maths

Re: Problème utilisation va_list et conversion double/float

Unread postby Lepzulnag » 26 Sep 2012, 17:51

Bon de toute façon, comme le montre le témoignage de Critor (qui a eu les même problèmes que moi avant moi :D ), il y a des bugs avec les va_list, donc ça ne cherche à rien de chercher plus loin. Je vais juste trouver une autre technique pour afficher des flottants.

Merci à vous.
User avatar
Lepzulnag
Niveau 9: IC (Compteur Infatigable)
Niveau 9: IC (Compteur Infatigable)
Level up: 78.5%
 
Posts: 151
Joined: 02 Aug 2012, 21:15
Location: Bretagne
Gender: Not specified
Calculator(s):
MyCalcs profile
Class: M2 Maths

Re: Problème utilisation va_list et conversion double/float

Unread postby critor » 26 Sep 2012, 17:54

Tu peux faire 5 fonctions... une avec 1 argument, une avec 2 arguments, etc...

Ou sinon, si tu aimes les tableaux et pointeurs, tu passes 2 arguments à ta fonction: un float* et le nombre de float.
Image
User avatar
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Level up: 51.4%
 
Posts: 42257
Images: 16712
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
MyCalcs profile
YouTube: critor3000
Twitter: critor2000
GitHub: critor


Return to Native: Ndless, Linux, ...

Who is online

Users browsing this forum: ClaudeBot [spider] and 12 guests

-
Search
-
Social TI-Planet
-
Featured topics
Comparaisons des meilleurs prix pour acheter sa calculatrice !
"1 calculatrice pour tous", le programme solidaire de Texas Instruments. Reçois gratuitement et sans aucune obligation d'achat, 5 calculatrices couleur programmables en Python à donner aux élèves les plus nécessiteux de ton lycée. Tu peux recevoir au choix 5 TI-82 Advanced Edition Python ou bien 5 TI-83 Premium CE Edition Python.
Enseignant(e), reçois gratuitement 1 exemplaire de test de la TI-82 Advanced Edition Python. À demander d'ici le 31 décembre 2024.
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
1234
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...
Donate
Discover the the advantages of a donor account !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partner and ad
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
1578 utilisateurs:
>1544 invités
>29 membres
>5 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Other interesting websites
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)