1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Problem mit calloc

  • xxfunkxx
  • 6. Dezember 2004 um 19:32
  • Unerledigt
  • xxfunkxx
    6
    xxfunkxx
    Mitglied
    Punkte
    330
    Beiträge
    55
    • 6. Dezember 2004 um 19:32
    • #1

    Hallo!
    Ich programmiere einen mp3-Player den man über ein kleines LCD Display mit 4 Buttons ansteuern kann. Hierzu verwende ich den Player imp3sh. Den imp3sh Player kann man über named pipes Steuerbefehle schicken um ihm zu sagen was er machen soll (PLAY, STOP, NEXT SONG, LOAD PLAYLIST, etc.).
    In meinem C-Programm habe ich eine handler-Funktion mit der ich auf Buttonevents reagieren kann.

    Gut das ist der Hintergrund des Programms. Jetzt mal zu meinem Problem.

    Ich habe eine Funktion geschrieben in der ich den Player initialisiere. Dort werden alle meine Playlist geladen.
    In initialize_player() allokiere ich mir Speicher mittels calloc() für zwei char Zeiger, die ich weiter unten wieder mit free() freigebe. Hier bekomme ich aber bei der Ausführung einen Segmentaion fault (siehe rotes Kommentar)
    Mir ist nicht klar warum?

    Der Code der Funktion sieht so aus:

    Code
    void initialize_player() {
        	system("cd /music/ && ls -1p *.lst > /music/all_playlists");
    
        	FILE *my_stream;
        	char my_filename[] = "/music/all_playlists";
        	char *my_string;
        	my_string = (char *) calloc (100, sizeof(char)); 
    
        	char *imp3sh_command;
        	imp3sh_command = (char *) calloc (100, sizeof(char)); 
    
        printf("\t\t\t\n---> DEBUGGING <---\n");
        	// delete all playlists
        	write_imp3in("dellist all\n");
    
        	int number_of_playlists = 0;
    
        	my_stream = fopen(my_filename, "r");
        	char *addlist;
        	char *uselist;
        	char *loadlist;
    
        	while( fgets (my_string, 100, my_stream) != NULL) {
        		number_of_playlists++;
        		//addlist to imp3sh
    
        		addlist = (char *) calloc (5, sizeof("addlist ") ); 
        		strcat(addlist, "addlist ");
        		strcat(addlist, my_string);
        		strcat(addlist, "\n");
        		write_imp3in(addlist);
        		free(addlist);
    
        		//uselist to imp3sh
    
        		uselist = (char *) calloc (5, sizeof("uselist ") ); 
        		strcat(uselist, "uselist ");
        		strcat(uselist, my_string);
        		strcat(uselist, "\n");
        		write_imp3in(uselist);
        		free(uselist);
    
        		//loadlist to imp3sh
        		loadlist = (char *) calloc (1, sizeof("loadlist /music/") ); 
        		strcat(loadlist, "loadlist /music/");
        		strcat(loadlist, my_string);
        		strcat(loadlist,"\n");
        		write_imp3in(loadlist);
        		printf("loadlist %s\n", loadlist);
        		free(loadlist);
    
        		//repeat
        		write_imp3in("repeat\n");
    
        	} //end while
    
    
        	pclose(my_stream);
        	free(my_string); [color=Red]// SEGMENTATION FAULT[/color]
        	free(imp3sh_command);   [color=Red]// SEGMENTATION FAULT[/color]
    
    
        	write_imp3in("djmode\n");
    
      }
    Alles anzeigen



    Um Steuerbefehle über die named pipes zu schicken habe ich eine weitere Funktion names write_imp3in() geschrieben, die sieht so aus:
    Die Steuerbefehle müssen immer mit \n abschließen

    Code
    void write_imp3in(char *s) {
       	usleep(500*1000); //wait 500ms 
       	//better learn how to use a semaphore
    
       	FILE *fd;
       	if ((fd = fopen("/tmp/imp3in","w")) == NULL) {
       		printf("\t---> Unable to open playlist file \n");
       		   cfont631_write_xy(1,1, "Unable to open playlist file");
       	}
       	fprintf(fd, s);
       	fclose(fd); // file has to be closed
    Alles anzeigen




    Kann mir jemand weiterhelfen?

    xxfunkxx

  • xxfunkxx
    6
    xxfunkxx
    Mitglied
    Punkte
    330
    Beiträge
    55
    • 7. Dezember 2004 um 07:54
    • #2

    Ich ab meinen Fehler gefunden. Die dynamischen Arrays waren einfach zu klein angelegt. Das hab ioch jezu so angepaßt, dass ich auf jedenfall die doppelte Größe habe und außerdem hab ich die Fehlerabfrage gleich nach der Speicherzuweisung eingebaut.

    Code
    addlist = (char *) calloc (2, strlen(my_string) + sizeof("addlist ") + 2); 
     if(addlist == NULL) {
        printf("\t---> Not enough RAM for pointer addlist!\n");
        exit(1);
     }
  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung