Zeigerproblem

  • Themenstarter Themenstarter Matthias_Nordwig
  • Beginndatum Beginndatum
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:
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:
Hallo Matthias,
benutze doch in Zukunft bitte die vom tutorials.de Editor angebotenen "Code Tags",
dann klappts auch mit em Nachbarn.
Angesichts deines Formatierungs wirrwarrs hab ich schnell was selber geschrieben:

Code:
#include <iostream>
#include <vector>
#include <string.h>

using namespace std;
    
int main(){

        char *token;
        string ip = "192.168.0.1";
        vector <char*> split_cont;
        
        token = strtok((char*)ip.c_str(), ".");
        split_cont.push_back(token);
        while(token != NULL){
                token = strtok(NULL, "."); 
                split_cont.push_back(token);
        }
        for(int i = 0; i < split_cont.size(); i++)
                cout << split_cont[i] << endl;

}



Matthias hat gesagt.:
Oder gibt es eine elegantere Lösung für dynamische Arrays in C++?

Schaust du zum Beispiel hier

Gruß

RedWing
 
Zurück