Verständnis Problem mit Arrays



  • Hallo!
    Ich habe schon einige Zeit Java programmiert, schreibe derzeit aber ein Bildanzeigeprogramm mit SDL, welches auch die Bilder soweit korrekt anzeigt, nur leider immer nur eines, beim Wechsel auf das nächste Bild scheint die Referenz nicht mehr gebeben zu sein.

    Ich habe ein folgende Variable zum abspeichern von cstrings:
    char *files[100];

    diese sollte 100 (von 0..99) Dateinamen beliebiger Länge speichern können (Namen werden ihrereseits als char * übergeben), allerdings funktioniert der Zugriff darauf manchmal, manchmal aber auch nicht.

    Vermutung: Ich habe die files - Variable falsch deklariert.
    Kann mir Jemand helfen und mir erklären, wie man diese Variable richtig deklariert, falls sie falsch ist? Danke! 👍



  • Sollte stimmen. Aber wieso nimmst du nicht einfach ein Array von std::string oder einen std::vector mit std::string?



  • Hier der Quelltext! Wichtig es geht mir um die files - Variable , wenn das zweite Bild geladen werden soll mit viewImage[i-1] ,dann kann er es nicht laden,da der übergebene dateiname scheinbar NULL ist.

    #include <stdlib.h>
    #include <stdio.h>
    #include <dirent.h>
    #include "SDL.h"
    #include "SDL_image.h"
    #include "SDL_gfxPrimitives.h"
    #include "SDL_rotozoom.h"
    #include <string>
    #include <ctype.h>
    using namespace std;
    
      SDL_Surface *display;
      SDL_Surface *image;
      SDL_Surface *zoomed;
      SDL_Event event;
      double rx = 0.0;
      double ry = 0.0;
      double w = 0.0;
      int akt = 0;  //aktuelles Bild
      char *title = "lwv - a LightWeight imageViewer";
    
      char *files[100];   //Array mit Platz für 100 Dateinamen beliebiger Länge -  ist glaube ich nicht richtig...
      char *fname;
      SDL_Rect drect;
      SDL_Rect zrect;
      int mshow = 1;   //Maus anzeigen an/aus
      int anzahl = 0;   //anzahl gefundener Bilder, anfangs 0
    
    void Dlist()   //sucht nach anzeigbaren Bildern im aktuellen Verzeichnis und erstellt einen Index dieser Bilder in files ,pro gefundenem Bild wird der Zähler anzahl erhöht
    {  		   // 9 unterstützte Formate : jpg,png,tga,gif,pcx,lbm,xpm,pnm,bmp
          struct dirent **dat;
          int count;
    
          count = scandir(".", &dat, 0, 0);
    
          while(count--) {
            if ( (strstr ( (*dat)->d_name,".jpg")) || (strstr ( (*dat)->d_name,".png")) || (strstr ( (*dat)->d_name,".tga")) || (strstr ( (*dat)->d_name,".gif"))
    	    || (strstr ( (*dat)->d_name,".pcx")) || (strstr ( (*dat)->d_name,".lbm")) || (strstr ( (*dat)->d_name,".xpm")) || (strstr ( (*dat)->d_name,".pnm")) 
    	    || (strstr ( (*dat)->d_name,".bmp")) ) {/*printf("%s\n", (*dat)->d_name);*/   //falls brauchbares bild,anzeigen			
    		files[anzahl] = (*dat)->d_name+'\0';
    		anzahl+=1;}
    	free(*dat++);
        }
    }
    
    void Quit( int returnCode )  //Beende-Routine
    {
        SDL_Quit( );
        exit( returnCode );
    }
    
    void Clear(SDL_Surface* dest)
    {
    	SDL_Rect rect = {0, 0, dest->w, dest->h};
    	SDL_FillRect(dest, &rect, 0);
    }
    
    void init()  //initialisiert SDL und den Bildschirm
    {
      if ( SDL_Init( SDL_INIT_VIDEO) < 0 )
      {
         fprintf(stderr, "SDL konnte nicht initialisiert werden:  %s\n",
           SDL_GetError());
         exit(1);
       }
    
       atexit(SDL_Quit);
    
       // init screen
       display = SDL_SetVideoMode( 1024,768, 32, SDL_HWSURFACE|SDL_RESIZABLE|SDL_DOUBLEBUF);
       if ( display == NULL )
       {
         fprintf(stderr, "Konnte kein Fenster 1024x768 px oeffnen: %s\n",
           SDL_GetError());
         exit(1);
       }
       SDL_WM_SetCaption(title,title);
    }
    
    void viewImage(char *filename)  //laedt uebergebenes Bild und zeigt es an
    {
      Clear(display);
      image = IMG_Load(filename);
      if (image == NULL)
      {
         fprintf(stderr, "Das Bild konnte nicht geladen werden: %s\n",
           SDL_GetError());
         exit(-1);
      }
      SDL_WM_SetCaption(filename,filename);
      rx = 1024.0 / (double) image->w;
      ry = 768.0 / (double) image->h;
      if( !(image==NULL) )  {fprintf(stdout,"Ratio %d x %d \n",  rx,ry);}
      // Bildgroesse zu Debuggingzwecke ausgeben
      fprintf(stdout,"Debug: BildGroesse: %i x %i Pixel\n",image->w,image->h);
    
      // Setzen des Zielbereichs
      drect.x = 0;
      drect.y = 0;
      drect.w = (image->w);
      drect.h = image->h;
    
      zoomed = zoomSurface (image, rx, ry, 1);
      fprintf(stdout,"Debug: ZoomedGroesse: %i x %i Pixel\n",zoomed->w,zoomed->h);
    
      zrect.x = 0;
      zrect.y = 0;
      zrect.w = (zoomed->w);
      zrect.h = zoomed->h;
    
      // kopiere surface auf display-surface
      SDL_BlitSurface(zoomed, &zrect, display, &drect);
      // den veränderten Bildschirm-Bereich auffrischen
      SDL_UpdateRects(display,1,&drect);
    }
    
     void handleKeyPress( SDL_keysym *keysym )
    {
        switch ( keysym->sym )
    	{
    	case SDLK_ESCAPE:
    	    //Falls ESC gedrückt
    	    Quit( 0 );
    	    break;
    	case SDLK_F1:
    	    //Vollbildmodus umschalten mit F1
    	    SDL_WM_ToggleFullScreen( display );
    	    if (mshow == 1)  { SDL_ShowCursor(0); mshow = 0;}  //stellt sicher das in FS die Maus aus ist
    	    else { SDL_ShowCursor(1); mshow = 1;}
    	    break;
    	case SDLK_F2:  //1 bild zurueck
    	    if (akt > 0) akt =akt-1;
    	    else akt = 0;
    	    viewImage(files[akt]);
    	    break;
    	case SDLK_F3:  //1 Bild vor
    	    if (akt < anzahl-1) akt = akt+1;
    	    else akt = akt;
    	    viewImage(files[akt]);
    	    break;
    	default:
    	    break;
    	}
        return;
    }
    
    int main()  //Hauptschleife
    {
      // Video Initialisierung
      init();
      Dlist(); //wichtige Verzeichnis-Vorgänge um nach Bildern zu suchen und Zähler zu setzen
      // Bild laden
      fprintf(stdout,"Anzahl gefundener Bilder: %i \n",anzahl);
    //  files
      for (int i = 1; i <= anzahl; i++)
          {
          fprintf(stdout,"Bild%i : %s \n",i,files[i-1]); 
    
    	viewImage(files[i-1]);
    	SDL_Delay(2000); 
    }
    
    while (true){
    	while ( SDL_PollEvent( &event ) )
    			{
    			    switch( event.type )
    				{
    				case SDL_KEYDOWN:
    				    /* handle key presses */
    				    handleKeyPress( &event.key.keysym );
    				    break;
    				case SDL_QUIT:
    				    /* handle quit requests */
    				    break;
    				default:
    				    break;
    				}
    			}
    	// SDL_UpdateRects(display,1,&drect);
    	 SDL_Delay(10);  //10ms pro Schleifendurchlauf warten, da sonst die CPU Last riesig wird!	 
    		}
      // Das Bitmap-Surface löschen
      SDL_FreeSurface(image);
    }
    

    @interpreter : ich werds gleich mal ausprobieren.



  • interpreter schrieb:

    Sollte stimmen. Aber wieso nimmst du nicht einfach ein Array von std::string oder einen std::vector mit std::string?

    Weil ich dann in der DList Funktion ein Problem mit dem Konvertieren zwischen
    char* und std::string* bekomme. In einem sdt::string werden doch die werte als int gespeichert,oder? Keine Ahnung wie ich das einfach konvertieren könnte 😞



  • barde schrieb:

    Weil ich dann in der DList Funktion ein Problem mit dem Konvertieren zwischen
    char* und std::string* bekomme.

    Nö. Du kannst jederzeit einen char* in einen std::string umwandeln (per Ctor) und dir aus dem std::string einen const char* zurückgeben lassen (per Methode c_str() )


Anmelden zum Antworten