Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Invité de passage
    Homme Profil pro
    Inscrit en
    octobre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : octobre 2011
    Messages : 17
    Points : 2
    Points
    2

    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 :
    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 340
    Détails du profil
    Informations personnelles :
    Âge : 29

    Informations forums :
    Inscription : avril 2002
    Messages : 2 340
    Points : 3 833
    Points
    3 833

    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
    Invité de passage
    Homme Profil pro
    Inscrit en
    octobre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : octobre 2011
    Messages : 17
    Points : 2
    Points
    2

    Par défaut

    Ah merci !
    Voilà mon nouveau programme, il fonctionne.

    Code :
    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 340
    Détails du profil
    Informations personnelles :
    Âge : 29

    Informations forums :
    Inscription : avril 2002
    Messages : 2 340
    Points : 3 833
    Points
    3 833

    Par défaut

    Il y a manifestement quelque chose qui cloche à ce niveau :

    Code :
    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •