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 :

Comment savoir la taille d'une variable


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par défaut
    Que te retourne AllocTable un : ou un si c'est un unsigned char** que nbPoints et le nombre de ligne de ton tableau et nbCoord le nombre de coloones.

    alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tailleMemoire = sizeof(unsigned char*)*sizeof(unsigned char)*nbPoints*nbCoord ;

    XXiemeciel

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 93
    Par défaut
    ca retourne un tableau a 2 dimensions donc selon moi un je pense que c'est plus des doubles que des unsigned char mais le principe reste le meme. Par contre, je pensais plus que la taille serai le resultat d'un calcul du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     sizeof(double)*dim*nbPts
    car c'est bien un tableau 2 dimensions avec nbPts comme nombre de ligne et nbCoord en nombre de colonne.

    Par contre en prenant ton exemple (avec des doubles a la place des unsigned char) je ne comprends pas a quoi correspond le sizeof(double*)
    tailleMemoire = sizeof(double*) * sizeof(double) * nbPoints * nbCoord ;

  3. #3
    Membre chevronné Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par défaut
    Citation Envoyé par killerjeff
    ca retourne un tableau a 2 dimensions donc selon moi un
    Ce n'est pas une regle absolu, d'ailleur la plupart du temps les allocations memoire ce font dans un tableau a une dimension et on calcul l'offset a partir de x,y de la facon suivante :

    offset = x + y*xsize

    XXiemeciel

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par killerjeff
    ca retourne un tableau a 2 dimensions donc selon moi un
    Non. double** c'est un pointeur vers pointeur vers double, donc éventuellement un pointeur vers un tableau de pointeurs vers des tableaux
    de doubles.

    Un tableau à deux dimensions serait un double (*)[DIM] où la seconde dimension serait DIM. On ne peut pas avoir en C++ de tableaux à deux dimensions variables. (On peut facilement faire des classes qui se comportent comme tel, mais on a l'air ici de rester dans les fonctions de tellement bas niveau qu'on se demande si on n'est pas dans le groupe du C :-).

    Il se peut que ta fonction d'allocation te retourne un tableau de taille dim*nPts et donc un double*, ou alors qu'elle te retourne bien un double** correctement initialisé.

    je pense que c'est plus des doubles que des unsigned char mais le principe reste le meme. Par contre, je pensais plus que la taille serai le resultat d'un calcul du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     sizeof(double)*dim*nbPts
    car c'est bien un tableau 2 dimensions avec nbPts comme nombre de ligne et nbCoord en nombre de colonne.
    C'est la taille miminale que va allouer la fonction si elle retourne un double*. Si elle retourne un double**, elle doit allouer en plus pour stocker les pointeurs. Donc on arrive à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sizeof(double)*dim*nbPts+sizeof(double*)*dim
    .

    Par contre en prenant ton exemple (avec des doubles a la place des unsigned char) je ne comprends pas a quoi correspond le sizeof(double*)
    tailleMemoire = sizeof(double*) * sizeof(double) * nbPoints * nbCoord ;
    Je ne comprends pas non plus ce calcul.

  5. #5
    Membre chevronné Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par défaut
    faute de frappe y'a une etoile en trop je pense

    XXiemeciel

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 93
    Par défaut
    Pour information complementaire,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TabPoint = AllocTab(int nbPoint, int nbCoord);
    //acces au coordonnée du ième point (considerant dim = 3, le cas le plus courant)
    double x = TabPoint[i][0];
    double y = TabPoint[i][1];
    double z = TabPoint[i][2];
    Voila l'utilisation que j'en fait en retour. Mais a l'interieur de la fonction et des classes, se serai codé en C dans la DLL, ca m'etonnerai qu'a moitié

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 93
    Par défaut
    je remonte ce post car on me demande de calculer la taille mémoire prise.
    Hors pour moi la taille serai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sizeof(double)*dim*nbPts
    car il y a au total dim*nbPts double de stocké

    Mais Jean-Marc.Bourguet indiqué comme taille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sizeof(double)*dim*nbPts+sizeof(double*)*dim
    ce qui fait une différence que j'aimerai comprendre.

    Merci de vos explications, vous etes

    Edit : autre petite question, est ce qu'il existe une fonction en C++ ou avec visual, pour savoir la taille de toute le programme à un moment donné ? Je pense que la réponse est non mais ca coute rien de demander

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 93
    Par défaut
    desole de le upper mais personne n'aurai une petite reponse ?

  9. #9
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut
    Pour la taille en mémoire de tout le programme, ça déoend du système.

    Si tu es sous Windows (je ne me souviens plus), va faire un tour sur msdn, tu seras surpris des fonctionnalitès du sujet

  10. #10
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TabPoint = AllocTab(int nbPoint, int nbCoord); 
    //acces au coordonnée du ième point (considerant dim = 3, le cas le plus courant) 
    double x = TabPoint[i][0]; 
    double y = TabPoint[i][1]; 
    double z = TabPoint[i][2];
    Si ce code est correct et qu'on peut écrire TabPoint[i][0]; alors, la valeur de retour est en double ** ( une déclaration en double (*)[n] impose la deuxième dimension qui a l'air d'être nbcoord donc variable) et il ya un tableau de pointeurs sur double de la taille de la première dimension (soit nbpoint, je suppose). Tu dois d'ailleurs savoir le type de la valeur retournée par AllocTab.
    On a donc un tableau de nbpoint pointeurs sur double occupant
    nbpoint*sizeof(double*)
    plus un ou plusieurs tableaux de double (pour l'instant, on ne peut pas savoir) dont la taille totale est
    nbpoint*nbCoord*sizeof(double)
    Soit un total de
    nbpoint* (sizeof(double*)+nbCoord*sizeof(double))

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 93
    Par défaut
    merci Diogene de tes explications, je viens de comprendre comment calculer la taille grace a toi.

    et merci a Caine aussi, car je ne savais pas qu'il y avait de telles fonctions sous visual et elles vont bien m'aider

    pour vous tous :

    et encore

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Comment calculer la taille d'une base de données ?
    Par say dans le forum Décisions SGBD
    Réponses: 8
    Dernier message: 01/04/2011, 16h48
  2. [XSL] Comment modifier la valeur d'une variable?
    Par sorcer1 dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 17/02/2010, 13h26
  3. Comment vérouiller la taille d'une cellule [HTML]
    Par White_Angel dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 18/04/2005, 14h19
  4. Réponses: 3
    Dernier message: 05/04/2005, 14h36

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