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'un tableau pointé dans un tableau


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2006
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2006
    Messages : 245
    Par défaut Taille d'un tableau pointé dans un tableau
    Bonjour à tous,

    Ce problème me semble très facile, et pourtant, je suis perdu...

    Mon compilateur ne peut accepter les tableaux de plus de 4ko.
    Or j'ai un tableau TooBigArray qui en fait 5...
    Donc, je coupe mon tableau en deux parties de moins de 4ko, et crée un tableau supplémentaire (GlobalArray) qui contient les adresses des deux tableaux (Array1 et Array2).
    Comme mes tableaux ont une signification, je ne veux pas les couper n'importe où, et je n'ai pas du tout envie de compter la taille à la main.

    Une callback traite les 5ko, en prenant des bouts de 100 octets continus de ce tableau TooBigArray(devenu imaginaire).

    L'idée est donc de regarder la taille des tableaux Array1 et Array2 avec un petit sizeof(Array1) par exemple pour savoir dans quel tableau je suis, si les 100 octets demandés sont à cheval sur les deux tableaux, ...
    Le problème, c'est que sizeof(GlobalArray[0]) me rend 1...
    Or pour moi, GlobalArray[0] contient Array1.

    Voici le code :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    static const unsigned char const Array1[] = {
    //	17,
    	OBJECT_ID(DTM_WELCOME), 1,
    		230, MG_WORD(4000), 1, 0, 
    		MG_WORD(3000), MG_WORD(0), MG_WORD(456), 
    	OBJECT_ID(DTM_SPYPAGE1), 1,
    		230, MG_WORD(4001), 7, 0, 
    		MG_WORD(3001), MG_WORD(0), MG_WORD(0), 
    		MG_WORD(3000), MG_WORD(0), MG_WORD(456), 
    		MG_WORD(11000), MG_WORD(438), MG_WORD(4), 
    		MG_WORD(3002), MG_WORD(0), MG_WORD(50), 
    		MG_WORD(3003), MG_WORD(0), MG_WORD(74), 
    		MG_WORD(3004), MG_WORD(0), MG_WORD(98), 
    		MG_WORD(3005), MG_WORD(0), MG_WORD(122)
    };
    static const unsigned char const Array2[] = {
    	OBJECT_ID(SFK_SPYMOD), 5,
    		7, 3, 1, 0, 
    		MG_WORD(21009), MG_WORD(10), MG_WORD(24), 
    	OBJECT_ID(SFK_UNDEFINED), 5,
    		7, 1, 1, 0, 
    		MG_WORD(21005), MG_WORD(38), MG_WORD(38), 
    	OBJECT_ID(SFK_HOME), 5,
    		7, 2, 0, 0, 
    	OBJECT_ID(SFK_TRACTOR), 5,
    		1, 1, 1, 0, 
    		MG_WORD(21006), MG_WORD(6), MG_WORD(23), 
    	OBJECT_ID(SFK_STOP), 5,
    		1, 4, 1, 0, 
    		MG_WORD(21001), MG_WORD(0), MG_WORD(0), 
    	OBJECT_ID(BMP_WSET_IBIO), 20,
    		MG_WORD(68), MG_WORD(68), MG_WORD(34), 0, 0, 1, MG_LONG(306), 0, 
    		255, 255, 255, 255, 255, 255, 255, 255, 248, 255, 
    		255, 255, 252, 0, 0, 31, 255, 248, 255, 255, 
    		255, 243, 255, 255, 227, 255, 248, 255, 255, 255, 
    		207, 255, 255, 252, 127, 248, 255, 255, 255, 63, 
    		255, 255, 255, 143, 248, 255, 255, 254, 255, 255, 
    		255, 255, 243, 248, 255, 255, 253, 255, 255, 255, 
    		255, 252, 248, 255, 255, 251, 255, 255, 255, 255, 
    		255, 120, 255, 255, 247, 255, 255, 255, 255, 255, 
    		184, 255, 255, 239, 255, 255, 255, 255, 255, 184, 
    		255, 255, 223, 255, 255, 255, 255, 255, 184, 255, 
    		255, 191, 255, 255, 255, 255, 255, 184, 255, 255, 
    		127, 255, 255, 255, 255, 255, 176, 255, 255, 127, 
    		255, 224, 0, 0, 0, 48, 255, 255, 127, 255, 
    		255, 255, 255, 255, 176, 255, 255, 128, 15, 255, 
    		255, 255, 255, 176, 255, 255, 192, 15, 255, 255, 
    		255, 254, 112, 255, 255, 192, 31, 255, 255, 255, 
    		225, 240, 255, 255, 0, 15, 255, 255, 254, 31, 
    		240, 255, 252, 0, 0, 0, 0, 1, 255, 240, 
    		255, 240, 0, 0, 0, 31, 224, 255, 240, 255, 
    		192, 63, 224, 0, 48, 48, 127, 240, 255, 0, 
    		255, 240, 0, 96, 24, 127, 240, 252, 3, 255, 
    		248, 0, 207, 204, 127, 240, 192, 15, 255, 240, 
    		1, 159, 230, 127, 240, 128, 63, 255, 224, 3, 
    		56, 115, 255, 240, 240, 255, 255, 192, 7, 48, 
    		51, 255, 240, 255, 255, 255, 0, 7, 51, 51, 
    		255, 240, 255, 255, 254, 0, 7, 48, 51, 255, 
    		240, 255, 255, 252, 64, 15, 56, 115, 255, 240, 
    		255, 255, 252, 224, 63, 159, 231, 255, 240, 255, 
    		255, 254, 67, 255, 207, 207, 255, 240, 255, 255, 
    		255, 7, 255, 224, 31, 255, 240, 255, 255, 255, 
    		255, 255, 240, 63, 255, 240
    };
     
    const unsigned char * const GlobalArray[] =
    {
    		Array1,
    		Array2
    };
    Comment donc obtenir la taille de mes tableaux ?
    Merci d'avance pour vos réponses

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    sizeof donne la taille du tableau seulement si il est déclaré de cette façon : Type tab[nombre];Dans le cas contraire, il renverra la taille du pointeur pointant sur le premier élément stocké.

    Pour avoir la taille du tableau, trois solutions :
    - que le dernier élément ait une valeur spécifique (ex : 0, -1, ...) et compter le nombre d'élément.
    - créer une structure contenant le tableau et la taille du tableau
    - créer une structure contenant un pointeur vers le premier élément (p1) et un vers le dernier élément (p2) , le nombre d'élément est donc p2 - p1.

    Sinon tu peux utiliser des tableaux beaucoup plus grand avec malloc (ne pas oublier le free quand le tableau ne sert plus).

  3. #3
    Membre éclairé
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2006
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2006
    Messages : 245
    Par défaut
    Merci pour ta réponse.
    Je vais implémenter la dernière solution, qui au vu de mes contraintes (toutes les valeurs sont prises, je ne veux pas lire à la main la taille) est la meilleure solution.

  4. #4
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 91
    Par défaut
    Bonjour,

    Citation Envoyé par jacklafrip Voir le message
    Merci pour ta réponse.
    Je vais implémenter la dernière solution, qui au vu de mes contraintes (toutes les valeurs sont prises, je ne veux pas lire à la main la taille) est la meilleure solution.
    Au passage, selon la norme C99, tu ne peux récupérer de manière sûre le résultat de p2 - p1 que dans un objet de type ptrdiff_t défini dans stddef.h.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <stddef.h>
     
    ptrdiff_t taille = p2 - p1;

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Petite question au passage : quelle utilité de déclarer un tableau comme const puisqu'il ne peut pas être une lvalue ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        int toto1[10] = {1,1,1,1,1,0};
        int toto2[10] = {0};
     
        toto1 = toto2;
    Ne compile pour cause de conflicting types. Un const donne une erreur plus "explicite", mais à part ça ?


    Le problème, c'est que sizeof(GlobalArray[0]) me rend 1...
    Or pour moi, GlobalArray[0] contient Array1.
    GlobalArray ne contient pas les tableaux mais des pointeurs vers leurs premiers éléments. C'est cohérent avec le type donné à ce tableau GlobalArray d'ailleurs.

  6. #6
    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 Bktero Voir le message
    Petite question au passage : quelle utilité de déclarer un tableau comme const puisqu'il ne peut pas être une lvalue ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        int toto1[10] = {1,1,1,1,1,0};
        int toto2[10] = {0};
     
        toto1 = toto2;
    Ne compile pour cause de conflicting types. Un const donne une erreur plus "explicite", mais à part ça ?
    On ne peut pas declarer un tableau const -- la syntaxe si c'etait possible serait quelque chose comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int tab const [10];
    ce qui n'est pas possible. Mais on peut definir un tableau de valeur constantes. Et l'effet est d'interdire de modifier ces valeurs, meme avec un


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

Discussions similaires

  1. Réponses: 7
    Dernier message: 23/06/2008, 11h50
  2. [Tableaux] Tableau associatif dans un tableau numéroté
    Par laloupiote dans le forum Langage
    Réponses: 4
    Dernier message: 27/03/2007, 12h15
  3. [CSS] Taille d'une boite DIV dans un tableau
    Par Seth77 dans le forum Mise en page CSS
    Réponses: 7
    Dernier message: 14/06/2006, 19h17
  4. [tableau]Valeur dans un tableau
    Par kisscool31 dans le forum Collection et Stream
    Réponses: 30
    Dernier message: 17/05/2005, 09h45

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