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

 
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
pzktupel



Anmeldungsdatum: 07.07.2020
Beiträge: 43

BeitragVerfasst am: 12.07.2020, 17:45    Titel: Pointer Antworten mit Zitat

Hallo mal wieder !

Ich habe mal eine Frage zu Pointern.

Bisher waren diese für mich undurchschauber in ihrer Funktion.
Heute habe ich mal etwas herumgespielt und mir ist eine Frage gekommen.

Trivialerweise möchte ich mal die Anwendung auf das Aussieben von Primzahlen Bezug nehmen.

Man kann ja mittels @Position , die Nummer der Speicherzelle ausgeben... und *(@Position) gibt den Inhalt dieser aus.

Siebt man ein Feld aus, wird allgemein Feld(i)=1 üblicherweise gesetzt für belegt und dann eben in P-Schritten das nächste gesetzt.

Bsp. For i=19 TO 1000 STEP 19: Feld(i)=1:NEXT i

Aber! , lässt sich das auch über die Speicherzellennummer erreichen ? Wenn ja, wie denn ?

Bisher konnte ich keinen Zuwachs an Schnelligkeit feststellen gegenüber
F(i)=1 und *(@i)=1.

Meine irgendwas von POKE gelesen zu haben.

Danke für ein Beispiel

LG pzktupel
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4380
Wohnort: ~/

BeitragVerfasst am: 13.07.2020, 07:34    Titel: Antworten mit Zitat

Mir fehlt gerade etwas die Zeit, deswegen nur ein rascher Link:
https://www.freebasic-portal.de/befehlsreferenz/eckige-klammern-449.html
(zweiter Teil: Pointerindizierung)
Vielleicht hilft es etwas weiter. Es gibt noch irgendwo ein schönes Beispiel mit Grafikspeicherzugriff, aber da müsste ich erst ausgiebig suchen.

POKE gibt es auch, mir fällt aber in FreeBASIC kein Fall ein, in dem es noch notwendig wäre - geht mit * imho praktischer.
https://www.freebasic-portal.de/befehlsreferenz/poke-476.html
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
pzktupel



Anmeldungsdatum: 07.07.2020
Beiträge: 43

BeitragVerfasst am: 13.07.2020, 14:35    Titel: Antworten mit Zitat

Teilweise bin ich auch auf den Seiten gewesen....mir ging es um diese Möglichkeit.


Angenommen man spannt ein Feld auf F(999) und F(0) hat die Adresse 3498172.

Jetzt siebt man in diesem 1000 Zellen Feld "For i=3 TO 999 STEP 11"

Da F(0) 3498172, hat F(3) die AddiNr. 3498175

Frage, ob man anhand der AddiNr. auch das Feld durchsieben kann ...also speichere in 3498186 [=3498172+3+11] eine Eins usw.


Zuletzt bearbeitet von pzktupel am 13.07.2020, 17:11, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1056
Wohnort: Ruhrpott

BeitragVerfasst am: 13.07.2020, 14:44    Titel: Antworten mit Zitat

POKE funktioniert zwar in FB, ist aber veraltet, und ich würde von der Benutzung abraten.

pzktupel hat Folgendes geschrieben:
Aber! , lässt sich das auch über die Speicherzellennummer erreichen ? Wenn ja, wie denn ?
Sicher geht das, allerdings ist FB bei der Pointerberechnung etwas eigen, der Compiler "denkt mit", was manchmal etwas schwer nachzuvollziehen ist.
Code:
Dim As Byte b
Print @b
Print @b + 1
Print

Dim As Short sh
Print @sh
Print @sh + 1
Print

Dim As Long x
Print @x
Print @x + 1
Print

Dim As LongInt li
Print @li
Print @li + 1
Print

Sleep
Wie du siehst, wird der Wert, den du zum Pointer dazuaddierst, intern mit der Anzahl der dem Datentyp entsprechenden Bytes multipliziert.

Zitat:
Bsp. For i=19 TO 1000 STEP 19: Feld(i)=1:NEXT i

Kommt drauf an. Wenn "Feld" ein ZString ist, musst du die Schritte byteweise angeben, weil ein ZString Pointer immer ein Bytepointer ist:
Code:
Dim As ZString*20 Feld(0 To 100)

For i As ZString Ptr = @Feld(LBound(Feld)) TO @Feld(UBound(Feld)) Step SizeOf(Feld)
   *i = Str(1)
Next

For x As Integer = LBound(Feld) To UBound(Feld)
   ? x, Feld(x)
Next

Sleep

Packst du den String hingegen in einen Type, übernimmt FB die Berechnung der Sprungweite:
Code:
Type tF
   As ZString*20 zs
End Type

Dim As tF Feld(0 To 100)

For i As tF Ptr = @Feld(LBound(Feld)) TO @Feld(UBound(Feld))
   i->zs = Str(1)
Next

For x As Integer = LBound(Feld) To UBound(Feld)
   ? x, Feld(x).zs
Next

Sleep


Und hier noch ein Beispiel, wie man umgekehrt aus dem Pointer auf ein Arrayelement dessen Index berechnen kann:
Code:
Type tPlane
   irgendwas As Integer
   nochWas As Integer
   wasGanzAnderes As Integer
   Static As tPlane plane() 'planes array
   Declare Sub operate(mode As Integer)
End Type

ReDim As tPlane tPlane.plane(0 To 10)

Sub tPlane.operate(mode As Integer)
   Dim As Integer index
   
   index =  (Cast(UInteger,@This) - Cast(UInteger,@tPlane.plane(0))) / SizeOf(tPlane) 'calculate the own index within the plane array
   '                         |                        |_pointer to the beginning of the plane array
   '                         |__________________________pointer to the actual plane
   Print index
   
End Sub

For x As Integer = 1 To UBound(tPlane.plane)
   tPlane.plane(x).operate(0)
Next

Sleep


Viel Spaß beim Aufdröseln grinsen

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1056
Wohnort: Ruhrpott

BeitragVerfasst am: 13.07.2020, 15:01    Titel: Antworten mit Zitat

pzktupel hat Folgendes geschrieben:
Teilweise bin ich auch auf den Seiten gewesen....mir ging es um diese Möglichkeit.


Angenommen nan spannt ein Feld auf F(999) und F(0) hat die Adresse 3498172.

Jetzt siebt man in diesem 1000 Zellen Feld "For i=3 TO 999 STEP 11"

Da F(0) 3498172, hat F(3) die AddiNr. 3498175

Frage, ob man anhand der AddiNr. auch das Feld durchsieben kann ...also speichere in 3498186 [=3498172+3+11] eine Eins usw.


Es ist ein bisschen schwer nachzuvollziehen, was du mit "Feld", "aufspannen" oder "sieben" meinst. Aber offensichtlich möchtest du gezielt auf einzelne Speicheradressen zugreifen, das geht mit einem Byte Pointer:
Code:
Dim As UByte b(0 To 1000)
Dim As UByte Ptr bp

bp = @b(0)
Print bp

*(bp + 3) = 1

For x As Integer = 0 To 10
   Print x, b(x)
Next

Sleep


Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
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