Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Falscher pointer ?!?

Frage Entwicklung C und C++

Mitglied: inspire

inspire (Level 1) - Jetzt verbinden

25.01.2010 um 18:10 Uhr, 3602 Aufrufe, 6 Kommentare

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:
01.
typedef struct 
02.
03.
  char *path; 
04.
  char *title; 
05.
  char *artist; 
06.
  char *album; 
07.
  int year; 
08.
  char *comment; 
09.
  int track; 
10.
  char *genre; 
11.
  int bitrate; 
12.
  int sample_rate; 
13.
  int channels; 
14.
  int length; 
15.
} sFile; 
16.
 
17.
 
18.
int max_titel = 0; 
19.
sFile *pdateien[1000];

folgende zeilen möchte ich nun 2 mal hintereinander ausführen. die funktion wird beim klicken auf einen button aufgerufen:
01.
pdateien[max_titel] = malloc(sizeof(sFile)); /* neuer pointer auf neue struktur */ 
02.
filetypification(sel, pdateien[max_titel]); /* struktur mit inhalt füllen. sel ist der pfad zur ausgewählten datei */ 
03.
 
04.
max_titel++; 
05.
 
06.
printf("\n\npfad: %s\n",(char*)pdateien[0]->path); 
07.
 
08.
if(max_titel == 2) 
09.
10.
  printf("\n\npfad: %s\n",(char*)pdateien[1]->path); 
11.
}
in filetypification passiert nur folgendes:
01.
int filetypification(char *pfad, sFile *pointer) 
02.
03.
  pointer->path = pfad; 
04.
  return 0; 
05.
}
beim ersten aufruf klappt alles. der pfad aus sel wird in pdateien[0]->path gespeichert und angezeigt. doch beim 2. aufruf tritt folgender fehler auf: plötzlich wird der neue dateipfad in pdateien[1]->path und pdateien[0]->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
Mitglied: 76109
25.01.2010 um 18:59 Uhr
Müsste eher etwas in der Art sein:
01.
struct sFile { 
02.
  .... 
03.
  .... 
04.
} *pdateien; 
05.
 
06.
pdateien = (sFile *) malloc(sizeof (struct sFile) * 1000); 
07.
.... //füllen 
08.
printf("\n\npfad: %s\n", pdateien[0].path); 
Gruß Dieter
Bitte warten ..
Mitglied: inspire
25.01.2010 um 20:16 Uhr
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[0].path);
klappt so nicht...das ist immer NULL...

inhalte einfügen hab ich nun so gemacht so:
01.
int filetypification(char *pfad, struct sFile pointer) 
02.
03.
  pointer.path = pfad; 
04.
  printf("%s",pointer.path); /* das klappt */ 
05.
  return 0; 
06.
07.
 
08.
... 
09.
 
10.
filetypification(sel, pdateien[max_titel]); 
was mache ich nun falsch? :/
Bitte warten ..
Mitglied: 76109
25.01.2010 um 21:02 Uhr
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:
01.
char path[] = "C:\\Test.Dat"; 
02.
 
03.
int handle; 
04.
 
05.
handle = open (path, Flags); 
06.
 
07.
read (handle, &pdateien[5], sizeof (struct sFile));	// Eine Datei mit einem Datensatz einlesen 
08.
 
09.
read (handle, pdateien, sizeof (struct sFile) * 1000);	// Eine Datei mit allen Datensätzen einlesen 
10.
 
11.
close (handle);
Gruß Dieter

PS. Bei pdateien immer eine Datensatznummer in der Form pdateien[0] bis pdateien[999] angeben.
Eine Datensatznummer beinhaltet immer einen ganzen Datensatz der Größe von Structur sFile
Bitte warten ..
Mitglied: inspire
25.01.2010 um 21:53 Uhr
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
01.
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
Bitte warten ..
Mitglied: 76109
25.01.2010 um 23:08 Uhr
Hallo inspire!

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

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[0] mit Größe Struct usw. In der Variablen path als pdateien[0].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 (?):
01.
Char MyPath[] = "C:\\Test" 
02.
 
