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

Pascal Discussion :

Problème de listes


Sujet :

Pascal

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2011
    Messages : 20
    Points : 11
    Points
    11
    Par défaut Problème de listes
    J'écris un programme qui nécessite d'utiliser des listes pour stocker des informations mais j'ai rencontré des problèmes (d'habitude j'utilise plutôt des enregistrements RECORD mais ils ne supportent pas la récursivité structurelle), alors j'ai isolé la manipulation de listes dans ce petit programme d'exemple :

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    PROGRAM remplisseurDeListe;
    	TYPE liste = ^cellule;
    	cellule = RECORD
    		tete:integer;
    		queue:liste
    	END;
     
    	VAR l1:liste;
     
    	FUNCTION remplirListe:liste;
    		VAR i:integer;
    	BEGIN
    		writeln('allo');
    		readln;
    		remplirListe:=NIL;
    		remplirListe^.queue:=remplirListe;
    		writeln('nombre ?');
    		readln(i);
    		remplirListe^.tete:=i;
    		remplirListe^.queue:=remplirListe;
    		writeln('nombre ?');
    		readln(i);
    		remplirListe^.tete:=i;
    		remplirListe^.queue:=remplirListe;
    		writeln('nombre ?');
    		readln(i);
    		remplirListe^.tete:=i
    	END;
     
    	PROCEDURE ecrireListe(VAR l:liste);
    	BEGIN
    		WHILE l<>NIL DO BEGIN
    			writeln(l^.tete);
    			l^.tete:=l^.queue^.tete;
    			l^.queue:=l^.queue^.queue
    		END
    	END;
     
     
    BEGIN
    	l1:=remplirListe;
    	ecrireListe(l1);
    	readln
    END.
    C'est vraiment un programme très simple qui demande trois chiffres pour en faire une liste l1, puis écrit la liste.
    Seulement chez moi le programme affiche "allo" et plante. Je crois que j'ai fait une erreur dans la structure de ma liste mais je ne vois pas où.

    Est-ce que vous voyez d'où ça pourrait venir ?

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 463
    Points : 4 305
    Points
    4 305
    Par défaut
    Oui, la zone mémoire pointée par le pointeur l1 n'est pas allouée, donc le programme plante forcément !

    Il faut absolument allouer les zones mémoires et les libérer proprement, avec les fonctions New et Dispose.

    Je te conseille de lire un tutoriel sur les pointeurs, et tu peux également consulter les exercices Pascal:
    http://pascal.developpez.com/cours/ptrau/?page=page_16
    http://pascal.developpez.com/exercices/?page=Sect9
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2011
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Ah merci !
    Voilà mon nouveau programme, il fonctionne.

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    PROGRAM remplisseurDeListe;
    	TYPE liste = ^cellule;
    	cellule = RECORD
    		tete:integer;
    		queue:liste
    	END;
     
    	VAR l1:liste;
     
     
    	PROCEDURE ajouter(var l: liste; valeur: integer);
    		var	p: liste;
    	begin
    		new(p);
    		p^.tete := valeur;
    		p^.queue := l;
    		l := p;
    	end;
     
    	PROCEDURE afficher(l: liste);
    		VAR p: liste;
    	BEGIN
    		p := l;
    		WHILE p <> NIL DO BEGIN
    			writeln(p^.tete);
    			p := p^.queue;
    		END;
    	END;
     
    	PROCEDURE vider(l: liste);
    		VAR p, r: liste;
    	BEGIN
    		p := l;
    		WHILE (p <> NIL) DO	BEGIN
    			r := p^.queue;
    			dispose(p);
    			p := r;
    		END;
    	END;
     
     
    	FUNCTION remplirListe:liste;
    		VAR i:integer;
    	BEGIN
    		new(remplirListe);
    		remplirListe:=NIL;
     
    		writeln('nombre ?');
    		readln(i);
    		ajouter(remplirListe,i);
    		writeln('nombre ?');
    		readln(i);
    		ajouter(remplirListe,i);
    		writeln('nombre ?');
    		readln(i);
    		ajouter(remplirListe,i);
    	END;
     
     
    BEGIN
    	l1:=remplirListe;
    	afficher(l1);
    	vider(l1);
    	readln
    END.
    J'espère que je "dispose" bien à la fin de l'exécution toute la place que j'avais réservée...

    D'habitude ces "new" et "dispose" sont dans des units alors je ne m'en souciais pas. Je ferai plus attention maintenant.
    C'est un peu ennuyeux de devoir s'occuper de la place qu'on utilise dans l'ordinateur, mais ça fait partie de l'informatique. Certains langages de haut niveau ne se soucient pas des places allouées, non ?

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 463
    Points : 4 305
    Points
    4 305
    Par défaut
    Il y a manifestement quelque chose qui cloche à ce niveau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		new(remplirListe);
    		remplirListe:=NIL;
    Je te laisse deviner quoi. Sinon le reste devrait marcher, mais je n'ai balayé que très rapidement le code.

    Les langages de haut niveaux masquent énormément de choses... Delphi, Java etc... oui c'est pratique à programmer, mais attention aux bourdes ! La manipulation de mémoire est une nécessité et il vaut mieux savoir ce que l'on fait, même avec les langages de haut niveau.
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

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

Discussions similaires

  1. [MySQL] Problème de liste déroulante dynamique
    Par vincedjs dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 03/03/2006, 17h38
  2. Problème de liste déroulante et js...
    Par Empty_body dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 03/03/2006, 11h44
  3. [MySQL] Problème de listes déroulantes liées avec requêtes sql
    Par richton95 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 21/12/2005, 17h04
  4. Problème avec liste déroulante
    Par Invité dans le forum IHM
    Réponses: 2
    Dernier message: 14/12/2005, 22h04
  5. Problème avec listes liées entre elles et bouton "précé
    Par Oluha dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/08/2005, 16h10

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