Absturz nach ca 1min - C & SDL2 & ANDROID



  • Hallo! Oder Hilfe?

    Vorvorvorweg:Ich vermute ich bin bestimmt im falschen Thread!?
    Hab leider keinen passenderen gefunden.
    Bitte um Entschuldigung und darum dies ggf. an die
    richtige Stelle zu verschieben. Danke.

    Vorvorweg: Es geht hier um C auf Android!

    Vorweg: Ja, ich habe google und auch dieses Forum durchsucht. Monate! Ehrlich.

    Ich bin kein IT-ler oder Kursteilnehmer irgend einer Schule aus diesem Bereich...

    Ich hab nur ein URur-altes buch von K&R (Deutsch) diverse Internetseiten incl. wikis konsumiert und mich versucht durch rumprobieren zu verbessern.

    Ich versuche schon etwas länger, mir in meiner recht geringen Freizeit die Fähigkeit zu programmieren anzueignen.
    "Rein geschaut" hab ich in Basic, Java, Pascal und C/C++, wobei ich allein in C mehr oder weniger zu Ergebnissen gekommen bin.

    (k.a warum.)

    Nach diversen kleineren (Konsolen) Programmen und Spielereien wollte ich mehr! Auf der Suche nach Möglichkeiten
    möglichst einfach Sound und Grafik zu nutzen bin ich auf SDL aufmerksam geworden.
    Nach etwas Einarbeitung hab ich dann auch hinbekommen Musik oder Klänge abzuspielen, Bilder zu zeigen, kleine Rechtecke, Linien oder Text auf den Screen zu rendern. Alles simpel in 2D gehalten. Für 3D bin ich noch längst nicht weit genug und da liegt auch z.Z. nicht mein Interesse.

    Soweit alles prima. Nun zu meinem Problem:

    ALLE MEINE Programme mit SDL2 laufen zwischen 30sec und ein paar Minuten und stürzen dann ab (beenden sich selbst)... 😞
    Das openGLes Beispiel "testgles" funktioniert aber problemlos.

    Woran könnte das liegen, oder besser noch: Was mache ich falsch?

    Ich habe ein eingeschränktes Equipment:

    Hardware:
    -Medion Lifetab E10318 (4 Kern a 1,61 GHz und 1GB RAM)
    -Kompatible Bluetooth Tastatur

    Software:
    -Andoid 4.2.2 (nicht gerootet)
    -C4Droid (aktuellste version mit allen Plugins)
    -DroidEdit Free

    Es ist ganz egal, ob ich meinen Code von C4Droid aus starte oder ihn als App exportiere, das Fehlerverhalten bleibt gleich.

    Damit ihr mir besser helfen könnt hab ich den Quellcode eines simplen Tools (TouchXY) ausgewählt, das einfach nur den Touchscreen ausliest und die Koordinaten anzeigt.

    Ich hab es in 2 Versionen versucht, nämlich einmal mit rendern und einmal mit blitten...
    Es wird noch eine -.ttf datei mit dem Namen schrift.ttf für beide Versionen benötigt und bei der Blittingversion ein -.bmp mit dem Namen Startbild.bmp. (Das Image ist einfach nur schwarz 820 * 480 pixel)

    Zum Code:



  • TouchXY blitting version:

    #include <stdlib.h>
    #include <string.h>
    #include <SDL2/SDL.h>
    #include "SDL2/SDL_ttf.h"
    
    int running;
    int xnum, ynum, status;
    int digit1[], digit2[], digit3[], digit4[];
    
    //Screen grösse für die Touchabfrage
    SDL_Rect gScreenRect = { 0, 0, 820, 480 };
    
    main()
    {  
          SDL_Window *sdlWindow;             // Zeiger auf "das Blatt"
    
          SDL_Surface *windowsurface;
    
          SDL_Init(SDL_INIT_EVERYTHING);   //VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER);  // Initialisiert SDL2
    
            // Arbeitsfenster mit folgenden Eigenschaften erstellen:
            sdlWindow = SDL_CreateWindow(
            "TouchXY",                       // Fenstertitel
            SDL_WINDOWPOS_CENTERED,         // initialisiert x Position
            SDL_WINDOWPOS_CENTERED,         // initialisiert y Position
            820,                               // breit, in pixel
            480,                               // hoch, in pixel
            SDL_WINDOW_SHOWN    // Ganzen Bildschirm benutzen
            );
    
            windowsurface = SDL_GetWindowSurface(sdlWindow);
    
            SDL_Surface *clear; 
    
               if (TTF_Init()==-1)   {        // Initialisiert TrueTypeFont Plugin für SDL
                     printf("TTF_Init:%s\n",TTF_GetError()); // Fehler ausgeben
                     exit(2); // Fehlerbedingtes Beenden
               }
    
              TTF_Font* font;        // Läd schrift.ttf in grösse 100 in font     
              font = TTF_OpenFont("schrift.ttf" ,40);
                  if (!font) {
                          printf("TTF_OpenFont: %s \n", TTF_GetError());     //Fehlerumgang
                  }
    
    SDL_Point touchLocation = { gScreenRect.w / 2, gScreenRect.h / 2 }; // Touchkoordinaten an Screen anpassen
    //SDL_TouchID SDL_GetTouchDevice(int touchID)                 
    //SDL_Finger* SDL_GetTouchFinger(touchID, int index);                 
    
    #include "itoa.h"
    
             SDL_Surface *text; //  Textsurface
    
             SDL_Event test_event; // Ein Eventhändeler
    
             status = 2; // Finger UP
             touchLocation.x = 0;
             touchLocation.y = 0;
             // Die "Letzte Position" Nullen...
             xnum = touchLocation.x; // Vorbereiten für itoa
             ynum = touchLocation.y;   
             itoa(xnum, digit3);     // Zahlen in String umwandeln
             itoa(ynum, digit4);                                          
    
             running = 1;
    
          while(running)   {       
              if (test_event.type == SDL_QUIT) {
                    running = 0;
                    break;
              }
    
              clear = SDL_LoadBMP("resources/startbild.bmp");
              SDL_BlitSurface(clear, NULL, windowsurface, NULL);
    
              while (SDL_PollEvent(&test_event))   {                 
                    switch (test_event.type)   {
                              case SDL_FINGERDOWN:                                  
                                      touchLocation.x = test_event.tfinger.x * gScreenRect.w; 
                                      touchLocation.y = test_event.tfinger.y * gScreenRect.h;
                                      status = 1;                                                         
                                      SDL_Delay ( 2 );
                                      break; 
    
                              case SDL_FINGERUP:                                  
                                      touchLocation.x = test_event.tfinger.x * gScreenRect.w; 
                                      touchLocation.y = test_event.tfinger.y * gScreenRect.h;
                                      xnum = touchLocation.x; // Vorbereiten für itoa
                                      ynum = touchLocation.y;   
                                      itoa(xnum, digit3);     // Zahlen in String umwandeln
                                      itoa(ynum, digit4);                                          
                                      touchLocation.x = 0;                                  
                                      touchLocation.y = 0;
                                      status = 2;
                                      SDL_Delay ( 2 );
                                      break; 
    
                              case SDL_FINGERMOTION:                                  
                                      touchLocation.x = test_event.tfinger.x * gScreenRect.w; 
                                      touchLocation.y = test_event.tfinger.y * gScreenRect.h;
                                      status = 3;      
                                      SDL_Delay ( 2 );   
                                      break; 
    
                              default:
                                      break;
    
                              }
                    }
    
                 xnum = touchLocation.x; // Vorbereiten für itoa
                 ynum = touchLocation.y;   
    
                 itoa(xnum, digit1);     // Zahlen in String umwandeln
                 itoa(ynum, digit2);        
    
                 if (status == 1) {
                 SDL_Color color = { 255, 0, 0, 255 };   // RGB
                 text = TTF_RenderText_Blended(font, " DOWN", color);   // Text
                 SDL_Rect rect6 = { 175, 94, 84, 74 };   // Textposition
                 SDL_BlitSurface(text, NULL, windowsurface, &rect6);
                 //sdlTexture = SDL_CreateTextureFromSurface (sdlRenderer, text);   // Bild in Textur
                 //SDL_RenderCopy(sdlRenderer, sdlTexture, 0, &rect6);   // Render Textur
                 }                    
                 else if (status == 2) {
                 SDL_Color color = { 0, 255, 0, 255 };   // RGB
                 text = TTF_RenderText_Blended(font, " UP ", color);   // Text
                 SDL_Rect rect7 = { 175, 94, 84, 74 };   // Textposition
                 SDL_BlitSurface(text, NULL, windowsurface, &rect7);
                 //sdlTexture = SDL_CreateTextureFromSurface (sdlRenderer, text);   // Bild in Textur
                 //SDL_RenderCopy(sdlRenderer, sdlTexture, 0, &rect7);   // Render Textur 
                 }
                 else if (status == 3) {
                 SDL_Color color = { 0, 0, 255, 255 };   // RGB
                 text = TTF_RenderText_Blended(font, " MOVE", color);   // Text
                 SDL_Rect rect8 = { 175, 94, 84, 74 };   // Textposition
                 SDL_BlitSurface(text, NULL, windowsurface, &rect8);
                 //sdlTexture = SDL_CreateTextureFromSurface (sdlRenderer, text);   // Bild in Textur
                 //SDL_RenderCopy(sdlRenderer, sdlTexture, 0, &rect8);   // Render Textur       
                 }
    
                 SDL_Color color = { 255, 140, 0, 255 };   // RGB
    
                 text = TTF_RenderText_Blended(font, "TPoint", color);   // Text
                 SDL_Rect rect0 = { 14, 14, 0, 0 };   // Textposition
                 SDL_BlitSurface(text, NULL, windowsurface, &rect0);
    
                 text = TTF_RenderText_Blended(font, ":", color);   // Text
                 SDL_Rect rect14 = { 155, 14, 0, 0 };   // Textposition
                 SDL_BlitSurface(text, NULL, windowsurface, &rect14); 
    
                 text = TTF_RenderText_Blended(font, ":", color);   // Text
                 SDL_Rect rect15 = { 155, 94, 0, 0 };   // Textposition
                 SDL_BlitSurface(text, NULL, windowsurface, &rect15); 
                 //sdlTexture = SDL_CreateTextureFromSurface (sdlRenderer, text);   // Bild in Textur
                 //SDL_RenderCopy(sdlRenderer, sdlTexture, 0, &rect0);   // Render Textur       
    
                 text = TTF_RenderText_Blended(font, "Status", color);   // Text
                 SDL_Rect rect5 = { 14, 94, 0, 0 };   // Textposition
                 SDL_BlitSurface(text, NULL, windowsurface, &rect5);
                 //sdlTexture = SDL_CreateTextureFromSurface (sdlRenderer, text);   // Bild in Textur
                 //SDL_RenderCopy(sdlRenderer, sdlTexture, 0, &rect5);   // Render Textur       
    
                 text = TTF_RenderText_Blended(font, "X: ", color);   // Text
                 SDL_Rect rect1 = { 175, 15, 0, 0 };   // Textposition
                 SDL_BlitSurface(text, NULL, windowsurface, &rect1);
                 //sdlTexture = SDL_CreateTextureFromSurface (sdlRenderer, text);   // Bild in Textur
                 //SDL_RenderCopy(sdlRenderer, sdlTexture, 0, &rect1);   // Render Textur       
    
                 text = TTF_RenderText_Blended(font, "Y: ", color);   // Text
                 SDL_Rect rect2 = { 175, 55, 0, 0 };   // Textposition
                 SDL_BlitSurface(text, NULL, windowsurface, &rect2);
                 //sdlTexture = SDL_CreateTextureFromSurface (sdlRenderer, text);   // Bild in Textur
                 //SDL_RenderCopy(sdlRenderer, sdlTexture, 0, &rect2);   // Render Textur
    
                 text = TTF_RenderText_Blended(font, digit1, color);   // Text
                 SDL_Rect rect3 = { 225, 15, 0, 0 };   // Textposition
                 SDL_BlitSurface(text, NULL, windowsurface, &rect3);
                 //sdlTexture = SDL_CreateTextureFromSurface (sdlRenderer, text);   // Bild in Textur
                 //SDL_RenderCopy(sdlRenderer, sdlTexture, 0, &rect3);   // Render Textur
    
                 text = TTF_RenderText_Solid(font, digit2, color);   // Text
                 SDL_Rect rect4 = { 225, 55, 0, 0 };   // Textposition
                 SDL_BlitSurface(text, NULL, windowsurface, &rect4);
                 //sdlTexture = SDL_CreateTextureFromSurface (sdlRenderer, text);   // Bild in Textur
                 //SDL_RenderCopy(sdlRenderer, sdlTexture, 0, &rect4);   // Render Textur             
    
                 text = TTF_RenderText_Solid(font, "LastTP", color);   // Text
                 SDL_Rect rect9 = { 14, 174, 0, 0 };   // Textposition
                 SDL_BlitSurface(text, NULL, windowsurface, &rect9);
                 //sdlTexture = SDL_CreateTextureFromSurface (sdlRenderer, text);   // Bild in Textur
                 //SDL_RenderCopy(sdlRenderer, sdlTexture, 0, &rect9);   // Render Textur             
    
                 text = TTF_RenderText_Blended(font, ":", color);   // Text
                 SDL_Rect rect16 = { 155, 174, 0, 0 };   // Textposition
                 SDL_BlitSurface(text, NULL, windowsurface, &rect16); 
    
                 text = TTF_RenderText_Solid(font, "X: ", color);   // Text
                 SDL_Rect rect10 = { 175, 134, 0, 0 };   // Textposition
                 SDL_BlitSurface(text, NULL, windowsurface, &rect10);
                 //sdlTexture = SDL_CreateTextureFromSurface (sdlRenderer, text);   // Bild in Textur
                 //SDL_RenderCopy(sdlRenderer, sdlTexture, 0, &rect10);   // Render Textur             
    
                 text = TTF_RenderText_Solid(font, "Y: ", color);   // Text
                 SDL_Rect rect11 = { 175, 174, 0, 0 };   // Textposition
                 SDL_BlitSurface(text, NULL, windowsurface, &rect11);
                 //sdlTexture = SDL_CreateTextureFromSurface (sdlRenderer, text);   // Bild in Textur
                 //SDL_RenderCopy(sdlRenderer, sdlTexture, 0, &rect11);   // Render Textur             
    
                 text = TTF_RenderText_Blended(font, digit3, color);   // Text
                 SDL_Rect rect12 = { 225, 135, 0, 0 };   // Textposition
                 SDL_BlitSurface(text, NULL, windowsurface, &rect12);
                 //sdlTexture = SDL_CreateTextureFromSurface (sdlRenderer, text);   // Bild in Textur
                 //SDL_RenderCopy(sdlRenderer, sdlTexture, 0, &rect12);   // Render Textur
    
                 text = TTF_RenderText_Solid(font, digit4, color);   // Text
                 SDL_Rect rect13 = { 225, 175, 0, 0 };   // Textposition
                 SDL_BlitSurface(text, NULL, windowsurface, &rect13);
                 //sdlTexture = SDL_CreateTextureFromSurface (sdlRenderer, text);   // Bild in Textur
                 //SDL_RenderCopy(sdlRenderer, sdlTexture, 0, &rect13);   // Render Textur             
    
                 SDL_FreeSurface(text); // Speicher für Textsurface frei machen                        
    
                 SDL_UpdateWindowSurface(sdlWindow);            
    
                 //SDL_Color farbe = { 0, 0, 0, 255 };   // RGB
                 //text = TTF_RenderText_Blended(font, "      ", farbe);   // Text    
                 //SDL_BlitSurface(text, NULL, windowsurface, NULL);               
                 //SDL_RenderClear( sdlRenderer );
                 //SDL_RenderPresent( sdlRenderer );
    
                 //SDL_RenderPresent(sdlRenderer); // Update Screen
    
                 //SDL_BlitSurface(clear, NULL, windowsurface, NULL);
    
                 //SDL_UpdateWindowSurface(sdlWindow);
    
                 SDL_Delay ( 10 );
          }
    
        cleanup();     //Aufräumen      
    
    }
    


  • TouchXY rendering version:

    #include <stdlib.h>
    #include <string.h>
    #include <SDL2/SDL.h>
    #include "SDL2/SDL_ttf.h"
    
    int running;
    int xnum, ynum, status;
    int digit1[], digit2[], digit3[], digit4[];
    
    //Screen grösse für die Touchabfrage
    SDL_Rect gScreenRect = { 0, 0, 820, 480 };
    
    main()
    {  
          SDL_Window *sdlWindow;             // Zeiger auf "das Blatt"
    
          SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER);  // Initialisiert SDL2
    
            // Arbeitsfenster mit folgenden Eigenschaften erstellen:
            sdlWindow = SDL_CreateWindow(
            "TouchXY",                       // Fenstertitel
            SDL_WINDOWPOS_UNDEFINED,         // initialisiert x Position
            SDL_WINDOWPOS_UNDEFINED,         // initialisiert y Position
            0,                               // breit, in pixel
            0,                               // hoch, in pixel
            SDL_WINDOW_FULLSCREEN_DESKTOP    // Ganzen Bildschirm benutzen
            );
    
         // Erstellt u initialisiert hardware beschleunigten Renderer mit syncro. zum Screen (Hz)
         SDL_Renderer* sdlRenderer = SDL_CreateRenderer(sdlWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);    
         SDL_SetHint (SDL_HINT_RENDER_SCALE_QUALITY, "linear"); //Skalierungs Anpassung
         SDL_RenderSetLogicalSize (sdlRenderer, 820, 480); //Rendern auf dieses Format
    
         SDL_Texture *sdlTexture;   // Textur anlegen
         sdlTexture = SDL_CreateTexture (sdlRenderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 820, 420);
    
               if (TTF_Init()==-1)   {        // Initialisiert TrueTypeFont Plugin für SDL
                     printf("TTF_Init:%s\n",TTF_GetError()); // Fehler ausgeben
                     exit(2); // Fehlerbedingtes Beenden
               }
    
              TTF_Font* font;        // Läd schrift.ttf in grösse 100 in font     
              font = TTF_OpenFont("schrift.ttf" ,100);
                  if (!font) {
                          printf("TTF_OpenFont: %s \n", TTF_GetError());     //Fehlerumgang
                  }
    
    SDL_Point touchLocation = { gScreenRect.w / 2, gScreenRect.h / 2 }; // Touchkoordinaten an Screen anpassen
    //SDL_TouchID SDL_GetTouchDevice(int touchID)                 
    //SDL_Finger* SDL_GetTouchFinger(touchID, int index);                 
    
    #include "itoa.h"
    
            SDL_SetRenderDrawColor( sdlRenderer, 0, 0, 0, 255 );
    
             SDL_Surface *text; //  Textsurface
    
             SDL_Event test_event; // Ein Eventhändeler
    
             status = 2; // Finger UP
             touchLocation.x = 0;
             touchLocation.y = 0;
             // Die "Letzte Position" Nullen...
             xnum = touchLocation.x; // Vorbereiten für itoa
             ynum = touchLocation.y;   
             itoa(xnum, digit3);     // Zahlen in String umwandeln
             itoa(ynum, digit4);                                          
    
             running = 1;
          while(running)   {       
              if (test_event.type == SDL_QUIT) {
                    running = 0;
                    break;
              }  
              SDL_RenderClear( sdlRenderer );
              while (SDL_PollEvent(&test_event))   {                 
                    switch (test_event.type)   {
                              case SDL_FINGERDOWN:                                  
                                      touchLocation.x = test_event.tfinger.x * gScreenRect.w; 
                                      touchLocation.y = test_event.tfinger.y * gScreenRect.h;
                                      status = 1;                                                         
                                      SDL_Delay ( 5 );
                                      break; 
    
                              case SDL_FINGERUP:                                  
                                      touchLocation.x = test_event.tfinger.x * gScreenRect.w; 
                                      touchLocation.y = test_event.tfinger.y * gScreenRect.h;
                                      xnum = touchLocation.x; // Vorbereiten für itoa
                                      ynum = touchLocation.y;   
                                      itoa(xnum, digit3);     // Zahlen in String umwandeln
                                      itoa(ynum, digit4);                                          
                                      touchLocation.x = 0;                                  
                                      touchLocation.y = 0;
                                      status = 2;
                                      SDL_Delay ( 5 );
                                      break; 
    
                              case SDL_FINGERMOTION:                                  
                                      touchLocation.x = test_event.tfinger.x * gScreenRect.w; 
                                      touchLocation.y = test_event.tfinger.y * gScreenRect.h;
                                      status = 3;      
                                      SDL_Delay ( 5 );   
                                      break; 
    
                              default:
                                      break;
    
                              }
                    }
    
                 xnum = touchLocation.x; // Vorbereiten für itoa
                 ynum = touchLocation.y;   
    
                 itoa(xnum, digit1);     // Zahlen in String umwandeln
                 itoa(ynum, digit2);        
    
                 if (status == 1) {
                 SDL_Color color = { 255, 0, 0, 255 };   // RGB
                 text = TTF_RenderText_Blended(font, "DOWN", color);   // Text
                 SDL_Rect rect6 = { 105, 94, 84, 74 };   // Textposition
                 sdlTexture = SDL_CreateTextureFromSurface (sdlRenderer, text);   // Bild in Textur
                 SDL_RenderCopy(sdlRenderer, sdlTexture, 0, &rect6);   // Render Textur
                 }                    
                 else if (status == 2) {
                 SDL_Color color = { 0, 255, 0, 255 };   // RGB
                 text = TTF_RenderText_Blended(font, " UP ", color);   // Text
                 SDL_Rect rect7 = { 105, 94, 84, 74 };   // Textposition
                 sdlTexture = SDL_CreateTextureFromSurface (sdlRenderer, text);   // Bild in Textur
                 SDL_RenderCopy(sdlRenderer, sdlTexture, 0, &rect7);   // Render Textur 
                 }
                 else if (status == 3) {
                 SDL_Color color = { 0, 0, 255, 255 };   // RGB
                 text = TTF_RenderText_Blended(font, "MOVE", color);   // Text
                 SDL_Rect rect8 = { 105, 94, 84, 74 };   // Textposition
                 sdlTexture = SDL_CreateTextureFromSurface (sdlRenderer, text);   // Bild in Textur
                 SDL_RenderCopy(sdlRenderer, sdlTexture, 0, &rect8);   // Render Textur       
                 }
    
                 SDL_Color color = { 255, 140, 0, 255 };   // RGB
    
                 text = TTF_RenderText_Blended(font, "TPoint: ", color);   // Text
                 SDL_Rect rect0 = { 14, 14, 84, 74 };   // Textposition
                 sdlTexture = SDL_CreateTextureFromSurface (sdlRenderer, text);   // Bild in Textur
                 SDL_RenderCopy(sdlRenderer, sdlTexture, 0, &rect0);   // Render Textur       
    
                 text = TTF_RenderText_Blended(font, "Status: ", color);   // Text
                 SDL_Rect rect5 = { 14, 94, 84, 74 };   // Textposition
                 sdlTexture = SDL_CreateTextureFromSurface (sdlRenderer, text);   // Bild in Textur
                 SDL_RenderCopy(sdlRenderer, sdlTexture, 0, &rect5);   // Render Textur       
    
                 text = TTF_RenderText_Blended(font, "X: ", color);   // Text
                 SDL_Rect rect1 = { 95, 15, 30, 30 };   // Textposition
                 sdlTexture = SDL_CreateTextureFromSurface (sdlRenderer, text);   // Bild in Textur
                 SDL_RenderCopy(sdlRenderer, sdlTexture, 0, &rect1);   // Render Textur       
    
                 text = TTF_RenderText_Blended(font, "Y: ", color);   // Text
                 SDL_Rect rect2 = { 95, 50, 30, 30 };   // Textposition
                 sdlTexture = SDL_CreateTextureFromSurface (sdlRenderer, text);   // Bild in Textur
                 SDL_RenderCopy(sdlRenderer, sdlTexture, 0, &rect2);   // Render Textur
    
                 text = TTF_RenderText_Blended(font, digit1, color);   // Text
                 SDL_Rect rect3 = { 140, 15, 30, 30 };   // Textposition
                 sdlTexture = SDL_CreateTextureFromSurface (sdlRenderer, text);   // Bild in Textur
                 SDL_RenderCopy(sdlRenderer, sdlTexture, 0, &rect3);   // Render Textur
    
                 text = TTF_RenderText_Solid(font, digit2, color);   // Text
                 SDL_Rect rect4 = { 140, 50, 30, 30 };   // Textposition
                 sdlTexture = SDL_CreateTextureFromSurface (sdlRenderer, text);   // Bild in Textur
                 SDL_RenderCopy(sdlRenderer, sdlTexture, 0, &rect4);   // Render Textur             
    
                 text = TTF_RenderText_Solid(font, "LastTP:", color);   // Text
                 SDL_Rect rect9 = { 14, 174, 84, 74 };   // Textposition
                 sdlTexture = SDL_CreateTextureFromSurface (sdlRenderer, text);   // Bild in Textur
                 SDL_RenderCopy(sdlRenderer, sdlTexture, 0, &rect9);   // Render Textur             
    
                 text = TTF_RenderText_Solid(font, "X: ", color);   // Text
                 SDL_Rect rect10 = { 105, 174, 30, 30 };   // Textposition
                 sdlTexture = SDL_CreateTextureFromSurface (sdlRenderer, text);   // Bild in Textur
                 SDL_RenderCopy(sdlRenderer, sdlTexture, 0, &rect10);   // Render Textur             
    
                 text = TTF_RenderText_Solid(font, "Y: ", color);   // Text
                 SDL_Rect rect11 = { 105, 210, 30, 30 };   // Textposition
                 sdlTexture = SDL_CreateTextureFromSurface (sdlRenderer, text);   // Bild in Textur
                 SDL_RenderCopy(sdlRenderer, sdlTexture, 0, &rect11);   // Render Textur             
    
                 text = TTF_RenderText_Blended(font, digit3, color);   // Text
                 SDL_Rect rect12 = { 140, 175, 30, 30 };   // Textposition
                 sdlTexture = SDL_CreateTextureFromSurface (sdlRenderer, text);   // Bild in Textur
                 SDL_RenderCopy(sdlRenderer, sdlTexture, 0, &rect12);   // Render Textur
    
                 text = TTF_RenderText_Solid(font, digit4, color);   // Text
                 SDL_Rect rect13 = { 140, 210, 30, 30 };   // Textposition
                 sdlTexture = SDL_CreateTextureFromSurface (sdlRenderer, text);   // Bild in Textur
                 SDL_RenderCopy(sdlRenderer, sdlTexture, 0, &rect13);   // Render Textur             
    
                 SDL_FreeSurface(text); // Speicher für Textsurface frei machen
    
                 SDL_RenderClear(sdlRenderer);
    
                 SDL_RenderPresent(sdlRenderer); // Update Screen
    
                 SDL_Delay ( 100 );
          }
    
        cleanup();     //Aufräumen      
    
    }
    


  • 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


Log in to reply