Page 1 of 1

Nombres flottants & librairie statique

Unread postPosted: 06 May 2014, 15:12
by Lepzulnag
Bonjour à tous,

le problème des nombres flottants en programmation ndless est depuis longtemps connu : je ne m'étendrai pas sur le sujet mais ils sont tout simplement inutilisables, ce qui rend impossible l'utilisation de toutes librairies qui demandent en argument de leur fonction un float ou un double (dans mon cas, c'est la librairie SDL_rotozoom, que j'aimerais utiliser).

Cependant je remarquais que SDL_primitives, qui permet d'afficher des graphiques complexes à l'écran, marchait correctement (lignes diagonales, ellipses, polygones, etc...). Or si je ne me trompe pas, des floats (ou double) sont utilisés pour l'affichage de ces figures, non ?

Je me suis alors dit que j'allais créer une librairie sans utiliser le compilateur ndless, qui convertit des floats en int et réciproquement, de telle sorte qu'en programmant avec ndless je n'ai a utilisé que des int.
Le problème, c'est que la librairie statique que j'ai créé contient des fichiers .o de type "MS Windows COFF Intel 80386 object file", alors que ne sont reconnus par le compilateur ndless que des fichiers de type "ELF 32-bit LSB...". Dois-je mettre une option particulière lorsque je compile afin d'obtenir le bon type de fichiers objets ?

Je compile avec MingW et gcc, et voici mon makefile, il est tout simple :

Code: Select all
SOURCES = $(wildcard *.c)
EXEC = testIntConvertor.exe
OBJECTS = $(SOURCES:.c=.o)

CC = gcc
CFLAGS = -Wall
LIBS = -lmingw32

all: $(EXEC)

$(EXEC): $(OBJECTS)
   $(CC) $(CFLAGS) -o $@ $^ $(LIBS)

.c.o:
   $(CC) $(CFLAGS) -c $< -o $@ $(TARGET)
   
clean:
   rm -rf *.o

Re: Nombres flottants & librairie statique

Unread postPosted: 06 May 2014, 16:23
by Levak
Je ne saurais répondre à ta question, cependant, j'aimerais revenir sur ce point :

le problème des nombres flottants en programmation ndless est depuis longtemps connu : je ne m'étendrai pas sur le sujet mais ils sont tout simplement inutilisables, ce qui rend impossible l'utilisation de toutes librairies qui demandent en argument de leur fonction un float ou un double (dans mon cas, c'est la librairie SDL_rotozoom, que j'aimerais utiliser).

Non, c'est simplement les nombres flottants passés à des syscalls, ce qui représente presque qu'exclusivement *printf.

Re: Nombres flottants & librairie statique

Unread postPosted: 06 May 2014, 17:02
by Lepzulnag
Mmh dans ce cas je ne comprends pas pourquoi les fonctions rotozoom n'ont eu aucun effet. Ca doit être une erreur de ma part, je vais aller re-tester cela en profondeur, et tiens au courant.

Merci :)

Re: Nombres flottants & librairie statique

Unread postPosted: 06 May 2014, 17:11
by Levak
Lepzulnag wrote:Ca doit être une erreur de ma part, je vais aller re-tester cela en profondeur, et tiens au courant.

Pour debugguer des flottants, utilise une technique stupide mais efficace :
Code: Select all
#define QUOTE_X(X) #X
#define QUOTE(X) QUOTE_X(X)
#define FLOAT_DIGITS 5
#define FLOAT_POWER 100000
#define FF "%d.%0" QUOTE(FLOAT_DIGITS) "d"
#define FLOAT(X) ((int)(X)), (int)(((X) - (int)(X)) * FLOAT_POWER)

...

printf("MyFloat : " FF "\n", FLOAT(42.42f));

Re: Nombres flottants & librairie statique

Unread postPosted: 06 May 2014, 17:27
by Lepzulnag
Joli le code pour tester les floats, merci ;)
Sinon c'est bien moi qui avait fait n'importe quoi, les fonctions de rotozoom marchent parfaitement bien.

Topic résolu donc, sauf si quelqu'un sait répondre à ma question sur les types de .o et la façon dont les générer. Bien que le problème ne se pose plus pour moi et pour le moment, peut-être qu'un jour il redeviendra d'actualité.

Re: Nombres flottants & librairie statique

Unread postPosted: 06 May 2014, 17:38
by Levak
Lepzulnag wrote:Joli le code pour tester les floats, merci ;)

J'ai édité 5 ou 6 fois, la dernière étant en ayant finalement testé avec gcc.