 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Make-Grafik
Anmeldungsdatum: 08.10.2012 Beiträge: 29
|
Verfasst am: 21.01.2014, 01:52 Titel: Pointer Typumwandlung Frage |
|
|
Hallo Community!
Ich habe einen sehr guten Algorithmus gefunden (geschrieben in FreeBASIC) welchen ich gerade versuche zu verstehen. Allerdings wird dort mit Pointern gearbeitet und ich blick da nicht so ganz durch. Dazu hab ich einfach mal ein Paar Fragen die mir hoffentlich beantwortet werden können.
Hier erst einmal um was es geht:
Code: | Dim As String s = "A"
Dim As UInteger<32> Ptr bp, bpz
bpz = Cast(UInteger<32> Ptr, StrPtr(s))
bp = bpz
Print *bp
Sleep |
Also, wie man unschwer erkennen kann, wird ein Pointer Typ in ein anderen Pointer Typ konvertiert. Die Variable bp enthält dabei immer noch den String Anfang (Äquivalent zu @s[0]). Soweit so gut, was mich allerdings verwirrt, ist der Ausgabewert von bp (Siehe Print Anweisung). Wenn ich gleiches nur mit einem String Ptr versuche (anstelle der Typumwandlung wird mir in der Konsole ein Haufen Zeichen entgegen geschmissen). Das verstehe ich nicht so ganz, eigentlich habe ich was erwartet. Auch was mich immer ein wenig wundert, dass der Pointer Inhalt (also nicht der Pointer selber) sich jedes Mal verändert.
Ich möchte nun folgendes wissen:
Was genau wird mir nun ausgegeben wenn ich die Variable bp mit dem Sternoperator aufrufe? (*bp)
Was hat der Wert zu bedeuten und wozu ist die Typumwandlung eines Pointers überhaupt sinnvoll?
Ich hoffe ich habe es einigermaßen verständlich erklärt was ich nun möchte. LG  _________________ Hmn :/ Mal schaun was es bringt... |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 21.01.2014, 03:13 Titel: Re: Pointer Typumwandlung Frage |
|
|
Make-Grafik hat Folgendes geschrieben: | Was genau wird mir nun ausgegeben wenn ich die Variable bp mit dem Sternoperator aufrufe? (*bp)
Was hat der Wert zu bedeuten und wozu ist die Typumwandlung eines Pointers überhaupt sinnvoll? |
Wie du schon richtig erkannt hast enthält die Variable bp bzw. bpz die Adresse des ersten Bytes des Strings s, also @s[0]. Der String s wird mit "A" initialisiert. An dieser Speicherstelle steht also 1 Byte ASCII Code für "A" (&h41 bzw. 65) und ein Null-Byte, dass FB automatisch jedem String anhängt. Lesen lässt du einen UInteger von dieser Adresse. Ein UInteger ist allerdings (so wie du mit den eckigen Klammern angegeben hast) 32Bits, also 4 Bytes lang. Somit werden die 2 Bytes des Strings gelesen und 2 Bytes die auf den String folgen. Da auf uninitialisierten Speicher zugegriffen werden ergeben sich für die letzten beiden Bytes zufällige Werte; theoretisch könnte es auch zum Programmabsturz bei dieser Operation kommen (praktisch ist dies jedoch unwahrscheinlich, da immer größere Blöcke Speicher zugewiesen werden).
Um dies besser zu veranschaulichen kannst du den Zahl in Hex konvertieren, sodass man die einzelnen Bytes sieht:Dabei kann man erkennen, dass die hinteren beiden Bytes stets konstant "0041" (hex) betragen und sich die anderen Bytes variabel verhalten. Es sind die vorhin beschriebenen Daten an dieser Adresse zu sehen - die "verdrehte" Reihenfolge kommt von der Little-Endian Speicherung von Zahlen auf Intel Prozessoren.
Sinn machen solche Umwandlung in vielen Fällen - in diesem allerdings nicht; schon allein durch den Zugriff außerhalb des zugewiesenen Speichers ist der Code im Normalfall fehlerhaft. _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
 |
Make-Grafik
Anmeldungsdatum: 08.10.2012 Beiträge: 29
|
Verfasst am: 21.01.2014, 07:44 Titel: |
|
|
Ah super, vielen dank für die info!
Das erklärt mir einiges  _________________ Hmn :/ Mal schaun was es bringt... |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|