Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Type
Anmeldungsdatum: 24.02.2006 Beiträge: 187 Wohnort: Dresden
|
Verfasst am: 24.03.2011, 14:40 Titel: UDT und variable Parameterliste |
|
|
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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 24.03.2011, 15:59 Titel: |
|
|
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 |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 24.03.2011, 17:43 Titel: |
|
|
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 |
|
 |
Type
Anmeldungsdatum: 24.02.2006 Beiträge: 187 Wohnort: Dresden
|
Verfasst am: 25.03.2011, 09:53 Titel: |
|
|
Alles klar, der Code von MOD hat super funktioniert! - 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 |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 25.03.2011, 11:29 Titel: |
|
|
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 |
|
 |
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 25.03.2011, 17:35 Titel: |
|
|
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 |
|
 |
Type
Anmeldungsdatum: 24.02.2006 Beiträge: 187 Wohnort: Dresden
|
Verfasst am: 27.03.2011, 10:43 Titel: |
|
|
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.  |
|
Nach oben |
|
 |
|