Bonjour,
Dans le cadre de l'étude des propriété d'un texte, j'écris vite fait un petit programme qui utilise la structure suivante.
Code :
type T_Node; type Node_Access is access T_Node; type T_Node is record Word : Unbounded_String; Next : Node_Access := null; Prev : Node_Access := null; Up : Node_Access := null; Down : Node_Access := null; end record;
|
que j'encapsule dans un type article
Code :
type T_Knowledge is record Matrix : Node_Access; end record;
|
Je veux réaliser une sorte de maillage avec les mots. Chaque nouveau mot est ajouter à la liste Matrix alors que les mots déjà dans la liste son ajouté dans la dimention transversale.
A vrai ldire, je sais pas vraiment ou j'en suis.
Mon problème est qu'a l'ajout de la seconde phrase avec Add le programme ne trouve pas de null en New_List.Next pour finir l'ajout.
la trace du programme....
J'ai deux phrase terminant par un point. A l'ajout de la première pas de problème.
A l'ajout de la seconde, le programme boucle entre le dernier mot et le point final.
J'ai remarquer qu'a l'ajout de la seconde phrase la procedure String_To_List bouclait égélement faute de trouver un null en next (fin de list) ; Pourtant cette même phrase est correctement transformé au début de la procedure Add ... Me semble t-il
Si vous avez du temps pour me dire en gros, ce que je dois faire pour m'y retrouver un peu. Merci.
J'ajoute les expression (les phrases) dans Matrix par l'intermédiare de la procedure String_To_List, avec la procedure Add suivante
Code :
procedure Add(Expr : in String; Knowledge : in out T_knowledge) is New_List : Node_access := String_To_List(Expr); Next : Node_Access; begin if Knowledge.Matrix = null then knowledge.Matrix := New_List; else while New_List /= null loop Next := Knowledge.Matrix; while Next.next /= null and then Next.Word /= New_List.Word loop Next := Next.Next; end loop; if Next.Word /= New_List.Word then while Next.Next /= null loop Next := Next.Next; end loop; Next.Next := New_List; else while Next.up /= null loop Next := Next.up; end loop; Next.up := New_List; Next.up.down := Next; end if; New_List := New_List.Next; end loop; end if; end Add;
|
Voici la procedure string_To_List.
Code :
function String_To_List(Expr : in String) return Node_access is New_List : Node_Access; New_Node : Node_access; Top : Positive := 1; Bot : Natural := 0; Char : Character; begin for Position in Expr'Range loop Char := Expr(position); if Is_Letter(char) or Is_digit(char) then Bot := Bot + 1; elsif Is_Special(Char) then case char is when ' ' => if Bot >= Top then New_Node := new T_Node; New_Node.Word := To_Unbounded_String(Expr(Top..Bot)); Link(New_List, New_Node); Top := Position+1; Bot := Position; else Top := Top + 1; Bot := Bot + 1; end if; when '.' => if Position < Expr'Length then if Is_Digit(Expr(Position + 1)) then Bot := Bot + 1; else New_Node := new T_Node; New_Node.Word := To_Unbounded_String(Expr(Top..Bot)); Link(New_List, New_Node); New_Node := new T_Node; New_Node.Word := To_Unbounded_String(Expr(position..position)); Link(New_List, New_Node); Top := Position+1; Bot := Position; end if; else New_Node := new T_Node; New_Node.Word := To_Unbounded_String(Expr(Top..Bot)); Link(New_List, New_Node); New_Node := new T_Node; New_Node.Word := To_Unbounded_String(Expr(position..position)); Link(New_List, New_Node); end if; when others => New_Node := new T_Node; New_Node.Word := To_Unbounded_String(Expr(Top..Bot)); Link(New_List, New_Node); New_Node := new T_Node; New_Node.Word := To_Unbounded_String(Expr(position..position)); Link(New_List, New_Node); Top := Position+1; Bot := Position; end case; else Put(Character'Val(7)); end if; end loop; return New_List; end String_To_List;
|
Et la procedure Link
Code :
procedure Link(List : in out Node_Access; pointer : in Node_access) is Next : Node_Access := List; begin if list = null then list := Pointer; else while Next.Next /= null loop Next := Next.Next; end loop; Next.Next := Pointer; Pointer.prev := Next; end if; end Link;
|
Message édité par Profil supprimé le 18-03-2009 à 11:31:13