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 :

déclaration tableau à M dimensions


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2013
    Messages : 5
    Par défaut déclaration tableau à M dimensions
    Bonjour,

    je travaille actuellement sur un projet d'ordonnancement à machine parallèle. Il nous est demandé de transposer un algorithme en langage C. Le problème est que l'algorithme utilise un tableau de dimension m (m étant le nombre de machines utilisé pour l'ordonnancement). Par exemple, s'il y a deux machines, le tableau sera a deux dimensions, dimensions 3 si trois machines, etc ...

    J'ai pour l'instant pondu ce code (ne pas faire attention au malloc j'ai mis une valeur au pif pour pas m’embêter) :

    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
     
    int impossibru (void ** tab,int C,int m)
    {
        int i=0;
        if (m==1)
        {
            *tab=0;
            return 0;
        }
        else
        {
            for (i=0;i<C;i++)
            {
                tab[i]=malloc(sizeof(int)*5);
                if (tab[i] == NULL)
                {
                    printf("Erreur d'allocation mémoire du tableau");
                    exit(-1);
                }
                *tab[i]=impossibru(*tab[i],C,m-1);
            }
        }
    }
    Comme vous pouvez le voir, j'ai tenté avec la méthode de la récursivité. Tout d'abord, on déclare avec des pointeurs void comme on ne sait pas si se sera un pointeur d'entier ou un pointeur de pointeur.

    Si m=1, cas d'arrêt, et on met la valeur dans le tableau. On return 0 pour dire que tout s'est bien passé. Sinon, s'il faut rajouter une nouvelle dimension, on alloue la place mémoire pour le nouveau tableau correspondant à la nouvelle dimension, et on refait appel à la fonction.

    J'ai cependant des problèmes dans la gestion du pointeur en paramètre, en particulier avec la dernière ligne
    1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *tab[i]=impossibru(*tab[i],C,m-1);
    Cela me met le code d'erreur suivant : invalid use of void expression

    Après avoir ressassé plusieurs fois sur mon bout de papier je ne vois pas trop d'où viens ce problème

  2. #2
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Bonjour,

    tu parles bien d'un tableau avec plusieurs dimensions : M[10][10][10][10] est un tableau à 4 dimensions chacune de taille 10 ?
    ou bien parles-tu d'un tableau à une dimension mais de taille dynamique M[n] où n est déterminé au run-time ?

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    Si tu parle de tableau du genre tab[10][10][10][10], saches qu'en mémoire, il est en fait représenté sous forme de tableau à une dimension.

    Tu peux avoir faire "comme si" tu avais un tableau à X dimensions tout en déclarant un tableau à une dimension.

    Il faudra juste convertir l'indice du tableau à une dimension en l'indice d'un tableau à X dimension.

    Dans le cas du tableau, tab, si on a : tab[i][j][k] = tab[l], l = i*10*10+j*10+k et i = l/(10*10) ; j = (l/10)%10 et k = l%(10*10).

    Grosso modo (dommage qu'on ne puisse pas rentrer de formules mathématiques ) :
    Soit i l'ensemble des indice d'un tableau à n+1 dimensions et Ind l'indice d'un tableau uni-dimensionnel,

    Ind = i0*10^n + i1*10^(n-1)*....+ in
    et ix = (Ind/ 10^(n-x) )%10


    N.B. Je n'ai pas vérifié les formules

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2013
    Messages : 5
    Par défaut
    Je parlais bien d'un tableau T[10][10][10][10] pour reprendre votre exemple.

    Vous pensez donc que la récursivité est une mauvaise piste ? Je vais essayer de voir avec ta méthode Neckara, car le parcours du tableau n'est pas très aisé avec celle-ci ^^

    NB : Le problème sur la dernière ligne venais d'un usage incorrect de void. Avec le code suivant, la compilation fonctionne (après à voir si c'est bien le résultat escompté ^^) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *(int *)tab[i]=(int)impossibru(tab[i],C,m-1);

  5. #5
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Simplifie-toi la vie et suit la méthode Neckara ... mais attention tu pourras rapidement te retrouver sans mémoire à allouer suivant la taille de tes cellules et les tailles de tes dimensions ... un simple int (4 octets en général) avec 4 dimensions de taille 10 fait déjà dans les 40ko ...

    Par curiosité, que va contenir ce «méga»-tableau ?

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2013
    Messages : 5
    Par défaut
    Après avoir cogité un peu, cette solution semble en effet plus simple : il suffit en effet de déclarer un tableau de taille C^m pour pouvoir stocker toutes les valeurs désirées.

    Quand au pourquoi de ce tableau, en fait le but final est qu'il contienne des booleen pour permettre l'utilisation d'un algorithme de programmation dynamique. En fonction de la valeur des booléens, cela nous permet de savoir si l'ordonnancement devient meilleure dans un sens ou non.

Discussions similaires

  1. déclaration dynamique tableau 2 dimensions
    Par boboss123 dans le forum C
    Réponses: 1
    Dernier message: 23/03/2015, 16h05
  2. Déclaration tableau 2 dimensions
    Par cotede2 dans le forum Collection et Stream
    Réponses: 14
    Dernier message: 22/10/2009, 16h51
  3. Déclaration Tableau 2 dimensions
    Par vincent.gad dans le forum Débuter
    Réponses: 5
    Dernier message: 21/11/2008, 18h02
  4. Réponses: 1
    Dernier message: 09/03/2006, 17h25
  5. [Tableaux] Déclaration d'un tableau à 2 dimensions
    Par kcizth dans le forum Langage
    Réponses: 5
    Dernier message: 04/01/2006, 15h35

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