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 :

Calcul de taille entre 2 pointeurs


Sujet :

C

  1. #1
    Membre éclairé Avatar de Fooshi
    Homme Profil pro
    ICD
    Inscrit en
    Juin 2002
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ICD
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 508
    Par défaut Calcul de taille entre 2 pointeurs
    Bonjour,
    j'ai 2 fonctions qui me calculent 2 pointeurs Read et Write :

    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
    /* Return the Read pointeur */
    void * 
    block_list_get_read( struct block_list_head * head )
    {
    	struct block_list_elem * elem;
    	elem = linked_list_first_as( block_list_elem, head ) + 1;
    	return (void *)((char *) elem + elem->read);
    }
     
    /* Return the Write pointeur */
    void *
    block_list_get_write( struct block_list_head * head )
    {
    	struct block_list_elem * elem;
    	elem = linked_list_last_as( block_list_elem, head ) + 1;
    	return (void *)((char *) elem + elem->write);
    }
    j'aimerais calculer la taille entre les 2 pointeurs (Write - Read)

    j'ai donc cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /* Return the size that can be read */
    unsigned int
    block_list_get_size_read( struct block_list_head * head )
    {
    	if(block_list_get_read(head) < block_list_get_write(head))
    	return (block_list_get_read(head) - block_list_get_write(head));
    	else
    	return 0;
    }
    ce qui me donne comme erreur 'void *' : unknown size
    c'est a dire que la taille du retour n'est pas connue.

    ou serais l'erreur ? merci d'avance car la je bloque

  2. #2
    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
    La différence entre deux pointeurs sur type T donne le nombre d'éléments de type T qui peuvent trouver place dans l'espace mémoire compris entre les deux pointeurs. Elle ne donne pas la différence en nombre de bytes.
    Tes pointeurs étant des void* , le type T est inconnu et la différence ne peut donc être calculée. Il faut transtyper les deux pointeurs.

  3. #3
    Membre éclairé Avatar de Fooshi
    Homme Profil pro
    ICD
    Inscrit en
    Juin 2002
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ICD
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 508
    Par défaut
    en les castant comme ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /* Return the size that can be read */
    unsigned int
    block_list_get_size_read( struct block_list_head * head )
    {
    	if(block_list_get_read(head) < block_list_get_write(head))
    	return ((unsigned int)block_list_get_read(head) - (unsigned int)block_list_get_write(head));
    	else
    	return 0;
    }

  4. #4
    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
    	return ((unsigned int *)block_list_get_read(head) - (unsigned int *)block_list_get_write(head));
    Si tu veux le nombre d'unsigned int, bien sûr.

  5. #5
    Membre éclairé Avatar de Fooshi
    Homme Profil pro
    ICD
    Inscrit en
    Juin 2002
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ICD
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 508
    Par défaut
    Pour retourner la taille en octet dans un unsigned int la syntaxe suivante est elle bonne ? car j'aimerais retourner la taille en octet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /// Return the size that can be read
    unsigned int
    block_list_get_size_read( struct block_list_head * head )
    {
    	if( block_list_get_read(head) < block_list_get_write(head) )
    	{
    		struct block_list_elem * elem;
    		elem = linked_list_first_as( block_list_elem, head ) + 1;
    		return ((unsigned int)((char *)(elem + elem->write) - (char *)(elem + elem->read)));
    	}
    	else
    	return 0;
    }

  6. #6
    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
    C'est difficile de répondre, puisqu'on ne connait pas le détail des définitions des types (elem ?) et ce que représentent certaines valeurs (elem->read, elem->write : nombre de bytes ou nombre d'autre chose ?)

    Entre les différents messages, il y a une disparité qui ne semble pas normale et cohérente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    return ((unsigned int)((char *)(elem + elem->write) - (char *)(elem + elem->read)));
    ....
    return (void *)((char *) elem + elem->read);
    return (void *)((char *) elem + elem->write);

    le transtypage en char * doit-il être sur elem ou sur (elem + elem->write) et (elem + elem->read) ?

  7. #7
    Membre éclairé Avatar de Fooshi
    Homme Profil pro
    ICD
    Inscrit en
    Juin 2002
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ICD
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 508
    Par défaut
    finalement j'ai resolu mon probleme . merci

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

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. calculer l'espace entre 2 <hr>
    Par pmartin8 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 01/12/2005, 18h12
  3. Calculer la taille d'un texte dans un DC
    Par vanitom dans le forum MFC
    Réponses: 9
    Dernier message: 28/10/2005, 15h32
  4. Calculer la taille d'une image
    Par bigourson dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 05/09/2005, 11h22
  5. Calculer une duree entre 2 dates
    Par d.w.d dans le forum C++
    Réponses: 7
    Dernier message: 02/03/2005, 22h39

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