Delphi Code in C++ Code umwandeln/beschreiben ?
-
Hey ich wuerde gerne folgenden Delphi Code in C++ realisieren.
type PClient = ^TClient; TClient = record HostName : String[20]; { Hostname } PeerIP : string[15]; { Client IP address } TakeShot : boolean; { explained later } Connected, { Time of connect } LastAction : TDateTime; { Time of last transaction } Thread : Pointer; { Pointer to thread } end; ... var Clients : TThreadList;so hab ich es in cpp code umgewandelt:
struct TClient { String PeerIP; // { Client IP address } String HostName; // { Hostname } bool TakeShot; // TDateTime Connected; // { Time of connect } TDateTime LastAction; // { Time of last transaction } TThread *Thread; // { Pointer to thread } };wie man sehen kann fehlt aber eine deklaration,
PClient = ^TClient;ich glaube es soll einen Zeiger auf die TClient-Struktur darstellen, den ich dann in meiner Formklasse deklariert habe:
TClient *PClient; // Zeiger auf Clientstruktur TThreadList *Clients; // Clientlisteprocedure TMainFormServer.TCPServerConnect(AThread: TIdPeerThread); var NewClient: PClient; begin GetMem(NewClient, SizeOf(TClient)); NewClient.PeerIP := AThread.Connection.Socket.Binding.PeerIP; NewClient.HostName := GStack.WSGetHostByAddr(NewClient.PeerIP); NewClient.TakeShot := False; NewClient.Connected := Now; NewClient.LastAction := NewClient.Connected; NewClient.Thread := AThread; AThread.Data := TObject(NewClient); try Clients.LockList.Add(NewClient); finally Clients.UnlockList; end; end;
-
Hallo,
Das unter dem type sind Deklarationen. Das würde in C++ etwa so aussehen.
struct TClient { AnsiString HostName; // Hostname AnsiString PeerIP; // Cleint IP address bool TakeShot; // explained later TDateTime Connected; // Time of connect TDateTime LastAction; // Time of last transaction void* Thread; // Pointer to thread }; TClient* PClient;und der Rest irgendwie so
void TMainFormServer::TCPServerConnect(TIdPeerThread* AThread) { PClient NewClient = new TClient; NewClient->PeerIP = AThread->Connection->Socket->Binding->PeerIP; NewClient->HostName = GStack->WSGetHostByAddr(NewClient->PeerIP); NewClient->TakeShot = false; NewClient->Connected = Now(); NewClient->LastAction = NewClient->Connected; NewClient->Thread = AThread; AThread->Data = reinterpret_cast<TObject*>(NewClient); try { Clients->LockList->Add(NewClient); } __finally { Clients->UnlockList; } }
-
Danke fuer die schnelle Antwort,
aber leider gibt es Probleme...PClient NewClient = new TClient;[C++ Fehler] unt_server.cpp(26): E2379 In Anweisung fehlt ;
-
Hallo
vermutlich hast du vergessen die Headerdatei von "TClient" zu includen oder es fehlt irgendwo vor der gezeigten Stelle ein Semikolon.
bis bald
akari
-
nein, das ist es alles nicht!
mir kommt es so vor alls koennte er mit dem Variablen Typ PClient nichts anfangen. Wenn ich schreibe... (in der gleichen Zeile)
TClient NewClient;...dann gehts!
Aber hat es dann auch die gleiche "Funktion" ?!
EDIT:
BITTE BEITRAG LÖSCHEN.... ich versuch jetzt etwas anderes !
-
Wo ist der Unterschied zwischen
PClient NewClient;und
PClient* NewClient = new TClient;
-
So wie Braunstein sagte, sind TClient und PClient Deklarationen, so daß es korrekterweise
typedef TClient* PClient;heißen muß.
Nun kannst du entwederTClient* NewClient = new TClient;oder
PClient NewClient = new TClient;schreiben, wobei erste zu bevorzugen ist.
-
Ok, Ok, Ich habe das typedef oben vergessen.

typedef TClient* PClient;So wäre das richtig. Das könnte man aber auch weglassen und dann gleich das hier schreiben.
TClient* NewClient = new TClient;
-
Bei mir gibt der Teil mit der Threadlist immer eine Fehlermeldung.
http://home.arcor.de/fokal/Error.JPG
struct ClientData { AnsiString IP; TIdPeerThread *Thread; };private: // User declarations TThreadList *Clients;void __fastcall TForm1::ServerConnect(TIdPeerThread *AThread) { ClientData *ActClient = new ClientData; TIdSocketHandle *Handle = Server->Bindings->Add(); Handle->IP = AThread->Connection->Socket->Binding->IP; Handle->Port = AThread->Connection->Socket->Binding->Port; ActClient->IP = Handle->IP; ActClient->Thread = AThread; AThread->Data = reinterpret_cast<TObject*>(ActClient); try { Clients->LockList()->Add(ActClient); } __finally { Clients->UnlockList(); } Edit1->Text = Handle->IP; Edit2->Text = IntToStr(Handle->Port); MessageBox(0,"Connected","Titel",MB_OK); delete ActClient; }Was mach ich denn hier falsch?
Ich kenn mich mit Threads leider überhaupt nicht aus.
-