C ++ Передача массива в функцию и чтение ее членов - PullRequest
0 голосов
/ 04 января 2019

в моей программе на c ++ я хочу передать массив функции и распечатать элементы этого массива на консоли.

Теперь я попал в две проблемы:

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

Передача numbers в logger, определенную как void logger(unsigned char data[]), приводит к изменению типа на unsigned char *, поэтому невозможно выполнить итерацию по массиву, поскольку размер неизвестен.

Моя цель также состоит в том, чтобы передать массивы любого размера, но предполагая, что размер массива всегда равен 8, я изменил сигнатуру на

logger(&numbers)
void logger(unsigned char(*data)[8])
{
  for (auto i = 0; i < sizeof(*data); i++)
  {
    std::cout << *(data[i]) << "\n";
  }
}

повторение по data имеет первую проблему, и вывод ``

так что вопросы;

  1. почему я получаю странный символ ASCII на cout.
  2. как нам поступить, передавая массив другой функции и итерируя по ней, я много искал, но не нашел решения

Ответы [ 4 ]

0 голосов
/ 04 января 2019

Попробуйте, он использует std :: vector и помещает символы в ''

#include <iostream>
#include <vector>

void logger(std::vector<unsigned char>& data)
{
    for (size_t i = 0; i < data.size(); ++i)
    {
        std::cout << data[i] << "\n";
    }
}

int main()
{
    std::vector<unsigned char> numbers { '1','2','3','4','5','6','7','8' };
    for (size_t i = 0; i < numbers.size(); ++i)
    {
        std::cout << numbers[i] << "\n";
    }
    logger(numbers);
}

Я получаю этот вывод:

1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
0 голосов
/ 04 января 2019

Для вашей первой проблемы используйте:

 int arr_size = sizeof(numbers)/sizeof(numbers[0]);
0 голосов
/ 04 января 2019

Вы не можете передать массив функции в C ++. Есть несколько способов обойти это

1) Использовать векторы вместо массивов

2) Передать ссылку на массив (это работает только с массивом фиксированного размера)

3) Передать указатель на первый элемент массива (для этого необходимо передать размер в качестве отдельного параметра).

Вот как вы делаете все три

1) использовать векторы

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

2) используйте ссылку

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) использовать указатель

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

векторы - лучшее решение. C ++ имеет правильные структуры данных в качестве стандарта, используйте их.

Как уже было объяснено, ваши проблемы с печатью связаны со специальными правилами для печати символов, просто приведите их без знака перед печатью.

Ни один код не был протестирован (или даже скомпилирован).

0 голосов
/ 04 января 2019

Проблема заключается в содержимом вашего массива:

unsigned char numbers[8] = { 1,2,3,4,5,6,7,8 };

Они интерпретируются как коды символов (из-за типа элемента массива), а не как буквальные значения. Скорее всего, используется сопоставление символов ASCII, а символы с 1 по 8 не пригодны для печати. ​​

Чтобы получить символьное значение, представляющее 1, вам нужно написать символьный литерал '1'. Если вы намеревались хранить и обрабатывать их как числа, вы можете либо изменить тип массива на int[8], либо привести их при печати:

std::cout << static_cast<int>(numbers[i]) << "\n";

С другой стороны, если вы намеревались использовать символы, вы должны изменить тип на char.


Чтобы решить проблему передачи массивов произвольного размера, либо используйте шаблон и передайте ссылку на std::array, либо просто используйте vector.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...