Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Pointer Typumwandlung Frage

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Make-Grafik



Anmeldungsdatum: 08.10.2012
Beiträge: 29

BeitragVerfasst am: 21.01.2014, 01:52    Titel: Pointer Typumwandlung Frage Antworten mit Zitat

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. lächeln

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 lächeln
_________________
Hmn :/ Mal schaun was es bringt...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 21.01.2014, 03:13    Titel: Re: Pointer Typumwandlung Frage Antworten mit Zitat

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:
Code:
Print hex(*bp)
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
Benutzer-Profile anzeigen Private Nachricht senden
Make-Grafik



Anmeldungsdatum: 08.10.2012
Beiträge: 29

BeitragVerfasst am: 21.01.2014, 07:44    Titel: Antworten mit Zitat

Ah super, vielen dank für die info!
Das erklärt mir einiges happy
_________________
Hmn :/ Mal schaun was es bringt...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz