Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
950 connectés 

  FORUM HardWare.fr
  Programmation
  Ada

  Construire une liste à l'arache

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Construire une liste à l'arache

n°1862961
Profil sup​primé
Posté le 18-03-2009 à 11:26:26  answer
 

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 :
  1. type T_Node;
  2.      type Node_Access is access T_Node;
  3.      type T_Node is
  4.         record
  5.            Word : Unbounded_String;
  6.            Next : Node_Access := null;
  7.            Prev : Node_Access := null;
  8.            Up   : Node_Access := null;
  9.            Down : Node_Access := null;
  10.         end record;


 
que j'encapsule dans un type article

Code :
  1. type T_Knowledge is
  2.         record
  3.            Matrix : Node_Access;
  4.         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 :
  1. procedure Add(Expr      : in String;
  2.                        Knowledge : in out T_knowledge) is
  3.  
  4.         New_List : Node_access := String_To_List(Expr);
  5.         Next : Node_Access;
  6.      begin
  7.  
  8.         if Knowledge.Matrix = null then
  9.            knowledge.Matrix := New_List;
  10.         else
  11.            while New_List /= null loop
  12.               Next := Knowledge.Matrix;
  13.               while Next.next /= null and then
  14.                 Next.Word /= New_List.Word loop
  15.                  Next := Next.Next;
  16.               end loop;
  17.               if Next.Word /= New_List.Word then
  18.                  while Next.Next /= null loop
  19.                     Next := Next.Next;
  20.                  end loop;
  21.                  Next.Next := New_List;
  22.               else
  23.                  while Next.up /= null loop
  24.                     Next := Next.up;
  25.                  end loop;
  26.                  Next.up := New_List;
  27.                  Next.up.down := Next;
  28.               end if;
  29.               New_List := New_List.Next;
  30.            end loop;
  31.         end if;
  32.      end Add;


 
Voici la procedure string_To_List.
 

Code :
  1. function String_To_List(Expr : in String) return Node_access is
  2.  
  3.  
  4.         New_List : Node_Access;
  5.         New_Node : Node_access;
  6.         Top  : Positive := 1;
  7.         Bot  : Natural := 0;
  8.         Char : Character;
  9.      begin
  10.  
  11.         for Position in Expr'Range loop
  12.            Char := Expr(position);
  13.            if Is_Letter(char) or
  14.              Is_digit(char) then
  15.               Bot := Bot + 1;
  16.            elsif Is_Special(Char) then
  17.               case char is
  18.                  when ' ' =>
  19.                     if Bot >= Top then
  20.                        New_Node := new T_Node;
  21.                        New_Node.Word := To_Unbounded_String(Expr(Top..Bot));
  22.                        Link(New_List, New_Node);
  23.                        Top := Position+1;
  24.                        Bot := Position;
  25.                     else
  26.                        Top := Top + 1;
  27.                        Bot := Bot + 1;
  28.                     end if;
  29.                  when '.' =>
  30.                     if Position < Expr'Length then
  31.                        if Is_Digit(Expr(Position + 1)) then
  32.                           Bot := Bot + 1;
  33.                        else
  34.                           New_Node := new T_Node;
  35.                           New_Node.Word := To_Unbounded_String(Expr(Top..Bot));
  36.                           Link(New_List, New_Node);
  37.                           New_Node := new T_Node;
  38.                           New_Node.Word := To_Unbounded_String(Expr(position..position));
  39.                           Link(New_List, New_Node);
  40.                           Top := Position+1;
  41.                           Bot := Position;
  42.                        end if;
  43.                     else
  44.                        New_Node := new T_Node;
  45.                        New_Node.Word := To_Unbounded_String(Expr(Top..Bot));
  46.                        Link(New_List, New_Node);
  47.                        New_Node := new T_Node;
  48.                        New_Node.Word := To_Unbounded_String(Expr(position..position));
  49.                        Link(New_List, New_Node);
  50.                     end if;
  51.                  when others =>
  52.                     New_Node := new T_Node;
  53.                     New_Node.Word := To_Unbounded_String(Expr(Top..Bot));
  54.                     Link(New_List, New_Node);
  55.                     New_Node := new T_Node;
  56.                     New_Node.Word := To_Unbounded_String(Expr(position..position));
  57.                     Link(New_List, New_Node);
  58.                     Top := Position+1;
  59.                     Bot := Position;
  60.               end case;
  61.            else
  62.               Put(Character'Val(7));
  63.            end if;
  64.         end loop;
  65.         return New_List;
  66.      end String_To_List;


 
Et la procedure Link
 

Code :
  1. procedure Link(List : in out Node_Access;
  2.                     pointer : in Node_access) is
  3.         Next : Node_Access := List;
  4.      begin
  5.         if list = null then
  6.            list := Pointer;
  7.         else
  8.            while Next.Next /= null loop
  9.               Next := Next.Next;
  10.            end loop;
  11.            Next.Next := Pointer;
  12.            Pointer.prev := Next;
  13.         end if;
  14.  
  15.      end Link;


Message édité par Profil supprimé le 18-03-2009 à 11:31:13
mood
Publicité
Posté le 18-03-2009 à 11:26:26  profilanswer
 

n°1862990
Profil sup​primé
Posté le 18-03-2009 à 11:44:55  answer
 

Je récapitule mon problème...
A la ligne 11 de la procedure Add ... New_List n'est jamais null.
Merci.

n°1863001
Profil sup​primé
Posté le 18-03-2009 à 12:00:20  answer
 

Bon désolé pou le dérangement.
 
Aux ligne 21 et 26 il faut créer un nouveau noeud an affectant := new T_Node ' (New_List); si non, on ajoute sans cesse la fin de la liste à la fin de la même liste. Si j'ai bien suivi.
 
Pour quoi, je trouve toujours après avoir posté alors que ça fait deux jour que je planche ?  [:rhetorie du chaos]


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Ada

  Construire une liste à l'arache

 

Sujets relatifs
[C#] Smtp et liste de diffusion Serveur ExchangeChanger un textarea a partir d une liste deroulante
[js] Liste et Input[RESOLU]Trier liste de fichiers
probleme liste deroulante Php / HTMLliste deroulantes imbriquées
js et modification d'une liste[JAVA] Recuperer la selection d'une liste [RESOLU]
Comment changer un pourcentage dans une même cellule?Liste d'images déroulantes
Plus de sujets relatifs à : Construire une liste à l'arache


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR