dans mon programme c ++, je veux passer un tableau à une fonction et afficher les membres de ce tableau dans la console.
J'ai maintenant deux problèmes:
logger(&numbers)
void logger(unsigned char(*data)[8])
{
for (auto i = 0; i < sizeof(*data); i++)
{
std::cout << *(data[i]) << "\n";
}
}
en passant les nombres à logger défini comme void logger (unsigned char data []) provoque le changement de type en unsigned char * donc il n'y a aucun moyen d'itérer sur le tableau car la taille est inconnue.
mon objectif est également de transmettre des tableaux de toutes tailles, mais en supposant que la taille d'un tableau est toujours de 8, j'ai changé la signature en
int main()
{
unsigned char numbers[8] = { 1,2,3,4,5,6,7,8 };
for (auto i = 0; i < sizeof(numbers); i++)
{
std::cout << numbers[i] << "\n"; // First Problem: Here i get
}
logger(numbers);
}
itération sur données code > a le premier problème et le résultat est ``
donc les questions sont;
cout . 3 Réponses :
Le problème réside dans le contenu de votre tableau:
std::cout << static_cast<int>(numbers[i]) << "\n";
Ceux-ci sont interprétés comme des codes de caractères (à cause du type d'élément du tableau)., pas comme des valeurs littérales. Le mappage de caractères utilisé est très probablement ASCII, et les caractères 1 à 8 ne sont pas imprimables.
Pour obtenir la valeur de caractère représentant 1 , vous devez écrire un littéral de caractère '1' . Si vous avez l'intention de les stocker et de les traiter comme des nombres, vous pouvez soit changer le type du tableau en int [8] , soit les convertir lors de l'impression:
unsigned char numbers[8] = { 1,2,3,4,5,6,7,8 };
Oui, je le sais mais cela fait partie d'un projet plus vaste qui nécessite des nombres à un octet et il n'y a pas d'autre type à utiliser
@ Amir-Mousavi Ma réponse traite également de cela.
Pour votre premier problème, utilisez:
int arr_size = sizeof(numbers)/sizeof(numbers[0]);
Vous ne pouvez pas passer un tableau à une fonction en C ++. Il y a plusieurs manières de contourner cela
1) Utiliser des vecteurs au lieu de tableaux
2) Passer une référence au tableau (cela ne fonctionne qu'avec un tableau de taille fixe)
3) Passez un pointeur vers le premier élément du tableau (cela nécessite que vous passiez la taille en tant que paramètre séparé).
Voici comment faire les trois
1) utiliser des vecteurs p>
unsigned char numbers[8] = { 1,2,3,4,5,6,7,8 };
logger(numbers, 8);
void logger(unsigned char *data, size_t size)
{
for (auto i = 0; i < size; i++)
{
std::cout << (unsigned)data[i] << "\n";
}
}
2) utiliser une référence
unsigned char numbers[8] = { 1,2,3,4,5,6,7,8 };
logger(numbers);
void logger(unsigned char (&data)[8])
{
for (auto i = 0; i < 8; i++)
{
std::cout << (unsigned)data[i] << "\n";
}
}
3) utiliser un pointeur
#include <vector>
std::vector<unsigned char>{1,2,3,4,5,6,7,8}:
logger(numbers);
void logger(const vector<unsigned char>& data)
{
for (auto i = 0; i < data.size(); i++)
{
std::cout << (unsigned)data[i] << "\n";
}
}
Les vecteurs sont la meilleure solution. C ++ a des structures de données appropriées en standard, utilisez-les.
Comme cela a déjà été expliqué, vos problèmes d'impression sont dus aux règles spéciales pour l'impression des caractères, il suffit de convertir en non signé avant l'impression.
Aucun code n'a été testé (ni même compilé).
Il y a une différence entre
char c = 1;etchar c = '1';Que diriez-vous de passer la longueur du tableau comme deuxième paramètre?
C'est l'une des raisons d'utiliser à la place
std :: arrayoustd :: vector. Ou si vous devez utiliser un tableau, passez la taille en argument. Ou utilisez une fonction de modèle de "taille du tableau" .Au fait, avec le pointeur vers la version du tableau que vous avez, alors
* (data [i])est incorrect.@Fureeish Oui je sais mais pour le projet, je dois utiliser char car nous n'avons besoin que d'un octet
Essayez ceci,
std :: cout << + numbers [i] << "\ n";@Eljay Merci beaucoup, cela fonctionne, alors que fait
+? le cast enint?Techniquement, ce n'est pas un casting. La valeur de retour de l'opération du unaire + appliquée à un char, un char non signé ou un char signé est un int.