Pb dans condition if avec un pointeur

cs_l07 Messages postés 3 Date d'inscription dimanche 9 mars 2003 Statut Membre Dernière intervention 6 novembre 2004 - 6 nov. 2004 à 13:13
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 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).

Merci d'avance...

4 réponses

cs_l07 Messages postés 3 Date d'inscription dimanche 9 mars 2003 Statut Membre Dernière intervention 6 novembre 2004
6 nov. 2004 à 13:15
dsl, l'indentation a disparu....
je reposte le code d'ici pas longtemps.
0
cs_l07 Messages postés 3 Date d'inscription dimanche 9 mars 2003 Statut Membre Dernière intervention 6 novembre 2004
6 nov. 2004 à 13:17
J'arrive pas à faire de tab, donc c foutu...
Désolé
0
cs_neko Messages postés 135 Date d'inscription jeudi 14 août 2003 Statut Membre Dernière intervention 12 octobre 2006 1
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;


bouh
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
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
0
Rejoignez-nous