Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Domso
Anmeldungsdatum: 02.02.2011 Beiträge: 109
|
Verfasst am: 09.09.2012, 11: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, 11: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, 12: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, 14: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, 01: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 |
|
 |
|