[gelöst] gtk_file_selection_get_filename überschreibt alles?!?



  • Hallo,

    ich habe ein misteriöses problem mit der funktion gtk_file_selection_get_filename. es kommt mir so vor, als würde es ständig mein komplettes array von strukturen (wenn man das so nennen kann) überschreiben.

    ich rufe die funktion get_filename über einen open-dialog 2 mal nacheinander auf. wenn ich möglichkeit 1 benutze (ist markiert), steht hinterher in pdateien[0]->path und pdateien[1]->path das gleiche oO bei möglichkeit 2 haben die zeichenketten unterschiedliche werte. und genau das ist mein problem. wieso werden die beiden geöffneten pfade (stehen in "sel") nicht einzeln gespeichert, sondern gleich in beiden variablen?

    leider ist der code etwas länger, ich hab rausgekürzt, was ging.

    würde mich sehr über eine kleine hilfe freuen 🙂

    gruß
    martin

    #include <stdio.h>
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include <string.h>
    #include <glib.h>
    
    typedef struct
    {
    	char *path;
    	char *title;
    	char *artist;
    	char *album;
    	int year;
    	char *comment;
    	int track;
    	char *genre;
    	int bitrate;
    	int sample_rate;
    	int channels;
    	int length;
    } sFile;
    
    int max_titel = 0;
    sFile *pdateien[1000];
    
    int filetypification(char *pfad, sFile *pointer)
    {
    	pointer->path = pfad;
    	return 0;
    }
    
    static gboolean delete_event( GtkWidget *widget,GdkEvent  *event, gpointer   data )
    {
    	return FALSE;
    }
    
    int main( int   argc, char *argv[] )
    {
    GtkWidget *window;
    GtkWidget *b_play, *b_pause, *b_stop, *b_next, *b_previous, *b_repeat, *b_shuffle, *b_volup, *b_voldown, *b_open;
    GtkWidget *table;
    GtkWidget *hbox;
    GtkWidget *vbox;
    GtkWidget *l_titel,*l_zeit, *f_titel, *f_zeit;
    GtkWidget *file_select;
    GtkWidget *pbar;
    GtkWidget *scrolled_window;
    GtkWidget *gtklist;
    GtkWidget *playlist;
    GtkWidget *list_item;
    gchar *sel;
    gint open;
    
    gtk_init (&argc, &argv);
    
    pbar = gtk_progress_bar_new ();
    
    int closeopen(void)
    {
    	gtk_widget_hide(file_select); 
    	return (0);
    }
    
    int fileopen(void)
    {
    
    	gtk_widget_show(file_select);
    	return (0);
    }
    
    int closelist(void)
    {
    	gtk_widget_hide(playlist);
    	return (0);
    }
    
    int get_filename(GtkWidget *widget, GtkFileSelection *selected)
    {
    /* ------------------------------------------------------------------------------------*/
    	/* MÖGLICHKEIT 1: FUNKTIONIERT NICHT */
    	sel = (char *)gtk_file_selection_get_filename(GTK_FILE_SELECTION(selected));
    
    	/* MÖGLICHKEIT 2: FUNKTIONIERT */
    	if(max_titel == 0)
    		sel = "asd";
    	else
    		sel = "dsa";
    
    /* ------------------------------------------------------------------------------------*/
    
    	printf("Folgende Datei wurde ausgewählt : %s\n\n", sel);
    	gtk_widget_hide(file_select);
    
    	open=1;
    	pdateien[max_titel] = malloc(sizeof(sFile)); 
    	filetypification(sel, pdateien[max_titel]); 
    
    	max_titel++;
    
    	printf("\n\npfad 1: %s\n",(char*)pdateien[0]->path); /* MÖGLICHKEIT 1: beim 2. mal ausgewählte datei oO MÖGLICHKEIT 2: asd */
    
    	if(max_titel == 2)
    	{
    		printf("\n\npfad 2: %s\n",(char*)pdateien[1]->path); /* MÖGLICHKEIT 1: beim 2. mal ausgewählte datei. MÖGLICHKEIT 2: dsa */
    	}
    
    	return (0);
    
    }
    
    /* Create a new window */
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    
    /* Set the window title */
    gtk_window_set_title (GTK_WINDOW (window), "MP3 Player");
    
    /* Set a handler for delete_event that immediately
    * exits GTK. */
    g_signal_connect (G_OBJECT (window), "delete_event",
          G_CALLBACK (delete_event), NULL);
    
    /* Sets the border width of the window. */
    gtk_container_set_border_width (GTK_CONTAINER (window), 20);
    
    /* Create a 2 Zeilen x8 Spalten table */
    table = gtk_table_new (2, 8, TRUE);
    
    /*open  Knopf*/ 
    b_open = gtk_button_new_with_label ("OPEN");
    g_signal_connect (G_OBJECT (b_open), "clicked",
          G_CALLBACK (fileopen),NULL);
    gtk_table_attach_defaults (GTK_TABLE (table), b_open, 7, 8, 0, 2);
    
     /*Eine Vertikale BOx mit unterliegenden horizontalen Boxen*/
    vbox = gtk_vbox_new (FALSE, 5);
    hbox = gtk_hbox_new (FALSE, 5);
    gtk_container_add (GTK_CONTAINER (window), hbox);
    gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
    gtk_container_set_border_width (GTK_CONTAINER (window), 5);
    
    hbox = gtk_hbox_new (FALSE, 5);
    gtk_box_pack_start (GTK_BOX (vbox), pbar, FALSE, FALSE, 0);
    gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
    
    gtk_widget_show_all (window);
    
    /* Oeffnen-dialog ------------------------------------------------- */
    
    file_select = gtk_file_selection_new("Auswahl");
    /*Signale einrichten*/
    gtk_signal_connect(GTK_OBJECT(file_select), "destroy",
        (GtkSignalFunc) closeopen, &file_select);
    gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(file_select)->ok_button),
        "clicked", (GtkSignalFunc) get_filename, file_select);
    gtk_signal_connect_object(GTK_OBJECT(GTK_FILE_SELECTION(file_select)->cancel_button),
               "clicked", (GtkSignalFunc) closeopen, GTK_OBJECT(file_select));
    
    /*lock window size*/
    gtk_window_set_resizable (GTK_WINDOW(window), FALSE);
    gtk_main ();
    return 0;
    }
    


  • falsches Forum ... entweder C++ oder (was wahrscheinlicher ist) ANSI C



  • oh ja, tut mir leid, bin ich wohl durcheinander gekommen 😕

    EDIT: lösung gefunden, hat sich erledigt.


Anmelden zum Antworten