Tableau dynamique

RideIsLife Messages postés 7 Date d'inscription dimanche 25 mars 2007 Statut Membre Dernière intervention 1 juillet 2008 - 1 juil. 2008 à 09:48
RideIsLife Messages postés 7 Date d'inscription dimanche 25 mars 2007 Statut Membre Dernière intervention 1 juillet 2008 - 1 juil. 2008 à 14:32
Bonjour,
J'ai une petite question à poser à propos des tableaux dynamiques, je n'ai rien trouvé qui pouvait m'aider sur le forum.
J'ai développé un serveur UDP qui stocke dans un tableau dynamique les nom, adresse IP et numéro de port de chaque client qui se connecte au serveur. Ce que je veux faire en fait, c'est supprimer de mon tableau dynamique les coordonnées complètes de mon client si celui ci ne me donne pas de signe de vie au bout d'un certain temps. Le seul problème est que je ne sais pas comment supprimer en l'occurence 3 cases de mon tableau dynamique, celles ci pouvant se trouver n'importe où dans le tableau. Je suis débutant en delphi, je pensais pouvoir utiliser la fonction Free, mais celle ci ne fonctionne qu'avec des TObject, ce qui n'est pas le type de mon tableau de string. Il y a t il un moyen simple de libérer la mémoire et donc des cases de mon tableau ? Ou faut il créer une procédure, si oui en utilisant quelle genre de fonction ?
Voilà je ne sais pas si quelqu'un a déjà été confronté au problème.
D'avance merci.

10 réponses

cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
1 juil. 2008 à 10:17
Bonjour,

Pourquoi ne pas créer une p'tit table avec des champs, stocker les données et ensuite faire une p'tit recherche sur la table afin de repérer l'enregistrement à supprimer.
non ?
un tableau de string pour gérer ce truc là je le sens pas bien..

cantador
0
RideIsLife Messages postés 7 Date d'inscription dimanche 25 mars 2007 Statut Membre Dernière intervention 1 juillet 2008
1 juil. 2008 à 10:27
Salut,
Merci pour ta réponse. En fait il était question que j'utilise effectivement une base de données au départ. Mais quand j'ai proposé cette solution à la personne pour laquelle je travaille, cela a été refusé car à priori trop long l'accès en mémoire si le fichier de la base de données est écrit en dur. C'est à ce genre de table que tu faisais référence ? Ou existe t il un autre type de "table", non nécessairement écrite dans un fichier, plus pratique d'utilisation qu'un tableau ?
Merci.
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
1 juil. 2008 à 12:13
car à priori trop long l'accès en mémoire

oui, le temps devient un souci au delà d'un grand nombre de données dans une table..(d'autres facteurs interviennent également) mais dans ton cas, tu supprimes l'enregistrement dans un  temps relativement cours (absence de signe de vie..) qu'on peut estimer à 3 mois environ..


en 3 mois, tu n'auras pas énormément de données..et donc le traitement sera rapide.


et puis il te faut bien assurer aussi la persistance de l'information.
le stockage ?
tu peux stocker dans un fichier texte
(record, txt, ini, csv..etc) + difficile à gérer
Moi je prendrai une table car en général il y a toujours une suite à ce genre d'exercice qui va entraîner d'autres problèmes.

cantador
0
fbalien Messages postés 251 Date d'inscription dimanche 7 décembre 2003 Statut Membre Dernière intervention 11 novembre 2016
1 juil. 2008 à 12:16
Bonjour

faut chercher l'index de ta case à supprimer
décaler tous les autres enregistrement a partir de cette index
index +1 va donc écraser index; index +2 va écraser index +1 etc
puis redimensionnement du tableau à -1

voila pour le principe
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
1 juil. 2008 à 12:17
Salut,
Le plus simple, s'il s'agit d'une liste de chaînes, c'est d'utiliser un TStringList (cf Google si tu ne connais pas) car il possède une méthode Delete(index) qui supprime la index-ième chaîne.

Sinon, si ce n'est pas que des chaînes, le mieux est de passer par une liste chaînée (Google là aussi, le web en regorge)

Sinon encore, tu peux tout simplement déplacer toutes les cases de ton tableau qui suivent celle que tu veux enlever d'un rang en arrière.
Comme ceci :

procedure DeleteFromTab(Index: Integer; var Tab: array of TBidule); // TBidule à remplacer par ton type à toi
begin
  while Index < High(Tab) do
  begin
    Tab[Index] := Tab[Index + 1];
    Inc(Index);
  end;
  SetLength(Tab, Length(Tab) - 1);
end;

mais c'est la méthode la plus lente. (la plus simple aussi)

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.nethttp://te%3C/body
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
1 juil. 2008 à 12:18
Ah, on s'est croisés fablien !

Sinon, pour qu'on t'aide un peu plus précisément, il faudrait voir au moins le code de déclaration du tableau, pour voir sa structure.
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
1 juil. 2008 à 12:30
voici un petit prototype de fonction que j'ai fait pour manipuler les tableaux. Tu as juste a remplacer X par ton type et ca devrait marcher. C'est la meme que celle de florenth, mais légèrement plus efficace je pense.

function ArrayRemove(var AArray: T<X>DynArray; Index: integer): <X>;
var
  L: integer;
begin
  L := Length(AArray);
  if (Index >= L) or (Index < 0) then
    raise EArrayError.CreateFmt(SArrayIndexError, [Index])
  else
  begin
    Result := AArray[Index];
    MoveMemory(@AArray[Index], @AArray[Index+1], (L - Index - 1) * SizeOf(<X>));
    SetLength(AArray, L-1);
  end;
end;
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
1 juil. 2008 à 12:51
En effet, MoveMemory() est un peu plus rapide que déplacer les éléments un par un.
Mais, dans tous les cas, l'utilisation d'un tableau n'est ni recommandable, ni recommandé.

Franchement, une liste chaînée est bien plus rapide. Surtout si tu veux supprimer le troisième élément d'un tableau qui en contient 1000.

Après, une table de bdd peut s'avérer utile si le projet devient "gros" et s'il y a besoin de persistence.
Mais entre un tableau et une table, même si les mots diffèrent de deux lettres, il y a tout un monde !

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.nethttp://te%3C/body
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
1 juil. 2008 à 14:03
J'ai développé un serveur UDP qui stocke dans un tableau dynamique les nom, adresse IP et numéro de port de chaque client qui se connecte au serveur.



et si le serveur est arrêté pour maintenance ?
que deviennent les données ?

cantador
0
RideIsLife Messages postés 7 Date d'inscription dimanche 25 mars 2007 Statut Membre Dernière intervention 1 juillet 2008
1 juil. 2008 à 14:32
Merci à tous pour vos réponses, je vais essayer dans un premier temps avec l'algorithme de décalage, pour supprimer mes éléments. Sinon je repenserai alors mon idée de tableau, pour une liste chainée. Le problème et que dans le cahier des charges que l'on m'a donné je ne sais pas à combien de clients je dois m'attendre. Donc il est vrai qu'il m'est difficile de savoir pour l'instant qu'elle est la solution la plus optimisée.
En fait,pour répondre à ta question Cantador, je dois si mon client n'envoie pas de nouvelles après 30s le supprimer de la base de données de mon serveur (c'est aussi moi qui ai développé le client, qui à l'aide d'un timer envoie toujours la même donnée pour montrer qu'il est vivant). Et effectivement, lors d'un arret du serveur les données sont perdues. La finalité de ce serveur est de simplement servir d'intermédiaire pour la communication de deux appareils, "cachés" derrière des routeurs NAT.
En tout cas merci à tous, je reposterai pour vous dire si cela a fonctionné.
0
Rejoignez-nous