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 :

Taille de matrice


Sujet :

Delphi

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2007
    Messages : 107
    Points : 73
    Points
    73
    Par défaut Taille de matrice
    Salut pour tous,
    j'ai besoin de matrice qui contient plus que 100 mille ligne
    j'ai fait la déclartion du matrice mais le prog m'affiche un erreure pour la taille du matrice, aidez moi SVP je travaille sur mon PFE.
    //la declaration est:
    tab:array[1..4,1..100000];

    merci d'avence.

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 218
    Points : 311
    Points
    311
    Par défaut
    Il faudrait déjà que tu précises le type de tes données, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      tab:array[1..4,1..100000] of integer;
    Après l'utilisation d'un tableau ne me semble pas franchement judicieux pour une telle capacité car tu fais une réservation mémoire de 400000 éléments d'un coup même si tu n'avais besoin que d'un élément.

  3. #3
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Bonjour,

    Pourquoi tenter de manipuler une matice aussi grosse en une seule fois alors que tu peux manipuler une matrice par blocs. D'autre part, il est judicieux également de repérer si ta matice est creuse, ou encore diagonale (repérer les zéros) afin de ne pas réserver inutilement de l'espace pour les données qui sont nulles.

    Une technique consiste à traiter les matrices comme des listes chaînées dont un enregistrement type est de la forme <ligne, colonne,valeur>, pour une valeur non nulle.
    Par contre il te faudra adapter toutes les opérations comme la somme, le produit, l'inversion...

    Cordialement

  4. #4
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 562
    Points
    3 562
    Par défaut
    Est-ce que tu passes ta matrice en paramètre d'une procedure quelquepart

    parce que les tableaux indicés de 1 à N, c'est pas terrible : il vaut mieux travailler avec des indices de 0 à N-1.

    Pourquoi ? à cause du fait qu'un tableau passé en paramètre est ré-indicé par delphi de 0 à N-1

    exemple :
    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
    const N=10;
     
    //Procedure qui plante
    function DernierElement(var tab:array of integer);
    begin
       //tab est indicé de 0 à N-1 donc cette ligne plante
       //pourtant on a bien passé un tableau indicé de 1 à N
       result:=tab[N];  //erreur d'indice hors limite déclenchée
     
       //le bon code : result:=tab[N-1];
    end;
     
     
    ...
    var MonTableau[1..N] of integer;
         i:integer;
    begin
       ....
       i:=DernierELement(MonTableau);
    end;
    Si ce n'est pas la raison, c'est parce que ton tableau que ton tableau dépasse 64Ko autorisé (3 Go et des brouettes, c'est gros !), auquel cas il va falloir que tu ruses comme les autres t'ont dit

    essaies avec un tableau dynamique par exemple (j'y crois pas si tu t'obstine à utiliser 100000 comme 2nd dimension):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     tab:array of integer;
    begin
      SetLength(tab,4,100000);
     
    ...
    end;

    Au pire, tu peux travailler sur un fichier binaire pour stocker tes données en utilisant un TFileStream pour y accéder, celà te permettra de travailler avec 4Go de données...

  5. #5
    Membre confirmé Avatar de Haywire
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2006
    Messages : 462
    Points : 573
    Points
    573
    Par défaut
    Pourquoi ? à cause du fait qu'un tableau passé en paramètre est ré-indicé par delphi de 0 à N-1
    Ca alors on en apprend tous les jours !
    J'indice toujours mes tableaux à partir de 0 pour garder les memes habitudes entre les différents langage que j'utilise, alors je n'ai jamais rencontré ce problème, mais si un jour j'y avais été confronté j'aurais pu me creuser la tête pendant des jours avant de comprendre lol.
    Merci donc pour cette info !

  6. #6
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Tu peut utilise un tableau dynamique comme la suite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var //tab:array[1..4,1..100000] of variant;ton declaration
        i,j : integer;
        tab : array of array of variant; //la nouvelle declaration 
    begin
      setlength(tab,4,100000); // definition le nombre de lignes et de colonnes
      for i := 0 to 4-1 do //n'oublier pas qu'un tableau dynamique l'indice 
                                //du premier element c'est 0 
      for j := 0 to 100000-1 do
      tab[i,j] := i*j;

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,
    Citation Envoyé par waskol
    Pourquoi ? à cause du fait qu'un tableau passé en paramètre est ré-indicé par delphi de 0 à N-1

    exemple :
    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
    const N=10;
     
    //Procedure qui plante
    function DernierElement(var tab:array of integer);
    begin
       //tab est indicé de 0 à N-1 donc cette ligne plante
       //pourtant on a bien passé un tableau indicé de 1 à N
       result:=tab[N];  //erreur d'indice hors limite déclenchée
     
       //le bon code : result:=tab[N-1];
    end;
    ...
    var MonTableau[1..N] of integer;
         i:integer;
    begin
       ....
       i:=DernierELement(MonTableau);
    end;
    Aisément évitable en définissant un type
    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
     
    const
      N = 10;
     
    type
      myTab = array [1..N] of integer;
     
    procedure ttt (var t : myTab);
    var
      i : integer;
    begin
     for i:=1 to N do
    ...
    end;
     
     
    var
      table : myTab;
     
    begin
    ...
      ttt(table);
    ...
    end.
    je ne vois vraiment pas en quoi ça pose problème, une bonne habitude étant de déclarer des types pour les données qu'on va utiliser.

Discussions similaires

  1. Taille maximale matrice
    Par Fiabulu dans le forum MATLAB
    Réponses: 2
    Dernier message: 01/12/2010, 12h59
  2. [contourc] Changement de taille de matrice
    Par airballman dans le forum Images
    Réponses: 18
    Dernier message: 23/05/2009, 18h10
  3. Taille maximal matrice en IML
    Par stefsas dans le forum SAS IML
    Réponses: 0
    Dernier message: 18/09/2008, 18h44
  4. Réponses: 15
    Dernier message: 04/06/2008, 13h26
  5. Debutante algorithme taille de matrice variant
    Par lilyla dans le forum Algorithmes et structures de données
    Réponses: 0
    Dernier message: 25/01/2008, 10h03

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