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:

UDT und variable Parameterliste

 
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
Type



Anmeldungsdatum: 24.02.2006
Beiträge: 187
Wohnort: Dresden

BeitragVerfasst am: 24.03.2011, 14:40    Titel: UDT und variable Parameterliste Antworten mit Zitat

Hallo Leute,

ich hab einen UDT erstellt und versuche ihn nun über eine variable Parameterliste an eine Sub zu übergeben.

Code:
type udt
   
   as string foo
   as byte bar
   
end type

sub PrintUDT cdecl (count as ubyte, ...)
   
   dim as any ptr argument = va_first()
   for a as ubyte = 1 to count
      print va_arg(argument, udt).foo
      argument = va_next(argument, udt)
   next a
   
end sub


dim as udt test1
dim as udt test2

test1.foo = "HUHU"
test2.foo = "HAHA"

PrintUDT (2,test1,test2)



Das Problem ist, dass ich eine Fehlermeldung beim kompilieren bekomme:

fbc.exe hat Folgendes geschrieben:
unbenannt.bas(25) error 55: Type mismatch, at parameter 2 of PRINTUDT() in 'PrintUDT (2,test1,test2)'


Übergebe ich einen Pointer, so kann ich zwar kompilieren, bekomme aber keine Ausgabe:
Code:
type udt
   
   as string foo
   as byte bar
   
end type

sub PrintUDT cdecl (count as ubyte, ...)
   
   dim as any ptr argument = va_first()
   dim as udt test
   for a as ubyte = 1 to count
      test =  *va_arg(argument, udt ptr)
      print test.foo
      argument = va_next(argument, udt ptr)
   next a
   
end sub


dim as udt test1
dim as udt test2

test1.foo = "HUHU"
test2.foo = "HAHA"

PrintUDT (2,@test1,@test2)


Bei einem Standard-Datentypen kann ich Alles ganz normal übergeben (brauche also auch keine Pointer).
Kann mir da jemand weiterhelfen?

Danke schonmal für eure Hilfe.

MfG Type
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 24.03.2011, 15:59    Titel: Antworten mit Zitat

Ich habe die zweite Lösung mal mit count AS INTEGER probiert und bekomme die gewünschten Werte zurück geliefert. Vielleicht ist es nur eines der Probleme, die beim Datentyp UBYTE auftauchen.

Beim ersten Programm kann es durchaus sein, dass die Methode nur für die Standard-Datentypen umgesetzt ist und es für UDTs deshalb nicht ohne Pointer funktioniert.
_________________
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
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 24.03.2011, 17:43    Titel: Antworten mit Zitat

Code:
Type udt
   As String foo
   As Byte bar
End Type

Sub PrintUDT Cdecl (ByRef count As UByte, ...)
   Dim As Any Ptr argument = va_first()
   Dim As udt Ptr temp
   
   For a As UByte = 1 To count
      temp = va_arg(argument, udt Ptr)
      Print temp->foo
      argument = va_next(argument, udt Ptr)
   Next
End Sub


Dim As udt test1
Dim As udt test2

test1.foo = "HUHU"
test2.foo = "HAHA"

PrintUDT(2, @test1, @test2)
Sleep
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Type



Anmeldungsdatum: 24.02.2006
Beiträge: 187
Wohnort: Dresden

BeitragVerfasst am: 25.03.2011, 09:53    Titel: Antworten mit Zitat

Alles klar, der Code von MOD hat super funktioniert! zwinkern - Danke!

Allerdings würd ich gerne noch wissen, warum ich count mit byref übergeben muss. - Denn das scheint mir der Knackpunkt zu sein...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 25.03.2011, 11:29    Titel: Antworten mit Zitat

Type hat Folgendes geschrieben:
Allerdings würd ich gerne noch wissen, warum ich count mit byref übergeben muss.


Zitat:
<CIA-94> fbc: dkls * r5460 /trunk/FreeBASIC/ (3 files in 3 dirs): Fixed va_first() to make it take into account 4 byte parameter alignment; the address it returned was wrong when the last fixed parameter of the vararg function was something with sizeof() <> 4.

weil das ein bug war, der bei byref nicht auftreten kann. mit den neuen daily builds sollte es also funktionieren.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
XOR



Anmeldungsdatum: 23.07.2010
Beiträge: 161

BeitragVerfasst am: 25.03.2011, 17:35    Titel: Antworten mit Zitat

Wenn du das udt bloss ausgeben willst, geht das so auch einacher:
Code:
Type udt
   As String foo
   As Byte bar
   Declare Operator Cast () as String
End Type

Operator udt.Cast () as String
   return "foo = "+foo+chr(13,10)+"bar = "+str(bar)+chr(13,10)
End Operator

Dim As udt test1
Dim As udt test2

test1.foo = "HUHU"
test2.foo = "HAHA"

Print test1
Print test2
Sleep
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Type



Anmeldungsdatum: 24.02.2006
Beiträge: 187
Wohnort: Dresden

BeitragVerfasst am: 27.03.2011, 10:43    Titel: Antworten mit Zitat

Zum Ausgeben ist deine Methode natürlich besser.
Der Quelltext, den ich gepostet habe war allerdings nur eine Vereinfachung von dem, bei dem das Problem wirklich aufgetaucht ist. zwinkern
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