Top-Themen

Aktuelle Themen (A bis Z)

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, 3625 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 ..
Ähnliche Inhalte
LAN, WAN, Wireless
Was ist ein Access point?
Frage von miramaneeLAN, WAN, Wireless4 Kommentare

Hallo, ich werde meinen Hybrid Tarif bei der Telekom kündigen. Mein Arbeitszimmer ist sehr weit weg so gute 7 ...

Voice over IP
OpenVPN Point-to-Point - VoIP Probleme
Frage von erik10Voice over IP12 Kommentare

Hallo zusammen, melde mich hier, weil ich aktuell nicht ganz verstehe was da passiert. Vielleicht kann mir jemand helfen ...

Switche und Hubs
Access-Point mit PoE gesucht
gelöst Frage von Looser27Switche und Hubs5 Kommentare

Hallo allerseits, ich bin auf der Suche nach einem Access-Point für unser Gebäude. Da ich einen PoE-Switch im Einsatz ...

LAN, WAN, Wireless
Access Point Cisco Verbinden
Frage von Giusi1LAN, WAN, Wireless2 Kommentare

Guten Tag allerseits Kann mir Jemand helfen bitte? Ich habe drei Accesspoint 1142N Cisco Autonom Konfiguriert. Möchte nun alle ...

Neue Wissensbeiträge
Mac OS X

MacOS wo ist die Tilde ?

Tipp von Alchimedes vor 6 StundenMac OS X1 Kommentar

Hallo, ich hab eine MacOS qwertz Keyboard auf US Layout umgestellt da die Sonderzeichen besser erreichbar sind. Leider fehlt ...

Datenschutz

Weitere Informationen zum Sicherheitsproblem BeA

Information von Penny.Cilin vor 13 StundenDatenschutz

Im folgenden ein weiterer Bericht über die Sicherheitsprobleme von Bea. Fataler Konstruktionsfehler im besonderen elektronischen Anwaltspostfach Gruss Penny

Windows 10

Systemdienste behalten nach Win10 inplace-Upgrade nicht die ggf. modifizierte Startart bei

Tipp von DerWoWusste vor 15 StundenWindows 103 Kommentare

Stellt Euch vor, Ihr habt ein Win10 System und modifiziert dort die Startart von Systemdiensten. Zum Beispiel wollt Ihr ...

Microsoft Office

Deaktivieren von Startbildschirm und Backstage-Ansicht in Office 2016 per Batch-Datei

Anleitung von SarekHL vor 18 StundenMicrosoft Office17 Kommentare

Guten Morgen zusammen! Ich habe mir gestern (auch mit Hilfe dieses Boards) ein Script gebastelt, um in Office 2016 ...

Heiß diskutierte Inhalte
Netzwerke
NTFS-Berechtigung
Frage von Daoudi1973Netzwerke23 Kommentare

Hallo zusammen und frohes neues Jahr (Sorry, ich bin spät dran) Meine Frage: 1- Ich habe einen Ordner im ...

Batch & Shell
AD-Abfrage in Batchdatei und Ergebnis als Variable verarbeiten
gelöst Frage von Winfried-HHBatch & Shell19 Kommentare

Hallo in die Runde! Ich habe eine Ergänzungsfrage zu einem alten Thread von mir. Ausgangslage ist die Batchdatei, die ...

Windows 10
Netbook erkennt Soundkarte nicht - keinerlei Info zum Hersteller und Modell vom Netbook und Hardware bekannt
Frage von fyrb38Windows 1018 Kommentare

Guten Tag, meine Schwester reist in einigen Wochen für ein paar Monate ins Ausland und hat sich dafür ein ...

Microsoft Office
Deaktivieren von Startbildschirm und Backstage-Ansicht in Office 2016 per Batch-Datei
Anleitung von SarekHLMicrosoft Office17 Kommentare

Guten Morgen zusammen! Ich habe mir gestern (auch mit Hilfe dieses Boards) ein Script gebastelt, um in Office 2016 ...