Samou85
Messages postés46Date d'inscriptionmardi 2 juin 2009StatutMembreDernière intervention 7 octobre 2009
-
14 sept. 2009 à 12:27
Samou85
Messages postés46Date d'inscriptionmardi 2 juin 2009StatutMembreDernière intervention 7 octobre 2009
-
14 sept. 2009 à 14:35
Bonjour à tous,
Voilà j'ai crée une application où je crée une liste chainée, et chaque fois je modifie la taille de cette liste chainée, l'application marche trés bien mais dès que j'essaye de créer une liste chainée de plus de 300 éléments, l'application bloque.
Donc je voudrais savoir s'il y a une limitation de la taille des listes chainées, (sachant que je programme en DELPHI 5)
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 14 sept. 2009 à 13:22
Théoriquement, une liste chaînée n'est limitée que par la mémoire de l'ordinateur (puisque les éléments de la liste peuvent être placés potentiellement partout dans la mémoire). As-tu réessayé plusieurs fois pour voir si ça plante toujours ? Parfois, il se peut que quelque chose ait interféré avec ta liste (en écrasant un pointeur par exemple, et donc la liste "déraille").
Samou85
Messages postés46Date d'inscriptionmardi 2 juin 2009StatutMembreDernière intervention 7 octobre 2009 14 sept. 2009 à 13:29
Merci bactérius de ta réponse;
en fait ce que je voulais faire au départ c'est créer une liste chainée de 2000 éléments biensur, il a bloqué, donc j'ai commencé à agrandir ma liste petit à petit, et bon pour etre plus exatce jusqu'à une liste chainée de 295 éléments ça compilé parfaitement et meme rapidement, au delà de ça, ben ça bloquait!
Samou85
Messages postés46Date d'inscriptionmardi 2 juin 2009StatutMembreDernière intervention 7 octobre 2009 14 sept. 2009 à 13:45
En fait ça n'affiche pas de message d'erreur, j'ai l'impression que comme la taille est trop grande ça lui prends du temps, mais j'ai beau attendre rien ne se passe alors j'arrete l'exécution; voilà!
Vous n’avez pas trouvé la réponse que vous recherchez ?
Samou85
Messages postés46Date d'inscriptionmardi 2 juin 2009StatutMembreDernière intervention 7 octobre 2009 14 sept. 2009 à 14:01
ok je vais envoyer le code mais, c'est bien complexe et et ça nécessitera beaucoup d'explications! Comment j'envois le code je le copie colle simplement ici?
//Cette première procedure permet de récupére un fichier texte qui sera afficher dans un composante ListBox, et ce que contient ce fichier text ce sont enfait des URLs:
procedure TForm1.btnloadfileClick(Sender: TObject);
begin
if (OpenDialog.Execute) then
ListBox.Items.LoadFromFile(OpenDialog.FileName);
end;
//Cette deuxieme procedure permet de classer ces URLs c'est à dire de leurs attribuer un numéro à chacun, biensur en évitant de réattribuer un autre chiffre si on rerencontre un URL déja vu:
procedure TForm1.btnparseClick(Sender: TObject);
var
i,
k,
l,
R,
Position,
Position2,
Position3,
Limite: Integer;
TURL : String;
NumURL:integer;
begin
Setlength(TabURL,100000);
NumURL:=0; // c le numéro de l'url de base
k:=1;
//traitement des URLs de base
for I:=0 to ListBox.Items.Count-1 do
begin
Position:=Pos('URL de base',ListBox.Items[i]); //récupération des url de bases
if(Position<>0) then
begin
Inc(NumURL);
//on récupére ici l'url de base
// c'est ici que tu fais l'insertion dans la liste chainée
TURL:=Copy(ListBox.Items[i],Position+17,Length(ListBox.Items[i]));
TabURL[k].Num:=(NumURL);
TabURL[k].URL:=TURL;
{ShowMessage('N°'+InttoStr(TabURL[k].Num)+TabURL[k].URL);}
k:=k+1;
end;
end;
//Traitement des sous-URLs
Limite:=k;
For l:=0 to ListBox.Items.Count-1 do
Begin
Position3:=Pos('URL de Base',ListBox.Items[l]);
Position2:=Pos(' h',ListBox.Items[l]);
If((Position3=0) and (Position2<>0))
then
Begin
TURL:=Copy(ListBox.Items[l],Position2,length(ListBox.Items[l]));
R:=Retrouve(TURL,TabURL);
If R=0 then
Begin
Inc(NumURL);
TabURL[k].Num:=NumURL;
TabURL[k].URL:=TURL;
{ShowMessage('N°'+InttoStr(TabURL[k].Num)+TabURL[k].URL);}
Limite:=Limite+1;
k:=k+1;
end;
end;
end;
Setlength(TabURL,Limite);
ShowMessage(IntToStr(Length(TabURL)));
end;
//C'est le fameux boutton qui me pose problème, c'est le boutton qui permet de créer la liste chainée en exploitant: la listBox et les numéros affectés aux URLs, mais il faut savoir que ce n'est pas une liste chainée toute simple, un élément de la liste chainée est un enregistrement qui contient: un integer, un pointeur de type PListe2 et un troisième pointeur de type PListe tu peux voir ça dans la déclaration de type:
procedure TForm1.btnListeClick(Sender: TObject);
Var
TabBase,Repertoire:Array of Integer;
TURL :String;
Position4,Position5,Position6,Position7,Position8,Position9,j,atteint,s,R,tr,i,h:Integer;
Pointeur,Tempo1,Tempo2:PListe;
Pointeur2,Tempo3,Tempo4:PListe2;
Trouv:Boolean;
Begin
New(ListeAdj);
ListeAdj:=Nil;
New(Tempo1);
Tempo1^.Elem:=TabURL[1].Num;
Tempo2:=ListeAdj;
ListeAdj:=Tempo1;
Tempo1^.suiv2:=Tempo2;
{ShowMessage(IntToStr(ListeAdj^.Elem));}
Setlength(TabBase,600);
TabBase[1]:=ListeAdj^.Elem;
New(ListeAdj^.Suiv1);
ListeAdj^.Suiv1:=NIL;
j:=1;
h:=1;
Setlength(Repertoire,600);
Repertoire[1]:=ListeAdj^.Elem;
Position4:=Pos('URL de base',ListBox.Items[j]);
While((j<=ListBox.Items.Count-1) and (Position4=0)) do
Begin
Position5:=Pos(' h',ListBox.Items[j]);
TURL:=Copy(ListBox.Items[j],Position5,Length(ListBox.Items[j]));
R:=Retrouve(TURL,TabURL);
Trouv:=False;
tr:=1;
While ((tr<=h) and (Trouv=false)) do
Begin
If Repertoire[tr]=TabURL[R].Num then trouv:=true
else tr:=tr+1;
end;
If (Trouv=False) then
Begin
h:=h+1;
Repertoire[h]:=TabURL[R].Num;
end;
If ((R<>0) and(Trouv=False))then
Begin
New(Tempo3);
Tempo3^.Elem2:=TabURL[R].Num;
Tempo4:=ListeAdj^.Suiv1;
ListeAdj^.Suiv1:=Tempo3;
Tempo3^.Suiv:=Tempo4;
{ShowMessage(IntToStr(ListeAdj^.Suiv1^.Elem2));}
end;
j:=j+1;
Position4:=Pos('URL de base',ListBox.Items[j]);
end;
{ShowMessage(IntToStr(Longueur(ListeAdj)));}
atteint:=j;
i:=2;
Begin
While(atteint<=ListBox.Items.Count-1) do
Begin
Position6:=Pos('URL de base',ListBox.Items[atteint]);
If ((Position6)<>0) then
Begin
New(Tempo1);
TURL:=Copy(ListBox.Items[atteint],(Position6)+17,Length(ListBox.Items[atteint]));
R:=Retrouve(TURL,TabURL);
Tempo1^.Elem:=TabURL[R].Num;
Tempo2:=ListeAdj^.Suiv2;
ListeAdj^.Suiv2:=Tempo1;
Tempo1^.suiv2:=Tempo2;
TabBase[i]:=ListeAdj^.Suiv2^.Elem;
i:=i+1;
{ShowMessage(IntToStr(ListeAdj^.Suiv2^.Elem));}
s:=Atteint+1;
Position7:=Pos(' h',ListBox.Items[s]);
Position6:=Pos('URL de base',ListBox.Items[s]);
ListeAdj^.Suiv2^.Suiv1:=Nil;
If (((Position6)=0)and((Position7)<>0)) then
Begin
Setlength(Repertoire,100);
Repertoire[1]:=ListeAdj^.Suiv2^.Elem;
h:=1;
While (Position7<>0) and (Position6=0)do
Begin
TURL:=Copy(ListBox.Items[s],Position7,Length(ListBox.Items[s]));
R:=Retrouve(TURL,TabURL);
Trouv:=False;
tr:=1;
While ((tr<=h) and (Trouv=false)) do
Begin
If Repertoire[tr]=TabURL[R].Num then trouv:=true
else tr:=tr+1;
end;
If (Trouv=False) then
Begin
h:=h+1;
Repertoire[h]:=TabURL[R].Num;
end;
If ((R<>0) and(Trouv=False))then
Begin
New(Tempo3);
Tempo3^.Elem2:=TabURL[R].Num;
Tempo4:=ListeAdj^.Suiv2^.Suiv1;
ListeAdj^.Suiv2^.Suiv1:=Tempo3;
Tempo3^.Suiv:=Tempo4;
{ShowMessage(IntToStr(ListeAdj^.Suiv1^.Elem2));}
end;
s:=s+1;
Position6:=Pos('URL de base',ListBox.Items[s]);
Position7:=Pos(' h',ListBox.Items[s]);
end;
end;
If (((Position6)=0)and((Position7)=0)) then s:=s+1;
end;
{ShowMessage(IntToStr(Longueur(ListeAdj)));}
Atteint:=s;
end;
//Ajout horizontale des sommets sans successeurs
j:=1;
While(j<=ListBox.Items.Count-1) do
Begin
Position8:=Pos('URL de base',ListBox.Items[j]);
Position9:=Pos(' h',ListBox.Items[j]);
If ((Position8=0) and (Position9<>0)) then
Begin
TURL:=Copy(ListBox.Items[j],Position9,Length(ListBox.Items[j]));
R:=Retrouve(TURL,TabURL);
Trouv:=false;
tr:=1;
While ((tr<=i) and (Trouv=false)) do
Begin
If TabBase[tr]=TabURL[R].Num then trouv:=true
else tr:=tr+1;
end;
If (Trouv=False) then
Begin
New(Tempo1);
New(Tempo1^.Suiv1);
Tempo1^.Elem:=TabURL[R].Num;
Tempo1^.Suiv1:=Nil;
Tempo2:=ListeAdj^.Suiv2;
ListeAdj^.Suiv2:=Tempo1;
Tempo1^.suiv2:=Tempo2;
TabBase[i]:=TabURL[R].Num;
i:=i+1;
end;
end;
j:=j+1;
end;
//Juste pour afficher la liste
Pointeur:=ListeAdj;
While(Pointeur<>Nil) do
Begin
Memo1.Lines.Add(IntToStr(Pointeur^.Elem));
{ShowMessage(IntToStr(Pointeur^.Elem));}
Pointeur2:=Pointeur^.Suiv1;
While (Pointeur2<>Nil) do
Begin
Memo1.Lines.Add(IntToStr((Pointeur2^.Elem2)));
{ShowMessage(IntToStr(Pointeur2^.Elem2));}
Pointeur2:=Pointeur2^.Suiv;
end;
Pointeur:=Pointeur^.Suiv2;
end;
Pointeur:=ListeAdj;
m:=0;
While(Pointeur<>Nil) do
Begin
m:=m+Longueur(Pointeur);
Pointeur:=Pointeur^.Suiv2;
end;
n:=Longueur1(ListeAdj);
end;
end;
Voilà, c'est bien compliqué comme je le disais, si biensur tu as une question je suis là, Merci encore