Addition sur pointeurs

Résolu
CCJ Messages postés 565 Date d'inscription mercredi 19 mai 2004 Statut Membre Dernière intervention 30 avril 2008 - 30 avril 2008 à 13:16
CCJ Messages postés 565 Date d'inscription mercredi 19 mai 2004 Statut Membre Dernière intervention 30 avril 2008 - 30 avril 2008 à 14:33
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

SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
30 avril 2008 à 13:52
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++ (@++)<!--
3
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
30 avril 2008 à 14:04
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++ (@++)<!--
3
CCJ Messages postés 565 Date d'inscription mercredi 19 mai 2004 Statut Membre Dernière intervention 30 avril 2008 1
30 avril 2008 à 13:55
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
0
CCJ Messages postés 565 Date d'inscription mercredi 19 mai 2004 Statut Membre Dernière intervention 30 avril 2008 1
30 avril 2008 à 14:10
OK merci encore
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
CCJ Messages postés 565 Date d'inscription mercredi 19 mai 2004 Statut Membre Dernière intervention 30 avril 2008 1
30 avril 2008 à 14:33
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
0