| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen   | 
	
	
	
		| Autor | 
		Nachricht | 
	
	
		Type
 
 
  Anmeldungsdatum: 24.02.2006 Beiträge: 187 Wohnort: Dresden
  | 
		
			
				 Verfasst am: 24.03.2011, 13: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: 4712 Wohnort: ~/
  | 
		
			
				 Verfasst am: 24.03.2011, 14: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, 16: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, 08: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, 10: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, 16: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, 09: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 | 
		 | 
	
	
		  | 
	
	
		 |