cs_l07
Messages postés3Date d'inscriptiondimanche 9 mars 2003StatutMembreDernière intervention 6 novembre 2004
-
6 nov. 2004 à 13:13
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 2008
-
9 nov. 2004 à 21:32
Bonjour tout le monde...
Plutôt que de me lancer dans une trop longue explication, je vais mettre tout le code de l'unité qui me pose problème.
Rq : c'est pour créer un logiciel de simulation de schémas logiques.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormActivate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
pcomposant = ^composant;
composant = record
entree1,entree2,suivant : pcomposant;
resultat,fini : boolean;
nom,oper : string;
end;
var
Form1: TForm1;
listecomposants : pcomposant;
procedure addporte (nom,oper : string);
function compexiste(nom:string):boolean;
implementation
{$R *.dfm}
procedure TForm1.FormActivate(Sender: TObject);
begin
new(listecomposants);
end;
procedure addporte (nom,oper : string);
var porte : pcomposant;
begin
if not compexiste(nom) then
begin
new(porte);
porte^.nom := nom;
porte^.fini := false;
porte^.suivant := listecomposants;
listecomposants := porte;
end
else
showmessage('Ce nom est déjà utilisé');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
addporte('porte1','AND');
end;
function compexiste(nom:string):boolean;
var compo : pcomposant;
begin
compo := listecomposants;
while compo <> NIL do
begin
if compo^.nom = nom then
result := true;
compo := compo^.suivant;
end;
result := false;
end;
end.
En fait mon problème est localisé dans la fonction compexiste.
Au moment du test 'compo^.nom = nom' . Quand j'exécute au pas-à-pas, même quand la condition est true, le programme ne rentre pas dans le if, et ne renvoie donc pas true...
Est-ce que c'est un bug de Delphi (6) avec les pointeurs ou plutôt une erreur de prog. (je penche pour la 2ème solution même si je la vois pas).
cs_neko
Messages postés135Date d'inscriptionjeudi 14 août 2003StatutMembreDernière intervention12 octobre 20061 6 nov. 2004 à 13:34
pour le fait que dans le pas a pas ca rentre pas dans le if, je sais pas mais dans tous les cas ta fonction renverra False c'est clair.
Delphi ce n'est pas comme en C ou d'autre langages, l'affectation d'une valeur dans Result ne fait pas automatiquement sortir de la fonction, dans ton cas:
admetton que Compo^.nom = nom, donc result recoi True, mais la boucle continue, et quand on sortira du while, ben result va recevoir False dans tous les cas, conclusion essais ça:
function compexiste(nom:string):boolean;
var compo : pcomposant;
begin
compo := listecomposants;
while compo <> NIL do
begin
if compo^.nom = nom then Begin
result := true;
Exit;
End;
compo := compo^.suivant;
end;
result := false;
end;
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 9 nov. 2004 à 21:32
Euh, PComposant c'est un pointeur vers un composant :
type
pcomposant = ^composant;
Mais c'est quoi comme record ou classe ton composant car cela vient peut-être de là le probleme...
Tu pourrai me montrer le declaration de ce truc stp.
Sinon, comment peut- tu vérifier quand ton IF renvoie true puisque tu ne vois pas les valeur de "compo^.nom" ni de "nom"
ou cela peut être la casse (Manger est différent de manger)
Si cela se trouve, ces deux variables ne sont jamais égales, verifie comme suit :
function compexiste(nom:string):boolean;
var compo : pcomposant;
begin
compo := listecomposants;
while compo <> NIL do
begin
Showmessage(compo^.nom + sLineBreak + nom);
if compo^.nom = nom then
result := true;
compo := compo^.suivant;
end;
result := false;
end;
et execute en mode normal.
Tu verras bien si les deux lignes sont égales.
@++ Florent
Si tu ne te plantes pas ......
tu ne poussera jamais