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 :

Problème allocation mémoire tableau à 2 dimensions


Sujet :

C

  1. #1
    Futur Membre du Club Avatar de Blackbelt_29
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 19
    Points : 9
    Points
    9
    Par défaut Problème allocation mémoire tableau à 2 dimensions
    Bonjour,

    Je souhaite allouer dynamiquement un tableau à deux dimensions.
    Du coup j'ai d'abord créé une fonction qui prend en paramètre une hauteur et une largeur et qui renvoie un tableau à deux dimensions dont voici le code :

    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
     
     
    float ** allocation( int height, int width )
    {
       int i,j;
       float ** tab = (float *) malloc( height*sizeof(float*) );  /*Ligne 153*/
       for ( i = 0; i<height; i++ )
       {
          tab[i] = (float* ) malloc( width*sizeof(float) );
          for ( j = 0; j<width; j++ )
          {
              tab[i][j] = 1;
          }
       }
       return tab;
    }
    Et je l'appel dans le main :

    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
     
    int main(void){
    /*....code déterminant height et width....*/
        float *imageVect=NULL;
        float **tab2=NULL;
        float **matrice=NULL;
        imageVect = (float *) malloc(height*width*nbImage * sizeof(float));
     
     
        /*Appel des fonctions*/
       tab2=allocation(height,width);
        imageVect=LireImageRAW(height,width,nbImage);
        matrice=DecompVect(imageVect,tab2,height,width,positionOffset); /*Ligne 240*/
     
    }

    Le but de mon programme est de transcrire un vecteur en une matrice en 512*512

    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
     
    float* DecompVect(float* imageVect,float* tab2,int height,int width,int positionOffset){
      /*Declaration des variables*/
        int i,j;
        /*fin de déclaration des variables*/
     
        for(i=0;i<height;i++){
            for(j=0;j<width;j++){
                tab2[i][j]=imageVect[positionOffset]; /*Ligne 179*/
                printf("%.2f\n",tab2[i][j]);
                positionOffset++;
            }
            printf("\n");
        }
     
     
        return(tab2);
        free(tab2);
    }

    Mon problème est que lorsque je compile le code voici l'erreur que j'ai :

    error: cannot convert 'float*' to 'float**' in initialization => ligne 153
    error : invalid types 'float[int]' for array subscript => ligne 179
    error: cannot convert 'float**' to 'float*' for argument '2' to 'float* DecompVect((float*,float*,int,int,int)' => ligne 240

    Je pense que mes erreurs sont liées à une seule et même erreur (lors de l'allocation du tableau je pense), mais je n'arrive pas à trouver la faute !

    Merci de vos réponses !

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    float ** tab = (float *)foobar; : là tu essaies de mettre une valeur de type float * dans une variable de type float **, ça ne pourra pas fonctionner.

    Ne caste jamais le résultat de malloc et consorts, c'est inutile voire dangereux.


    Pourquoi veux-tu utiliser des tableaux à deux dimensions pour manipuler tes images ? Tu es plus à l'aise avec ? Parce que si c'est simplement cela tu peux abstraire l'accès à un pixel donné avec une macro ou une fonction comme ceci (code absolument pas testé) :
    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
    struct imageSequence {
        unsigned char *dataOriginal;
        float *dataProcessed;
        unsigned int w, h;
        unsigned int bpp; // bits-per-pixel: 8, 16, 24 or 32
        unsigned int count; // number of image matrices
    };
     
    unsigned char *getPixelOriginalAt(struct imageSequence *img, unsigned int num, int x, int y) {
        assert(num < img->count);
        assert(x >= 0 && (unsigned int)x < img->w && y >= 0 && (unsigned int)y < img->h);
     
        const unsigned int imgSize = img->w * img->h * img->bpp / 8;
        return &img->dataOriginal[num * imgSize + y * img->w * img->bpp / 8 + x * img->bpp / 8];
    }
     
    float *getPixelProcessedAt(struct imageSequence *img, unsigned int num, int x, int y) {
        assert(num < img->count);
        assert(x >= 0 && (unsigned int)x < img->w && y >= 0 && (unsigned int)y < img->h);
     
        const unsigned int imgSize = img->w * img->h;
        return &img->dataProcessed[num * imgSize + y * img->w + x];
    }
    Outre la difficulté de manipulation de la double indirection, le souci avec la représentation des images dans des TYPE ** (tableau à deux dimensions dynamique) est que cela ne correspond pas au layout de l'image en mémoire (ligne par ligne de haut en bas, dans l'immense majorité des cas). Il y a donc des conversions à réaliser qui ne sont pas forcément triviales pour un débutant.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour, j'ai pas complètement compris ton code mais j'y ai vu plusieurs erreurs:

    A la ligne 153, tu affecte un float * à un float **
    Dans les paramètres de la fonction DecompVect, la variable tab2 est un float * alors que partout ailleurs dans le code c'est un float **
    Ce qui fait qu'à la ligne 179 tu utilise un tableau à une dimension comme un tableau à deux dimensions.


    Cordialement

    EDIT: Matt_Houston j'avais pas vu ton poste...

  4. #4
    Futur Membre du Club Avatar de Blackbelt_29
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Merci pour vos réponses Matt_Houston et RenardEnjoy !

    Pourquoi veux-tu utiliser des tableaux à deux dimensions pour manipuler tes images ? Tu es plus à l'aise avec ?
    En fait mon image est sous forme de vecteur [hauteur*largeur] il faut donc pour que je puisse traiter l'image la transcrire en image en deux dimension (je dois appliquer un filtre médian sur cette image)

    du coup j'ai changé certaine chose dans mes fonctions et j'ai toujours des erreurs dans la fonction allocation :

    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
    float ** allocation( int height, int width )
    {
       int i,j;
       float **tab2=NULL;
       tab2 = malloc( height*sizeof(float*) );  /*Ligne 153*/
       for ( i = 0; i<height; i++ )
       {
          tab2[i] = malloc( width*sizeof(float) ); /*ligne 156*/
          for ( j = 0; j<width; j++ )
          {
              tab2[i][j] = 1;
          }
       }
       return tab2;
    }
    Voici les erreurs
    error:invalid conversion from 'void*' to float**' [-fpermisive] => ligne 153
    error:invalid conversion from 'void*' to float**' [-fpermisive] => ligne 156
    et j'ai changé les appels dans le main et la déclaration dans la fonction de recomposition du vecteur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float** DecompVect(float* imageVect,float** tab2,int height,int width,int positionOffset)
    du coup il me revoit un tableau 2D en prenant en paramètre le vecteur, le tableau 2D créer grâce à l'allocation mémoire...

    et dans le main je l'appel de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        tab2=allocation(height,width);
        tab2=DecompVect(imageVect,tab2,height,width,positionOffset); /*Ligne 240*/
    edit: J'ai résolu mon erreur finalement j'avais mal initialisé les malloc !
    Je vais voir si le programme fonctionne et si oui je mettrai résolu !

    merci !

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

Discussions similaires

  1. allocation mémoire tableau 2 dimensions
    Par imou222 dans le forum Débuter
    Réponses: 3
    Dernier message: 22/04/2014, 17h35
  2. problème avec un tableau à plusieurs dimensions
    Par lelutin dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 07/09/2006, 12h05
  3. [Tableaux] Problème tri de tableau à deux dimensions
    Par squall62 dans le forum Langage
    Réponses: 21
    Dernier message: 24/05/2006, 18h18
  4. Réponses: 5
    Dernier message: 24/05/2006, 08h59
  5. problème allocation mémoire
    Par kinta dans le forum C++
    Réponses: 7
    Dernier message: 09/02/2006, 23h22

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