| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen   | 
	
	
	
		| Autor | 
		Nachricht | 
	
	
		Domso
 
 
  Anmeldungsdatum: 02.02.2011 Beiträge: 109
 
  | 
		
			
				 Verfasst am: 09.09.2012, 10:14    Titel: array-udt-problem | 
				     | 
			 
			
				
  | 
			 
			
				Hi zusammen
 
 
ich habe ein kleines problem mit diesem code
 
 	  | Code: | 	 		  
 
Type udt_type
 
   As integer var1(1 To 10)
 
End Type
 
Dim As udt_type typ(1 To 10)
 
 
For k As Integer = 1 To 10
 
   typ(1).var1(k)=1
 
Next
 
 
Dim As double var2=-2
 
Dim As Integer var3=-2
 
Dim As Integer var4=((var3+1)*-1)
 
 
For k As Integer = 1 To 10
 
   Print typ(((-2)+1)*-1).var1(k)
 
   Print typ((var3+1)*-1).var1(k)
 
   Print typ((var2+1)*-1).var1(k)
 
   Print typ(var4).var1(k)
 
   Print "------"
 
Next
 
 
sleep
 
 | 	  
 
Eigentlich sollte das Programm jeweils 4x den selben wert anzeigen, 
 
aber der 2. ist falsch
 
Wo liegt hier genau der Fehler, weil
 
eigentlich steht ja 4x das selbe dran... nur anders formatiert | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		Eternal_pain
 
  
  Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
  | 
		
			
				 Verfasst am: 09.09.2012, 10:57    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Ehrlich gesagt bin ich mir nicht ganz sicher aber lehne mich mal ein bisschen aus dem Fenster  
 
 
-2 + +1 = -1
 
-1 * -1 ergibt tja.. 1? -1? scheinbar ist sich FBC genauso unsicher wie ich, das ergebnis in Var4 und auch eine rechnung einfach per print ergeben 1 aber irgendwie ist mir das 1*1 konzept hier als würde etwas anders laufen und intern ergibt das ganze -1 was ausserhalb des speichers (1 to 10) liegt und somit zu dem fehlerhaften Ergebnis kommt oder abstürzen...
 
 
Edit: was ich meine; wollte ich durch Berechnungen 'vroteile' in sachen performance erziehlen, würde ich ein *1 einfach weglassen weil unsinnig und wie gesagt, weit aus dem fenster gelehnt... FBC könnte da ähnlich 'denken' _________________
   | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		MOD Fleißiger Referenzredakteur
  
  Anmeldungsdatum: 10.09.2007 Beiträge: 1003
 
  | 
		
			
				 Verfasst am: 09.09.2012, 11:24    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Es dürfte sich hierbei um einen Compiler Bug handeln. Alle Indizes ergeben 1 und sind damit gültig, allerdings stimmt die Pointeradresse im Fall von "var3" nicht. Ich hab den Code mal aufgearbeitet und werde es mal dem FreeBASIC Chefentwickler melden.
 
 	  | Code: | 	 		  Type udt_type
 
   As Integer var1(1 To 10)
 
End Type
 
Dim As udt_type typ(1 To 1)
 
 
'Set all var1() of typ(1) to 1
 
For i As Integer = 1 To 10
 
   typ(1).var1(i) = 1
 
   Print "Index " & i & " = " & typ(1).var1(i)
 
Next
 
Print "Press any key":Print
 
Sleep
 
 
Dim As Double  var2 = -2 'works with double
 
Dim As Integer var3 = -2 'doesn't work with integer
 
Dim As Integer var4 = ((var3 + 1) * -1)
 
 
For i As Integer = 1 To 10
 
   Print "Index " & i & ":"
 
   '              index of typ()            index of var()      value                                   adress
 
   Print "typ(" & (((-2) + 1) * (-1)) & ").var(" & i & ") = " & typ(((-2) + 1) * (-1)).var1(i) & " @" & @typ(((-2)+1)*(-1))
 
   Print "typ(" & ((var2 + 1) * (-1)) & ").var(" & i & ") = " & typ((var2 + 1) * (-1)).var1(i) & " @" & @typ((var2+1)*(-1))
 
   Print "typ(" & ((var3 + 1) * (-1)) & ").var(" & i & ") = " & typ((var3 + 1) * (-1)).var1(i) & " @" & @typ((var3+1)*(-1))
 
   Print "typ(" & (var4)              & ").var(" & i & ") = " & typ(var4).var1(i)              & " @" & @typ(var4)
 
   Print "typ(" & (1)                 & ").var(" & i & ") = " & typ(1).var1(i)                 & " @" & @typ(1)
 
   Print "------"
 
Next
 
Sleep | 	 
  | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		Domso
 
 
  Anmeldungsdatum: 02.02.2011 Beiträge: 109
 
  | 
		
			
				 Verfasst am: 09.09.2012, 13:34    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				ok, thx... dann liegts nicht an mit    | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		dkl FreeBASIC-Compiler-Entwickler
 
  Anmeldungsdatum: 25.04.2010 Beiträge: 14 Wohnort: Germany
  | 
		
			
				 Verfasst am: 12.09.2012, 00:59    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Dieses Problem sollte jetzt behoben sein: fbc commit c33f34f8
 
 
Das "* -1" im Arrayzugriff sorgt blöderweise für einen negativen Indexfaktor, der von den Arrayzugriffoptimierungen nicht richtig behandelt wurde. Der negative Faktor wurde an den ASM emitter weitergegeben, obwohl der damit nicht umgehen kann, und den Faktor dann auch direkt ignoriert hat, und da war der Index beim Arrayzugriff dann natürlich falsch. | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		 |