Announcement

Collapse
No announcement yet.

c klassendeklaration nach Delphi übersetzen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • c klassendeklaration nach Delphi übersetzen

    Hallo zusammen, ich brauche mal eine Starthilfe,kann mir bitte jemand folgende Klassendeklaration nach Delphi übersetzen, mich irritiert vor allem, das der Klassenname immer wieder auftaucht, ist das bei proceduren so oder wie?:
    <pre>
    class Packet {
    public:
    Packet(uint8 protocol = OP_Const);
    Packet(char* header);
    Packet(char* pPacketPart,uint32 nSize,bool bLast);
    Packet(CMemFile* datafile,uint8 protocol = OP_Const);
    Packet(int8 in_opcode,int32 in_size,uint8 protocol = OP_Const);
    ~Packet();
    char* GetHeader();
    char* GetUDPHeader();
    char* GetPacket();
    char* DetachPacket();
    uint32 GetRealPacketSize()
    bool IsSplitted()
    bool IsLastSplitted()
    void PackPacket();
    bool UnPackPacket();
    char* pBuffer;
    uint32 size;
    uint8 opcode;
    uint8 prot;
    private:
    bool m_bSplitted;
    bool m_bLastSplitted;
    char head[6];
    char* completebuffer;
    char* tempbuffer;
    bool m_bPacked;
    };
    </pre>
    Vielen Dank schon mal im voraus...

  • #2
    Wenn du das nachbauen willst, so ist das relativ einfach. Der Zugriff auf ein C++ Objekt ist nur sehr schwer moeglich wenn nicht unmoeglich.<br>
    <pre>
    // Packet ist der class name also TPacket in Delphi Schreibweise
    class Packet {
    public:
    // das hier sind mehrere ueberladene Konstruktoren
    Packet(uint8 protocol = OP_Const);
    constructor Create(protocol: Byte = OP_Const);
    Packet(char* header);
    constructor Create(header: PChar);
    Packet(char* pPacketPart,uint32 nSize,bool bLast);
    constructor Create(PacketPar: PChar; nSize: Cardinal; bLast: LongBool);
    Packet(CMemFile* datafile,uint8 protocol = OP_Const);
    constructor Create(datafile: TMemoryStream; protocol: Byte = OP_Const);
    Packet(int8 in_opcode,int32 in_size,uint8 protocol = OP_Const);
    // den mach mal selbst :-)
    // das ist der Destruktor umsetzen nach Destroy
    ~Packet();
    // das hier sind verschiedene Methoden
    char* GetHeader();
    function GetHeader: PChar;
    char* GetUDPHeader();
    // die anderen wie GetHeader
    char* GetPacket();
    char* DetachPacket();
    // lies die Konstruktoren und mach es selbst
    uint32 GetRealPacketSize()
    bool IsSplitted()
    bool IsLastSplitted()
    void PackPacket();
    procedure PackPacket;
    bool UnPackPacket();
    // hier kommen Variablen
    char* pBuffer;
    uint32 size;
    uint8 opcode;
    uint8 prot;
    private:
    // und noch ein paar private Variablen
    bool m_bSplitted;
    bool m_bLastSplitted;
    char head[6];
    head: array [0..5] of Char;
    char* completebuffer;
    char* tempbuffer;
    bool m_bPacked;
    }; </pre>
    Das soll nur als Anleitung dienen. Ich garantiere fuer nichts

    Comment


    • #3
      Ach so ist das, den Klassennnamen habe ich ja noch erkannt und die Funktionen und Variablen habe ich mir dann auch richtig gedacht, nur das mehrmalige Auftauchen des Klassennamens hätte ich nicht mit Konstruktoren in Verbindung gebracht, das hat mich echt irritiert. Also vielen Dank!

      Comment


      • #4
        Jetzt wirds aber komisch, was die da erzeugen:
        <pre>
        Packet::Packet(char* header){
        m_bSplitted = false;
        m_bPacked = false;
        m_bLastSplitted = false;
        tempbuffer = 0;
        pBuffer = 0;
        completebuffer = 0;
        Header_Struct* head = (Header_Struct*) header;
        size = head->packetlength-1;
        opcode = head->command;
        prot = head->eDonkeyID;
        </pre>wobei head als char head[6] definiert ist und Header_Struct als
        <pre>
        struct Header_Struct{
        int8 eDonkeyID;
        int32 packetlength;
        int8 command;
        </pre> kann mir jemand verraten, warum 1. nicht gleich die variable head und der parameter header als header_Struct definiert sind und 2. warum z.b. der zugriff head->packetlength-1 möglich ist. Merkt sich c welche struktur man vorher da reingecastet hat oder wie

        Comment


        • #5
          Na sie nehmen den Zeiger header und typen ihn in einen Header_Struct Zeiger um. Man haette header als void * 8Pointer) statt einem char * (PChar) typen sollen, aber Zeiger ist Zeiger. Was man ausdruecken will ist das eine variable grosse Struktur uebergeben wird, die am Andang einen Header enthaelt der den Rest der Struktur beschreibt.<br>
          Nachdem der Zeiger umgetypt ist kann man natuerlich auf die Elemente der Struktur zugreifen.<br>
          head->packetlength entspricht head^.packetlength in Delphi

          Comment


          • #6
            Na aber so wie es aussieht wird doch hier ausschlieslich eine Header_Struct übergeben, nichts dahinter, also wieso nicht gleich so deklarieren? und die Konstruktion head->packetlength verwundert mich weil head ja auch nicht als Header_Struct deklariert ist sondern nur als "char head[6]", wieso kann man dann ohne cast diesen zugriff verwenden, bzw woher weiss der compiler das ich packetlength aus Header_Struct meine wenn ich eigentlich, nach deklaration auf ein array of char zugreife

            Comment


            • #7
              Abgesehen von den Fragen der letzten Nachricht scheine ich jetzt eh am ende zu sein, in folgender Funktion:<pre>
              char* Packet::GetHeader(){
              ASSERT ( !m_bSplitted );
              Header_Struct* header = (Header_Struct*) head;
              header->command = opcode;
              header->eDonkeyID = prot;
              header->packetlength = size+1;
              return head;
              }
              </pre> taucht auf einmal ein Zugriff auf den Bezeichner header auf, diesen gibt es bei manchen anderen Funktionen/Prozeduren als parameter aber weder als Klassenvariable noch finde ich sie global, was wohl auch gefährlich währe. Woher kommt die Variable also? Oder ist es die Result Variable? Das müsste aber heissen das bei einer Funktion getHeader automatisch mit dem bezeichner header auf result zugegriffen werden kann?! Und last not least, wieso wird header gefüllt wenn anschliessend doch head zurückgegeben wird (was im übrigen sinn macht, head ist die klassenvariable vom typ Header_Struct)

              Comment


              • #8
                "Header_Struct* head = (Header_Struct*) header;" ist die Deklaration einer lokalen Variablen im Konstruktor. Damit ist das head der Klasse ueberlagert.<br>
                Ansonsten ist header ein PChar. Wie gross die Daten dahinter sind ist nicht klar. Am Anfang steht ein Header_Struct. Hinter dem Headr_Struct stehen hoechstwahrscheinlich packetLength oder packetLength - SizeOf(Header_struct) Daten.<br><br>
                In GetHeader wird das obige umgedreht. Diesmal ist header der Zeiger auf die Struktur und er wird auf das head der Klasse zeigen lassen (das mit den 6 Chars). Es wird dann der Zeiger (PChar) auf head zurueckgeliefert. Dabei sit sichergestellt das es keine lokale Variable ist, da es ja Teil der Klasse ist

                Comment


                • #9
                  Hmm, also get Header ist doch eigentlich eine Funktion, die den Header zurrückgeben soll, das wäre doch m.e. mit return head erledigt?! Wwofür also die Lokale Variable Header, die macht für mich keine Sinn

                  Comment


                  • #10
                    Komisch meine letzte Nachricht ist wohl nicht hierhin durchgedrungen, naja, dann nochmal: Was mich daran wundert ist, wofür ist die Lokale Variable header nötig, die erst gefüllt und dann nach verlassen der prozedur ja eh vernichtet wird. Das return head; hätte doch gereicht?

                    Comment


                    • #11
                      Das private Element der Klasse "char head[6];" ist ein Puffer fuer ein Header_Struct. GetHeader richtet einen Zeiger auf ein Header_Struct auf diesen Puffer und fuellt ihn aus. Dann liefert die Methode den Zeiger als PChar zurueck.<br>
                      Da head ein Element des Objektes ist, existiert es solange das Objekt existiert und man muss sich nicht mit Alloziierungen rumschlagen.<br>
                      Der Hauptfehler ist das head nicht als Header_Struct deklariert ist sondern als gleich langes array. Deshalb diese vielen Umtypungen mit lokalen Zeigern

                      Comment


                      • #12
                        Ach, jetzt wird mir langsam klar, das head scheinbar nicht immer die richtigen Werte enthält, der ganze umstand ist also nur es vorher noch zu füllen..., tststs, c eben )
                        dank

                        Comment

                        Working...
                        X