2009-09-03 12 views
2

Il semble que g ++ ignore la différence de taille des tableaux lors du passage d'arrays en tant qu'arguments. C'est-à-dire, ce qui suit compile sans avertissements même avec -Wall.Fonctions acceptant les types de tableaux C/C++

void getarray(int a[500]) 
{ 
    a[0] = 1; 
} 

int main() 
{ 
    int aaa[100]; 
    getarray(aaa); 
} 

Maintenant, je comprends le modèle sous-jacent de passer un pointeur et évidemment je pouvais définir la fonction que getarray(int *a). Je m'attendais, cependant, à ce que gcc émette au moins un avertissement quand j'ai spécifié les tailles de tableau explicitement.

Y a-t-il un moyen de contourner cette limitation? (I guest boost :: array est une solution mais j'ai tellement de vieux code utilisant un tableau de type c qui a été promu en C++ ...)

+0

en double de: http://stackoverflow.com/questions/1328223/sizeof-array- passé-comme-paramètre –

+0

@Richard: la réponse à cette question contient l'indice de celui-ci. La question est cependant différente. Celui-ci concerne la préservation du type. – xtofl

Répondre

10

Les tableaux sont passés comme un pointeur vers leur premier argument. Si la taille est importante, vous devez déclarer la fonction comme void getarray(int (&a)[500]);

L'idiome C est de passer la taille du tableau comme ceci: void getarray (int a [], taille int);
L'idiome C++ utilise std :: vector (ou std :: tr1 :: array plus récemment).

+0

Pouvez-vous expliquer comment fonctionne getarray (int (& a) [500])? – akif

+2

L'utilisation de int a [500] passe juste un pointeur vers un int. L'utilisation de int (& a) [500] passe une référence à un tableau de 500 éléments. Ils sont différents types et le compilateur voit la discordance. En passant, en utilisant int (& a) [500] vous ne pouvez plus passer un tableau alloué avec new int [500]! – rpg

+0

Super! Une technique utile. Le code généré est identique pour autant que je sache. – nimrodm

3

Je seconde what rpg said. Toutefois, au cas où vous voulez appeler la fonction avec des tableaux de toute taille, vous pouvez utiliser un modèle pour le faire:

template< std::size_t N> 
void getarray(int (&a)[N]) 
+0

+1, cela peut être une approche utile, mais sachez que vous ne pouvez plus appeler cette fonction avec un simple 'int *'! –

+0

@j_random_hacker: Je vois cela comme un avantage. – sbi

Questions connexes