| 
				
					|  | 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 |  
		| OEG 
 
  
 Anmeldungsdatum: 01.08.2020
 Beiträge: 8
 Wohnort: Séte / France
 
 | 
			
				|  Verfasst am: 01.08.2020, 12:31    Titel: Structure als Parameter |   |  
				| 
 |  
				| Hallo, 
 Ich bin zwar neu hier und in FreeBasic,
 arbeite aber schon ein paar Jahre mit Blitz-,PureBasic als 'Armateur'!
 
 Nun habe ich eine Frage,die ich selber nicht lösen kann.
 es geht um folgendes:
 ich möchte einer Procedure(Sub oder Function) eine Variable übergeben, weiss aber noch nicht,welchen DatenTyp diese haben wird. Es ist aber auf jeden Fall ein 'UDT'.
 Da ich aber einen Typ angeben muss(jedenfalls weist mich der Compiler vehement darauf hin), frage ich mich, ob ich einen
 Zeiger auf die Structure(Type) erzeugen kann.
 Ich dachte zuerst,einfach die benötigte Grösse zu übergeben,Aber dann kann ich ja nicht auf die Member's zugreifen.
 
 Kann da vllt jemand helfen?
 
 Olaf
 _________________
 IF A=B AND B=C THEN IF A=C THEN PRG IS RUNNING
 ELSEIF A NOT C THEN REALLIVE IS RUNNING
 ENDIF
 |  |  
		| Nach oben |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4710
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 01.08.2020, 13:08    Titel: |   |  
				| 
 |  
				| Ich weiß noch nicht genau, was für dich in Frage kommt, daher mal ein paar Lösungsideen. 
 Was du grundsätzlich machen kannst, ist die Übergabe eines ANY PTR. Das würde ich aber eher als brutal einstufen, und an die Members kommst du dann auch nur über Pointer-Rechnung, was ich für wenig sinnvoll halte.
