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;		// Clientliste
    
    procedure 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 entweder

    TClient* 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.



  • Hallo

    Debugger benutzen um Verlauf und Variablen deines Programms zu verfolgen.

    bis bald
    akari


Anmelden zum Antworten