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 :

taille d'objet générique


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    Collégien
    Inscrit en
    Mars 2003
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Mars 2003
    Messages : 192
    Points : 87
    Points
    87
    Par défaut taille d'objet générique
    salut,


    comment dans un module supposé générique peut-on retrouver la taille d'un objet utilisateur ?

    par exemple des fonctions comme qsort nécessitent la taille des éléments a trier, ou encore fread() etc...

    par exemple disons que j'ai du coté utilisateur un tableau de double, dans mon module générique les double seront pointés par des void*, seulement comment faire pour savoir que ce sont des double ?

    pour exemple ce programme :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(void)
    {
       double a = 4;
     
       void *p;
       p = &a;
     
       printf("sizeof(double) = %d\n",sizeof(double));
       printf("sizeof(a) = %d\n",sizeof(a));
       printf("sizeof(*p) = %d\n",sizeof(*p));
     
     
       return 0;
    }

    qui sans surprise m'affiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sizeof(double) = 8
    sizeof(a) = 8
    sizeof(*p) = 1

    et comme coté module je n'ai que '*p' sous la main, impossible de savoir que mes éléments font '8' en taille, ce qui est la source de nombreux disfonctionnements...

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: taille d'objet générique
    Citation Envoyé par Heimdall
    comment dans un module supposé générique peut-on retrouver la taille d'un objet utilisateur ?
    On la lui fournit.

    http://emmanuel-delahaye.developpez.com/clib.htm
    Module OBJ

    par exemple des fonctions comme qsort nécessitent la taille des éléments a trier, ou encore fread() etc...
    pour ces deux fonctions, il ya a un parametre "nombre d'élements du tableau" et un parametre "taille d'un élément"
    par exemple disons que j'ai du coté utilisateur un tableau de double, dans mon module générique les double seront pointés par des void*, seulement comment faire pour savoir que ce sont des double ?
    On ne le sait pas. On ne connais que l'adresse et la taille. On ne connait pas le type. C'est pour ça que dans qsort(), la fonction qui a besoin de connaitre le type est fournie par l'utilisateur (callback), par lui, il connait le type.

    pour exemple ce programme :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(void)
    {
       double a = 4;
     
       void *p;
       p = &a;
     
       printf("sizeof(double) = %d\n",sizeof(double));
       printf("sizeof(a) = %d\n",sizeof(a));
       printf("sizeof(*p) = %d\n",sizeof(*p));
     
     
       return 0;
    }
    qui sans surprise m'affiche :
    Pour moi, la surprise, c'est qu'il compile.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Compiling MAIN.C:
    Error MAIN.C 14: Not an allowed type
    Error MAIN.C 14: Not an allowed type
    Warning MAIN.C 18: 'p' is assigned a value that is never used
    Reessaye en mode ANSI strict, parce que ça ressemble à une extension bien connue de gcc qui attribue 1 à sizeof (void), ce qui est contraire aux regles du langage C.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sizeof(double) = 8
    sizeof(a) = 8
    sizeof(*p) = 1
    et comme coté module je n'ai que '*p' sous la main, impossible de savoir que mes éléments font '8' en taille, ce qui est la source de nombreux disfonctionnements...
    C'est une question de domaine. Regarde bien comment est utilisé qsort().

    On passe l'adresse et les tailles à la fonction.
    Le callback passe les adresses. C'est l'utilisateur qui connait les types (et donc les tailles)

    Il faut travailler en couches 'domaines' :
    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
     
                     qsort(..., compare);                     
                        |                     -------------------
                        |                    | compare()         |
                        |                     -------------------
                        |                    | ...               |
                        |                     -------------------
    Application         |                            ^
    --------------------|----------------------------|---------
    Bibliothèque        |                            |
                        v                            |
                      ---------------------------    |
                     | qsort(..., pf_compare)    |   |
                      ---------------------------    |
                     | ...                       |   |
                     | (*pf_compare)(...);       | --
                     | ...                       |
                      ---------------------------

  3. #3
    Membre régulier
    Homme Profil pro
    Collégien
    Inscrit en
    Mars 2003
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Mars 2003
    Messages : 192
    Points : 87
    Points
    87
    Par défaut Re: taille d'objet générique
    Citation Envoyé par Emmanuel Delahaye

    http://emmanuel-delahaye.developpez.com/clib.htm
    Module OBJ
    ok, un brin trop abstrait/compliqué pour moi :-)
    On ne le sait pas. On ne connais que l'adresse et la taille. On ne connait pas le type. C'est pour ça que dans qsort(), la fonction qui a besoin de connaitre le type est fournie par l'utilisateur (callback), par lui, il connait le type.

    ah oui ok, bon voyant vite fait ton code OBJ, il est vrai que la 'taille' est un paramètre de l'objet et par conséquent devrait faire partie d'un module abstrait sensé le représenter, comme tu l'a fait. Cependant j'ai aps envie de me casser à faire ce genre de trucs un brin compliqué et pas vraiment utile pour moi en ce moment, étant donné que mes listes sont sensées êtres utilisées pour y stocker des nombres.


    Pour moi, la surprise, c'est qu'il compile.
    [code]Compiling MAIN.C:
    Error MAIN.C 14: Not an allowed type
    Error MAIN.C 14: Not an allowed type
    Warning MAIN.C 18: 'p' is assigned a value that is never used


    Reessaye en mode ANSI strict, parce que ça ressemble à une extension bien connue de gcc qui attribue 1 à sizeof (void), ce qui est contraire aux regles du langage C.
    je sais pas quoi dire... j'ai pourtant dis à devc++ de respecter le C ansi, d'ailleurs dans la commande de compil je vois '-ansi'


    C'est une question de domaine. Regarde bien comment est utilisé qsort().

    On passe l'adresse et les tailles à la fonction.
    Le callback passe les adresses. C'est l'utilisateur qui connait les types (et donc les tailles)
    ok je comprends. J'avance... pas encore fini mais pas loin : http://nicolas.aunai.free.fr/particule/vect/ je me suis inspiré de ton site pour la présentation d'ailleurs ;-)

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: taille d'objet générique
    Citation Envoyé par Heimdall
    http://nicolas.aunai.free.fr/particule/vect/ je me suis inspiré de ton site pour la présentation d'ailleurs ;-)
    Je vois ça! Ca fait plaisir.

    Attention à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #ifndef _LIST_H
    #define _LIST_H_
    Tu ne respecte pas mes conventions :

    http://emmanuel-delahaye.developpez.com/codage.htm#nommage

    libre à toi, mais tu brises une regle du C qui dit que les identificateurs commençant par '_' suivit de '_' ou 'A'..'Z' sont réservés pour l'implémentation. A ta place, je ne pourrais plus dormir!

  5. #5
    Membre régulier
    Homme Profil pro
    Collégien
    Inscrit en
    Mars 2003
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Mars 2003
    Messages : 192
    Points : 87
    Points
    87
    Par défaut Re: taille d'objet générique
    Citation Envoyé par Emmanuel Delahaye
    Je vois ça! Ca fait plaisir.
    ton site rassemble les exemples de rigueur absolue, peut-etre même trop d'ailleurs, que j'ai commencé à connaitre sur fclc et sur ce point c'est bien.
    M'enfin je te soupçonne de t'avoir fait des log qui te préparent tous tes trucs genre fichiers etc.... parce que sinon c'est vrai que c'est chiant. m'enfin ça permet d'etre lisible (RElisible surtout)

    pendant qu'on parle de ton site, un truc à signaler, je trouve assez emmerdant la petite "infobulle" qui se trimballe sous le curseur tout le temps pour répéter le titre de la page.. ça cache constamment ce qu'on lis... m'enfin c'est un avis perso ;-)

    Attention à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #ifndef _LIST_H
    #define _LIST_H_
    Tu ne respecte pas mes conventions :

    http://emmanuel-delahaye.developpez....ge.htm#nommage

    libre à toi, mais tu brises une regle du C qui dit que les identificateurs commençant par '_' suivit de '_' ou 'A'..'Z' sont réservés pour l'implémentation. A ta place, je ne pourrais plus dormir!

    ah euh ouais... mais quand je vois ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    H_ED_EXEMPLE_20040529115235
    j'ai peur...

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: taille d'objet générique
    Citation Envoyé par Heimdall
    ton site montre un exemple de rigueur absolue, peut-etre même trop d'ailleurs, m'enfin je te soupçonne de t'avoir fait des log qui te préparent tous tes trucs genre fichiers etc....
    J'ai effectivement écrit un générateur de code qui à partir de 'xxx' construit xxx.c, xxx.h et txxx.c (le fichier de test unitaire), avec entête, datation automatique, protection, organisation, structures, prototypes, etc. Vive le C, bien que c'est sûrement plus facile à faire en d'autres langages que je ne connais pas...
    pendant qu'on parle de ton site, un truc à signaler, je trouve assez emmerdant la petite "infobulle" qui se trimballe sous le curseur tout le temps pour répéter le titre de la page.. ça cache constamment ce qu'on lis... m'enfin c'est un avis perso ;-)
    Euh, ok, je vais voir ça... Je ne suis pas trop sûr de savoir la retirer... Le HTML, je débute, et franchement, ça ne me passione pas!
    <...>mais quand je vois ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    H_ED_EXEMPLE_20040529115235
    j'ai peur...
    Arf! Pareil c'est de la génération automatique.

    H : header (pour être sûr de ne pas commencer par E qui est réservé pour les codes d'erreur : ERANGE etc.)
    ED : c'est moi!
    EXEMPLE : sans commentaires...
    20040529115235 = Le 2004/04/05 à 11:52:35

    Mais tu peux mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #ifndef H_LIST
    #define H_LIST
    et tout le monde est content.

    D'ailleurs, il y avait une erreur dans ton code qui fait que la protection ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #ifndef _LIST_H
    #define _LIST_H_
    Les deux identificateurs doivent être strictement identiques, or ici, il y a un '_' qui traine...

  7. #7
    Membre régulier
    Homme Profil pro
    Collégien
    Inscrit en
    Mars 2003
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Mars 2003
    Messages : 192
    Points : 87
    Points
    87
    Par défaut Re: taille d'objet générique
    Citation Envoyé par Emmanuel Delahaye
    J'ai effectivement écrit un générateur de code qui à partir de 'xxx' construit xxx.c, xxx.h et txxx.c (le fichier de test unitaire), avec entête, datation automatique, protection, organisation, structures, prototypes, etc. Vive le C, bien que c'est sûrement plus facile à faire en d'autres langages que je ne connais pas...
    ahaha oui j'en étais sûr :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     /* File generated by 'NEW.EXE' Ver 1.10 (c) ED 1998 */
    en parlant de tests unitaires, il serait aussi intéressant de voir une page explicant les démarches rigoureuses de tests d'un module en C dans tes pages... justement je cherche à en fait un pour mes 'list' et 'vect' cependant je ne vois pas trop par où commencer pour faire un truc béton.

    Euh, ok, je vais voir ça... Je ne suis pas trop sûr de savoir la retirer... Le HTML, je débute, et franchement, ça ne me passione pas!
    le coté intéressant dans la conception web c'est le côté respect de la norme w3c je trouve. Les CSS permettent de faire des choses fantastiques...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    H_ED_EXEMPLE_20040529115235
    Arf! Pareil c'est de la génération automatique.
    je m'en serai bien douté.

    H : header (pour être sûr de ne pas commencer par E qui est réservé pour les codes d'erreur : ERANGE etc.)
    ED : c'est moi!
    EXEMPLE : sans commentaires...
    20040529115235 = Le 2004/04/05 à 11:52:35
    oui oui j'avais vu l'explication, c'est un peu barbare quand même ;-)

    Mais tu peux mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #ifndef H_LIST
    #define H_LIST
    et tout le monde est content.

    D'ailleurs, il y avait une erreur dans ton code qui fait que la protection ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #ifndef _LIST_H
    #define _LIST_H_
    Les deux identificateurs doivent être strictement identiques, or ici, il y a un '_' qui traine...

    AH merci, une boulette que j'avais pas vu !

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: taille d'objet générique
    Citation Envoyé par Heimdall
    en parlant de tests unitaires, il serait aussi intéressant de voir une page explicant les démarches rigoureuses de tests d'un module en C dans tes pages... justement je cherche à en fait un pour mes 'list' et 'vect' cependant je ne vois pas trop par où commencer pour faire un truc béton.
    Ok, Je vais y refléchir.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    H_ED_EXEMPLE_20040529115235
    oui oui j'avais vu l'explication, c'est un peu barbare quand même ;-)
    Tes jugements de valeur à l'emporte-pièce m'étonneront toujours...

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

Discussions similaires

  1. Utilitaire pour obtenir la taille des objets Access
    Par =JBO= dans le forum Contribuez
    Réponses: 14
    Dernier message: 19/08/2023, 19h22
  2. [WCF] Limitation dans la taille des objets
    Par dev01 dans le forum Windows Communication Foundation
    Réponses: 3
    Dernier message: 30/08/2012, 08h18
  3. taille des objets en java
    Par tarik1099 dans le forum Langage
    Réponses: 2
    Dernier message: 26/05/2007, 20h59
  4. [FLASH 8] Taille des objets et zoom
    Par Yukio dans le forum Flash
    Réponses: 2
    Dernier message: 27/09/2005, 05h36
  5. [VB6] Taille d'objet en mémoire
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 01/01/2004, 16h23

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