Accueil Ti-Gen Foire Aux Questions Chat sur le chan #tigcc sur IRC
Liste des membres Rechercher Aide
Bienvenue Invité !   Se connecter             Mes sujets   
Administrer
0 membre(s) et 1 visiteur(s) actif(s) durant les 5 dernières minutes Utilisateurs actifs : Aucun membre + 1 visiteur
Avant de poster sur le forum, il y a des régles de bases à respecter pour une bonne entente et un respect de tous.
Veuillez lire la charte du forum.
  :: Index » GFA-Basic TI68K » Documentations » Les secrets internes à GFA-Basic (0 réponse(s))
./POST DE DEPART (post n°0)   Marquer comme non lu.
geogeo Ecrit le: Jeudi 23 juin 2005 à 14:24 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


Organisation des variables et tableaux en mémoire


Le GFA-Basic possède quatre types de variables différents:

  • Les variables sans suffixe distinctif représentent des réels à virgule flottante qui sont mémorisés sur 10 octets sous forme binaire. Avec une précision assez importante.

  • Les variables avec le suffixe % (par exemple A%) sont des variables entières (Integer), dont la mémorisation nécessite 4 octets. Avec ce type de variables, on peut représenter des nombres entiers allant de -2 milliards à +2 milliards environ (-2147483648 à +2147483647 exactement).

  • Les variables booléennes sont suivies du caractère ! et ne peuvent prendre que deux valeurs : la valeur 0 (pour Faux) et -1(en fait toute valeur différentes de 0 : pour Vrai). Elles utilisent un octet (parfois deux octets en cas d'alignement de données).

  • Les variables alphanumériques (variables chaînes de caractères) ont pour suffixe le caractère $. De telles variables peuvent contenir au maximum 32767 caractères, car, dans le descripteur (voir plus bas) d'une variable alphanumérique, seuls deux octets sont utilisés pour indiquer la longueur.

    Les noms de variables doivent toujours commencer par une lettre alphanumérique et peuvent avoir une longueur de 64 caractères maximum.

    Pour différenceier les variables, toute la longueur du nom est prise en compte naturellement.

    Les caractères suivant la lettre alphanumérique initiale peuvent être des lettres, des chiffres, le souligné ou le point.

    Si une instruction d'affectation commence par LET, on peut même utiliser des mots clés (nom d'instruction) (même si cela n'est pas conseillé) comme nom de variables. Ainsi, la ligne suivante est tout à fait autorisée:

    LET LET=17

    En BASIC Gfa, il y a donc très peu de mots réservés.

    Grâce à l'instruction VARPTR(var) (pointeur de variables), on peut accéder à l'adresse en mémoire du premier octet de la zone-mémoire où le BASIC Gfa place le contenu de 'var'.

    Pour pouvoir mémoriser les chaînes de caractères et les tableaux (champs), on utilise un descripteur.

    Le descripteur est stocké sur 6 octets, dont les quatres premiers représentent une adresse. La signification des deux derniers est différente selon qu'il s'agit d'une chaîne de caractères ou d'un tableau.

    Examinons donc séparément les descripteurs de chaînes de caractères et de tableaux. Commençons par le plus simple : l'organisation des chaînes de caractères en mémoire:

    Avec l'instruction ARRPTR(var), on obtient l'adresse du premier octet du descripteur. Comme nous l'avons déjà dit, les quatre premiers octets du descripteur indiquent une adresse. C'est l'adresse où est placé le premier caractère de la chaîne. Cette adresse est identique à celle que retourne l'instruction VARPTR. Les deux derniers octets du descripteur indiquent la taille de la chaîne. A la fin de la chaîne mémorisée, on trouve, un octet de remplissage couramment appelé octet NULL.

    Plus tard viendra, après ce fameux octet NULL, l'adresse de début du descripteur correspondant (on appelle cette adresse 'backtrailer'. Il permettera d'accélérer sensiblement l'exécution du processus appelé Garbage-Collection (la collecte et l'effacement des zones mémoires qui ne sont plus utilisées)).

    Le programme suivant devrait permttre de comprendre encore mieux l'organisation des chaînes de caractères en mémoire:

    CLS
    A$="GfA"
    PRINT "Adresse du descripteur:"'
    PRINT ARRPTR(A$)
    PRINT "Adresse de début de la chaîne:"'
    PRINT LPEEK(ARRPTR(A$))
    PRINT "Pour vérification:"'
    PRINT VARPTR(A$)
    PRINT "Longueur de la chaîne:"'
    PRINT DPEEK(ARRPTR(A$)+4)
    PRINT "Chaîne de caractères:"'
    PRINT CHR$(PEEK(VARPTR(A$)));
    PRINT CHR$(PEEK(VARPTR(A$)+1));
    PRINT CHR$(PEEK(VARPTR(A$)+2))
    PRINT "Octet de remplissage:"'
    PRINT PEEK(VARPTR(A$)+3)


    Examinons à présent la manière dont les tableaux (champs ou array) sont stockés en mémoire:

    On accède aux tableaux de la même façon que pour les chaînes, c'est-à-dire par l'intermédiare d'un descripteur (descripteur de tableau). L'adresse de début du descripteur est également obtenue à l'aide de l'instruction ARRPTR(tab()). Les quatre premiers octets du descripteur de tableau contiennent l'adresse du début du tableau. Les deux derniers octets indiquent le nombre de dimensions du tableau (exemple : quatre pour A(3,4,5,7)).

    Au début du tableau se trouvent, contenu dans chaque fois deux octets, les nombres d'éléments dans chaque dimension. On commence par la dernière dimension (avec l'exemple précédent A(3,4,5,7), les deux premiers octets contiennent la valeur 8, les deux suivants la valeur 6, les deux suivants la valeur 5 et les deux derniers la valeur 4 (ne pas oublier que l'indice commence à 0)).

    On trouve ensuite le contenu des différents éléments du tableau. Pour des tableaux de réels, chaque élément occupe 10 octets, pour des tableaux d'entiers relatifs (Integer), 4 octets, et pour des tableaux de booléens, 1 seul octet.

    S'il s'agit d'un tableau de chaînes de caractères, on n'obtient pas directement le contenu des chaînes, mais leurs descripteurs. Ces descripteurs de chaînes ont le même format et la même fonction que ceux décrits dans la première partie.

    Pour se familiariser avec cette organisation des tableaux qui peut paraître confuse au premier coup d'oeil (surtout en ce qui concerne les tableaux de chaînes de caractères), il est conseillé de programmer l'exemple suivant:

    CLS
    DIM A$(1,0)
    A$(0,0)="A"
    A$(1,0)="BC"
    D=ARRPTR(A$())
    PRINT "Adresse du descripteur de tableau:"'D
    F=LPEEK(D)
    PRINT "Adresse du tableau:"'F
    PRINT "Nombre de dimension:"'
    PRINT DPEEK(D+4)
    PRINT "Nombre d'éléments dans la 2ème dim.:"'
    PRINT DPEEK(F)
    PRINT "Nombre d'éléments dans la 1ère dim.:"'
    PRINT DPEEK(F+2)
    PRINT "Adr. du descripteur pour 0,0:"'
    PRINT F+4
    PRINT "Adr. dans le descripteur pour 0,0:"'
    PRINT LPEEK(F+4)
    PRINT "Longueur de la chaîne 0,0:"'
    PRINT DPEEK(F+8)
    PRINT "Adr. du descripteur pour 1,0:"'
    PRINT F+10
    PRINT "Adr. dans le descripteur pour 1,0:"'
    PRINT LPEEK(F+10)
    PRINT "Longueur de la chaîne 1,0:"'
    PRINT DPEEK(F+14)
    PRINT "Vérification pour 0,0:"'
    PRINT VARPTR(A$(0,0))
    PRINT "Vérification pour 1,0:"'
    PRINT VARPTR(A$(1,0))
    PRINT "Chaîne 0,0:"'
    PRINT CHR$(PEEK(LPEEK(F+4)))
    PRINT "Chaîne 1,0:"'
    PRINT CHR$(PEEK(LPEEK(F+10)));
    PRINT CHR$(PEEK(LPEEK(F+10)+1))


    -Edité le Jeudi 23 juin 2005 à 14:24 par geogeo-
    Webmaster du site.
    Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

    Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
    http://www.tigen.org/gfabasic
        
      :: Index » GFA-Basic TI68K » Documentations » Les secrets internes à GFA-Basic (0 réponse(s))
    Pages : 1/1     « [1] » »|

    .Répondre à ce sujet
    Les boutons de code
    [B]old[I]talic[U]nderline[S]trikethrough[L]ine Flip Hori[Z]ontallyFlip [V]erticallySha[D]ow[G]low[S]poilerCode [G][C]ite
    Bullet [L]istList Item [K] Link [H][E]mail[P]icture SmileysHelp
    Couleurs :
    Saisissez votre message
    Activer les smileys
         

    Forum de Ti-Gen v3.0 Copyright ©2004 by Geoffrey ANNEHEIM
    Webmaster: Kevin KOFLER, Content Admins: list, Server Admins: Tyler CASSIDY and Kevin KOFLER, DNS Admin: squalyl
    Page générée en 83.85ms avec 18 requetes