Strukturen direkt schreiben (per Speicherzugriff)

Für allgemeine Fragen zur Programmierung mit PureBasic.
es_91
Beiträge: 411
Registriert: 25.01.2011 04:48

Strukturen direkt schreiben (per Speicherzugriff)

Beitrag von es_91 »

Hallo.

Ich habe ein riesiges Strukturpacket von deutschen Verben, so sieht es aus:

Code: Alles auswählen

Structure VERBKONJ
  
  Ich.s
  Du.s
  Er.s
  Wir.s
  Ihr.s
  Sie.s
  
EndStructure

Structure VERBTEMP
  
  Praesens.VERBKONJ
  Praeteritum.VERBKONJ
  Perfekt.VERBKONJ
  Plusquamperfekt.VERBKONJ
  Futur1.VERBKONJ
  Futur2.VERBKONJ
  
EndStructure

Structure VERBFORM
  
  Aktiv.VERBTEMP
  Vorgangspassiv.VERBTEMP
  Zustandspassiv.VERBTEMP
  
EndStructure

Structure VERB
  
  Infinitiv.s
  Indikativ.VERBFORM
  Konjunktiv1.VERBFORM
  Konjunktiv2.VERBFORM
  Imperativ.VERBFORM
  Partizip.VERBFORM
  
EndStructure
Die Struktur soll so gefüllt werden, dass alle Elemente denselben Wert erhalten. Das bedeutet unglaublich viele Codezeilen für wenig Effekt. Darum wollte ich fragen: kann ich mit for offset = 0 to sizeof(VERB) über die Struktur iterieren und per Speicherzugriff die Pointer alle auf denselben String setzen?

Etwa so:

Code: Alles auswählen

; Pseudocode:

Newlist Verben.VERB()
AddElement(Verben())

NeuerString$ = "testen"

For x = 0 to SizeOf(VERB) - 8
  PokeQ(@Verben() + x, @NeuerString$)
Next

Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Strukturen direkt schreiben (per Speicherzugriff)

Beitrag von STARGÅTE »

Schreib dir einfach 4 Prozeduren zum setzen von VERBKONJ, VERBTEMP, VERBFORM und VERB.
Dann hast du genau 6 Zuweisungen und 15 Prozeduranweisungen.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8837
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Strukturen direkt schreiben (per Speicherzugriff)

Beitrag von NicTheQuick »

Du könntest durchaus per Pointermanipulation jedem Element in deinen Strukturen den selben String "testen" zuweisen. Allerdings war's das auch schon. Wenn du versuchen würdest einen der Strings zu ändern, würde das dann nämlich entweder alle anderen mit ändern oder alle anderen ungültig machen. Warum das genau so ist, wäre jetzt kompliziert zu erklären. Du könntest aber der Einfachheit halber sowas hier machen:

Code: Alles auswählen

Structure VERBKONJ
	Ich.s
	Du.s
	Er.s
	Wir.s
	Ihr.s
	Sie.s
EndStructure

Structure VERBTEMP
	Praesens.VERBKONJ
	Praeteritum.VERBKONJ
	Perfekt.VERBKONJ
	Plusquamperfekt.VERBKONJ
	Futur1.VERBKONJ
	Futur2.VERBKONJ
EndStructure

Structure VERBFORM
	Aktiv.VERBTEMP
	Vorgangspassiv.VERBTEMP
	Zustandspassiv.VERBTEMP
EndStructure

Structure VERB
	Infinitiv.s
	Indikativ.VERBFORM
	Konjunktiv1.VERBFORM
	Konjunktiv2.VERBFORM
	Imperativ.VERBFORM
	Partizip.VERBFORM
EndStructure

Procedure fillStringStructure(*structure.String, nElements.i, value.s)
	Protected i.i
	For i = 1 To nElements
		*structure\s = value
		*structure + SizeOf(String)
	Next
EndProcedure

Define verb.VERB

Define.i elemente = SizeOf(verb) / SizeOf(String)
Debug "Insgesamt sind es " + elemente + " Strings."

fillStringStructure(verb, elemente, "testen")

Debug verb\Partizip\Aktiv\Praesens\Sie
Debug verb\Konjunktiv1\Vorgangspassiv\Futur1\Wir
Das funktioniert aber nur, solange in der Struktur tatsächlich nur Strings vorkommen und sonst nichts. Ich iteriere hier einfach über alle Strings in der Struktur und setzen den String dort auf den festgelegten Wert.
es_91
Beiträge: 411
Registriert: 25.01.2011 04:48

Re: Strukturen direkt schreiben (per Speicherzugriff)

Beitrag von es_91 »

Ja, genau so etwas hatte ich gesucht. Danke, Nic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Strukturen direkt schreiben (per Speicherzugriff)

Beitrag von STARGÅTE »

Wowow, der Code ist aber sehr sehr labil.
Es funktioniert nur für Strukturen die nur aus Strings besteht. Ein anderes Feld, und das Ding läuft gegen die Wand.
Also schön aufpassen!
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8837
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Strukturen direkt schreiben (per Speicherzugriff)

Beitrag von NicTheQuick »

Hauptsache das Problem wird einfach gelöst. :D
es_91
Beiträge: 411
Registriert: 25.01.2011 04:48

Re: Strukturen direkt schreiben (per Speicherzugriff)

Beitrag von es_91 »

Dank auch an STARGATE! :D
Benutzeravatar
_sivizius
Beiträge: 98
Registriert: 23.10.2013 15:21

Re: Strukturen direkt schreiben (per Speicherzugriff)

Beitrag von _sivizius »

und als Array? also

Code: Alles auswählen

Structure ...
  woerter.s[VIEL]
EndStructure
und dann statt den einzelnen Strukturfeldern Konstanten nehmen um sie Direkt zu bezeichnen?
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8837
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Strukturen direkt schreiben (per Speicherzugriff)

Beitrag von NicTheQuick »

Natürlich! :shock:
Wieso bin ich da nicht gleich drauf gekommen? :doh:

Das ist ja viel einfacher. Zwar, immer noch getrickst, aber irgendwie schöner:

Code: Alles auswählen

Structure VERBKONJ
	Ich.s
	Du.s
	Er.s
	Wir.s
	Ihr.s
	Sie.s
EndStructure

Structure VERBTEMP
	Praesens.VERBKONJ
	Praeteritum.VERBKONJ
	Perfekt.VERBKONJ
	Plusquamperfekt.VERBKONJ
	Futur1.VERBKONJ
	Futur2.VERBKONJ
EndStructure

Structure VERBFORM
	Aktiv.VERBTEMP
	Vorgangspassiv.VERBTEMP
	Zustandspassiv.VERBTEMP
EndStructure

Structure VERB
	s.s[0]
	Infinitiv.s
	Indikativ.VERBFORM
	Konjunktiv1.VERBFORM
	Konjunktiv2.VERBFORM
	Imperativ.VERBFORM
	Partizip.VERBFORM
EndStructure

Define verb.VERB

Define.i elemente = SizeOf(verb) / SizeOf(String)
Debug "Insgesamt sind es " + elemente + " Strings."

Define i.i
For i = 0 To elemente - 1
	verb\s[i] = "test"
Next

Debug verb\Partizip\Aktiv\Praesens\Sie
Debug verb\Konjunktiv1\Vorgangspassiv\Futur1\Wir 
Antworten