Integerwerte über Pointer an Integervariable zuweisen.



  • Junge, junge soviel Antworten habe ich nicht erwartet.

    WebFritzi hatte recht, Tkatitem wurde nicht richtig initialisiert, da ich die Initialisierungsroutine überladen hatte und ausgerechnet die falsche Version der Funktion verwendet wurde.

    Junix, die Variablen sind Teil von Tkatitem sprich Tkatitem ist wie folgt aufgebaut:

    class Tkatitem
            {
            public:
                    AnsiString name;
                    AnsiString iconnect;
                    GUID iguid;
                    TList* events;
            }
    

    Hier müßten doch dann die Variablen im Speicher erhalten bleiben, wenn ich die Klasse nicht freigebe oder ?

    Mittlerweile krieg ich auch was auf dem Bildschirm angezeigt, wenn ich

    tmKatitem->name
    

    z.B. einem Editfeld zuweise. Allerdings sind das im Moment leider noch irgendwelchen unidentifizierbaren Hieroglyphen, obwoh dort eigentlich der Name stehen sollte. Weiß hier jemand, womit das zusammenhängt?

    <KleinerFeiglich> sorry, ist ne eigene Klasse in meinem Programm und dient nur zu programminternen Geschichten.

    Gruß

    Udo



  • z.B. einem Editfeld zuweise. Allerdings sind das im Moment leider noch irgendwelchen unidentifizierbaren Hieroglyphen, obwoh dort eigentlich der Name stehen sollte. Weiß hier jemand, womit das zusammenhängt?

    Schau dir nochmal in Ruhe junix' Post an, bevor du weiterfragst... Oder noch besser: schau dir in einem C++-Tutorial ein Kapitel über Pointer an.

    [ Dieser Beitrag wurde am 13.01.2003 um 00:53 Uhr von WebFritzi editiert. ]



  • ...und, udo, Schau mal in der FAQ den Beitrag "Public-Variablen sind Böse aber wieso?" an den du im FAQ-Index unter "Allgemeines" findest.

    -junix



  • Ehrlich gesagt, versteh ich hier wirklich was nicht. Kann sein, daß ich mich täusche, aber wenn ich ne neue Klasse oder ein Objekt mit new deklariere muß ich die doch extra mit delete wieder freigeben, da sie ansonsten im Speicher bleiben.

    Also müßte es doch möglich sein, über nen Pointer aus einer anderen Funktion auf die Daten von Katitem zuzugreifen, weil die Klasse eben mit new erzeugt wird ?!

    Und die Version mit tmpKatitem->name hat bei einer anderen Möglichkeit auch funktioniert. Siehe z.B. den VirtualTreeView die Funktion VT.NodeGetDataSize(Node); hier wird über diese Funktion ein Pointer auf ne Klasse bzw. Datenstruktur zurückgegeben und ich kann nach dem Typcasten einwandfrei auf die Daten der Struktur zugreifen (hoffe den VT kennt Ihr, aber ich denke schon).

    Also helft mir bitte. Es kann durchaus sein, daß ich hier im Moment auf dem Schlauch stehe und was verwechsle.

    Danke

    Udo



  • Item->DataP = &Katitem;
    

    Diese Zeile sagt mir, dass du Katitem garantiert nicht mit new erzeugt hast. Sonst könnte der restliche Code auch nichtmehr funktionieren.
    Ich kann nur nochmal auf Webfritzi verweisen. Er hat recht. Bevor du weitermit Zeigern rumspielst solltest du dringends in einem Tutorial mal über Zeiger nachlesen.

    KLeine Zwischenfrage an dich: Was macht der Operator '&'?

    -junix

    [ Dieser Beitrag wurde am 13.01.2003 um 01:24 Uhr von junix editiert. ]



  • & weist einem Pointer die Adresse von einem Objekt oder einer Variablen als Wert zu. In diesem Fall hier soll die Adresse von Katitem an Item->DataP übergeben werden, so daß DataP die Adresse von Katitem enthält.

    Aber Du hattest recht Unix. Es lag wirklich am &-Operator. In meiner Funktion werden mehrere Katitems in einer TList gespeichert (natürlich nur die Addressen) und durch die Zuweisung mit dem &-Operator habe ich die Adresse des TListitems erhalten und nicht die Adresse von Katitem. Das kann natürlich nicht funktionieren.

    Aber ich möchte Euch trotzdem nochmal recht herzlich für Eure Hilfe bedanken. :p Und das mit den Pointer krieg ich auch noch auf die Reihe. Arbeite erst seit ungefähr 6 Wochen mit dem BCB und da läuft halt noch nicht alles rund.

    Gruß

    Udo

    [ Dieser Beitrag wurde am 13.01.2003 um 01:31 Uhr von Darkheart editiert. ]



  • & weist einem Pointer die Adresse von einem Objekt oder einer Variablen als Wert zu.

    Falsch. Der weist garnichts zu... der gibt was zurück! Und zwar einen Pointer auf die Adresse des angegebenen Objektes.

    Also, sagen wir Katiitem ist ein Pointer auf ein Tkatiitem. Von welchem Typ ist dann wohl &katiitem?

    [ Dieser Beitrag wurde am 13.01.2003 um 01:37 Uhr von WebFritzi editiert. ]



  • Sorry, gibt die Adresse zurück! Natürlich und dass sollte ja auch so sein. DataP soll ja den Pointer von Katitem enthalten. Habs vielleicht falsch ausgedrückt.



  • DataP soll ja den Pointer von Katitem enthalten

    Und genau das ist der Punkt. Ich dachte, Katiitem ist ein Pointer?

    Edit: Beantworte meine Frage in meinem vorigen Post.

    [ Dieser Beitrag wurde am 13.01.2003 um 01:39 Uhr von WebFritzi editiert. ]



  • Moment jetzt! Langsam wirds haarig. Also Katitem ist wie folgt deklariert

    Tkatitem *Katitem = new Tkatitem;

    Insofern ist Katitem ein Objekt vom Typ Tkatitem und &Katitem gibt die Adresse des Objekts im Speicher zurück.

    So, und die Adresse an der das Objekt liegt habe ich mit

    Item->DataP = &Katitem;

    der Variablen DataP zugewiesen. Oder etwa nicht?



  • Original erstellt von Darkheart:
    **Moment jetzt! Langsam wirds haarig. Also Katitem ist wie folgt deklariert

    Tkatitem *Katitem = new Tkatitem;

    Insofern ist Katitem ein Objekt vom Typ Tkatitem und &Katitem gibt die Adresse des Objekts im Speicher zurück.
    **

    Nö. Katiitem ist ein Objekt vom Typ Tkatiitem*. Soll heißen: Katiitem zeigt auf ein Tkatiitem-Objekt. So, mit dem Wissen solltest du mir jetzt sagen können, von was für einem Typ &Katiitem ist.



  • Die Adresse von einem Pointer auf ein Tkatitem. Uuuups! Dachte wirklich, daß es sich dabei direkt um das Objekt handelt.



  • Original erstellt von Darkheart:
    Die Adresse von einem Pointer auf ein Tkatitem.

    Naja OK. Das lasse ich gelten. Also, &Katiitem ist vom Typ Tkatiitem**, also ein Pointer auf einen Pointer auf ein Tkatiitem-Objekt. So, und was musst du jetzt schreiben, um Item->DataP auf das Tkatiitem-Objekt zeigen zu lassen?

    P.S.: Hast mal Java geproggt?

    [ Dieser Beitrag wurde am 13.01.2003 um 02:00 Uhr von WebFritzi editiert. ]



  • Ja, ist klar ====> Item->DataP = Katitem;

    Java: Nein, noch nicht! Bisher einiges in Delphi, viel in HTML, PHP und Javascript. Java war mir irgendwie immer zu hart und zu kompliziert. Aber das dachte ich von C++ auch, bis ich im November/Dezember letzten Jahres angefangen habe. 🙂



  • Von welchem Typ ist eigentlich DataP?



  • DataP ist als void* deklariert, also ein allgemeiner Pointer. Folglich muß ich beim Auslesen von DataP ein Typcast auf einen Tkatitem* vornehmen. Aber das geht in Ordnung so, weil ich damit auch noch andere Klassen referenzieren möchte.



  • Du bist ein schlaues Bürschchen. Hast alles sofort kapiert. Super! 🙂 Nur solltest du nicht einfach drauflos proggen, sondern dir manchmal nochmal Gedanken darüber machen, was du da wirklich machst. Das ist besonders wichtig, wenn du mit dem Speicher arbeitest.



  • Danke 🙂

    Deshalb habe ich auch diesen Treath hier gepostet. Ich hatte zuvor für jede Kleinigkeit in meinem Programm eine eigene Variable definiert. Zuviele Integer, AnsiStrings, etc. für ein und dieselben Elemente, bis mir letzte Woche der Gedanke mit den Pointern kam. Du kannst Dir natürlich vorstellen, daß ein paar Änderungen schon ne Menge an Speichereinsparung gebracht haben.

    Das was mir im Moment noch fehlt, ist teilweise das Feeling für C++. Aber ich bin sicher, wenn ich mich ne Weile damit beschäftige, dann werde ich das auch auf die Reihe kriegen. Ehrlich gesagt, werde ich die ganze WEB-Programmiererei wahrscheinlich komplett über Bord werfen und mich nur noch dem BCB widmen. Es macht mehr Spaß und ein Grafiker war ich sowieso noch nie.

    Also bis dann und Danke nochmal für Euere Hilfe

    Udo



  • Gut geführt, Fritzi (:
    Gut begriffen, Udo.

    Vergiss aber bei all der Zeigerei nicht den Artikel über Public-Variablen zu lesen den ich dir angegeben habe. Ist ein recht wichtiges Thema.

    -junix



  • Hallo junix,

    habe mir den Artikel schon mal heute Nacht angesehen, aber ich werde ihn nochmal durchlesen. War aber schon interessant.

    Danke auch nochmal für Deine Hilfe!

    Gruß

    Udo 😉


Anmelden zum Antworten