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() )