IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

copier un tableau dynamique à deux dimensions


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 127
    Par défaut copier un tableau dynamique à deux dimensions
    Bonjour,

    Je souhaite bêtement copier un tableau dynamique à deux dimension dans un autre tableau dynamique à deux dimensions, il s'agit d'un tableau du type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     array of array of Integer;
    J'ai expérimenté un peu avec MOVE et COPY sans grand succès.
    Avez-vous une suggestion pour résoudre mon problème (sans parcourir chaque élément du tableau bien évidement).

    Cordialement,

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 086
    Par défaut
    En théorie, avec le Move sur deux tableaux avec les mêmes dimensions, c'est osé, mais cela doit fonctionner !

    Sinon, Copy, doit fonctionner, c'est la fonction faite pour ...

    faire voir ton code
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 933
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 933
    Par défaut
    Ca ne fonctionnera pas sans boucle avec un tableau dynamique puisque ce ne sont que des pointeurs sur... d'autres tableaux.

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 086
    Par défaut
    Bien vu AndNotOr, Copy ne copie que les références, ce code démontre la vacherie de la chose !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    var
      A1, A2: array of array of Integer;
      I, J: Integer;
      S: string;
    begin
      SetLength(A1, 10, 100);
     
      for I := Low(A1) to High(A1) do
        for J := Low(A1[I]) to High(A1[I]) do
          A1[I, J] := I + J;
     
      A2 := Copy(A1); // Fait juste pointer A2 sur A1 ...
     
      S := '';
      for I := Low(A2) to High(A2) do
        for J := Low(A2[I]) to High(A2[I]) do
          S := S + #13 + IntToStr(A2[I, J]);
     
      ShowMessage(S);
     
      for I := Low(A1) to High(A1) do
        for J := Low(A1[I]) to High(A1[I]) do
          A1[I, J] := A1[I, J] * 10;
     
      S := '';
      for I := Low(A2) to High(A2) do
        for J := Low(A2[I]) to High(A2[I]) do
          S := S + #13 + IntToStr(A2[I, J]); 
     
      ShowMessage(S);
    end;
    la solution étant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      SetLength(A2, 10, 100);
      for I := Low(A2) to High(A2) do
        A2[I] := Copy(A1[I]);
    Valable pour des tableau dynamiques avec la même seconde dimension ...

    EDIT, j'ai fermé Delphi, ça donne quoi ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      SetLength(A2, 10);
      for I := Low(A2) to High(A2) do
         A2[I] := Copy(A1[I]);
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 933
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 933
    Par défaut
    Et encore, dans ton exemple, tu fixes toutes les dimensions du tableau en un seul SetLength. On pourrait imaginer que le données sont contiguës. Mais elles ne le seront certainement pas avec plus loin un SetLenth(A1[5], 101) (Réallocation).

    Il y a aussi ces 2 dword au pointeur -4 (-8) qui représente le compteur de référence et le nombre d'éléments dans le tableau (high). A prendre en compte dans Copy... avant de reseter le compteur de référence...

    Et j'en oublie surement !

    Je choisirais la facilité avec 2 petites boucles .

  6. #6
    Membre émérite Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Par défaut
    Salut,

    Un simple CopyMemory (API windows) doit faire l'affaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      CopyMemory(@Dest, @Src, SizeOf(Src));

  7. #7
    Membre émérite
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Par défaut
    Pourquoi pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    B:array of array of integer;
    B:=Copy(A)

  8. #8
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 086
    Par défaut
    Montor, voir le problème du Copy ICI ... qui ne copie que les références car il copie le array de array sans copié chaque item
    Lit donc un peu la conversation, tu as fait le même coup ICI, et proposant une solution déjà évoqué qui justement est le problème
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. Tableau dynamique deux dimensions de class
    Par Hyssgrif dans le forum C++
    Réponses: 3
    Dernier message: 17/04/2015, 15h22
  2. Tableau dynamique à deux dimensions
    Par Neuromancien2 dans le forum ASP
    Réponses: 4
    Dernier message: 13/06/2007, 18h12
  3. Tableau dynamique à deux dimensions
    Par David Fouejio dans le forum MFC
    Réponses: 4
    Dernier message: 05/03/2007, 09h37
  4. Réponses: 1
    Dernier message: 09/03/2006, 17h25
  5. Réponses: 6
    Dernier message: 26/11/2005, 19h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo