Pointer/Struct

Alle Fragen zur Programmierung, die nicht in die speziellen Themen passen
Antworten
Alter VB6er
Foriker
Beiträge:7
Registriert:Do 10. Mai 2012, 18:00
Kontaktdaten:
Pointer/Struct

Beitrag von Alter VB6er » Mi 12. Feb 2014, 17:24

Halo werte Gambas Gemeinde

In der netten Sprache C, gibt es die Zeiger. In Gambas auch. Laut Dokumentation zeigen sie wie ihre C Geschwister auf den Speicherbereich. In C nutze ich Zeiger sehr gerne, ich weiß viele hassen die und verstehen selten deren Zweck, für die Wertübermittlung an Funktionen. Bin halt ein Fan von Referenzen, anstatt von Kopien. Oder Funktionen können Array zurückgeben. Zeigen sind echt nette Teile. (schwärm)

Ist in Gambas so etwas in dieser überhaupt möglich, oder warum werden dort Pointer genutzt?
In Basic ist die Nutzung der Pointer eigentlich unüblich.
Mit freundlichen Gruß
Alter VB6er
Zuletzt geändert von Alter VB6er am Di 18. Feb 2014, 00:28, insgesamt 2-mal geändert.

tux_
Moderator
Beiträge:950
Registriert:Di 11. Nov 2008, 20:05
Kontaktdaten:

Re: Pointer

Beitrag von tux_ » Mi 12. Feb 2014, 21:28

Pointer werden in Gambas im Zusammenhang mit den eingebauten Funktionen Alloc(), Realloc(), Free() und einem Memory-Stream interessant. Zu diesem Thema gehoeren indirekt auch die Int@-, Long@-, etc. -Funktionen, die auf Pointern operieren - zusammen mit ihrem Dual VarPtr(). (Siehe Dokumentation im Language Index zu allen diesen Stichworten, sowie die Kategorie External Function Management fuer Anregungen.) Hierzu faellt mir allerdings keine Anwendung ein, die sich nicht auch ueber bereits vorhandene Gambas-Klassen realisieren liesze. Einige Grenzfaelle (oder abgedrehte Spielereien) mag es geben...[*]

Ein anderes Einsatzgebiet, fuer das man sich leicht selbst ein Beispiel konstruieren kann, ist das Uebergeben eines Zeigers auf allozierten Speicher an eine Extern-Funktion. Nimm z.B. strerror_r(3) in der glibc.

[*] Eine moegliche Anwendung waere die Konvertierung einer Gambas-Struktur (Struct) in eine gepackte (in gcc: __attribute__((packed))) C-Struktur oder die Implementierung dynamisch definierter (!) Strukturen in Gambas. Das Interesse in beiden Faellen ist aber lediglich theoretisch. Denn wer braucht das im ersten Fall beschriebene? Der zweite Fall koennte ueber eine Collection geloest werden (nur speicherintensiver als mit einem Memory-Stream).
Achtung: Es passiert, dass ich einen frisch geschrieben Beitrag innerhalb von 10 Minuten noch 3-4 Mal aendere!

Alter VB6er
Foriker
Beiträge:7
Registriert:Do 10. Mai 2012, 18:00
Kontaktdaten:

Re: Pointer

Beitrag von Alter VB6er » Mo 17. Feb 2014, 23:34

Hallo tux_

Danke für die Info bezüglich der Pointer in Gambas.
Also könnte man Pointer in Bezug mit Strukturen einsetzen.
Finde das schon ein wenig merkwürdig, solche Pointer in Gambas zu haben

Nun kommt dazu meine nächste Frage. Ich habe eine Struct, die von einer json-Datei gefüttert wird.

Public Struct StRoot
SDate As String
STime As String
IVersion As Integer
SRootName As String
SRootPass As String
End Struct

Da das auslesen der json-Datei über zwei Klassen realisiert wird, eine Klasse ist für das reine lesen der json-Datei verantwortlich. (sie kann auch konforme json-Dateien schreiben)
Die zweite Klasse bereitet dann die Daten dann so auf, dass der obige Struct befüllt werden kann. (auch diese Klasse kann mehr)

Nun stehe ich vor dem Problem, wie bekomme ich die Daten aus der Klasse?

Kann man eine Struct einfach über Property Funktionen Kapseln, so dass man nur lese Zugriff gegeben ist? Kann man überhaupt eine Struct als Rückgabewert einer Funktion haben? :roll:

Mit freundlichen Grüßen
ein Alter VB6er

tux_
Moderator
Beiträge:950
Registriert:Di 11. Nov 2008, 20:05
Kontaktdaten:

Re: Pointer/Struct

Beitrag von tux_ » Di 18. Feb 2014, 12:36

Finde das schon ein wenig merkwürdig, solche Pointer in Gambas zu haben
Die braucht man eben, allein schon fuer Extern.
Kann man eine Struct einfach über Property Funktionen Kapseln, so dass man nur lese Zugriff gegeben ist? Kann man überhaupt eine Struct als Rückgabewert einer Funktion haben?
Ja und ja. Allerdings vielleicht nicht so, wie du meinst: man kann eine Property Read definieren, die eine Struktur widerspiegelt. Dann ist die *Eigenschaft* nicht beschreibbar, d.h. man kann der Eigenschaft keine neue Struktur zuweisen. Wohl aber kann man den Feldern der Struktur neue Werte zuweisen.

Wenn du das Aendern von Strukturfeldern verbieten moechtest, brauchst du eine eigene Klasse statt einer Struktur. Strukturen sind nur Datencontainer, mit Klassen kannst du auch Programmlogik verbinden.

Was die Rueckgabe einer Struktur betrifft: ja, kann man machen. Aber auch hier gibt es einen Wermutstropfen: die Struktur muss in allen Klassen, in denen sie verwendet wird, auf die gleiche Weise definiert sein. Strukturen haben nur einen lokalen Gueltigkeitsbereich. Tipp: Klassen haben einen globalen Gueltigkeitsbereich.
Achtung: Es passiert, dass ich einen frisch geschrieben Beitrag innerhalb von 10 Minuten noch 3-4 Mal aendere!

Antworten

Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 5 Gäste