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:

Structure als Parameter

 
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
OEG



Anmeldungsdatum: 01.08.2020
Beiträge: 8
Wohnort: Séte / France

BeitragVerfasst am: 01.08.2020, 13:31    Titel: Structure als Parameter Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 01.08.2020, 14:08    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
OEG



Anmeldungsdatum: 01.08.2020
Beiträge: 8
Wohnort: Séte / France

BeitragVerfasst am: 01.08.2020, 14:27    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 01.08.2020, 14:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
OEG



Anmeldungsdatum: 01.08.2020
Beiträge: 8
Wohnort: Séte / France

BeitragVerfasst am: 01.08.2020, 14:56    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 01.08.2020, 15:00    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
OEG



Anmeldungsdatum: 01.08.2020
Beiträge: 8
Wohnort: Séte / France

BeitragVerfasst am: 01.08.2020, 15:39    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1002
Wohnort: Ruhrpott

BeitragVerfasst am: 01.08.2020, 15:53    Titel: Antworten mit Zitat

Hallo DEG und willkommen im Forum! lächeln

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
Benutzer-Profile anzeigen Private Nachricht senden
OEG



Anmeldungsdatum: 01.08.2020
Beiträge: 8
Wohnort: Séte / France

BeitragVerfasst am: 01.08.2020, 17:00    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1002
Wohnort: Ruhrpott

BeitragVerfasst am: 01.08.2020, 18:12    Titel: Antworten mit Zitat

Zitat:
Code:
Type typdef ' Type der ein 'Dumy as TypeBeispiel' Ptr aufnimt
   mtyp As Integer Ptr
End Type
Das ist schon mal falsch. Richtig müsste es heissen:
Code:
Type typdef ' Type der ein 'Dumy as TypeBeispiel' Ptr aufnimt
   mtyp As punkt Ptr
End Type

Die Pointerarithmetik von FB ist etwas eigenwillig.
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
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. mit dem Kopf durch die Mauer wollen

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
Benutzer-Profile anzeigen Private Nachricht senden
OEG



Anmeldungsdatum: 01.08.2020
Beiträge: 8
Wohnort: Séte / France

BeitragVerfasst am: 01.08.2020, 20:03    Titel: Antworten mit Zitat

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'.
verwundert: 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 mit dem Kopf durch die Mauer wollen Kopf schütteln

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 01.08.2020, 21:19    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1002
Wohnort: Ruhrpott

BeitragVerfasst am: 01.08.2020, 22:13    Titel: Antworten mit Zitat

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 Ich brauch nen Kaffee... ) 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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 01.08.2020, 23:29    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
OEG



Anmeldungsdatum: 01.08.2020
Beiträge: 8
Wohnort: Séte / France

BeitragVerfasst am: 02.08.2020, 00:32    Titel: Antworten mit Zitat

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( neutral Include, cool Type<Class>,Oder lachen eineDLL vor lachen auf dem Boden rollen)

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1002
Wohnort: Ruhrpott

BeitragVerfasst am: 04.08.2020, 13:45    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
OEG



Anmeldungsdatum: 01.08.2020
Beiträge: 8
Wohnort: Séte / France

BeitragVerfasst am: 07.08.2020, 18:49    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 07.08.2020, 19:39    Titel: Antworten mit Zitat

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. lächeln
(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
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