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