Addition sur pointeurs [Résolu]

Signaler
Messages postés
565
Date d'inscription
mercredi 19 mai 2004
Statut
Membre
Dernière intervention
30 avril 2008
-
Messages postés
565
Date d'inscription
mercredi 19 mai 2004
Statut
Membre
Dernière intervention
30 avril 2008
-
Bonjour.
Je cherche actuellement a determiner la taille d'un tableau. J'ai donc ecrit le petit bout de code suivant :

template <class T> long SizeofArray(T * data)
{
    long reg;
    reg = 0;
    while(*data != 0)
    {
        data += sizeof(T);
        reg++;
    }
    return reg;
}

J'ai testé avec des chaines de type char de la maniere suivante :

char msg[] = "<HTML>En construction</HTML>";
std::cout << "Taille : " << SizeofArray<char>(msg) << std::endl;

Pas de probleme cela me retourne bien 28.
Cependant lors d'un test similaire avec un tableau d'entier quelques problemes sont apparut

int test[6];
test[0]=123;
test[1]=456;
test[2]=789;
test[3]=741;
test[4]=852;
test[5]=963;

std::cout << "Taille : " << SizeofArray(test) << std::endl;

La le resultat est aleatoire.
J'ai constaté que , avec des char, l'addtion de l'adresse du premier element avec la taille fonctionne correctement mais avec des int , au lieu d'ajouter la taille qui est de 4 oct, cette fonction ajoute 16 , ce qui decale forcement tout et finit par faire pointer data en dehors de la variable.

Voici un exemple de ce que j'obtiens :

Resultat pratique (nombre de decalage: addresse pointée) :
0: 0xbfa367c0
1: 0xbfa367d0
2: 0xbfa367e0
3: 0xbfa367f0
4: 0xbfa36800

resultat théorique (nombre de decalage: addresse pointée):
0: 0xbfa367c0
1: 0xbfa367c4
2: 0xbfa367c8
3: 0xbfa367cc
4: 0xbfa367d0

S'il vous plait !

Si l'informatique été de l'alcool il y aurait des genies partout

5 réponses

Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
Bien sûr que ça fonctionne avec une chaine de caractère. Une chaine de caractère se termine par un 0 de fin de chaine.
Cependant, un tableau de int (ou BYTE ou DWORD etc.) NE PEUT se terminer par une quelconque valeur puisque, justement, il peut toutes les prendre. Un 0 peut très bien se situer en plein milleu du tableau.

Il est impossible de déterminer la longueur d'un tableau (sauf une chaine de caractère) à partir d'un pointeur

C++ (@++)<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
Non. On peut faire un sizeof cependant, il retournera la taille total du tableau (sur un tableau seulement, pas sur un pointeur) et non la taille du nombre d'éléments "présents" (car justement, il est impossible de déterminer si une case a une valeur ou non).

C++ (@++)<!--
Messages postés
565
Date d'inscription
mercredi 19 mai 2004
Statut
Membre
Dernière intervention
30 avril 2008
1
Ok merci beaucoup :)
Petite question au passage , si on ne peut pas avec un pointeur , on peut autrement ?

Si l'informatique été de l'alcool il y aurait des genies partout
Messages postés
565
Date d'inscription
mercredi 19 mai 2004
Statut
Membre
Dernière intervention
30 avril 2008
1
OK merci encore
Messages postés
565
Date d'inscription
mercredi 19 mai 2004
Statut
Membre
Dernière intervention
30 avril 2008
1
Ah mais quel boulet suis-je ><.
Le probleme de debordement en question (16 au lieu de 4) vennai de fait que l'incrementation de pointeur prend en compte le type de pointeur ...

Voila deux problemes , deux solutions :O

Si l'informatique été de l'alcool il y aurait des genies partout