IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Pascal Discussion :

Redimensionnement d'un tableau sans utiliser les pointeurs


Sujet :

Langage Pascal

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 69
    Points : 35
    Points
    35
    Par défaut Redimensionnement d'un tableau sans utiliser les pointeurs
    Je m'exerce avec Dev-pascal tournant avec le compilateur Free Pascal 2.6.2.

    Voici l'exercice que je me suis donné : saisir des valeurs dans un tableau dont l'utilisateur fixera, avant la saisie, l'indice maximal.

    C'est un cas de redimensionnement de tableau. D'après les tutoriels que j'ai lus (notamment Les Tableaux dynamiques de Eric Sigoillot sur ce site), les pointeurs sont requis. C'est un concept que je n'ai pas encore sérieusement étudié.

    J'ai alors, après la lecture du tutoriel, essayé une astuce pour contourner les pointeurs :

    - déclarer un tableau sans taille : Tab : array of real;

    - obtenir de l'utilisateur l'indice maximal du tableau : readln(indmax);

    - redimensionner le tableau : SetLength(Tab, indmax);

    - après les traitements voulus, libérer la mémoire : SetLength(Tab, 0);

    Cette astuce fonctionne bien. En tout cas, pour l'instant, elle me permet de résoudre le problème qui m'est posé. Cependant, je ne pourrai me permettre de nier l'utilité des Pointeurs.

    Qu'en pensez-vous ?

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 058
    Points : 15 339
    Points
    15 339
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par iks37 Voir le message
    - déclarer un tableau sans taille : Tab : array of real;

    - obtenir de l'utilisateur l'indice maximal du tableau : readln(indmax);

    - redimensionner le tableau : SetLength(Tab, indmax);
    Je pense que la variable indmax est mal nommée dans ce cas, car il s'agit plutôt du nombre d'éléments, comme cela est expliqué dans la documentation de FreePascal :

    Type
    TByteArray = Array of Byte;
    When declaring a variable of a dynamic array type, the initial length of the array is zero. The actual length of the array must be set with the standard SetLength function, which will allocate the necessary memory to contain the array elements on the heap. The following example will set the length to 1000:

    Var
    A : TByteArray;

    begin
    SetLength(A,1000);
    After a call to SetLength, valid array indexes are 0 to 999: the array index is always zero-based.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  3. #3
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    j'en pense que tu utilises des pointeurs sans le savoir

    un tableau dynamique EST un pointeur.

    quand tu crées une fonction avec une paramètre par adresse : func(var p :Integer); tu utilises un pointeur.

    la seule chose qui est parfois mal maîtrisée avec les pointeurs c'est l'allocation mémoire; un pointeur ne possède pas d'espace mémoire propre, c'est juste une adresse, mais s'il pointe sur une variable existante (comme "p" dans l'exemple ci-dessus), la question ne se pose pas.

    pour en revenir à SetLength() c'est lui qui alloue de la mémoire pour le tableau, et la variable pointe toujours sur le premier élément du tableau. mais rien n'empêche d'utiliser un pointeur pour parcourir le tableau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    var
      a: array of Integer;
      i: PInteger; // Pointeur vers un Integer
    begin
      SetLength(a, 5); // a = (0,0,0,0,0)
      i := @a[2]; // récupère l'adresse du 3ième élément
      i^ := 4; // a = (0,0,4,0,0)
      Inc(i); // Integer suivant
      Inc(i^); // a = (0,0,4,1,0)
    end;
    il faut juste distinguer l'adresse "i" et la valeur pointée "i^"
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 69
    Points : 35
    Points
    35
    Par défaut Indice maximal ou taille ?
    Bonsoir Paul TOTH,

    Dans le cadre de mon exercice d'apprentissage, je considère un tableau de dimension 1.
    Le programme demande effectivement à l'utilisateur le nombre d'éléments qu'il veut saisir.
    C'est à l'aide cette valeur que je procède au redimensionnement du tableau, et j'obtiens Tab[0..(nombre_d_éléments - 1)].

    Ainsi : valeur de l'indice minimal = 0 et valeur de l'indice maximal = nombre_d_éléments - 1

    Veuillez m'éclairer...

    Pourriez-vous m'expliquer comment adjoindre mon programme source à un commentaire ?

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 058
    Points : 15 339
    Points
    15 339
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par iks37 Voir le message
    Pourriez-vous m'expliquer comment adjoindre mon programme source à un commentaire ?
    Vous pouvez insérer du code dans votre message en utilisant les balises appropriées, que vous pouvez obtenir automatiquement en appuyant sur le bouton marqué du caractère #.

    Vous pouvez aussi joindre un fichier en cliquant sur "Gérer les pièces jointes".
    Images attachées Images attachées  
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  6. #6
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 69
    Points : 35
    Points
    35
    Par défaut
    Je présente le fichier source de ma proposition :
    Fichiers attachés Fichiers attachés

  7. #7
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 058
    Points : 15 339
    Points
    15 339
    Billets dans le blog
    9
    Par défaut
    Pour ce qui concerne l'usage du tableau, il me semble que votre code est correct. Je vois que les experts ne sont pas intervenus : c'est bon signe.

    Il y a une chose cependant qui pourrait être améliorée. Le langage Pascal permet d'utiliser des variables de type boolean, qui peuvent prendre les valeurs true et false. La fonction que vous utilisez pour vérifier que le nombre saisi est bien compris entre 0 et 20 pourrait renvoyer un résultat de type booléen.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    FUNCTION qtitatif(nombre : real): boolean;//integer;
    //var test : integer;
    begin
      //if((nombre < 0)or(nombre > 20))
      //then test := 1
      //else test := 0;
      //Qtitatif := test
      if (nombre < 0) or (nombre > 20 )
      then qtitatif := true
      else qtitatif := false; 
    end;
    Ou encore plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FUNCTION qtitatif(nombre : real): boolean;
    begin
      qtitatif := (nombre < 0) or (nombre > 20);
    end;
    L'appel de la fonction se présenterait alors de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      //while (qtitatif(nombre)= 1) do
      while qtitatif(nombre) do
    C'est beau le Pascal.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  8. #8
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 69
    Points : 35
    Points
    35
    Par défaut
    Merci pour vos conseils.

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/09/2009, 17h37
  2. Inclure un fichier externe sans utiliser les frames
    Par gazza dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 12/07/2006, 09h52
  3. Réponses: 9
    Dernier message: 01/07/2006, 21h04
  4. Decompression d'un fichier sans utiliser les modules du CPAN
    Par choubiroute dans le forum Modules
    Réponses: 6
    Dernier message: 10/03/2006, 15h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo