M
Matthias_Nordwig
Mein Ziel ist es einen eingelesenen String nach Trennzeichen in ein dynamisches Array zu zerlegen. An sich klappt das auch ganz gut Nur kommt es danach immer zu einer Zugriffsverletzung. Ich kann mir leider nicht erklären warum. Kann mir wer helfen?
Hier der Code (an entsprechenden Stellen kommentiert)
Aufrufende Funktion:
Code------------------------------------------
------------------------------------------Code
Das lustige ist: die Funktionalität an sich klappt. Die einzelnen Felder werden im Anschluss korrekt ausgegeben. Aber danach kommt es, definitiv durch diese Funktionalität verursacht, zum Zugriffsfehler im Speicher. Liegt das eventuell daran das für andere Funktionen der Anwendung reservierter Speicher überschrieben wird, der dann aufgerufen wird? Muss ich das dann mit Calloc realisieren? Oder gibt es eine elegantere Lösung für dynamische Arrays in C++?
Vielen Dank im Vorraus
Matthias Nordwig
Nach oben schieb
Hier der Code (an entsprechenden Stellen kommentiert)
Aufrufende Funktion:
Code------------------------------------------
Code:
void __fastcall Tanmeldung::AnmeldenClick(TObject *Sender)
{
String buf;
char delimiter=';';
struct hostent * host = gethostbyname(chat->ip.c_str());
chat->ip = AnsiString(int(LOBYTE(LOWORD(*((DWORD*)host->h_addr_list[0]))))) + ".";
chat->ip += AnsiString(int(HIBYTE(LOWORD(*((DWORD*)host->h_addr_list[0]))))) + ".";
chat->ip += AnsiString(int(LOBYTE(HIWORD(*((DWORD*)host->h_addr_list[0]))))) + ".";
chat->ip += AnsiString(int(HIBYTE(HIWORD(*((DWORD*)host->h_addr_list[0])))));
chat->hostname=host->h_name;
chat->nick=txt_user->Text;
// Ab hier wird es interessant:
file_write("test.txt","abc;def","w");
----------- Das ist der bezügliche String der durch eine Selbstgeschriebene Funktion in eine Datei geschrieben wird
MessageBox(0,file_read("test.txt").c_str(),"huhu",0);
chat->delimit_string(&buf,file_read("test.txt"),delimiter);
------------------------------------------------
Hier übergebe ich wie folgt:
(Die Adresse des Zeigers;Den zu zerlegenden String, Das Trennzeichen )
MessageBox(0,(*(&buf)).c_str(),"huhu",0); \
MessageBox(0,(*(&buf+1)).c_str(),"huhu",0); > testweise Ausgabe der Felder
MessageBox(0,(*(&buf+2)).c_str(),"huhu",0); /
anmeldung->Hide();
chat->Show();
}
------------------------------------------Code
Aufgerufene Funktion:
Code------------------------------------------
void __fastcall Tchat::delimit_string(String *buf,String text,char delimiter)
{
long i=1,i2=1;-->Zählvariablen
buf=buf+1;-->Die Adresse wird hochgezählt, wodurch ich mein Array begründe (ich lasse hier also das 0. Feld erstmal leer)
*buf="";
for(i=1;i<text.Length()+1;i++) --> Schleife für Abarbeitung jedes einzelnen Zeichens
{
if(text[i]==delimiter) --> Prüft ob aktuelles Zeichen = delimiter
{
buf=buf-i2; --> herstellen der ursprungsadresse
i2++; --> hochzählen der Felder
i++;
buf=buf+i2; Adresse auf letztes Feld setzen
*buf="";
}
*buf+=text[i];--> aktuelles Zeichen wird an aktuelles Feld angehängt
}
buf=buf-i2; --> Ursprungsadresse wird angesprungen (0. Feld)
*buf=i2; --> Länge des Arrays wird in erstes Feld eingetragen
}
------------------------------------------Code
Das lustige ist: die Funktionalität an sich klappt. Die einzelnen Felder werden im Anschluss korrekt ausgegeben. Aber danach kommt es, definitiv durch diese Funktionalität verursacht, zum Zugriffsfehler im Speicher. Liegt das eventuell daran das für andere Funktionen der Anwendung reservierter Speicher überschrieben wird, der dann aufgerufen wird? Muss ich das dann mit Calloc realisieren? Oder gibt es eine elegantere Lösung für dynamische Arrays in C++?
Vielen Dank im Vorraus
Matthias Nordwig
Nach oben schieb
Zuletzt bearbeitet von einem Moderator: