Précédent   Forum du club des développeurs et IT Pro > Autres langages > Pascal
Pascal Forum d'entraide sur la programmation en langage Pascal et sur les EDI. Avant de poster -> la F.A.Q Pascal, les cours
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 09/09/2012, 15h56   #1
Monsieur Griboux
Invité de passage
 
Homme
Inscription : octobre 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Suisse

Informations forums :
Inscription : octobre 2011
Messages : 10
Points : 1
Points : 1
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 ?
Monsieur Griboux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2012, 17h41   #2
M.Dlb
Rédacteur/Modérateur
 
Avatar de M.Dlb
 
Inscription : avril 2002
Messages : 2 273
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : avril 2002
Messages : 2 273
Points : 3 377
Points : 3 377
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
M.Dlb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2012, 18h53   #3
Monsieur Griboux
Invité de passage
 
Homme
Inscription : octobre 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Suisse

Informations forums :
Inscription : octobre 2011
Messages : 10
Points : 1
Points : 1
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 ?
Monsieur Griboux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2012, 22h29   #4
M.Dlb
Rédacteur/Modérateur
 
Avatar de M.Dlb
 
Inscription : avril 2002
Messages : 2 273
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : avril 2002
Messages : 2 273
Points : 3 377
Points : 3 377
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
M.Dlb est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 09h29.


 
 
 
 
Partenaires

Hébergement Web