03.
filetypification(&MyPath, &pdateien[0].path);  
04.
 
05.
printf("%s", pdateien[0].path); // nach Rückkehr sollte das auch gehen 
06.
.... 
07.
 
08.
int filetypification(char *pfad, char *pointer) 
09.
{  
10.
   pointer = pfad; 
11.
 
12.
   printf("%s",pointer); 
13.
}
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 weiterhilft


Gruß Dieter
Bitte warten ..
Mitglied: inspire
25.01.2010 um 23:53 Uhr
Hallo dieter,

ich danke dir sehr für deine bemühungen, doch z.b. die zeile
filetypification(&MyPath, &pdateien[0].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:

01.
#include <stdio.h> 
02.
#include <stdlib.h> 
03.
#include <gtk/gtk.h> 
04.
#include <string.h> 
05.
#include <glib.h> 
06.
 
07.
typedef struct 
08.
09.
	char *path; 
10.
	char *title; 
11.
	char *artist; 
12.
	char *album; 
13.
	int year; 
14.
	char *comment; 
15.
	int track; 
16.
	char *genre; 
17.
	int bitrate; 
18.
	int sample_rate; 
19.
	int channels; 
20.
	int length; 
21.
} sFile; 
22.
 
23.
 
24.
int max_titel = 0; 
25.
sFile *pdateien[1000]; 
26.
 
27.
 
28.
int filetypification(char *pfad, sFile *pointer) 
29.
30.
	printf("\n\n----pfad: %s\n\n",(char*)pdateien[0]->path); 
31.
	pointer->path = pfad; 
32.
	return 0; 
33.
34.
 
35.
 
36.
static gboolean delete_event( GtkWidget *widget,GdkEvent  *event, gpointer   data ) 
37.
38.
	return FALSE; 
39.
40.
 
41.
 
42.
int main( int   argc, char *argv[] ) 
43.
44.
GtkWidget *window; 
45.
GtkWidget *b_play, *b_pause, *b_stop, *b_next, *b_previous, *b_repeat, *b_shuffle, *b_volup, *b_voldown, *b_open; 
46.
GtkWidget *table; 
47.
GtkWidget *hbox; 
48.
GtkWidget *vbox; 
49.
GtkWidget *l_titel,*l_zeit, *f_titel, *f_zeit; 
50.
GtkWidget *file_select; 
51.
GtkWidget *pbar; 
52.
GtkWidget *scrolled_window; 
53.
GtkWidget *gtklist; 
54.
GtkWidget *playlist; 
55.
GtkWidget *list_item; 
56.
gchar *sel; 
57.
gint open; 
58.
 
59.
 
60.
gtk_init (&argc, &argv); 
61.
 
62.
 
63.
pbar = gtk_progress_bar_new (); 
64.
 
65.
int closeopen(void) 
66.
67.
	gtk_widget_hide(file_select);  
68.
	return (0); 
69.
70.
 
71.
int fileopen(void) 
72.
73.
 
74.
	gtk_widget_show(file_select); 
75.
	return (0); 
76.
77.
 
78.
 
79.
int closelist(void) 
80.
81.
	gtk_widget_hide(playlist); 
82.
	return (0); 
83.
84.
 
85.
 
86.
 
87.
int get_filename(GtkWidget *widget, GtkFileSelection *selected) 
88.
89.
/* ------------------------------------------------------------------------------------*/ 
90.
	/* MÖGLICHKEIT 1: FUNKTIONIERT NICHT */ 
91.
	sel = (char *)gtk_file_selection_get_filename(GTK_FILE_SELECTION(selected)); 
92.
 
93.
	/* MÖGLICHKEIT 2: FUNKTIONIERT */ 
94.
	if(max_titel == 0) 
95.
		sel = "asd"; 
96.
	else 
97.
		sel = "dsa"; 
98.
 
99.
/* ------------------------------------------------------------------------------------*/ 
100.
 
