|
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 |
pzktupel
Anmeldungsdatum: 07.07.2020 Beiträge: 83
|
Verfasst am: 12.07.2020, 17:45 Titel: Pointer |
|
|
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
|
Nach oben |
|
|
pzktupel
Anmeldungsdatum: 07.07.2020 Beiträge: 83
|
Verfasst am: 13.07.2020, 14:35 Titel: |
|
|
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 |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 13.07.2020, 14:44 Titel: |
|
|
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
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 13.07.2020, 15:01 Titel: |
|
|
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 |
|
|
|
|
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.
|
|