Verückte Typumwandlung



  • Hi,
    Der folgende Codeausschnitt erscheint mir nicht fehlerhaft, aber es kommen andere Ergebnisse als ich erwarte. Was könnte falsch sein?

    void update_bullet(bullet *b)
    {
    	int x, y;
    	float px, py, r;
    	y = (int)(b->y) - b->r; 
    	x = (int)(b->x) - b->r;
    

    Kurz zum Problem, b->x und b->y sind vom Typ float und ein Element einer bullet Struktur, auf die der Zeiger b zeigt. b->r ebenso, aber es ist vom Typ int. Alle werte sind zu beginn der Funktion relativ klein, aber x und y sind nach der Zuweisung astronomisch hoch.
    Ich habe versucht das ganze zu debuggen. Da sagen Bilder mehr als hundert Worte. Ich weiß wirklich nicht was da schief läuft. Wenn ich mit F11 schritt für Schritt durch den Code gehen will, kriege ich eine Fehlermeldung, die sich auf FtoI2.asm bezieht. Was nun?

    zur Refferenz noch die Struct Definition

    struct bullet
    {
    	float x, y;
    	int r;
    };
    typedef struct bullet bullet;
    

    ich weiß nicht, ob das das Richtige Board ist, um diese Frage zu stellen. Da MSVC 2008 express eigentlich ANSI-C konform sein sollte, denke ich bin hier richtig zu sein.
    Ich linke mit SDL und tinyPTC, aber das folgende Testprogramm liefert das gewünschte Ergebnis.

    #include <stdlib.h>
    #include <stdio.h>
    #include "tinyptc.h"
    #include "SDL.h"
    
    void
    ptc_cleanup_callback (void)
    {
      fprintf (stderr, "Callback!\n");
    }
    
    struct bullet
    {
    	float x, y;
    	int r;
    };
    typedef struct bullet bullet;
    
    int main()
    {
    	int x, y;
    	float px, py, r;
    	bullet *b;
    	b=malloc(sizeof(bullet));
    	b->x=169.75963;
    	b->y=96.712952;
    	b->r=5;
    	y = (int)(b->y) - b->r; 
    	x = (int)(b->x) - b->r;
    	printf("x: %i\ny:%i", x, y);
    	getchar();
    	return 0;
    }
    

    EDIT: das ganze hat eben zweimal geklappt, die Funktion wird aber mehrmals in einer Schleife aufgerufen, dann lief wieder nichts.



  • Bin jetzt zu faul um zu rätseln, was Du eingentlich genau erreichen willst, aber mir scheint es etwas widersinnig, dass Du einerseits im struct x und y als floats hast, und sie dann bei Berechnungen auf int rundest.

    Und wozu sind die lokalen px,py,r gut?

    Es werden irgendwo riesige Integer-Zahlen ausgegeben? Bist Du sicher, dass nicht floats von printf als Integer ausgegeben wird (printf ist ja der Typ egal, das Formatstring ist nicht typsicher - allerdings warnen modernde/gute Compiler).

    Also z.B.:

    float f=-1.345345;
    printf("meine Lieblingszahl ist %i\n", f);
    

    printf(char* format, ...) ist es völlig wurscht, was für Typen da per Ellipse auf dem Stack landen. Es hält sich stur an die Typen im Formatstring.

    Es wird in dem Beispiel oben sicher eine absurd große Integerzahl ausgegeben, weil Vorzeichenbit/Mantisse/Exponent/ in der float-Darstellung für "hochwertige" Bits sorgen dürften, auch wenn der Betrag der float Zahl klein ist.

    Wie gesagt: mir ist nicht ganz klar, was Deine Kugeln genau treiben sollen (Ballerspiel, Simulation der Flugbahn eines Geschoss'?).

    Aber es sieht sehr seltsam aus, wie Du ints und floats durcheinander benutzt.



  • genau, die kugeln sind geschosse und deren bahn wird mit sinus funktionen berechnet, daher ist ein preäzises ergebniss wichtig, der screenbuffer ist hingegen ein integer array und speichert die pixelwerte.
    mit printf hat das erste beispiel nicht viel zu tun und beim zweiten gibts nichts zu beanstanden.
    Das beste ist, dass es jetzt läuft, nachdem ich einen anderen fehler entdeckt habe, der für die endlosschleife verantwortlich war. wie ich beim debuggen überhaupt an der schleife vorbei gekommen bin weiß ich allerdings nicht.


Log in to reply