Bug avec tableau dans structure ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Bug avec tableau dans structure ?

Message par Mesa »

Bonsoir, y aurait-il un bug dans les structures quand elles comprennent un tableau :

Code : Tout sélectionner

;octet non signé :.a
;mot non signé :.u

;/////////////////// CPU ////////////////////////////////////////////
Global TAILLEMEMOIRE= 4096 ;$FFF
Global ADRESSEDEBUT = 512   ;$200

Structure CPUS
Array memoire.a(TAILLEMEMOIRE) ;declaration d'un tableau pour la mémoire de 4Ko
;Registres
Array V.a(16) ; 8bits
I.u ; 16 bits stocke une adresse memoire ou dessinateur
Array saut.u(16) ;//Pour gerer les sauts dans "memoire" 16 aux maximums
nbrsaut.a ;//stocke le nombre de sauts effectués pour ne pas dépasser 16
compteurJeu.a ;// Compteur pour la synchronisation 
compteurSon.a ;// Compteur pour le son
pc.u ;//pour parcourir le tableau "memoire" "program counter" 16bits
EndStructure

Global cpu.CPUS ;  //déclaration de notre CPU

Procedure initialiserCpu()

  ;//On initialise le tout

    

    For i=1 To TAILLEMEMOIRE-1; 
         cpu\memoire(i)=0       ;ERREUR Index de tableau hors limites ! ! ! ?
    Next i

     For i=0 To 15
        cpu\V(i)=0;
        cpu\saut(i)=0;
     Next i

    cpu\pc=ADRESSEDEBUT;
    cpu\nbrsaut=0;
    cpu\compteurJeu=0;
    cpu\compteurSon=0;
    cpu\I=0;


  EndProcedure
  
  initialiserCpu()
  
  End
J'ai une ERREUR Index de tableau hors limites quelque soit l'index
Par contre si je remplace la variable TAILLEMEMOIRE par la constante #TAILLEMEMOIRE (sans global), ça marche.

ça s'explique comment svp ?

Merci.

Mesa
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: Bug avec tableau dans structure ?

Message par flaith »

Salut,

normalement et conformément aux objets dynamiques présents dans une structure, celle-ci doit d'abord être initialisée

Dans l'aide, rubrique "Compiler Functions"
Syntax : InitializeStructure(*Pointer, Structure)

Description :

InitializeStructure initialize the specified structured memory area. This is useful when the structure contains dynamic objects like array", list or map which have to be allocated internally by PureBasic. 'Structure' is the name of the structure which should be used to perform the initialization. There is no internal check to ensures than the structure match the memory area. This function is for advanced users only and should be used with care.
Le programme serait donc :

Code : Tout sélectionner

;octet non signé :.a
;mot non signé :.u

;/////////////////// CPU ////////////////////////////////////////////
Global TAILLEMEMOIRE= 4096 ;$FFF
Global ADRESSEDEBUT = 512   ;$200

Structure CPUS
  ;Array memoire.a(TAILLEMEMOIRE) ;declaration d'un tableau pour la mémoire de 4Ko
  Array memoire.a(TAILLEMEMOIRE)
  ;Registres
  Array V.a(16)    ;8bits
  I.u               ; 16 bits stocke une adresse memoire ou dessinateur
  Array saut.u(16) ;//Pour gerer les sauts dans "memoire" 16 aux maximums
  nbrsaut.a         ;//stocke le nombre de sauts effectués pour ne pas dépasser 16
  compteurJeu.a     ;// Compteur pour la synchronisation
  compteurSon.a     ;// Compteur pour le son
  pc.u              ;//pour parcourir le tableau "memoire" "program counter" 16bits
EndStructure

Procedure initialiserCpu()

  ;//On initialise le tout
  *sCPU.CPUS = AllocateMemory(SizeOf(CPUS))
  InitializeStructure(*sCPU, CPUS)
  For i=0 To TAILLEMEMOIRE-1;
    *sCPU\memoire(i) = 0
  Next i

  For i=0 To 15
    *sCPU\V(i)=0;
    *sCPU\saut(i)=0;
  Next i

  *sCPU\pc=ADRESSEDEBUT;
  *sCPU\nbrsaut=0;
  *sCPU\compteurJeu=0;
  *sCPU\compteurSon=0;
  *sCPU\I=0;
EndProcedure
 
initialiserCpu()
 
End 
Mais j'ai la même erreur :?
Demivec
Messages : 91
Inscription : sam. 18/sept./2010 18:13

Re: Bug avec tableau dans structure ?

Message par Demivec »

Mesa a écrit :J'ai une ERREUR Index de tableau hors limites quelque soit l'index
Par contre si je remplace la variable TAILLEMEMOIRE par la constante #TAILLEMEMOIRE (sans global), ça marche.

ça s'explique comment svp ?
Les structures sont définies au «moment de la compilation». Le TAILLEMEMOIRE variable n'est pas définie au moment de la compilation, il ne reçoit pas une valeur jusqu'à ce que «l'exécution». TAILLEMEMOIRE # est défini à moment de la compilation. Ce pourquoi il travaille avec # TAILLEMEMOIRE et non TAILLEMEMOIRE.
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: Bug avec tableau dans structure ?

Message par flaith »

Arf, j'ai réfléchi (le soir j'ai plus de mal :wink:)
C'est exactement ce que dit Demivec, la valeur doit être définie, tu n'as pas le choix
Si tu désire avoir une longueur différente et modifiable dans ton programme utilise plutôt une "List" ou une "Map"
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Bug avec tableau dans structure ?

Message par comtois »

flaith a écrit :Si tu désire avoir une longueur différente et modifiable dans ton programme utilise plutôt une "List" ou une "Map"
Les tableaux dynamiques peuvent être redimensionnés

Code : Tout sélectionner

;octet non signé :.a
;mot non signé :.u

;/////////////////// CPU ////////////////////////////////////////////
Global TAILLEMEMOIRE= 4096 ;$FFF
Global ADRESSEDEBUT = 512   ;$200

Structure CPUS
  Array memoire.a(0) ;declaration d'un tableau pour la mémoire de 4Ko
  ;Registres
  Array V.a(16) ; 8bits
  I.u ; 16 bits stocke une adresse memoire ou dessinateur
  Array saut.u(16) ;//Pour gerer les sauts dans "memoire" 16 aux maximums
  nbrsaut.a ;//stocke le nombre de sauts effectués pour ne pas dépasser 16
  compteurJeu.a ;// Compteur pour la synchronisation
  compteurSon.a ;// Compteur pour le son
  pc.u ;//pour parcourir le tableau "memoire" "program counter" 16bits
EndStructure

Global cpu.CPUS ;  //déclaration de notre CPU

Procedure initialiserCpu()
  
  ;//On initialise le tout
  
  ReDim cpu\memoire.a(TAILLEMEMOIRE)
  
  For i=1 To TAILLEMEMOIRE-1;
    cpu\memoire(i)=0       ;ERREUR Index de tableau hors limites ! ! ! ?
  Next i
  
  For i=0 To 15
    cpu\V(i)=0;
    cpu\saut(i)=0;
  Next i
  
  cpu\pc=ADRESSEDEBUT;
  cpu\nbrsaut=0;
  cpu\compteurJeu=0;
  cpu\compteurSon=0;
  cpu\I=0;
  
  
EndProcedure

initialiserCpu()

End
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: Bug avec tableau dans structure ?

Message par flaith »

C'est bien ce que je dis, le soir j'ai vraiment plus de mal pour réfléchir :lol:
Répondre