| 
				
					|  | 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: 85
 
 
 | 
			
				|  Verfasst am: 12.07.2020, 16: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: 4711
 Wohnort: ~/
 
 |  |  
		| Nach oben |  |  
		|  |  
		| pzktupel 
 
  
 Anmeldungsdatum: 07.07.2020
 Beiträge: 85
 
 
 | 
			
				|  Verfasst am: 13.07.2020, 13: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, 16:11, insgesamt einmal bearbeitet
 |  |  
		| Nach oben |  |  
		|  |  
		| grindstone 
 
 
 Anmeldungsdatum: 03.10.2010
 Beiträge: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 13.07.2020, 13:44    Titel: |   |  
				| 
 |  
				| POKE funktioniert zwar in FB, ist aber veraltet, und ich würde von der Benutzung abraten. 
 
 Sicher geht das, allerdings ist FB bei der Pointerberechnung etwas eigen, der Compiler "denkt mit", was manchmal etwas schwer nachzuvollziehen ist. 	  | pzktupel hat Folgendes geschrieben: |  	  | Aber! , lässt sich das auch über die Speicherzellennummer erreichen ? Wenn ja, wie denn ? | 
 Wie du siehst, wird der Wert, den du zum Pointer dazuaddierst, intern mit der Anzahl der dem Datentyp entsprechenden Bytes multipliziert. 	  | 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
 | 
 
 
  	  | 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: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 13.07.2020, 14: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.
 
 |  |