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 :

[LG]Liste de pointeurs


Sujet :

Langage Pascal

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 26
    Points : 16
    Points
    16
    Par défaut [LG]Liste de pointeurs
    Bonjour,

    Je fais programme pour effectuer des multiplications exactes de très grands nombres (en théorie je voulais atteindre plusieurs milliers de chiffres).
    J'ai crée des listes de pointeurs pour stocker mes nombres:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    type t_pnombre=^t_nombre;
     
         t_nombre=record
                  chiffre:integer;
                  suivant:t_pnombre;
                end;
    Problème: à l'exécution, dès qu'un de mes nombres dépasse 20 chiffres, le programme se ferme. Un msg d'erreur d'affiche mais j'ai pas le tps de le lire...

    Je travaille avec delphi 6.
    1) Y a-t-il une sorte de "console dans laquelle je pourrais lire les msg d'erreur?
    2)Quelles sont les limites d'utilisation des pointeurs? Le nombre de pointeur est-il uniquement limité par la RAM?

    Merci

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut Re: Liste de pointeurs
    Citation Envoyé par kmitz
    1) Y a-t-il une sorte de "console dans laquelle je pourrais lire les msg d'erreur?
    Si tu lances ton programme à partir d'une console, tu pourras voir le message d'erreur.

    Citation Envoyé par kmitz
    2)Quelles sont les limites d'utilisation des pointeurs? Le nombre de pointeur est-il uniquement limité par la RAM?
    Le nombre de pointeur est lié à la quantité de mémoire virtuelle disponible
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 26
    Points : 16
    Points
    16
    Par défaut
    Et comment puis-je connaître et modifier la quantité de mémoire virtuelle allouée au programme?

  4. #4
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    La quantité de mémoire maximale disponible sous DOS est 640 Ko, la taille du tas. Elle n'est pas extensible. Pour connaitre la quantité de mémoire disponible, tu peux utiliser MemAvail. Pour connaitre la taille du plus grand bloc de mémoire disponible, tu peux utiliser MaxAvail.
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 26
    Points : 16
    Points
    16
    Par défaut
    En fait je sais pas si c'est un problème de mémoire virtuelle...
    En utilisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    try except writeln('bug');
    dans la boucle principale repeat until, au bout de plusieurs itérations le calcul reprend sans erreur.
    Quand j'exécute sous delphi, même avec try, il marque "violation d'accès" à l'adresse n°xxxxxxx.
    Quand je lance l'exécutable tout seul, ça écrit plein de fois "bug" et au bout d'un moment le calcul reprend, puis ça réécrit "bug" et ça reprend etc..

    Jsuis allé voir la quantité de mémoire virtuelle, c réglé à 768 mo dans windows..

  6. #6
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Fais voir la partie de code qui marche pas alors...

    Sous Windows, tu as autant de mémoire que tu veux
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 26
    Points : 16
    Points
    16
    Par défaut
    C'est la boucle principale de l'addition entre 2 nombres, sotckés dans des listes de pointeurs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    repeat
         if nb1=NIL then
          begin
            new(p1); {pour eviter d'affecter une valeur à nb1^.chiffre si 
                            nb1=NIL}
            nb1:=p1;
            nb1^.chiffre:=0;
            nb1^.suivant:=NIL;
          end;
     
         if nb2=NIL then
          begin
            new(p1);
            nb2:=p1;
            nb2^.chiffre:=0;
            nb2^.suivant:=NIL;
          end;
     
         res^.chiffre:= nb1^.chiffre + nb2^.chiffre + retenue ;
     
         if res^.chiffre>=10 then
             begin
              reste:= res^.chiffre mod 10;               {gestion des retenues}
              retenue:= (res^.chiffre - reste) div 10;
              res^.chiffre:=reste;
             end
         else retenue:=0;
     
         new(p);
         p^.suivant:=res;
         res:=p;
         nb1:=nb1^.suivant;
         nb2:=nb2^.suivant;
     
    until (nb1=NIL) AND (nb2=NIL);


    Cette partie de procédure fonctionne très bien jusqu'à 20 chiffres, puis elle se met à déconner, après elle fonctionne pour un nombre de chiffres supérieur, puis se remet à déconner etc.

    PS: l'erreur sous delphi c'est: Le projet xxxxxxx.exe a provoqué une classe d'exception EAccessViolation avec le message 'Violation d'accès' à l'adresse yyyyyyyy dans le module 'xxxxxxxx.exe' . Lecture de l'adresse zzzzzzz. Processus stoppé.

  8. #8
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Une erreur de violation d'accès est générallement due au fait que tu essayes de déréférencer un pointeur nil... Est-ce bien cette partie du code qui ne marche pas ?
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  9. #9
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 53
    Points : 64
    Points
    64
    Par défaut
    Salut,

    Je ne suis pas sûr que ce soit à l'orrigine de ton problème, mais le morceaux suivant semble contenir une coquille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if nb2=NIL then
          begin
            new(p1);
            nb2:=p1;
            nb2^.chiffre:=0;
            nb2^.suivant:=NIL;
          end;
    Tu écrases en effet p1 et il pointe vers la même zone que p2.
    En fait c'est peut-être la cause car si tu faits un dispose de p1 puis de p2, pour le coup p2 vaut nil ...

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 26
    Points : 16
    Points
    16
    Par défaut
    C'est possible que le problème vienne de là ("déréférencement").. J'ai retesté mon programme et j'ai cru remarquer que c'était une procédure sensée libérer les pointeurs (dispose) qui faisait tout planter.. Faut que je retourne jeter un coup d'oeil..

  11. #11
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Tu dois certainement affecter nil à un pointeur, puis essayer d'y accéder ensuite... Dabs ce cas, c'est un problème algorithmique
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

Discussions similaires

  1. [STL] Clear une liste de pointeurs
    Par mambo dans le forum SL & STL
    Réponses: 2
    Dernier message: 21/03/2007, 16h07
  2. Réponses: 1
    Dernier message: 19/10/2006, 15h33
  3. [LG]Liste de pointeurs de type pointer
    Par tom_snop dans le forum Langage
    Réponses: 4
    Dernier message: 29/03/2005, 23h40
  4. fuite de memoire dans une liste de pointeur sur composant
    Par Nicolos_A dans le forum Composants VCL
    Réponses: 2
    Dernier message: 16/12/2004, 08h46
  5. [LG]liste chainee + pointeur + affichage
    Par k_ro dans le forum Langage
    Réponses: 6
    Dernier message: 17/01/2004, 13h58

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