Eine elegante Lösung wäre die Verwendung von Vererbung. Das setzt voraus, dass alle UDTs, die an die Prozedur übergeben werden können, einen gemeinsamen Typ besitzen. Ich bin da in der Syntax nicht mehr so drin, aber ich könnte es mir so vorstellen wie in der Referenz zu IS im zweiten Beispiel:
https://www.freebasic-portal.de/befehlsreferenz/is-vererbung-oop-635.html
 
 _________________
 Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
 |  |  
		| Nach oben |  |  
		|  |  
		| OEG 
 
  
 Anmeldungsdatum: 01.08.2020
 Beiträge: 8
 Wohnort: Séte / France
 
 | 
			
				|  Verfasst am: 01.08.2020, 13:27    Titel: |   |  
				| 
 |  
				| Gott,bin ich Blöd!!! 
 Klar ich declariere einen 'DummyType,
 der die StandardMember's hat,
 erweitere Ihn mit dem gewünschten Type
 und habe einen StandardParameter MIT definiertem DatenTyp
 Meine Function sollte nämlich noch zwei Felder dazugeben,
 das macht jetzt der 'ProtoType'
 Jetzt noch eine Frage:
 
 Als Rückgabe einer Function brauche ich einen Zeiger auf auf einen MemoryBlock! wie declariere ich diesen?, der brauch ja auch einen Typ,oder?
 Ist etwas verwirrend mit FB, in PBist ein Pointer ja sein eigener Typ.
 
 Olaf
 _________________
 IF A=B AND B=C THEN IF A=C THEN PRG IS RUNNING
 ELSEIF A NOT C THEN REALLIVE IS RUNNING
 ENDIF
 |  |  
		| Nach oben |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4710
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 01.08.2020, 13:43    Titel: |   |  
				| 
 |  
				| Ja, der Block braucht ebenfalls einen Typ, z. B. 
  	  | Code: |  	  | FUNCTION testfunktion(parameter AS MyType) AS BYTE PTR ...
 
 | 
 Auch hier würde wieder, wenn es da kein einheitlicher Typ Sinn macht, ein ANY PTR funktionieren; ich denke aber, dass ein BYTE PTR nicht schlecht ist. FreeBASIC arbeitet nämlich mit Zeigerarithmetik, welche die Größe des zugrundeliegenden Datentyps miteinbezieht; siehe z. B. hier:
 https://www.freebasic-portal.de/befehlsreferenz/eckige-klammern-449.html (Abschnitt "Pointerindizierung")
 _________________
 Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
 |  |  
		| Nach oben |  |  
		|  |  
		| OEG 
 
  
 Anmeldungsdatum: 01.08.2020
 Beiträge: 8
 Wohnort: Séte / France
 
 | 
			
				|  Verfasst am: 01.08.2020, 13:56    Titel: |   |  
				| 
 |  
				| Für eine Adr. sollte also ein< Integer Ptr > ausreichen?! 
 Olaf
 _________________
 IF A=B AND B=C THEN IF A=C THEN PRG IS RUNNING
 ELSEIF A NOT C THEN REALLIVE IS RUNNING
 ENDIF
 |  |  
		| Nach oben |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4710
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 01.08.2020, 14:00    Titel: |   |  
				| 
 |  
				| Ja, reicht aus. _________________
 Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
 |  |  
		| Nach oben |  |  
		|  |  
		| OEG 
 
  
 Anmeldungsdatum: 01.08.2020
 Beiträge: 8
 Wohnort: Séte / France
 
 | 
			
				|  Verfasst am: 01.08.2020, 14:39    Titel: |   |  
				| 
 |  
				| Merci, 
 Ich glaube,das reicht für's erste.
 
 Olaf
 _________________
 IF A=B AND B=C THEN IF A=C THEN PRG IS RUNNING
 ELSEIF A NOT C THEN REALLIVE IS RUNNING
 ENDIF
 |  |  
		| Nach oben |  |  
		|  |  
		| grindstone 
 
 
 Anmeldungsdatum: 03.10.2010
 Beiträge: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 01.08.2020, 14:53    Titel: |   |  
				| 
 |  
				| Hallo DEG und willkommen im Forum!   
 Wie ist das in deiner ersten Frage gemeint: Bekommt die Prozedur zur Laufzeit des Programms verschiedene Typen übergeben, oder weisst du nur jetzt, während du das Programm schreibst, noch nicht genau, wie der UDT aussieht?
 
 Im zweiten Fall ist das ganz einfach. Du übergibst einen Parameter vom Typ des UDTs. Den genauen Aufbau kannst du dann während des Programmierens anpassen:
  	  | Code: |  	  | Type tHello As String welt
 As String world
 As String mundo
 End Type
 
 Dim As tHello hello
 
 hello.welt = "Hallo Welt"
 hello.world = "Hello world"
 hello.mundo = "Hola mundo"
 
 Sub printHello(gruesse As tHello)
 Print gruesse.welt
 Print gruesse.world
 Print gruesse.mundo
 End Sub
 
 printHello(hello)
 
 Sleep
 
 | 
 Im zweiten Fall kannst du dir einen passenden Kombityp zusammenbasteln:
  	  | Code: |  	  | Type tTyp1 As Integer zahl1
 As Integer zahl2
 As Integer zahl3
 As ZString*100 text1
 End Type
 
 Type tTyp2
 As Single zahl1
 As Double zahl2
 As ZString*100 text1
 As ZString*100 text2
 End Type
 
 Type tTyp3
 As ZString*100 text1
 As ZString*100 text2
 As ZString*100 text3
 End Type
 
 Type tKombiTyp
 As Integer welchertyp
 Union
 t1 As tTyp1
 t2 As tTyp2
 t3 As tTyp3
 End Union
 End Type
 
 Sub mehrereTypen(t As tKombityp)
 Select Case t.welchertyp
 Case 1
 Print t.t1.zahl1
 Print t.t1.zahl2
 Print t.t1.zahl3
 Print t.t1.text1
 Case 2
 Print t.t2.zahl1
 Print t.t2.zahl2
 Print t.t2.text1
 Print t.t2.text2
 Case 3
 Print t.t3.text1
 Print t.t3.text2
 Print t.t3.text3
 Case Else
 Print "Kenn ich nicht!"
 End Select
 End Sub
 
 Dim As tKombiTyp ty
 
 With ty
 .welchertyp = 1
 .t1.zahl1 = 1
 .t1.zahl2 = 4
 .t1.zahl3 = 9
 .t1.text1 = "Hallo"
 End With
 
 mehrereTypen(ty)
 
 With ty
 .welchertyp = 2
 .t2.zahl1 = 100
 .t2.zahl2 = 298
 .t2.text1 = "Hier ich,"
 .t2.text2 = "wer da?"
 End With
 
 Print
 mehrereTypen(ty)
 
 With ty
 .welchertyp = 3
 .t3.text1 = "Wenn einer einen Ast zersaegt"
 .t3.text2 = "und damit einen Gast erlegt"
 .t3.text3 = "dann wird das mit Knast belegt."
 End With
 
 Print
 mehrereTypen(ty)
 
 Sleep
 | 
 
 Alternativ (das würde ich empfehlen) kannst du die Prozedur auch überladen:
  	  | Code: |  	  | Type tTyp1 As Integer zahl1
 As Integer zahl2
 As Integer zahl3
 As String text1
 End Type
 
 Type tTyp2
 As Single zahl1
 As Double zahl2
 As String text1
 As String text2
 End Type
 
 Type tTyp3
 As String text1
 As String text2
 As String text3
 End Type
 
 Sub mehrereTypen OverLoad (t As tTyp1)
 Print t.zahl1
 Print t.zahl2
 Print t.zahl3
 Print t.text1
 End Sub
 
 Sub mehrereTypen (t As tTyp2)
 Print t.zahl1
 Print t.zahl2
 Print t.text1
 Print t.text2
 End Sub
 
 Sub mehrereTypen (t As tTyp3)
 Print t.text1
 Print t.text2
 Print t.text3
 End Sub
 
 Dim As tTyp1 ty1
 Dim As tTyp2 ty2
 Dim As tTyp3 ty3
 
 With ty1
 .zahl1 = 1
 .zahl2 = 4
 .zahl3 = 9
 .text1 = "Hallo"
 End With
 
 mehrereTypen(ty1)
 
 With ty2
 .zahl1 = 100
 .zahl2 = 298
 .text1 = "Hier ich,"
 .text2 = "wer da?"
 End With
 
 Print
 mehrereTypen(ty2)
 
 With ty3
 .text1 = "Wenn einer einen Ast zersaegt"
 .text2 = "und damit einen Gast erlegt"
 .text3 = "dann wird das mit Knast belegt."
 End With
 
 Print
 mehrereTypen(ty3)
 
 Sleep
 
 | 
 
 Gruß
 grindstone
 _________________
 For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
 |  |  
		| Nach oben |  |  
		|  |  
		| OEG 
 
  
 Anmeldungsdatum: 01.08.2020
 Beiträge: 8
 Wohnort: Séte / France
 
 | 
			
				|  Verfasst am: 01.08.2020, 16:00    Titel: |   |  
				| 
 |  
				| Hallo Es ist die 2. Variante!
 Das heisst, die 'Function ist ein Constructor,
 und da die 'Class' ja nicht nur eine Sache Abdecken soll und
 auch in anderen Prg's laufen soll, muss Sie mit 'Unbekannten'
 arbeiten.
 Ich habe jetzt erst mal folgenden Code gebastelt
 
 
  	  | Code: |  	  | Type punkt ' TypeBeispiel der gebraucht wird x As Integer
 y As Integer
 End Type
 
 Type typdef ' Type der ein 'Dumy as TypeBeispiel' Ptr aufnimt
 mtyp As Integer Ptr
 End Type
 
 Type ListType 'Type der die Dumy an die Class übergibt
 ltlast As Integer Ptr
 ltnext As Integer Ptr
 prototyp As typdef
 End Type
 '
 ' So sollte es keine Probleme geben,wenn verschiedene 'Type's' an ListType übergeben werden
 '
 Type L_List ' <Class>,die Verschiedene Variable & LinkedList erzeugt
 
 DECLARE CONSTRUCTOR(Dumy As ListType) ' Hier soll der Constructor den DatenTyp übernehmen
 Declare DESTRUCTOR()
 
 DECLARE FUNCTION AddElement(index As Integer) AS Integer Ptr
 Declare Function DeleteElement(index As Integer) As Integer Ptr
 Declare Function ChangeElement(index As Integer ) As Integer Ptr
 Declare Function ResetList() As Byte
 Declare Function NextElement() As Integer Ptr
 
 
 Private:
 lstsze As UInteger
 Lstcnt As UInteger
 lstsel As UInteger
 lstseladr As Integer Ptr
 lstroot As Integer Ptr
 lstend As Integer Ptr
 End Type
 
 | 
 
 Lässt sich so schon mal compilieren!
 
 Habe noch eine andere 'Möglichkeit' gefunden mit TypeOf()
 
 Olaf
 _________________
 IF A=B AND B=C THEN IF A=C THEN PRG IS RUNNING
 ELSEIF A NOT C THEN REALLIVE IS RUNNING
 ENDIF
 |  |  
		| Nach oben |  |  
		|  |  
		| grindstone 
 
 
 Anmeldungsdatum: 03.10.2010
 Beiträge: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 01.08.2020, 17:12    Titel: |   |  
				| 
 |  
				| Das ist schon mal falsch. Richtig müsste es heissen: 	  | Zitat: |  	  |  	  | Code: |  	  | Type typdef ' Type der ein 'Dumy as TypeBeispiel' Ptr aufnimt mtyp As Integer Ptr
 End Type
 | 
 | 
  	  | Code: |  	  | Type typdef ' Type der ein 'Dumy as TypeBeispiel' Ptr aufnimt mtyp As punkt Ptr
 End Type
 | 
 Die Pointerarithmetik von FB ist etwas eigenwillig.
 Du siehst, zum Pointer wird nicht 1 addiert, sondern die Anzahl der Bytes, die der UDT belegt, und du kommst in Teufels Küche, wenn du das einfach ignorierst. Und ja, diese Eigenart hat das Potenzial, einen Programmierer in den Wahnsinn zu treiben. 	  | Code: |  	  | Type punkt ' TypeBeispiel der gebraucht wird x As Integer
 y As Integer
 End Type
 
 Dim p As punkt
 
 Print @p
 Print @p + 1
 
 Sleep
 | 
   
 Ich würde immer noch das Überladen empfehlen, das ist am übersichtlichsten. Die Prozedur, an die du den UDT übergibst, muß ja sowieso einen Code enthalten, der eben diesen Typ von UDT adäquat verarbeitet.
 
 Oder hast du vor, eine verkettete Liste zu erstellen, eventuell mit unterschiedlichen TYPEs?
 
 Gruß
 grindstone
 _________________
 For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
 |  |  
		| Nach oben |  |  
		|  |  
		| OEG 
 
  
 Anmeldungsdatum: 01.08.2020
 Beiträge: 8
 Wohnort: Séte / France
 
 | 
			
				|  Verfasst am: 01.08.2020, 19:03    Titel: |   |  
				| 
 |  
				|  	  | Zitat: |  	  | Oder hast du vor, eine verkettete Liste zu erstellen, eventuell mit unterschiedlichen TYPEs? 
 Gruß
 grindstone
 | 
 
 BINGO!!
 Weil Selber Machen Macht Schlau!!
 Naja,Villeicht,mit ein wenig Hilfe
 
 Type typdef ' Type der ein 'Dumy as TypeBeispiel' Ptr aufnimt
 mtyp As punkt Ptr
 End Type
 
 Und genau DA!! ist das Problem!!
 wenn ich einen "punkt ptr" nehme,also für jede Variable den Type ändern muss,dann kann ich auch die 'Class'
 jedesmal modifizieren!
 Dann ist es nicht mehr 'Universel'.
 
  : Eigenartig,dass es Ohne 'Classe', also Procedural mit Globals kein Problem ist,und eine 'Classe' jetzt.... 
 Ich will doch nur den Type in die Classe oder so
     
 Olaf
 _________________
 IF A=B AND B=C THEN IF A=C THEN PRG IS RUNNING
 ELSEIF A NOT C THEN REALLIVE IS RUNNING
 ENDIF
 |  |  
		| Nach oben |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4710
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 01.08.2020, 20:19    Titel: |   |  
				| 
 |  
				| Für eine Liste mit erweiterbaren Typen denke ich, ein allgemeiner Listentyp, von dem jeder einzubindende Typ erben muss, wird das praktischste sein. In anderen Sprachen würde man das über Interfaces machen - FreeBASIC kennt weder Interfaces noch Mehrfachvererbung, von daher ist man etwas eingeschränkt. _________________
 Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
 |  |  
		| Nach oben |  |  
		|  |  
		| grindstone 
 
 
 Anmeldungsdatum: 03.10.2010
 Beiträge: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 01.08.2020, 21:13    Titel: |   |  
				| 
 |  
				| Das Problem ist, daß der Compiler, um auf Elemente eines TYPEs zugreifen zu können, wissen MUSS, um welchen Datentyp es sich handelt. Das wird sich auch mit Vererbung nicht umgehen lassen. 
 Da der Pointer selbst immer dieselbe Größe hat, könnte man mit ANY Pointern arbeiten, die man dann jeweils entsprechend castet. Das ist aber -vorsichtig ausgedrückt- etwas umständlich. Hier mal ein rudimentäres (mir fallen langsam die Augen zu
  ) Beispiel, um das Prinzip zu verdeutlichen:  	  | Code: |  	  | Type tListeTyp1 As Byte id = 1
 As Any Ptr parent
 As Any Ptr child
 As Integer level
 Declare Property childID As Integer
 End Type
 
 Property tListeTyp1.childID As Integer
 If this.child = 0 Then
 Return 0
 EndIf
 Return *Cast(Byte Ptr, this.child)
 End Property
 
 Type tListeTyp2
 As Byte id = 2
 As Any Ptr parent
 As Any Ptr child
 As Integer level
 As Double wert2
 End Type
 
 Type tListeTyp3
 As Byte id = 3
 As Any Ptr parent
 As Any Ptr child
 As Integer level
 As Double wert2
 As String text
 End Type
 
 
 Function erstelleTyp(elementTyp As Integer, par As Any Ptr) As Any Ptr
 Dim As Any Ptr p
 Select Case elementTyp
 Case 1
 p = New tListeTyp1
 Cast(tListeTyp1 Ptr, p)->parent = par
 Case 2
 p = New tListeTyp2
 Cast(tListeTyp2 Ptr, p)->parent = par
 Case 3
 p = New tListeTyp3
 Cast(tListeTyp3 Ptr, p)->parent = par
 End Select
 *Cast(Byte Ptr, p) = elementTyp
 Return p
 End Function
 
 Dim As Any Ptr root = New tListeTyp1
 
 Dim As Any Ptr element
 
 element = root
 ? *Cast(Byte Ptr, element) 'typ - ID des elements
 
 ? Cast(tListeTyp1 Ptr, element)->childID 'typ - ID des kindelements (0 = kein kindelement vorhanden)
 ?
 Cast(tListeTyp1 Ptr, element)->child = erstelleTyp(2, element) 'kindelement vom typ 2 erstellen
 ? Cast(tListeTyp1 Ptr, element)->childID 'typ - ID des kindelements
 
 Sleep
 | 
 
 Gruß
 grindstone
 _________________
 For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
 |  |  
		| Nach oben |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4710
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 01.08.2020, 22:29    Titel: |   |  
				| 
 |  
				| Du kannst an eine Prozedur immer auch den Elterntyp übergeben - solange du nicht auf die Members zugreifst, die nicht zum Elterntyp gehören, ist das dem Compiler egal (und sonst musst du halt entsprechend CASTen). Für die Listenfunktionen sind die Nichtlisten-Members ja egal. Und um den Umgang mit den Listenfunktionen scheint es ja zu gehen. 
 
  	  | Code: |  	  | TYPE ListPoint AS ListPoint PTR ltnext
 DECLARE SUB addElement(element AS ListPoint PTR)
 END TYPE
 
 SUB ListPoint.addElement(element AS ListPoint PTR)
 DIM AS ListPoint PTR lp = @THIS
 DO WHILE lp->ltnext <> 0
 lp = lp->ltnext
 LOOP
 lp->ltnext = element
 END SUB
 
 
 
 
 TYPE myType EXTENDS ListPoint
 AS INTEGER value
 DECLARE CONSTRUCTOR(v AS INTEGER)
 END TYPE
 
 CONSTRUCTOR myType(v AS INTEGER)
 value = v
 END CONSTRUCTOR
 
 DIM AS myType PTR a = NEW myType(7)
 a->addElement(NEW myType(4))
 
 PRINT a->value
 PRINT CAST(myType PTR, a->ltnext)->value
 | 
 
 Gegebenfalls könnte man speziell eine Funktion getElement für jedes Kind von ListPoint überladen, um gleich an den richtigen Typen zu kommen.
 _________________
 Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
 |  |  
		| Nach oben |  |  
		|  |  
		| OEG 
 
  
 Anmeldungsdatum: 01.08.2020
 Beiträge: 8
 Wohnort: Séte / France
 
 | 
			
				|  Verfasst am: 01.08.2020, 23:32    Titel: |   |  
				| 
 |  
				| Damit ist mir sehr geholfen!! 
 Ich hab mich bereits anderweitig umgesehen, und bin bei 'C' (C von A bis Z) auf eine ähnliche Lösung gestossen.
 C is zwar nicht wirklich meine Sprache,doch nahe genug dran an Basic,so dass ich so Ganz langsam die
 "PointerLogik in FB verstehe.Ist sowieso noch etwas,nun, gewöhnungbedürftig, wie FB Variablen declariert
 so mit 'as' und dann ein compilorFehler nach dem anderen.....
 
 Nun gut werd das erst mal mit meinem C-Geborgtem vergleichen und dann sehen,wie das ganze schlussendlich
 verpackt wird(
  Include,  Type<Class>,Oder  eineDLL  ) 
 Und Nun
 Gute Nacht
 Olaf
 _________________
 IF A=B AND B=C THEN IF A=C THEN PRG IS RUNNING
 ELSEIF A NOT C THEN REALLIVE IS RUNNING
 ENDIF
 |  |  
		| Nach oben |  |  
		|  |  
		| grindstone 
 
 
 Anmeldungsdatum: 03.10.2010
 Beiträge: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 04.08.2020, 12:45    Titel: |   |  
				| 
 |  
				| Das Erweitern per Vererbung funktioniert tatsächlich. 
 Kleiner Tip: Mit WITH kann man sich ggf. viel Casterei ersparen. Der gecastete Pointer muß dann allerdings dereferenziert werden.
  	  | Code: |  	  | Type ListPoint As ListPoint Ptr ltnext
 Declare Sub addElement(element As ListPoint Ptr)
 End Type
 
 Sub ListPoint.addElement(element As ListPoint Ptr)
 Dim As ListPoint Ptr lp = @This
 Do While lp->ltnext <> 0
 lp = lp->ltnext
 Loop
 lp->ltnext = element
 End Sub
 
 Type myType1 EXTENDS ListPoint
 As Integer value
 Declare Constructor(v As Integer)
 End Type
 
 Constructor myType1(v As Integer)
 value = v
 End Constructor
 
 Type myType2 EXTENDS ListPoint
 As String text
 Declare Constructor(t As String)
 End Type
 
 Constructor myType2(t As String)
 text = t
 End Constructor
 
 Dim As myType1 Ptr a = New myType1(7)
 a->addElement(New myType1(4))
 
 Print a->value
 Print Cast(myType1 Ptr, a->ltnext)->value
 Print *Cast(myType1 Ptr, a->ltnext).value
 
 a->ltnext->addElement(New myType2("Hallo"))
 
 With *Cast(myType1 Ptr, a->ltnext)
 Print .value
 End With
 
 Print Cast(myType2 Ptr, a->ltnext->ltnext)->text
 With *Cast(myType2 Ptr, a->ltnext->ltnext)
 Print .text
 End With
 
 Sleep
 | 
 
 Gruß
 grindstone
 _________________
 For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
 |  |  
		| Nach oben |  |  
		|  |  
		| OEG 
 
  
 Anmeldungsdatum: 01.08.2020
 Beiträge: 8
 Wohnort: Séte / France
 
 | 
			
				|  Verfasst am: 07.08.2020, 17:49    Titel: |   |  
				| 
 |  
				| So- Hallo,
 
 habe einen RIESIGEN Fehler gefunden,der für ernsthafte Zweifel an
 meinem Verstand sorgte!!
 
 Mein Ürsprüngliches Problem bestand darin,dass ich einen Zeiger
 auf eine Structure übergeben wollte,was aber nicht richtig funktionierte.
 Daher dachte ich mir,dass evtl der Typ der Struct ausreichen könnte!
 
 Nachdem ich nun die Vorschläge dieses Themas umgesetzt hatte,
 waren immer noch einige "Zweifelhafte" Ergebnisse zu verzeichnen!!
 
 Schlussendlich stellte ich fest,das ein Error 40 vorliegt!
 der FBCompiler,den ich installiert hatte,ist ein 32-Bit Compiler,
 ich habe aber eine 64-bit Zeiger-Arithmetric durchgeführt,
 mit "natürlich" falchen Ergebnisse.
 
 Nachdem ich den 64-bit Compiler nutze,stimmt alles wieder!
 
 So- das Problem hat sich also damit erledigt.
 
 Übrigens, die 'Linked-List' ist
 a: ein Stack
 b: ein Qeue(Warteschlane)
 
 
 Vielen Dank an alle,die sich hier beteiligt haben.
 
 Olaf
 _________________
 IF A=B AND B=C THEN IF A=C THEN PRG IS RUNNING
 ELSEIF A NOT C THEN REALLIVE IS RUNNING
 ENDIF
 |  |  
		| Nach oben |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4710
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 07.08.2020, 18:39    Titel: |   |  
				| 
 |  
				|  	  | OEG hat Folgendes geschrieben: |  	  | der FBCompiler,den ich installiert hatte,ist ein 32-Bit Compiler, ich habe aber eine 64-bit Zeiger-Arithmetric durchgeführt
 | 
 Auch wenn ich diese Methode bisher noch nicht sehr häufig verwendet habe, könnte da ein SIZEOF(INTEGER) helfen, das den Wert immer passend zum System ausgibt.
   (Das ist natürlich die Größe in Byte und nicht in Bit.)
 _________________
 Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
 |  |  
		| 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.
 
 |  |