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

C Discussion :

Probleme tableau 3 dimensions


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 195
    Points : 101
    Points
    101
    Par défaut Probleme tableau 3 dimensions
    Bonjour,

    Voilà, je veux construire un tableau à trois dimensions de taille MT [100] [100] [500]. L’exemple suivant marche bien quand la taille est petite, MT [10] [10] [10] par 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    #include<stdio.h>
    #include<math.h>
    #include<time.h>
    #include <sys/time.h>
     
     
    #define nbc 10
    #define Taille_matrice 10
    #define T0 200.5
     
    void matrice(float (*MT)[nbc][Taille_matrice])
    {
    	int i,j,k;
     
    for (k = 0; k <Taille_matrice; k++)
    	{
         for (i=0; i<nbc; i++)
          {
    		  for (j=0; j<nbc; j++)
    		  {
    			  MT[i][j][k]=T0;
    		  }
    	  }
      }
    }
     
    void matrice(float (*MT)[nbc][Taille_matrice]);
    int main()
    {
    	clock_t tic = clock();
    	int i,j,k;
    	float MT[nbc][nbc][Taille_matrice];
    	matrice(MT);
     
    	for (k = 0; k <Taille_matrice; k++)
    	{
         for (i=0; i<nbc; i++)
          {
    		  for (j=0; j<nbc; j++)
    		  {
    			  printf("%lf ", MT[i][j][k]); 
            }  
      printf("\n"); 
    	}
    	printf("\n");
       }   
     
     
    clock_t toc = clock();
        printf("Elapsed: %f seconds\n", (double)(toc - tic) / CLOCKS_PER_SEC);
    return 0;
     
    }
    Mais avec de grand taille [100] [100] [500], le code se bloque (même quand on désactive l’affichage) au niveau de la ligne qui présente la déclaration du tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float MT[nbc][nbc][Taille_matrice];
    Avez-vous une idée c’est quoi le problème et comment on peut le résoudre ?
    Merci

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Tu demandes un tableau statique de 20MB, sûrement que ça bloque et débordes largement de la stack size.
    Btw, si ta matrice est déclarée float MT[nbc][nbc][Taille_matrice] pourquoi les paramètres sont float (*MT)[nbc][Taille_matrice] ?
    Soit tu utilises la notation de triple pointeur (qui est une hérésie mais 1 problème à la fois), soit tu utilises la notation avec toutes les dimensions, mais mixer les 2 est un très bon moyen de faire des erreurs.
    Et ton code est toujours un gouffre à performance et la porte ouverte aux cache-miss (quoi qu'à ce niveau, on a carrément enlevé les murs pour les empirer).
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 195
    Points : 101
    Points
    101
    Par défaut Probleme tableau 3 dimensions en C
    Merci Bousk pour votre réponse.

    Désolé mais je n'ai pas bien compris ce que vous voulez dire par ça :
    Btw, si ta matrice est déclarée float MT[nbc][nbc][Taille_matrice] pourquoi les paramètres sont float (*MT)[nbc][Taille_matrice] ?
    En effet, moi j'ai pensé qu'il n'y a pas un problème de mémoire car le même code a été fait sous Matlab et il marche bien.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur
    Inscrit en
    Juillet 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juillet 2009
    Messages : 416
    Points : 1 443
    Points
    1 443
    Par défaut
    Salut conanran,

    Si tu déclares ton tableau comme une variable locale, comme tu l'as fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float MT[nbc][nbc][Taille_matrice];
    Ça l'allouera sur la stack, qui est une partie de l'application allouée d'avance par l'OS au lancement du programme, et dont tu ne peux pas choisir la taille, qui sur Windows par exemple est limitée à quelques Mo.

    Pour pouvoir mettre ton tableau n'importe où dans la RAM, et de lui donner la taille que tu veux (enfin, dans les limites de ta machine), tu dois l'allouer dynamiquement:
    (ici je montre la syntaxe avec un tableau d'1 dimension, aujourd'hui ça ne m'arrive quasiment plus jamais d'avoir affaire à des tableaux de plusieurs dimensions :p)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    float* MT = (float*)malloc(nbc * nbc * Taille_matrice * sizeof(MT));
    //Ne pas oublier le free(); plus loin dans le code quand tu n'en as plus besoin
    free(MT);

  5. #5
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    On peut aussi écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    float (*MT)[nbc][Taille_matrice] = malloc( nbc * sizeof*MT );
    ... ... ...
    free( MT );
    et MT sera utilisable comme une matrice MT[nbc][nbc][Taille_matrice], mais n'aura une empreinte sur la pile de la taille d'un pointeur au lieu d'un tableau à trois dimensions.

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 195
    Points : 101
    Points
    101
    Par défaut
    Bonjour
    Merci dalfab

    Pourriez-vous m’expliquer exactement comment faire dans l’exemple ci-dessus.

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 195
    Points : 101
    Points
    101

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Langage] Probleme tableau 3 dimensions
    Par galadorn dans le forum Langage
    Réponses: 7
    Dernier message: 16/11/2008, 11h09
  2. Réponses: 4
    Dernier message: 29/11/2006, 12h00
  3. Probleme tableau 2 dimensions
    Par EmilyRose dans le forum C++
    Réponses: 2
    Dernier message: 09/10/2006, 18h20
  4. [Conception] problème tableau 2 dimensions
    Par Tootsi dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 24/01/2006, 18h55

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