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 :

Indication de la taille de la seconde dimension d'un tableau passé en paramètre?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut Indication de la taille de la seconde dimension d'un tableau passé en paramètre?
    Salut!

    Pour le passage d'un tableau multidimensionnel à une fonction faut il obligatoirement indiquer la taille de la dernière dimension?
    Si oui pourquoi?

    Car cela ne semble à priori pas nécessaire et de plus ce type de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void f(int t[][],unsigned taille1,unsigned taille2){
    return;
    }
    compile sans warning.

    Qu'en est il exactement?

    Merci.

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    C'est vraiment bizarre que ça compile sans warning car il n'y a même pas int (dans unsigned taille1) !

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par millie
    C'est vraiment bizarre que ça compile sans warning car il n'y a même pas int (dans unsigned taille1) !
    Peut être un coup de l'optimisation... Les paramètres sont ignorés...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <stdio.h>
     
    static void f(int t[][], unsigned taille1, unsigned taille2)
    {
       printf ("%d\n", t[1][2]);
    }
     
    int main (void)
    {
       int a[2][3];
       f (a, 2, 3);
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Compiling: main.c
    main.c: In function `f':
    main.c:5: error: invalid use of array with unspecified bounds
    Process terminated with status 1 (0 minutes, 0 seconds)
    1 errors, 0 warnings

  4. #4
    Membre confirmé Avatar de _kal_
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Par défaut
    Citation Envoyé par millie
    C'est vraiment bizarre que ça compile sans warning car il n'y a même pas int (dans unsigned taille1) !
    Par défaut, il me semble que :
    unsigned int = unsigned

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par seriousme
    Pour le passage d'un tableau multidimensionnel à une fonction faut il obligatoirement indiquer la taille de la dernière dimension?
    La taille de toutes les dimensions (la premire peut être omise)
    Si oui pourquoi?
    Si il n'y a pas les dimensions nécessaires, le compilateur ne peut pas faire les calculs de déplacement nécessaires pour atteindre l'élément.

  6. #6
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    En effet en mettant du contenu dans la fonction ça ne passe plus.

    Sinon écrire:
    n'est il pas strictement équivalent à:
    ?
    En pratique non mais si on suit le raisonnement:
    "passé en paramètre à une fonction un tableau est "transformé" en un pointeur du typpe des éléments du tableau pointant sur le premier élément du tableau";
    alors int t[][]=>int* t[] qui ne passe pas plus, alors que int t[]=>int* t fonctionne.

    De plus déclarer un tableau de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int t[][3]={{1,2,3},{4,5,6},{7,8,9}};
    n'est il pas équivalent à déclarer un pointeur vers une zone contenant des pointeurs qui pointent sur des zones mémoires contenant des entiers, chose qui est explicite avec les allocations dynamiques.

    Et d'ailleurs pourquoi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int t[][]={{1,2,3},{4,5,6},{7,8,9}};
    ne passe pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    40  elements of array `t' have incomplete type 
    40  array size missing in 't' 
    40  storage size of 't' isn't known
    ?

  7. #7
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Lors de l'appel de la fonction, seul le pointeur de pointeur va être passé en paramètre, donc a priori, il n'y a aucun moyen de connaître la taille du tableau uniquement à partir d'un pointeur.

    En effet, execute ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     int t[] = {1,2,3,4,5,6};
     
     int * u;
     
     u = &(t[0]);
     
     
     printf("%d %d\n", u, t);
     printf("%d %d\n", sizeof(u), sizeof(t));
    u et t pointe sur le même endroit, mais le sizeof est différent ! En passage de paramètre, il n'y a que le pointeur, donc pas suffisament de données pour connaitre la taille !

  8. #8
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    En passage de paramètre, il n'y a que le pointeur, donc pas suffisament de données pour connaitre la taille !
    Oui mais c'est au programmeur d'indiquer le taille d'une manière ou d'une autre lors du passage en paramètre:
    -soit en utilisant une variable globale ou une constante avec "#define",
    -soit en la passant en paramètre.

    Pourquoi le compilo accepte de laisser le programmeur gérer la taille avec les tableaux unidimensionnel en transformant int t[] en int* t,
    et n'accepte pas pour les tableaux multidimensionnels?

  9. #9
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    En fait, un tableau à deux dimension, ce n'est pas vraiment multidimensionnelle, mais un tableau de pointeur constant !!

    C'est à dire que:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int t[] ={1,2,3};
    int r[] = {4 ,5,6};
     
    int * y [2];
     
    y[0] = t;
    y[1] = r;
    Fonctionne mais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int t[] ={1,2,3};
    int r[] = {4 ,5,6};
     
    int u[2][3];
     
     
    u[0] = t;
    ne fonctionne pas.


    Personnellement, j'ai toujours cru que l'on ne pouvait avoir d'aucune manière que ce soit la taille d'un tableau ! Mais j'ai appris que si le tableau est déclaré avec un pointeur constant, en utilisant sizeof sans la même fonction, on peut obtenir sa taille ! (je pensais que sizeof était une commande du précompilateur qui ne fonctionnait que sur sur les types !)

    Mais j'ai toujours pris l'habitude de passer les tailles en paramètres si le tableau est peu utilisé ou de faire un TAD sinon (qui a l'avantage que l'on peut tout passer en allocation dynamique rapidement si c'est bien programmé) !

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par seriousme
    En effet en mettant du contenu dans la fonction ça ne passe plus.

    Sinon écrire:
    Pas du C.
    n'est il pas strictement équivalent à:
    ?
    Absolument pas. int ** est le type de l'adresse d'un pointeur sur int ou d'un tableau de pointeurs sur int. Rien à voir.
    En pratique non mais si on suit le raisonnement:
    N'insiste pas, c'est faux. T [][] n'existe pas. C'est clair ?
    De plus déclarer un tableau de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int t[][3]={{1,2,3},{4,5,6},{7,8,9}};
    n'est il pas équivalent à déclarer un pointeur vers une zone contenant des pointeurs qui pointent sur des zones mémoires contenant des entiers, chose qui est explicite avec les allocations dynamiques.
    Non. Un tableau, quelque soit ses dimensions est toujours linéraire.
    Et d'ailleurs pourquoi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int t[][]={{1,2,3},{4,5,6},{7,8,9}};
    ne passe pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    40  elements of array `t' have incomplete type 
    40  array size missing in 't' 
    40  storage size of 't' isn't known
    ?
    Puis qu'on te dit que T[][] n'existe pas. T'es bouché ou quoi ? Fait trop chaud ? T'as le cerveau qui fond ?

  11. #11
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Puis qu'on te dit que T[][] n'existe pas.
    En passage de paramètre OK mais à la déclaration l'interprétation:
    "créer un tableau bidimensionnel dont la première zone contient 1,2,3 puis la seconde 4,5,6 et enfin la troisième 7,8,9" semble évidente.

  12. #12
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par seriousme
    En passage de paramètre OK mais à la déclaration l'interprétation:
    "créer un tableau bidimensionnel dont la première zone contient 1,2,3 puis la seconde 4,5,6 et enfin la troisième 7,8,9" semble évidente.
    Mais c'est pas possible... CA N'EXISTE PAS. OK ?

  13. #13
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Bon...

    Avant de nous fâcher un expert, certains pourraient peut-être réviser un peu et lire un cours de C et notamment les parties concernant les tableaux , les tableaux multidimensionnels et les différences entre tableaux et pointeurs ?
    Dans le doute, lisez tout le cours.


    Enfin...c'est juste une idée...

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

Discussions similaires

  1. [AS2] connaitre la dimension d'un tableau
    Par ooyeah dans le forum ActionScript 1 & ActionScript 2
    Réponses: 3
    Dernier message: 03/08/2005, 19h36
  2. Nombre de dimensions d'un tableau multidimensionnel
    Par Bruno75 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 08/07/2005, 10h03
  3. Dimension d'un tableau
    Par Kerod dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 10/04/2005, 15h46
  4. Avis aux experts : accéder aux dimensions d'un tableau.
    Par poulpi dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 25/11/2004, 09h09
  5. [VB.NET] Dimension d'un tableau
    Par fabthebreton dans le forum Windows Forms
    Réponses: 2
    Dernier message: 26/07/2004, 09h37

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