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 :

Recuperer la taille d'un tableau


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2010
    Messages : 18
    Points : 29
    Points
    29
    Par défaut Recuperer la taille d'un tableau
    Hello!

    J'ai un petit problème, je me suis inscrit à une competition en ligne pour voir si j'arrive à gagner quelques points ( sur topcoder ) mais j'ai un problème dès le début : On doit faire une classe StreetSales dans laquelle une méthode sera appellée au début de chaque test (init) avec certains paramètres:

    la representation d'une carte de la forme : string []carte
    un tableau d'entier (pour le prix des objets dans le depot): int []prix
    et deux autres machins qui n'ont rien à voir...

    Donc je me demandais comment puis-je recuperer le nombres de lignes composant la carte ( pour les colonnes , c'est simple, j'ai juste à faire carte[0].size()) , de même pour le tableau prix, car si j'utilise sizeof, je trouverais la taille du pointeur, et non du tableau...


    Merci d'avance

    Partie de l'enoncé concerné:

    Implementation
    Your code should implement the following methods:

    * init method is called once per test case to give you:
    o the map of the district districtMap; 'X' marks a house and '.' marks a piece of street. You can walk on the streets, and you can trade at the house only if you stand at a street cell which is horizontally or vertically adjacent to it.
    o warehouse prices per unit of goods of each type warehousePrices. You can figure out the number of distinct goods you can trade G as the number of elements in warehousePrices;
    o the number of units of goods you can carry C;
    o the number of steps you can perform per day S;

    Definition

    Class: StreetSales
    Method: dayTrade
    Parameters: int[]
    Returns: String[]
    Method signature: String[] dayTrade(int[] visitedHouses)

    Method: init
    Parameters: String[], int[], int, int
    Returns: int
    Method signature: int init(String[] districtMap, int[] warehousePrices, int C, int S)
    (be sure your methods are public)

  2. #2
    Membre averti

    Inscrit en
    Juillet 2008
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 186
    Points : 350
    Points
    350
    Par défaut
    Bonjour,

    Si c'est comme cela qu'ils voient le C++, c'est absolument incroyable. Ils feraient mieux de dire que c'est du C !

    Question terminologie d'abord, en C++ il n'y a pas de méthodes, uniquement des fonctions membres. Et puis dans la librairie C++, il y a une classe pile poil faite peur représenter une chaîne de caractères. C'est std::string, avec un s minuscule. C'est quoi leur String avec un S majuscule, une chaîne de caractère mieux que celle du standard. Et pour finir, dans la librairie C++, il y a tout plein de conteneurs standards, comme std::vector ou std::list, qui remplacent très avantageusement les tableaux. Et comme ces conteneurs ont une fonction size(), cela répondrait tout simplement à ta question !

    Didier

  3. #3
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Mauvais forum, c'est du Java ça.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2010
    Messages : 18
    Points : 29
    Points
    29
    Par défaut
    Ah mince, c'est bien ce que je pensais, j'ai cherché partout String avec une majuscule, mais je trouvais pas, je comprenais pas pourquoi ( j'ai aussi croisé des String^ , pas non plus compris ce que c'etait).
    Mais pourtant ce concours permet l'utilisation du C++, et dans l'enoncé, ils n'ont pas marqué à quoi ressemblait les fonctions membres init et l'autre...
    Donc je sais pas du tout comment faire....

    Edit: Ah oui, aussi, ce n'est pas moi qui recupere des données "input", je dois creer une classe avec ces deux fonctions membres, que je soumet ensuite, et c'est le serveur qui appelle lui même les fonctions avec les paramètres, donc le vector j'aurais bien aimé pouvoir l'utiliser, mais j'ai pas trop le choix, je suis obligé de mettre un tableau de string dans mes paramètres....
    Donc peut-être que l'enoncé n'est pas approprié pour les Cplusplusiens, mais il n'y a rien d'autre dans l'enoncé me permettant de comprendre comment je fais...

    Re Edit: J'ai posté une question sur le forum de topcoder, qui a été vue 20 fois, mais je sais pas s'ils trouvent la question stupide, si mon anglais est horrible ou s'ils n'ont pas la réponse, mais personne n'a repondu...

  5. #5
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Ah ok, String^ c'est donc du C++/CLI, ceci dit c'est toujours pas le bon forum.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2010
    Messages : 18
    Points : 29
    Points
    29
    Par défaut
    Non, mais je veux dire dans mes recherches de String j'ai trouvé String^, mais ça ne m'interesse pas non plus, mon seul but c'est de savoir comment faire pour recuperer les dimensions des differents tableaux en C++ , sauf qu'apparemment, comme l'enoncé n'est pas génial, vous ne pouvez pas m'aider ...

  7. #7
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Mais c'est du java ça, et ici c'est le c++!
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2010
    Messages : 18
    Points : 29
    Points
    29
    Par défaut
    Ben oui et non, je ne savais pas que l'enoncé était ecrit en Java et ma question etait juste " peut on recuperer la taille d'un tableau en C++"...

  9. #9
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    fonction membre size de std::vector. Sinon luc avait écrit un truc pour mes tableaux du style T[N]. Pour ceux alloué avec new[], no way.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  10. #10
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Bonsoir,

    Citation Envoyé par cup of tea Voir le message
    Ben oui et non, je ne savais pas que l'enoncé était ecrit en Java et ma question etait juste " peut on recuperer la taille d'un tableau en C++"...
    J'espère bien comprendre la question...
    Si tu fais une allocation comme en C,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int longueur = 100;
    int* tableau = (int*)malloc(longueur*sizeof(int));
    alors tu peux recuperer la longueur de tableau en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int longueur_recuperee = sizeof(tableau)/sizeof(int);
    Par contre, si tu fais une allocation comme en C++ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int longueur = 100;
    int* tableau = new int[longueur];
    tu perds l'information sur la longueur.
    Dans ce cas, la solution classique consiste à faire une classe dans laquelle tu stockes la longueur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class Tableau
    {
    private:
        int _longueur;
        int* _elements;
    public:
        Tableau(int const& longueur):_longueur(longueur),_elements(new int[longueur]){};
    }
    Je ne sais plus s'il est possible de surcharger l'opérateur sizeof mais cela peut-être une bonne piste également.

  11. #11
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    L'allocation avec malloc doit être bannie du C++ car elle trop casse geule et dans le cas des non POD, ca foirera car elle n'appellera pas le constructeur des objets.

    L'allocation avec new[] n'est ni pratique, ni sécurisée. Il est bien plus préférable d'utiliser std::vector que te reconstruire une roue maison.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  12. #12
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    @David: Ce genre de truc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    template <typename T, std::size_t N>
    inline std::size_t bounds(T (&)[N]) { return N; }
    Si oui, c'est dans la faq de comeau

    Et pour malloc, il n'appelera jamais le constructeur même pour un POD (ou n'importe quoi d'autre), pour new, il l'appelera selon la forme du contructeur et de l'appel à new (constructeur trivial ou non, présence des () ou non).

  13. #13
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Flob90 >> C'était l'idée de base pour les tableaux de type T[N]. Je te laisse juger ici. Pour le coup du malloc, a poster dans la précipitation, il manquait deux mots ce qui rendait ma remarque plutôt fausse.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2010
    Messages : 18
    Points : 29
    Points
    29
    Par défaut
    Merci beaucoup pour vos réponses, ca m'aidera pour une autre fois:
    Sur le forum ils ont repondu à ma question, en fait il fallait que je regles mon langage par defaut pour que ce soit en C++, si on le change pas c'est en Java par defaut :p.

    Maintenant je me retrouves avec des vector <string > et vector<int > , c'est beaucoup mieux :


    Class: StreetSales
    Method: dayTrade
    Parameters: vector <int>
    Returns: vector <string>
    Method signature: vector <string> dayTrade(vector <int> visitedHouses)

    Method: init
    Parameters: vector <string>, vector <int>, int, int
    Returns: int
    Method signature: int init(vector <string> districtMap, vector <int> warehousePrices, int C, int S)
    (be sure your methods are public)

    Enfin du C++ , content Goten ?

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    De toute façon, pour le coup du malloc(), tu as le même problème qu'avec new: sizeof ne marche pas dessus.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #16
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    @Medinoc: Qu'est ce qui ne marche pas ? sizeof(malloc(ma_var))=sizeof(void*), je ne vois pas ce qui ne marche pas !

  17. #17
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu as répondu à ta propre question: Ça ne marche pas que les tableaux alloués par malloc(), parce que ça retourne la taille du pointeur à la place.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  18. #18
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Ha tu voulais dire que ca ne donnera pas la taille du type réelement pointé ? dans ce cas là oui, mais ce n'est pas que sizeof ne fonctionne pas sur malloc, il fonctionne très bien et fait ce qu'on attend de lui. Si tu veus la taille du type, suffit de déréférencer.

    Edit: J'avais mal lu (pas lu même) un des messages précédent, je vois maintenant de quoi tu parles : le problème pour déterminer la taille d'un tableau lorsqu'il est alloué dynamiquement. (message de Aleph)

  19. #19
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Bonjour,

    Citation Envoyé par Flob90 Voir le message
    Edit: J'avais mal lu (pas lu même) un des messages précédent, je vois maintenant de quoi tu parles : le problème pour déterminer la taille d'un tableau lorsqu'il est alloué dynamiquement. (message de Aleph)
    Tout d'abord, un sujet très intéressant de Wilkipédia.

    Au temps pour moi, j'ai effectivement écrit une grosse bêtise.
    Le seul cas qui marche est celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int tableau[10]; // on peut choisir une autre taille bien sûr!!!
    int taille = sizeof(tableau)/sizeof(int);

  20. #20
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En C++, il y a aussi le truc à base de template, qui a l'avantage de provoquer une erreur de compilation si tu tentes de l'utiliser sur un pointeur.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. recuperer une dimension du tableau et recuperer sa taille
    Par goldengear dans le forum Langage
    Réponses: 2
    Dernier message: 28/04/2015, 17h55
  2. Taille maximum de tableau en Delphi
    Par yannick37 dans le forum Langage
    Réponses: 5
    Dernier message: 03/03/2004, 13h18
  3. qbasic : taille d'un tableau
    Par clood200 dans le forum Basic
    Réponses: 2
    Dernier message: 16/09/2003, 07h26
  4. [VB6] [Réseau] Récupérer la taille d'un fichier avec inet
    Par pcpunch dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 20/02/2003, 21h38
  5. [VB6] [Fichier] Récupérer sa taille
    Par SpP dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/09/2002, 19h56

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