• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

Problem beim C Programmieren

FA_Myx

Guest
Hier mein Code:

void MakeIndividualUsernamesAndFiles (char *FileList[],int FileListSize, PsyHndl hndl,char **RetFileList){


char **NewFileList = NULL;

if((NewFileList = (char **) malloc(sizeof (char*) * FileListSize)) == NULL) {cout << "zu wenig Speicher vorhanden"; goto exit;}
for(int j = 0;j < FileListSize;j++){
if ((NewFileList[j] = (char*) malloc(sizeof (char*) * _MAX_PATH)) == NULL) {cout << "zu wenig Speicher vorhanden"; goto exit;}
}


for (int k = 0 ; k<FileListSize;k++)
cout << "\n Number: " << k << ": " << NewFileList[k] << "\n"; // funktioniert
RetFileList = NewFileList;
for (int x = 0 ; x<FileListSize;x++)
cout << "\n Number: " << x << ": " << RetFileList[x] << "\n"; // Speicher Fehler !!
return retvalue;
}


int _tmain(int argc, _TCHAR* argv[])
{
char **NewList;
MakeIndividualUsernamesAndFiles(FileList,2,0,NewList);

return 0;
}

Sorry für die schlechte Formatierung...
Mein Problem, ich kapier net wieso er den Speicherfehler bringt. Ich würde die Liste die ich mir erstelle gerne im Hauptprogramm verwenden, wie mach ich das ?

Danke für gute Ideen
Myx
 

Clawg

Guest
1. goto ist grundsaetzlich boese (= moegliche Fehlerquelle)
2. Pruefe am Anfang der Funktion ob die uebergebene Variablen FileList, FileListSize und hndl gueltige Werte aufweisen
3. In der Zeile "if ((NewFileList[j] = (char*) malloc(sizeof (char*) * _MAX_PATH)) == NULL)" allokierst du Speicher fuer einen Pointer auf ein Char-Array (d.h. einen String), weisst aber als Groesse sizeof(char*)*_MAX_PATH anstatt sizeof(char)*_MAX_PATH zu. (d.h. womoeglich 4 bytes statt 1 byte)
4. cout ist nicht C. In C benutzt man printf. (bzw. benutzt man in C++ new und nicht malloc)
5. 'return retvalue;' hat dort nichts verloren

Bereinigt kompiliert und laeuft das Programm problemlos:

#include <iostream>

void MakeIndividualUsernamesAndFiles (int FileListSize, char **RetFileList){


char **NewFileList = NULL;

if((NewFileList = (char **) malloc(sizeof (char*) * FileListSize)) == NULL) {std::cout << "zu wenig Speicher vorhanden";}
for(int j = 0;j < FileListSize;j++){
if ((NewFileList[j] = (char*) malloc(sizeof (char*) * 100)) == NULL) {std::cout << "zu wenig Speicher vorhanden";}
}


for (int k = 0 ; k<FileListSize;k++)
std::cout << "\n Number: " << k << ": " << NewFileList[k] << "\n"; // funktioniert
RetFileList = NewFileList;
for (int x = 0 ; x<FileListSize;x++)
std::cout << "\n Number: " << x << ": " << RetFileList[x] << "\n"; // funktioniert
}


int main()
{
char **NewList;
MakeIndividualUsernamesAndFiles(10, NewList);

return 0;
}
 

haschischtasche

Ährenpenis
Mitglied seit
28.09.2002
Beiträge
37.131
Reaktionen
7.874
ich nur kann delphi/pascal, blitzbasic und nen bisschen purebasic :8[:
 
Mitglied seit
06.10.2002
Beiträge
2.210
Reaktionen
0
claw rawkt.
naja, schlussendlich studiert er die kacke, ne ? :)
 
Mitglied seit
20.09.2001
Beiträge
1.355
Reaktionen
0
claw sein teil sieht schon gut aus, würd statt dem goto exit nen return; machen da in deinem main ja eh nix mehr folgt und du bei nem fehler die funktion bzw dein programm beenden willst. dazu würd ich für bessere lesbarkeit bei if nich alles in einer zeile schreiben, das führt bei grösseren code nur zu problemen da man fehlerquellen schlecht wiederfindet besonders beim debugging :o
 

Clawg

Guest
Ok, nochmal in schoen und professionell (wobei mangels Inhalt im Originalprogramm hier einiges wegfaellt, v.a. die Fehlerbehandlung :o )

#include <iostream>
#include <string>
#include <list>
void makeIndividualUsernamesAndFiles(std::list<std::string>& new_file_list)
{
// ... newFileList mit tollen Sachen fuellen ...
int k = 0;
for(std::list<std::string>::const_iterator i = new_file_list.begin();i!=new_file_list.end();i++)
{
std::cout << "\n Number: " << k << ": " << *i << "\n"; // funktioniert
k++;
}
}

int main()
{
std::list<std::string> file_list;
makeIndividualUsernamesAndFiles(file_list);
return 0;
}
 

FA_Myx

Guest
Hallo Claw, danke für deine Antworten und Anregungen.

Das Problem hat sich mittlerweile gelöst. Der Witz ist, das Programm war vollkommen richtig, bei nem Freund läuft es ohne Probleme. Nur bei mir nicht. Warum weiss der Geier, vielleicht ist mein Project irgendwie kaputt.

Ja goto ist grundsätzlich böse, um Fehler abzufangen allerdings sehr hilfreich und von vielen Programmieren für diesen Zweck als legitim anerkannt. Ich hab das eh nur von meinem Vorgänger übernommen.

Die 3. Zeile ja stimmt da ist tatsächlich ein Fehler, da hat er bisschen zu viel Speicher geholt. Danke.

4. japp is klar, naja cout nehm ich nur weil ichs angenehmer als printf finde und mein Vorgänger das auch so gemacht hat.

5. japp sorry, hab ich übersehen als ich das Testprogramm für euch zusammen gebaut hab.

Deine Endlösung ist nun aber komplett C++ oder?
Werde mal fragen ob ich das teilweise benutzen darf, zumal es mit C++ natürlich viel einfacher geht. Gibt da ja genug schöne flexible Datenstrukturen...

Danke für deine Bemühungen nochmals.

Myx
 

The_Company

Guest
Uhm, wenn man einfach irgendwas malloced und das dann als string printed, hat man ein Problem wenn das Memoryu kein 0 Byte enthält.
 
Oben