101.
	printf("Folgende Datei wurde ausgewählt : %s\n\n", sel); 
102.
	gtk_widget_hide(file_select); 
103.
 
104.
	open=1; 
105.
	pdateien[max_titel] = malloc(sizeof(sFile));  
106.
	filetypification(sel, pdateien[max_titel]);  
107.
 
108.
	max_titel++; 
109.
 
110.
	printf("\n\npfad: %s\n",(char*)pdateien[0]->path); 
111.
 
112.
	if(max_titel == 2) 
113.
114.
		printf("\n\npfad: %s\n",(char*)pdateien[1]->path); 
115.
116.
 
117.
 
118.
	return (0); 
119.
 
120.
121.
 
122.
 
123.
/* Create a new window */ 
124.
window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
125.
 
126.
 
127.
/* Set the window title */ 
128.
gtk_window_set_title (GTK_WINDOW (window), "MP3 Player"); 
129.
 
130.
/* Set a handler for delete_event that immediately 
131.
* exits GTK. */ 
132.
g_signal_connect (G_OBJECT (window), "delete_event", 
133.
      G_CALLBACK (delete_event), NULL); 
134.
 
135.
/* Sets the border width of the window. */ 
136.
gtk_container_set_border_width (GTK_CONTAINER (window), 20); 
137.
 
138.
/* Create a 2 Zeilen x8 Spalten table */ 
139.
table = gtk_table_new (2, 8, TRUE); 
140.
 
141.
/*open  Knopf*/  
142.
b_open = gtk_button_new_with_label ("OPEN"); 
143.
g_signal_connect (G_OBJECT (b_open), "clicked", 
144.
      G_CALLBACK (fileopen),NULL); 
145.
gtk_table_attach_defaults (GTK_TABLE (table), b_open, 7, 8, 0, 2); 
146.
  
147.
 /*Eine Vertikale BOx mit unterliegenden horizontalen Boxen*/ 
148.
vbox = gtk_vbox_new (FALSE, 5); 
149.
hbox = gtk_hbox_new (FALSE, 5); 
150.
gtk_container_add (GTK_CONTAINER (window), hbox); 
151.
gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0); 
152.
gtk_container_set_border_width (GTK_CONTAINER (window), 5); 
153.
 
154.
hbox = gtk_hbox_new (FALSE, 5); 
155.
gtk_box_pack_start (GTK_BOX (vbox), pbar, FALSE, FALSE, 0); 
156.
gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0); 
157.
 
158.
gtk_widget_show_all (window); 
159.
 
160.
/* Oeffnen-dialog ------------------------------------------------- */ 
161.
 
162.
file_select = gtk_file_selection_new("Auswahl"); 
163.
/*Signale einrichten*/ 
164.
gtk_signal_connect(GTK_OBJECT(file_select), "destroy", 
165.
    (GtkSignalFunc) closeopen, &file_select); 
166.
gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(file_select)->ok_button), 
167.
    "clicked", (GtkSignalFunc) get_filename, file_select); 
168.
gtk_signal_connect_object(GTK_OBJECT(GTK_FILE_SELECTION(file_select)->cancel_button), 
169.
           "clicked", (GtkSignalFunc) closeopen, GTK_OBJECT(file_select)); 
170.
 
171.
 
172.
/*lock window size*/ 
173.
gtk_window_set_resizable (GTK_WINDOW(window), FALSE); 
174.
gtk_main (); 
175.
return 0; 
176.
}
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[0]->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 ;)
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Windows Update
Package Publisher - Copy has failed falscher Parameter

Frage von Belloci zum Thema Windows Update ...

Debian
gelöst Apticron report wird mit falscher IP in der Mail geschickt (5)

Frage von BakBone zum Thema Debian ...

Netzwerke
gelöst Windows 10 falscher DNS Server (4)

Frage von danielr1996 zum Thema Netzwerke ...

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...

Microsoft Office
Keine Updates für Office 2016 (11)

Frage von Motte990 zum Thema Microsoft Office ...