inspire
Goto Top

Falscher pointer ?!?

hallo,

mir ist ein problem mit pointer in die quere gekommen, das ich nicht alleine zu lösen vermag x| es entzieht sich irgendwie meiner logik, da meine funktion anscheinend auf einen falschen pointer zugreift, obwohl ich ihr genau sage, welchen sie zu benutzen hat.
ich versuche mal, meinen code zusammenzufassen:
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];


folgende zeilen möchte ich nun 2 mal hintereinander ausführen. die funktion wird beim klicken auf einen button aufgerufen:
pdateien[max_titel] = malloc(sizeof(sFile)); /* neuer pointer auf neue struktur */
filetypification(sel, pdateien[max_titel]); /* struktur mit inhalt füllen. sel ist der pfad zur ausgewählten datei */

max_titel++;

printf("\n\npfad: %s\n",(char*)pdateien->path);  

if(max_titel == 2)
{
  printf("\n\npfad: %s\n",(char*)pdateien[1]->path);  
}

in filetypification passiert nur folgendes:
int filetypification(char *pfad, sFile *pointer)
{
  pointer->path = pfad;
  return 0;
}

beim ersten aufruf klappt alles. der pfad aus sel wird in pdateien->path gespeichert und angezeigt. doch beim 2. aufruf tritt folgender fehler auf: plötzlich wird der neue dateipfad in pdateien[1]->path und pdateien->path geschrieben, er soll jedoch nur in pdateien[1]->path. ich übergeben filetypification doch absichtlich pdateien[max_titel], wobei max_titel beim 2. aufruf doch auf 1 stehen sollte oO

deshalb wende ich mich an euch. findet jemand meinen logik-fehler?

gruß
martin

Content-ID: 134313

Url: https://administrator.de/forum/falscher-pointer-134313.html

Ausgedruckt am: 23.12.2024 um 13:12 Uhr

76109
76109 25.01.2010 um 18:59:22 Uhr
Goto Top
Müsste eher etwas in der Art sein:
struct sFile {
  ....
  ....
} *pdateien;

pdateien = (sFile *) malloc(sizeof (struct sFile) * 1000);
.... //füllen
printf("\n\npfad: %s\n", pdateien.path);   

Gruß Dieter
inspire
inspire 25.01.2010 um 20:16:50 Uhr
Goto Top
okay, das hab ich mal versucht, umzusetzen. in filetypification kann ich so inhalte einfügen, doch sie hinterher auszulesen schaffe ich nicht. das
printf("\n\npfad: %s\n", pdateien.path);
klappt so nicht...das ist immer NULL...

inhalte einfügen hab ich nun so gemacht so:
int filetypification(char *pfad, struct sFile pointer)
{
  pointer.path = pfad;
  printf("%s",pointer.path); /* das klappt */  
  return 0;
}

...

filetypification(sel, pdateien[max_titel]); 

was mache ich nun falsch? :/
76109
76109 25.01.2010 um 21:02:30 Uhr
Goto Top
Hallo inspire!

Der Code von filetypification(..) funktioniert so nicht.

Ich habe schon seit über 10 Jahre nix mehr in C gemacht, aber probier mal zum Einlesen was in dieser Art:
char path = "C:\\Test.Dat";  

int handle;

handle = open (path, Flags);

read (handle, &pdateien[5], sizeof (struct sFile));	// Eine Datei mit einem Datensatz einlesen

read (handle, pdateien, sizeof (struct sFile) * 1000);	// Eine Datei mit allen Datensätzen einlesen

close (handle);

Gruß Dieter

PS. Bei pdateien immer eine Datensatznummer in der Form pdateien bis pdateien[999] angeben.
Eine Datensatznummer beinhaltet immer einen ganzen Datensatz der Größe von Structur sFile
inspire
inspire 25.01.2010 um 21:53:53 Uhr
Goto Top
hallo dieter,

ich weiß nicht, ob wir uns verstehen. "sel" ist nur ein string, den ich in die struktur speichern möchte. (ich muss zugeben, deinen letzten code hab ich nicht ganz verstanden).

also, jetzt bekomme ich die werte nicht mehr ausgelesen. in filetypification mit
printf("%s",pointer.path); /* pointer ist ja jetzt eigentlich kein pointer mehr, wenn ich das richtig verstanden habe... */  
geht es noch, nur hinterher außerhalb nicht mehr. ich möchte nur das auslesen, was ich eben eingefügt habe.

gruß
martin
76109
76109 25.01.2010 um 23:08:44 Uhr
Goto Top
Hallo inspire!

Da habe ich wohl falsche Schlüsse gezogen. Dachte Du wolltest letztenendes Datensätze aus Dateien Einlesenface-smile

Aber, ich merke gerade, dass ich einen Denkfehler hatte, weil Du ja nur Pointer in der Struktur hast. Also vergiss das mit dem Datei einlesen wieder, weil ja nur Adressen eingetragen werden.

Am Anfang habe ich Deinen Code so verstanden, das Du 1000 Datensätze ala Struktur sFile anlegen willst?

D.h. beim direkten Umgang mit pdateien muss eine Datensatznummer angegeben werden, also 1. Datensatz = pdateien mit Größe Struct usw. In der Variablen path als pdateien.path wird nur die Adresse des Strings von "Path" gesichert und ist somit nur ein Pointer.
Und wenn ich nicht ganz falsch liege müsste es so hinkommen (?):
Char MyPath = "C:\\Test"  

filetypification(&MyPath, &pdateien.path); 

printf("%s", pdateien.path); // nach Rückkehr sollte das auch gehen  
....

int filetypification(char *pfad, char *pointer)
{ 
   pointer = pfad;

   printf("%s",pointer);  
}
Sicher bin ich mir jetzt aber auch nicht. Ist halt schon lange her und testen geht auch nicht, also ???

Hoffe, dass es Dir zumindest ein wenig weiterhilftface-smile


Gruß Dieter
inspire
inspire 25.01.2010 um 23:53:53 Uhr
Goto Top
Hallo dieter,

ich danke dir sehr für deine bemühungen, doch z.b. die zeile
filetypification(&MyPath, &pdateien.path);
funktioniert nicht, das & muss weg.

wie dem auch sei, ich bin der lösung an anderer stelle auf der spur. ich habe meinen code mal so weit runtergekürzt, dass es einigermaßen übersichtlich sein sollte:

#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)
{
	printf("\n\n----pfad: %s\n\n",(char*)pdateien->path);  
	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: %s\n",(char*)pdateien->path);  

	if(max_titel == 2)
	{
		printf("\n\npfad: %s\n",(char*)pdateien[1]->path);  
	}


	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;
}

ich weiß, das ist jetzt nicht sehr schön, doch anders komme ich nicht weiter. get_filename rufe ich 2 mal auf.
die kritischen beiden zeilen habe ich markiert (zeile 113, 123). wenn ich dabei möglichkeit 2 benutze, stehen in pdateien->path und pdateien[1]->path die beiden verschiedenen statischen buchstaben. wenn ich jedoch beide male möglichkeit 1 benutze, steht in beiden der gleiche inhalt... irgendwie entzieht sich das meiner logik oO

vielleicht kann damit ja jemand was anfangen und mir etwas auf die sprünge helfen. dass der fehler in den ersten beiträgen von mir nicht erkennbar war, tut mir leid.

gute nacht
martin

EDIT: hab die lösung endlich gefunden, hat sich also erledigt ;)