Hi,
ich hänge momentan an einem Problem und komme nicht weiter.
Ich versuche, in meinem Programm eine Ini-Datei auszulesen und die ausgelesenen Werte abzuspeichern.
Von der Idee her find ich das auch ganz einfach umzusetzen, nur diese ganze Pointernotation macht mir echt zu schaffen. Ich muss dazu sagen, dass ich inzwischen ca 5-6 Jahre kein C mehr programmiert habe und daher immer wieder auf Probleme stoße, der Großteil davon hat mit Zeigern zu tun.
Meine gedachte Vorgehensweise zum Auslesen eines Ini-Keys ist folgende:
- Im Main deklariere ich einen char*, der auf den späteren String zeigen soll
- Diesen Zeiger übergebe ich an eine Unterfunktion, die mir das Ini-File auslesen soll
- Ich lese den Schlüssel der Inidatei in einen Puffer aus (GetPrivateProfileString)
- Die Länge des resultierenden Arrays im Puffer wird für ein realloc in der Unterfunktion verwendet, um den ursprünglichen Zeiger mit Speicher zu versehen
- Der String des Schlüssels wird in den neu alloziierten Speicher geschrieben
- Die Unterfunktion wird beendet
- Nach Verarbeitung des Schlüssels wird der alloziierte Speicher mit free wieder freigegeben
Ich habe dies probiert und es gab logischerweise einen Stack corrupt, weil ich höchstwahrscheinlich nur ein Call-by-Value gemacht hab und daher mein umalloziierter Chararray lokal war und danach dann wieder gelöscht wurde.
Hier der Code dazu:
void GetIniString(char* Section, char* Key, char* IniPath, char* StringArray) {
char KeyReadingBuffer[255];
GetPrivateProfileString(Section, Key, NULL, KeyReadingBuffer, 254, IniPath);
StringArray = (char*)realloc(StringArray, (strlen(KeyReadingBuffer)*sizeof(char)));
strncpy(StringArray, KeyReadingBuffer, strlen(KeyReadingBuffer));
StringArray[strlen(KeyReadingBuffer)] = '\0';
return;
}
Aufruf mit:
GetIniString("Section", "Key", IniPath, StringArray);
free(StringArray);
Daher habe ich probiert, den char* vom Main per Call-by-reference zu übergeben und in der Unterfunktion über den Zeiger auf den ursprünglichen Zeiger zuzugreifen.
Dabei verrenne ich mich aber hilflos in * und & Zeichen, weil ich nie weiß, wann ich was brauche.
Analog zu diesem Problem versuche ich das auch noch mit einer Matrix, um eine ganze Section per GetPrivateProfileSection auszulesen und dann abzuspeichern.
Kann mir da jemand ein wenig weiterhelfen, damit ich mal den richtigen Weg finde?
Danke für die Hilfe.
Gruß,
Joe
ich hänge momentan an einem Problem und komme nicht weiter.
Ich versuche, in meinem Programm eine Ini-Datei auszulesen und die ausgelesenen Werte abzuspeichern.
Von der Idee her find ich das auch ganz einfach umzusetzen, nur diese ganze Pointernotation macht mir echt zu schaffen. Ich muss dazu sagen, dass ich inzwischen ca 5-6 Jahre kein C mehr programmiert habe und daher immer wieder auf Probleme stoße, der Großteil davon hat mit Zeigern zu tun.
Meine gedachte Vorgehensweise zum Auslesen eines Ini-Keys ist folgende:
- Im Main deklariere ich einen char*, der auf den späteren String zeigen soll
- Diesen Zeiger übergebe ich an eine Unterfunktion, die mir das Ini-File auslesen soll
- Ich lese den Schlüssel der Inidatei in einen Puffer aus (GetPrivateProfileString)
- Die Länge des resultierenden Arrays im Puffer wird für ein realloc in der Unterfunktion verwendet, um den ursprünglichen Zeiger mit Speicher zu versehen
- Der String des Schlüssels wird in den neu alloziierten Speicher geschrieben
- Die Unterfunktion wird beendet
- Nach Verarbeitung des Schlüssels wird der alloziierte Speicher mit free wieder freigegeben
Ich habe dies probiert und es gab logischerweise einen Stack corrupt, weil ich höchstwahrscheinlich nur ein Call-by-Value gemacht hab und daher mein umalloziierter Chararray lokal war und danach dann wieder gelöscht wurde.
Hier der Code dazu:
void GetIniString(char* Section, char* Key, char* IniPath, char* StringArray) {
char KeyReadingBuffer[255];
GetPrivateProfileString(Section, Key, NULL, KeyReadingBuffer, 254, IniPath);
StringArray = (char*)realloc(StringArray, (strlen(KeyReadingBuffer)*sizeof(char)));
strncpy(StringArray, KeyReadingBuffer, strlen(KeyReadingBuffer));
StringArray[strlen(KeyReadingBuffer)] = '\0';
return;
}
Aufruf mit:
GetIniString("Section", "Key", IniPath, StringArray);
free(StringArray);
Daher habe ich probiert, den char* vom Main per Call-by-reference zu übergeben und in der Unterfunktion über den Zeiger auf den ursprünglichen Zeiger zuzugreifen.
Dabei verrenne ich mich aber hilflos in * und & Zeichen, weil ich nie weiß, wann ich was brauche.
Analog zu diesem Problem versuche ich das auch noch mit einer Matrix, um eine ganze Section per GetPrivateProfileSection auszulesen und dann abzuspeichern.
Kann mir da jemand ein wenig weiterhelfen, damit ich mal den richtigen Weg finde?
Danke für die Hilfe.
Gruß,
Joe