Samou85
Messages postés46Date d'inscriptionmardi 2 juin 2009StatutMembreDernière intervention 7 octobre 2009
-
6 juin 2009 à 10:52
Samou85
Messages postés46Date d'inscriptionmardi 2 juin 2009StatutMembreDernière intervention 7 octobre 2009
-
13 juin 2009 à 01:20
Bonjour à tous!
voilà je voudrais poser une question sur les pointeurs!
J'ai une tableau où chaque case contient un pointeur vers un autre tableau, et je voudrais supprimer des cases du tableau pricipal et comment c'est un tableau de pointeurs je ne sais pas exactement comment je dois m'y prendre!
Merci de me répondre!
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 6 juin 2009 à 11:11
Salut,
Manque de précision tout ça. Un peu de code pour nous aiguiller peut être ?
Ton tableau principal est un tableau dynamique ? Doit il être trié ? Doit tu conserver les autres éléments à leur place (Element situé en i+1 doit toujours être en i + 1 après la suppression de l'élément i) ?
La principale question que tu dois te poser -> faut il libérer le tableau pointer avant de supprimer la case ?
Une bonne technique de suppression dans un tableau est de recopier le dernier élément dans la case à supprimer et de signaler d'une manière ou d'une autre que le tableau a un élément de moins. Mais ce n'est pas toujours possible en fonction des contraintes que tu appliques à ton tableau (cf ci-dessus).
Samou85
Messages postés46Date d'inscriptionmardi 2 juin 2009StatutMembreDernière intervention 7 octobre 2009 6 juin 2009 à 12:24
Il est vrai que tu as raison "rt15" tout ça manque un peu de précision et de source je vais essayer d'etre plus clair:
type
TTabTest= Array[1..10000] of integer;
PTabTest= ^TTabTest;
TPTabTest= Array[1..10000] of PTabTest;
Begin
TabAdj:TPTabTest;
end;
en fait ce que je veux c'est supprimer certaine case de TabAdj et si une case est supprimé je veux que celle qui vient juste aprés elle prenne sa place, mais si je fais par exemple:
TabAdj[i]:=TabAdj[i+1]; (je crois que ça ne fera que faire pointer deux pointeurs vers le meme tableau).
voilà j'espère que c'est plus clair........merci de m'aider!
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 6 juin 2009 à 12:40
pourquoi ne pas utiliser une TList ?
type
TTabTest= TList;
TPTabTest= TList {of TTabTest};
var
l : TTabTest;
l2: TPTabTest;
x: integer;
begin
l2 := TPTabTest.Create;
l := TTabTest.Create;
l.Add(Pointer(5));
l.Add(Pointer(222));
...
l2.Add(l);
...
x := Integer(TTabTest(l2[i])[j]);
Vous n’avez pas trouvé la réponse que vous recherchez ?
function IntArrayIndexOfASC(const Value: integer; const Ptr: pIntArray): integer;
var N : integer;
begin
result := -1;
for N := 0 to IntArrayCount-1 do
if Ptr^[N] = Value then
begin
result := N;
break;
end;
end;
function IntArrayIndexOfDESC(const Value: integer; const Ptr: pIntArray): integer;
var N : integer;
begin
result := -1;
for N := IntArrayCount-1 downto 0 do
if Ptr^[N] = Value then
begin
result := N;
break;
end;
end;
procedure IntArrayIndexOf(const Value: integer; const Ptr: pIntArray; var Index: integer);
var N : integer;
begin
for N := Index to IntArrayCount-1 do
if Ptr^[N] = Value then
begin
Index := N;
break;
end;
end;
procedure IntArrayToStrings(Strings:TStrings; const Ptr : pIntArray);
var N : integer;
begin
Strings.BeginUpdate;
try
Strings.Clear;
for N := 0 to IntArrayCount-1 do
Strings.Add(IntToStr(ptr^[N]));
finally
Strings.EndUpdate;
end;
end;
Samou85
Messages postés46Date d'inscriptionmardi 2 juin 2009StatutMembreDernière intervention 7 octobre 2009 6 juin 2009 à 22:42
OK "rt15" si je fais comme tu le dis; rt15 dit: "Dans ce cas faut décaler toutes les cases suivantes, pas juste celle d'après", donc à la fin du Array j'aurais la (n)éme case qui sera à la (n-1)éme case; donc
je devrais quand meme supprimer cette (n)éme case comment le faire?
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 7 juin 2009 à 09:49
Bin après on peut se demander ce que tu appelles "supprimer" !
Array[1..10000] -> Donc ton tableau n'est pas redimensionable. Tu ne peux pas lui supprimer physiquement des cases (A l'inverse d'un tableau dynamique).
Donc il faut que tu te donnes un moyen ou un autre de connaître la dernière case occupée.
Tu as globalement deux méthodes :
1) Stocker dans un entier quelque part l'index de la dernière case occupée. Cela peut être dans une variable séparée, ou dans une case de ton tableau. Dans ton cas, un tableau de pointeur indicé de 1 à 10000, tu peux ajouter une case 0. Cette case 0, bien que Delphi considérera qu'elle contient un pointeur, tu peux mettre un Integer dedans. Suffit de caster. Mais bon c'est le genre d'astuce qui peut dérouter un(e) débutant(e). C'est la technique utilisée pour les chaîne de Delphi. 2) Mettre une valeur particulière dans la dernière case occupée. C'est la technique utilisée pour ce qu'on appelle les chaîne à zéro terminal. Elles sont très utilisées dans Windows. Cette fois, pour connaître la taille, il faut parcourir tout le tableau jusqu'à tomber sur le caractère spécial #0.
Je te propose un petit exemple basé sur la technique 1), avec un compteur dans une variable séparée (Pas dans le tableau). Et plutôt que de passer par des Integer, je vais prendre des PChar. Une liste pour afficher le contenu du tableau, un bouton pour supprimer l'élément sélectionné, un bouton pour ajouter en fin de tableau le texte d'un Edit.
unit Unit1;
procedure TForm1.FormDestroy(Sender: TObject);
var
nI: Integer;
begin
for nI:= 1 to nTabCount do
FreeMem(lpTab[nI]);
end;
procedure TForm1.btnDeleteClick(Sender: TObject);
var
nItemToDelete: Integer; // Indice de la case à supprimer
nI: Integer;
begin
// Vérif qu'il y a un élément sélectionné
if lstArrayContent.ItemIndex <> -1 then
begin
// Les items sont indicés à partir de 0
nItemToDelete:= lstArrayContent.ItemIndex + 1;
// Libération du tableau pointé
FreeMem(lpTab[nItemToDelete]);
// Décalage des pointeurs suivants
for nI:= nItemToDelete to nTabCount - 1 do
lpTab[nI]:= lpTab[nI + 1];
// On signale que l'on a une case de moins dans le tableau
Dec(nTabCount);