Absturz nach ca 1min - C & SDL2 & ANDROID



  • Die von beiden Versionen benutzte eigene headerdatei itoa.h

    #include <math.h>
    #include <stdio.h>
    
    // int num2[];
    // int num = 54;
    
    // main()
    // {
    // printf ("num = %c \n", num);
    
    // itoa(num, num2);
    
    // printf ("num2 = %s", num2);
    // }
    
    // char* itoa(int num)
    // { 
    //     /* log10 (num) gibt die anzahl von stellen an; +1 für den \0 terminator */
    //     int size = log10(num) + 1;
    //     char *z = malloc(size);
    //     snprintf(z, size, "%d", num);
    // }  
    
    int reverse(s)          /* s an Ort und Stelle umkehren */
    char s[];
    {
              int c, i, j;
    
              for (i = 0, j = strlen(s)-1; i < j; i++, j--) {
                      c = s[i];
                      s[i] = s[j];
                      s[j] = c;
              }
    }
    
    int itoa(n, s)          /* n in Zeichenkette s umwandeln */
    char s[];
    int n;
    {
            int i, sign;
    
            if ((sign = n) < 0)          /* Vorzeichen notieren */
                    n = -n;                   /* n positiv machen */
            i = 0;
            do {                               /* Ziffern von rechts her generieren */
                    s[i++] = n % 10 + '0';        /* nächste Ziffer */
            } while ((n /= 10) > 0);             /* entfernen */
            if (sign < 0)
                    s[i++] = '-';
            s[i] = '\0';
            reverse(s);
    }
    
    void cleanup(void)
    {
        SDL_DestroyWindow(sdlWindow);
        SDL_DestroyTexture(sdlTexture);
        // SDL_DestroyTexture(tempTexture);
        //IMG_Quit();
        TTF_Quit();
        SDL_DestroyRenderer(sdlRenderer);
        SDL_Quit();
       // return 0;
    }
    


  • Compiler Output:

    /data/data/com.n0n3m4.droidc/files/temp.c:26:1: warning: return type defaults to 'int'
    main()
    ^
    /data/data/com.n0n3m4.droidc/files/temp.c: In function 'main':
    /data/data/com.n0n3m4.droidc/files/temp.c:207:21: warning: passing argument 2 of 'TTF_RenderText_Blended' from incompatible pointer type
    text = TTF_RenderText_Blended(font, digit1, color); // Text
    ^
    In file included from /data/data/com.n0n3m4.droidc/files/temp.c:14:0:
    /data/data/com.n0n3m4.droidc/files/gcc/arm-linux-androideabi/include/SDL2/SDL_ttf.h:203:39: note: expected 'const char *' but argument is of type 'int *'
    extern DECLSPEC SDL_Surface * SDLCALL TTF_RenderText_Blended(TTF_Font *font,
    ^
    /data/data/com.n0n3m4.droidc/files/temp.c:213:21: warning: passing argument 2 of 'TTF_RenderText_Solid' from incompatible pointer type
    text = TTF_RenderText_Solid(font, digit2, color); // Text
    ^
    In file included from /data/data/com.n0n3m4.droidc/files/temp.c:14:0:
    /data/data/com.n0n3m4.droidc/files/gcc/arm-linux-androideabi/include/SDL2/SDL_ttf.h:160:39: note: expected 'const char *' but argument is of type 'int *'
    extern DECLSPEC SDL_Surface * SDLCALL TTF_RenderText_Solid(TTF_Font *font,
    ^
    /data/data/com.n0n3m4.droidc/files/temp.c:241:21: warning: passing argument 2 of 'TTF_RenderText_Blended' from incompatible pointer type
    text = TTF_RenderText_Blended(font, digit3, color); // Text
    ^
    In file included from /data/data/com.n0n3m4.droidc/files/temp.c:14:0:
    /data/data/com.n0n3m4.droidc/files/gcc/arm-linux-androideabi/include/SDL2/SDL_ttf.h:203:39: note: expected 'const char *' but argument is of type 'int *'
    extern DECLSPEC SDL_Surface * SDLCALL TTF_RenderText_Blended(TTF_Font *font,
    ^
    /data/data/com.n0n3m4.droidc/files/temp.c:247:21: warning: passing argument 2 of 'TTF_RenderText_Solid' from incompatible pointer type
    text = TTF_RenderText_Solid(font, digit4, color); // Text
    ^
    In file included from /data/data/com.n0n3m4.droidc/files/temp.c:14:0:
    /data/data/com.n0n3m4.droidc/files/gcc/arm-linux-androideabi/include/SDL2/SDL_ttf.h:160:39: note: expected 'const char *' but argument is of type 'int *'
    extern DECLSPEC SDL_Surface * SDLCALL TTF_RenderText_Solid(TTF_Font *font,
    ^
    /data/data/com.n0n3m4.droidc/files/temp.c: At top level:
    /data/data/com.n0n3m4.droidc/files/temp.c:19:5: warning: array 'digit1' assumed to have one element
    int digit1[], digit2[], digit3[], digit4[];
    ^
    /data/data/com.n0n3m4.droidc/files/temp.c:19:15: warning: array 'digit2' assumed to have one element
    int digit1[], digit2[], digit3[], digit4[];
    ^
    /data/data/com.n0n3m4.droidc/files/temp.c:19:25: warning: array 'digit3' assumed to have one element
    int digit1[], digit2[], digit3[], digit4[];
    ^
    /data/data/com.n0n3m4.droidc/files/temp.c:19:35: warning: array 'digit4' assumed to have one element
    int digit1[], digit2[], digit3[], digit4[];
    ^



  • Nur zwei kleine Sachen ohne den Code wirklich begutachtet zu haben: Warum implementierst du deine eigene Variante von itoa? Siehe: http://www.cplusplus.com/reference/cstdlib/itoa/
    Und: Warum sind digit1, etc. int-Arrays, wenn sie doch einen String aufnehmen sollen?



  • Muss ich irgendwo irgendwie den Speicher separat wider frei machen oder sowas? Steh da wie n Ochse vor nem Berg.

    Sorry für so viel Text...

    Anderes Equipment kann ich mir z.Z. nicht leisten. Und ich bitte um Geduld, falls noch Fragen sind, da ich nicht jeden Tag die Möglichkeit habe online zu gehen. Ich bin auf jeden Fall sehr dankbar für jeden Hinweis, jede Idee und jede Hilfestellung die ich bekommen kann!

    Danke im voraus! 🙂 🙂 🙂

    ;



  • Da du keinen Speicher direkt allokiert (angefordert) hast (über malloc, calloc, etc), musst du auch nichts frei machen. Die verschiedenen Datentypen sind dir nicht geläufig, kann das sein?

    Die Frage nach itoa bleibt. Ich weiß auch nicht so recht, was du mit Equipment meinst. Du hast einen Compiler, das reicht eigentlich auch schon aus (fürs Testing wäre natürlich ein Android-fähiges Gerät sinnvoll bzw. ein entsprechender Emulator).



  • Muss ich irgendwo irgendwie den Speicher separat wider frei machen oder sowas?

    Vor allen Dingen musst du erstmal überhaupt Speicher anfordern, Zeile 9 ist großer Müll.

    da ich nicht jeden Tag die Möglichkeit habe online zu gehen

    Schreibt Programme für Android und hat nicht die Möglichkeit, Online zu gehen.
    Schon lange nicht mehr solchen Müll gesehen.
    Troll.



  • Das hat mit privaten umständen bzw. lebensstiel zu tun. Für die meisten hier lebe ich warscheinlich hinter dem Mond. Das macht mich noch lange nicht zu einem Trol. Eben so wenig wie der umstand, das ich nicht viel ahnung habe. Was ich, wie der Nick vermuten läst nicht versuche zu verheimlichen. Aber trotzdem danke.



  • @ FoE
    Du hast recht. Habe ich nicht. Damit sollte ich mich erstmal beschäftigen richtig?



  • Am besten ein Tutorial oder besser gleich ein Buch zur Einführung lesen, verstehen und versuchen alles nachzumachen und herumzuexperimentieren. Entsprechende Buchempfehlungen und Linklisten gibt's hier im Forum.



  • Für was soll ich denn bitte sonst programme schreiben, wenn ich kein anderes Equip habe?

    Und natürlich weiss ich wofür die verschiedenen Datentypen stehen, aber habe mit der umwandlung probleme. es werden ja zahlen durch dir berührung erzeugt, ich brauche aber strings um sie mit SDL_ttf zu zeigen.

    Kann das aber meinen Absturz verursachen?


  • Mod

    -NoOoB- schrieb:

    @ FoE
    Du hast recht. Habe ich nicht. Damit sollte ich mich erstmal beschäftigen richtig?

    Ja, es soll ganz nützlich sein, die Sprache zu beherrschen, die man benutzt 🙂

    Gerade C ist ziemlich unverzeihlich, was selbst kleinste Fehler und Ungenauigkeiten angeht. Zumal einem Kenntnisse anderer Sprachen oder allgemeine Intuition in C öfters fehl leiten, muss man schon genau wissen, was man tut. C ist letztlich eine Sprache von Profis für Profis und eher ungeeignet für zufälliges Herumexperimentieren.

    Zu deinen Problemen, solltest du erst einmal alle Warnungen des Compilers wie Fehler behandeln. Der Compiler spricht besser C als du und kann jede Menge Unsinn erkennen, auch wenn dieser Unsinn streng genommen legales C ist (weswegen der Compiler nur warnt, dass etwas komisch aussieht, aber kein Fehler ist).

    Und natürlich weiss ich wofür die verschiedenen Datentypen stehen, aber habe mit der umwandlung probleme.

    Nein, du weißt nicht genug über Datentypen, das zeigt direkt der zweite Teil deines Satzes.

    Kann das aber meinen Absturz verursachen?

    Natürlich kann es das. Schließlich versuchst du Daten so zu benutzen, als wären sie komplett andere Daten. Was sollte sonst passieren? Eine magische Umwandlung?

    Aber es heißt nicht, dass dies das einzige Problem in deinem Code wäre.



  • Muss morgen sehr früh raus und bin auch mehr als müde...
    Ich denke ich schaff es morgen abend wider hier zu schaun. Für alle die bis dahin hier sinnvolle posts LEISTEN:

    DANKE!!!



  • Ok, krit angenommen. Dann bring ich euch nehme ich an mit meiner letzten frage für heute richtig zum lachen.

    Wo lerne ich denn am besten, was mein compiler mir sagt?

    Bin dank C4Droid ide verwöhnt und habe keine ahnung wie ich die compiler output informationen nutzen/umsetzen kann...

    Bisher hab ich alles andere (ohne SDL) immer erraten. keine Probleme.

    Also, gute nacht und bis morgen...


  • Mod

    Wo lerne ich denn am besten, was mein compiler mir sagt?

    Lesen? Der GCC hat doch extrem hilfreiche Fehlermeldungen. Clang hat auch sehr gute, eventuell sogar bessere. Aber so etwas wie

    /data/data/com.n0n3m4.droidc/files/temp.c: In function 'main':
    /data/data/com.n0n3m4.droidc/files/temp.c:207:21: warning: passing argument 2 of 'TTF_RenderText_Blended' from incompatible pointer type
                  text = TTF_RenderText_Blended(font, digit1, color);   // Text
                         ^
    In file included from /data/data/com.n0n3m4.droidc/files/temp.c:14:0:
    /data/data/com.n0n3m4.droidc/files/gcc/arm-linux-androideabi/include/SDL2/SDL_ttf.h:203:39: note: expected 'const char *' but argument is of type 'int *'
     extern DECLSPEC SDL_Surface * SDLCALL TTF_RenderText_Blended(TTF_Font *font,
    

    ist doch wohl ziemlich eindeutig. Es nennt dir den Ort (In function 'main', temp.c, Zeile 207, Spalte 21); den Grund (passing argument 2 of 'TTF_RenderText_Blended' from incompatible pointer type); zeigt noch einmal genau die Stelle; und gibt dann noch einen hilfreichen Hinweis, wo die unpassende Stelle steht (SDL_ttf.h (included von temp.c Zeile 14, Spalte 0), Zeile 203, Spalte 39); was dort steht; und was da dran nicht passt (expected 'const char *' but argument is of type 'int *'). Was willst du da noch mehr? Du wirst ja geradezu überschüttet mit Hinweisen, was das Problem ist.



  • /data/data/com.n0n3m4.droidc/files/temp.c: At top level:
    /data/data/com.n0n3m4.droidc/files/temp.c:19:5: warning: array 'digit1' assumed to have one element
    int digit1[], digit2[], digit3[], digit4[];
    ^
    /data/data/com.n0n3m4.droidc/files/temp.c:19:15: warning: array 'digit2' assumed to have one element
    int digit1[], digit2[], digit3[], digit4[];
    ^
    /data/data/com.n0n3m4.droidc/files/temp.c:19:25: warning: array 'digit3' assumed to have one element
    int digit1[], digit2[], digit3[], digit4[];
    ^
    /data/data/com.n0n3m4.droidc/files/temp.c:19:35: warning: array 'digit4' assumed to have one element
    int digit1[], digit2[], digit3[], digit4[];

    deine Arrays haben keinen Speicherplatz d.h. du schreibst schoen ueber deinen Speicher drueber mit Random-Absturz-Ergebnis nach Zeit x - deine Kompiler-Warnungen sagen das ueberdeutlich - solange da Warnungen kommen ist was falsch - und einfach den Fehler weg-casten wird dir nicht helfen



  • deine Arrays haben ein int Speicher - aber die ganze "alte" Schreibweise ist echt verwirrend

    jetzt machst du ein neues Programm und bringst Stück für Stück kleine Teile aus deinem jetzigen da hin - zwischen jedem Teil schön lange testen

    1. SDL-Initialisierung
    2. erstmal nur die puren Werte vom Touch holen
    3. Ausgabe

    jeden Schritt einzeln Testen, Warnung nicht akzeptieren und sauber lösen - dann läuft dein Programm bald - jetzt sind es gerade zu viele Fehler auf einmal



  • clear = SDL_LoadBMP("resources/startbild.bmp");

    wo ist das FreeSurface dazu? könnte in der while-Schleife auch ganz schön Resourcen braucen



  • TTF_RenderText_... liefern immer eine NEUE Surface - du gibts nur eine davon (die letzte) frei

    text = TTF_RenderText_Blended(font, digit1, color); hier wird ein char* String erwartet - du gibts einfach einen int rein???

    usw, usw, usw



  • Oh man, da hab ich ja erstmal gut was zu tun 🙂 ... vielen Dank dafür!

    -Also ich werde den Rat beherzigen, das Ganze neu von Begin zusammen zu puzzeln und ausgiebig zu testen.

    -Und natürlich zieh ich mir Datentypen nochmal genauer zu Gemüt.

    -Copileroutput (warnung) wird ab sofort nicht mehr toleriert.

    Auch meine anderen Programme werden da durch müssen 😉 (also wirklich viel zu tun)...

    -----------------------------------------------------------------------

    Meine "alte" schreibweise kommt bestimmt aus dem K&R-Buch, tut mir leid dafür. Wo bekomme ich ein/en Beispiel/Einblik in "aktuellem" Stil?

    Bei dem Textsurface... heuft sich also Müll im ram an, wenn ich es nicht direckt nach der Nutzung sondern erst am Ende nach allen Nutzungen frei mache?

    Und meine Zeile 9... das ich den Datentyp int benutzt habe war so eine art Kettenreaktion. Ich hab es echt erst mit strings probiert, aber das hat (irgendwie (sorry)) nicht funktioniert. Weiss -natürlich- nicht warum. Hab auch noch andere Wege versucht und (für mich) hatte nur dieser so funktioniert. (Wollte also die ints aus den Koordinaten direkt in strings umwandeln (casten?))
    Das heisst, wenn ich mein Programm ausseinander nehme und testend neu zusammen füge, werde ich trozdem dieses Verständnissproblem immernoch haben. Also, wie gehe ich besser mit genau DIESEM Problem/Fehler um?

    Ja ich weiss, erschiessen! Aber das ist mir zu radikal.
    itoa als Funktion brauche ich dabei trotzdem; richtig?



  • -Copileroutput (warnung) wird ab sofort nicht mehr toleriert.

    aber die Warnung bitte nicht Tod/Weg-casten - damit zwingst du nur deinen Kompiler das Problem zu ignorieren - richtig Lösen

    Meine "alte" schreibweise kommt bestimmt aus dem K&R-Buch, tut mir leid dafür. Wo bekomme ich ein/en Beispiel/Einblik in "aktuellem" Stil?

    ein C99 (oder auch älter) Standard-Buch kaufen, im Internet suchen - K&R-Bücher findest du nur noch auf dem Flohmarkt

    Bei dem Textsurface... heuft sich also Müll im ram an, wenn ich es nicht direckt nach der Nutzung sondern erst am Ende nach allen Nutzungen frei mache?

    https://www.libsdl.org/projects/docs/SDL_ttf/SDL_ttf_44.html

    "Returns: a pointer to a new SDL_Surface. NULL is returned on errors."

    da steht nichts von re-use oder sowas - und die Parameter der Funktion reichen so weit ich das sehe nicht aus irgendwas zu re-usen

    https://wiki.libsdl.org/SDL_LoadBMP

    "Returns a pointer to a new SDL_Surface structure or NULL if there was an error;"

    itoa als Funktion brauche ich dabei trotzdem; richtig?

    ja brauchst du (aber bitte die fertige Implementation aus dem Standard) - int wird in "Computer-Art" vorgehalten - du willst aber die menschlich lesbare Form davon - also als Zeichenkette

    http://www.cplusplus.com/reference/cstdlib/itoa/

    und schau dir mal an was im dem Beispiel in Zeile 8 gemacht wird - char buffer [33]; - fester Puffer fuer 32 Zeichen +1 fuer die Abschluss 0

    oder auch mit sprintf

    http://www.cplusplus.com/reference/cstdio/sprintf/

    weitere Tips:

    mach mehr Funktionen:

    text = TTF_RenderText_Solid(font, "LastTP", color);   // Text 
    SDL_Rect rect9 = { 14, 174, 0, 0 };   // Textposition 
    SDL_BlitSurface(text, NULL, windowsurface, &rect9);
    

    koenntest du z.B. in eine put_solid_text(font, text, color, left, top) Funktion
    umbauen und dann x mal nutzen - würde deinen Code sehr viel kleiner machen

    immer initialisieren:
    und auf jeden Fall jede Variable sofort initalisieren - und wenn du Free oder sonstige Handle/Pointer-Freigaben verwendest sofort danach deine Variable auf 0 setzen (oder passenden Initalwert) - auch wenn du sie dann nicht mehr nutzt - sicher ist sicher

    es gibt da auch nette Tools die unterstützen wie z.B.

    AddressSanitizer (und andere Sanitizer) von clang oder gcc
    http://cppcheck.sourceforge.net/
    http://www.viva64.com/en/pvs-studio/
    http://valgrind.org/

    aber jetzt erstmal die Dokus richtig lesen dann klappt das schon


Anmelden zum Antworten