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 Delphi Discussion :

Liste Chaînée: Modifier valeur élément


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 246
    Points : 67
    Points
    67
    Par défaut Liste Chaînée: Modifier valeur élément
    Bonjour à tous,

    n'ayant rien trouvé sur le sujet je me permets de poser la question car je sèche complètement.

    J'essaie de modifier la valeur d'une variable dynamique dans une liste chaînée.
    Lorsque j'affiche les différents enregistrements lors de la boucle tout semble correct mais lorsque j' utilise la chaîne créée en dehors de la procédure je me fais éjecter pour violation d'accès d'adresse...

    Merci à vous.
    BB

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    pt_cour:=liste;
    motAscii:=liste;
     
    while pt_cour<>NIL do begin
       if ord(pt_cour^.group.lettre)< 63 Then begin
          Lettre:= pt_cour^.cases.lettre;
          motAscii^.group.lettre:=chr(ord(Lettre)+32);
       end;
      pt_cour:=pt_cour^.suivant;
      motAscii:=motAscii^.suivant;
     end;

  2. #2
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 559
    Points : 3 948
    Points
    3 948
    Par défaut
    Salut

    Code pas assez détaillé (la description des types manque par exemple).
    Cependant quel est l'intérêt de l'instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      motAscii:=motAscii^.suivant;
    Tu parcours la liste liste avec deux pointeurs différents mais qui progressent de la même façon. A quoi bon, tu aurais obtenu la même chose avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    pt_cour:=liste;
    motAscii:=liste;
     
    while pt_cour<>NIL do begin
       Lettre:= pt_cour^.cases.lettre;
       if ord(Lettre)< 63 Then
          pt_cour^.group.lettre:=chr(ord(Lettre)+32);
       pt_cour:=pt_cour^.suivant;
    end;
    me trompai-je ?
    Tu n'as peut-être pas tout dit...
    @+

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 246
    Points : 67
    Points
    67
    Par défaut
    Merci Eric,

    tu as raison le second pointeur ne sert à rien mais j'ai tellement testé cette bête boucle que j'en étais resté là.

    J'ai modifié un petit programme qui me permet de traiter les listes chaînées (d'insérer ou d'ajouter) et je me retrouve toujours avec le même problème.
    J'ai donc ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Type
     pList = ^Noeud;
     Noeud = record
               Element: Integer;
     
               Suivant: pList;
    ************************
    While (PMOdif <> Nil) do begin
           if i = Position Then
            PModif^.Element:=132;
           i:=i+1;
           PModif:=PModif^.suivant;
         end;
    Et je me fais éjecter également lors de la visualisation de la liste.

    Merci.
    BB

  4. #4
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 559
    Points : 3 948
    Points
    3 948
    Par défaut
    Tu devrais mettre le source complet ce serait plus simple.

    Pour ton dernier code, j'ai les commentaires suivants:
    - initialise correctement le pointeur PModif et le compteur i. Au premier appel ça marche peut-être, mais après, badaboum !!!

    - une fois que tu as atteint la donnée situé à Position et modifié la valeur, tu peux quitter la boucle car les données suivantes ne t'intéressent plus.

    - si tu atteint la fion de la liste avant d'atteindre position, i.e. Position est supérieur au nombre d'éléments, tu as un problème le mieux est de lever une exception (robustesse du code)

    - Définis autant de procédure ou fonction qu'il y a d'opération à réaliser et n'hésite pas à employer des variables locales.

    - Mieux, définis un objet liste, Delphi le permettant, faut pas s'en priver. Mais avant il faut que tu réfléchisses bien à ce que doit faire ta liste, notamment les services que tu attends d'elle. Définit ensuite les méthodes et attributs. Ne connaissant pas le sujet de ton travail, je ne peux pas faire beaucoup plus.

    @+

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 246
    Points : 67
    Points
    67
    Par défaut
    Eric,

    en espérant m'exprimer correctement j'ai pu remarquer que parce que j'utilisais une liste comme variable (en déclarant VAR devant) dans ma fonction d'appel et bien cette fonction me renvoyait une liste vide après traitement.

    J'ai donc localisé l'élément à modifier dans la liste (et ce sans le VAR) sinon j'avais encore une liste vide.
    Ensuite j'ai détruit cet élément et enfin insérer un nouveau à cette même place.

    Je ne sais pas si c'est normal ou comment le justifier mais pour toi ça l'est certainement et peut-être pourras-tu me dire comment faire plus simple.

    Merci.
    BB

  6. #6
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 559
    Points : 3 948
    Points
    3 948
    Par défaut
    Citation Envoyé par BBouille Voir le message
    Eric,

    en espérant m'exprimer correctement j'ai pu remarquer que parce que j'utilisais une liste comme variable (en déclarant VAR devant) dans ma fonction d'appel et bien cette fonction me renvoyait une liste vide après traitement.

    J'ai donc localisé l'élément à modifier dans la liste (et ce sans le VAR) sinon j'avais encore une liste vide.
    Ensuite j'ai détruit cet élément et enfin insérer un nouveau à cette même place.

    Je ne sais pas si c'est normal ou comment le justifier mais pour toi ça l'est certainement et peut-être pourras-tu me dire comment faire plus simple.

    Merci.
    BB
    Envoie le code, je tâcherais de regarder cela d'ici ce soir. Pas le temps en journée.

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 246
    Points : 67
    Points
    67
    Par défaut
    Bonsoir Eric,

    voici le petit programme de test concerné.
    Il suffit de cliquer sur Ajouter - Voir - Modifier - Voir.

    Ma question était de savoir s'il n'y avait pas moyen de faire plus simple pour modifier la valeur d'un élément plutôt que de repérer l'élément, le détruire et d'enfin insérer le nouvel élément modifié.

    Bien à toi.

    BB
    Fichiers attachés Fichiers attachés

  8. #8
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 559
    Points : 3 948
    Points
    3 948
    Par défaut
    Salut

    J'ai revu ton code et commenté celui-ci sans introduire trop de nouvelles choses.

    D'une façon générale :
    - trouves une meilleure façon d'indenter ton code et sois plus rigoureux dans l'indentation, c'est capital pour la compréhension
    - Attention aux variables globales telles que MyPtr, altérée inopinément dans la routine de conversion de la liste en texte, c'est sans doute cela qui plantait ton programme.
    - quand tu mets en oeuvre des structures dynamiques telles que des listes chaînées, surtout à la mode "vieux Pascal", fais attention, les pointeurs et les allocations dynamiques donnent vite des migraines. J'ai dans ce sens ajouté une routine de destruction de la liste chaînée.
    - je trouve qu'accéder aux données par leur rang dans une liste simplement chaînée n'est pas une bonne idée mais bon, je ne connais pas tes contraintes.

    Il y a sans doute des bugs résiduels, je te laisse t'amuser avec...

    @+
    Fichiers attachés Fichiers attachés

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 246
    Points : 67
    Points
    67
    Par défaut
    Hello,

    un grand merci à toi.
    J'apprécie beaucoup tes explications et les simplifications apportées.
    Tout est quasi clair maintenant.

    Bonne continuation.

    BB

  10. #10
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 559
    Points : 3 948
    Points
    3 948
    Par défaut
    Salut

    Bonne continuation çà toi aussi.


    @+

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  11. #11
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 559
    Points : 3 948
    Points
    3 948
    Par défaut Variante
    Une grosse révision qui peut sans doute encore clarifier ton exemple, j'ai introduit une nouvelle procédure GetNthElem afin de simplifier le code des autres procédures, j'ai éliminé mes commentaires précédents qui ne se justifient plus. La procédure GetNthElem ramène le N°ième élément (paramètre Curr) par position mais aussi son précédesseur (paramètre Prev), ce qui permet de simplifier les autres procédures.
    Fichiers attachés Fichiers attachés

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 246
    Points : 67
    Points
    67
    Par défaut
    Holà Eric,

    je n'en espérais pas autant.
    Je pourrai en faire maintenant des copier-coller avec ce code super propre et concis.

    Merci mille fois.

    BB

  13. #13
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 559
    Points : 3 948
    Points
    3 948
    Par défaut
    Salut

    En fait, la première solution ne me plaisait pas car je trouvais le code assez lourd, ça m'a trotter dans la tête alors j'ai sorti une autre version.

    Bonne continuation.

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 20
    Dernier message: 02/05/2010, 16h56
  2. [Access 2002] Modifier valeur dans liste déroulante
    Par wperezrobles dans le forum Access
    Réponses: 5
    Dernier message: 10/10/2006, 09h51
  3. Réponses: 6
    Dernier message: 24/08/2006, 14h56
  4. Zone de liste modifiable : valeur par défaut
    Par pafi76 dans le forum Access
    Réponses: 2
    Dernier message: 26/06/2006, 14h44
  5. Zone de liste modifiable + Valeur par défaut
    Par Frac dans le forum Access
    Réponses: 7
    Dernier message: 27/10/2005, 08h21

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