2
votes

C ++ Passer un tableau à une fonction et lire ses membres

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;

  1. pourquoi j'obtiens un caractère ASCII étrange à cout .
  2. comment devons-nous gérer le passage d'un tableau à une autre fonction et l'itérer, j'ai beaucoup cherché mais je n'ai trouvé aucune solution


8 commentaires

Il y a une différence entre char c = 1; et char 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 :: array ou std :: 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 en int ?


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.


3 Réponses :


6
votes

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 };


2 commentaires

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.



1
votes

Pour votre premier problème, utilisez:

 int arr_size = sizeof(numbers)/sizeof(numbers[0]);


0 commentaires

3
votes

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é).


0 commentaires