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 :

créer des tableaux de tableaux


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2022
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2022
    Messages : 34
    Par défaut créer des tableaux de tableaux
    Bonjour,

    J'ai un problème depuis des années déjà avec les tableaux de tableaux (problème que j'arrive à contourner en mettant tout dans une liste).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    TYPE myfunction() // Type souhaité à retourner : int[7][5] ; type qu'on peut retourner : int**
    {
      int grid[7][5] = malloc(7*5*sizeof(int));
      return grid;
    }
     
    int main()
    {
      int grid[7][5] = myfunction(); // Type incompatible si myfunction retourne int** et elle ne peut pas retourner int[7][5].
    }
    Le problème est que :
    est différent de . En effet grid[i+1][j] <=> *(grid+(i+1)*5+j) et avec int**, on perd les infos de la taille.

    Y a-t-il une solution sans utiliser std::vector, une bibliothèque ou une classe pré-implantée svp ?

    PS: Quand je tape :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int(*)[7][5] function()
    {
      int grid[7][5] = new int[7][5];
      return grid;
    }
    le type de retour ne fonctionne pas plus et le new non plus.

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 063
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 063
    Par défaut
    Bonjour,

    Vous êtes sur un forum C et non C++. Vous devriez écrire ICI.

  3. #3
    CGi
    CGi est déconnecté
    Expert confirmé
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    Détails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Vous êtes sur un forum C et non C++. Vous devriez écrire ICI.
    Oui et non. Le problème initial tient plutôt du C.

    @nauvisse Quand je vois ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int grid[7][5] = malloc(7*5*sizeof(int));
    Ça me laisse dire, que tu devrais reprendre un cours sur les tableaux du langage C.
    Ici, tu tente d'initialiser un tableau déjà alloué sur la pile avec un pointeur d'une allocation sur le tas. Ça n'a aucun sens !
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2022
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2022
    Messages : 34
    Par défaut
    Oui effectivement, c'est un compromis entre le C et le C++
    Et aussi impossible d'initialiser un tableau déjà alloué sur la pile avec un pointeur d'une allocation sur le tas, effectivement.

    Si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int** function()
    {
      int** grid = new int[7][5];
      return grid;
    }
    ça ne marche pas, je lis <<cannot convert 'int(*)[5]' to 'int**' in initialisation>>

    Je voudrais, dans la fonction qui utilise ensuite grid, écrire simplement grid[i][j] plutôt que *(grid+j+5*i).

    Savez-vous svp ?

  5. #5
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 771
    Par défaut
    Citation Envoyé par Nauvisse Voir le message
    ça ne marche pas, je lis <<cannot convert 'int(*)[5]' to 'int**' in initialisation>>

    Je voudrais, dans la fonction qui utilise ensuite grid, écrire simplement grid[i][j] plutôt que *(grid+j+5*i).

    Savez-vous svp ?
    Oui c'est normal

    réponse rapide : vas relire les cours de pointeurs en C

    Le type XX** est l'adresse d'1 pointeur d'1 variable de type XX.
    Mais on utilise l'adresse d'1 variable (pointeur compris) que si on veut modifier la valeur de la dite variable.
    La raison : en C, le passage de paramètres est 1 passage par valeur (lecture).

    Parce que dans ton code, tu vas retourner l'adresse d'1 variable locale
    Donc soit tu retournes juste 1 int* soit tu passes l'adresse d'1 pointeur sur 1 entier int**.

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 599
    Par défaut
    Un tableau est complexe à gérer en C, une fonction ne peut ni recevoir ni retourner un tableau. Pour accéder à un tableau de tableaux, on peut se ramener à utiliser un pointeur sur des tableaux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    typedef int  Array5Int[5];
    Array5Int*  myfunction( unsigned nb_rows ) // Type souhaité à retourner : int[7][5], remplacé par int (*)[5]
    {
       Array5Int*  grid = malloc( nb_rows * sizeof(Array5Int) );  // alloue nb_rows éléments de type Array5Int
       return  grid;
    }
    int main()
    {
       Array5Int*  grid = myfunction( 7 ); // myfunction( 7 ) retourne un int(*)[5] qui a 7 éléments
       grid[6][4] = 42;
    }
    Ca serait bien plus simple en C++:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <array>
    int main() {
       using Grid = std::array<std::array<int,5>,7>;
       Grid  grid;             // pas d'allocation dynamique, peut être copié, et transmis et reçu de fonction
       grid[6][4] = 42;
    }

  7. #7
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2022
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2022
    Messages : 34
    Par défaut
    Merci beaucoup, j'avais pas pensé envoyer en entrée le pointeur plutôt que le récupérer en sortie. Je crois que ce code est correct :
    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
     
    void function(int (**gridPt)[5])
    {
      *gridPt = new int[7][5];
     
      for (int j = 0 ; j < 5 ; ++j)
        for (int i = 0 ; i < 7 ; ++i)
          (*gridPt)[i][j] = 0;
     
      (*gridPt)[6][3] = 25;
    }
     
    int main(int argc, char *argv[])
    {
      QCoreApplication qca(argc, argv);
     
      int (*grid)[5];
      function(&grid);
     
      int i,j;
     
      for (j = 0 ; j < 5 ; ++j)
      {
        for (i = 0 ; i < 7 ; ++i)
          printf("%d ",grid[i][j]);
        printf("\n");
      }
     
      delete [] grid;
     
      return qca.exec();
    }
    Bien compliqué toutefois.

    Et si le nombre 5 est variable, je ne sais pas comment faire. Vous sauriez svp ?

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/09/2004, 21h25
  2. ajouter à la suite des tableaux
    Par vic_cw dans le forum C++
    Réponses: 9
    Dernier message: 22/08/2004, 15h11
  3. [OPENOFFICE] Transformation des tableaux OOo en HTML
    Par GrandFather dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 15/05/2004, 18h00
  4. Réponses: 2
    Dernier message: 19/08/2003, 18h04
  5. free sur des tableaux "a moitié dynamiques"
    Par barthelv dans le forum C
    Réponses: 4
    Dernier message: 31/07/2003, 15h30

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