Seite 1 von 1

Quad-Problem bei Bit-Array-Test

Verfasst: 06.05.2006 12:43
von uweb
Hallo,

ich habe gerade mal einen kleinen Dummy geschrieben um die Machbarkeit (Geschwindigkeit) für ein großes Bit-Array zu testen.
Dabei habe ich nun aber ein Problem das ich mir nicht erklären kann.
Bei der Debug-Ausgabe in der 2. Schleife kommt statt 16168 irgend ein Wert und danach nur noch 16176.

Code: Alles auswählen

 StartTime = ElapsedMilliseconds()
 
 WfO = 1024*1024
 WfA = 256
 
 RowSize  = WfO / 8 ; 8 Bits = 1 Byte
 MemSize  = RowSize * WfA
 
 *MemoryID = AllocateMemory(MemSize)
 *c = AllocateMemory(RowSize)
 
  If *MemoryID And *c
    Debug "Startadresse des "+Str(MemSize/1048576)+"MB Speicherbereichs ist: "+Str(*MemoryID)


    *a = *MemoryID + RowSize * 64
    *b = *MemoryID + RowSize * 32

    Debug "*a = " + Str(*a)
    Debug "*b = " + Str(*b)
    Debug "*c = " + Str(*c)

    
    For i = 0 To RowSize-8 Step 8 ; ############## das läuft so ##############
      PokeQ(*c+i, PeekQ(*a+i) & -1)
;      Debug Str(i)
    Next
    Debug Str(i)+" Schleifendurchläufe beim Test"

    
    For i = 0 To RowSize-8 Step 8 ; ######### hier läuft etwas schief ########
      PokeQ(*c+i, PeekQ(*a+i) & PeekQ(*b+i))
      Debug Str(i)
    Next
    Debug Str(i)+" Schleifendurchläufe bei dem was ich eigentlich will"


    FreeMemory(*MemoryID)
  Else
    Debug "Konnte den angeforderten Speicher nicht reservieren!"
  EndIf

ElapsedTime = ElapsedMilliseconds()-StartTime 
Debug ElapsedTime
edit :

Ich bin gerade auf die Idee gekommen den Test auf Long statt Quad umzustellen und damit läuft es.
Nun vermute ich den Fehler doch eher bei Version 4.0 Beta 11 als bei mir.
Deshalb habe ich den Thread im Anfänger-Forum gelöscht und hier neu erstellt.

Code: Alles auswählen

 StartTime = ElapsedMilliseconds()
 
 WfO = 1024*1024
 WfA = 256
 
 RowSize  = WfO / 8 ; 8 Bits = 1 Byte
 MemSize  = RowSize * WfA
 
 *MemoryID = AllocateMemory(MemSize)
 *c = AllocateMemory(RowSize)
 
  If *MemoryID And *c
    Debug "Startadresse des "+Str(MemSize/1048576)+"MB Speicherbereichs ist: "+Str(*MemoryID)


    *a = *MemoryID + RowSize * 64
    *b = *MemoryID + RowSize * 32

    Debug "*a = " + Str(*a)
    Debug "*b = " + Str(*b)
    Debug "*c = " + Str(*c)

    
    For i = 0 To RowSize-4 Step 4 ; ############## das läuft so ##############
      PokeL(*c+i, PeekL(*a+i) & -1)
;      Debug Str(i)
    Next
    Debug Str(i)+" Schleifendurchläufe beim Test"

    
    For i = 0 To RowSize-4 Step 4 ; ######### hier läuft nichts mehr schief ########
      PokeL(*c+i, PeekL(*a+i) & PeekL(*b+i))
;      Debug Str(i)
    Next
    Debug Str(i)+" Schleifendurchläufe bei dem was ich eigentlich will"


    FreeMemory(*MemoryID)
  Else
    Debug "Konnte den angeforderten Speicher nicht reservieren!"
  EndIf

ElapsedTime = ElapsedMilliseconds()-StartTime 
Debug ElapsedTime
Da ich mir vorläufig noch keinen 64-Bit-Puter leisten kann dürfte es so eigentlich auch nicht langsamer sein.
Trotzdem wäre es interessant ob sich nun tatsächlich um einen Bug handelt.

Verfasst: 06.05.2006 16:28
von Helle
Ist wohl ein Bug. Habe mir mal die von PB erstellte Assembler-Datei angeschaut. In der fragwürdigen Schleife werden z.B. 2 POP`s ohne die entsprechenden PUSH´s verwendet; der Rest sieht auch komisch aus.
Folgendes funktioniert auch:

Code: Alles auswählen

    For i = 0 To RowSize-8 Step 8 ; ######### hier läuft etwas schief ######## 
      ;PokeQ(*c+i, PeekQ(*a+i) & PeekQ(*b+i)) 
     
      A.q=PeekQ(*a+i)
      B.q=PeekQ(*b+i)
      PokeQ(*c+i,A&B)
Hier stimmen auch wieder PUSH`s/POP´s.
Sollteste mal im englischen Forum melden.

Gruss
Helle

Verfasst: 07.05.2006 09:14
von uweb
Danke für's Feedback !

Ich bin nur selten im englischen Forum.

Nach Deiner Bestätigung habe ich es mir dann aber doch angetan.

Dort habe ich sogar einen passenden existierenden Thread gefunden
und mich daran gehängt.

http://www.purebasic.fr/english/viewtopic.php?p=143325