Итак, я программировал для своего Arduino, который является вариантом C ++. Я написал программу, чтобы отмечать каждое число на 4-значном семисегментном дисплее. У меня возникли проблемы с установкой контактов [] на разные массивы разной длины.

Например, отображение одного означает, что 2 контакта будут включены, что выражается в массиве int one[] = {1,2};, а отображение четырех занимает четыре контакта int four[] = {1,2,3,4};.

Я пробовал:

int pins[] = null;
int one[] = {1,2};
int four[] = {1,2,3,4};
switch(num) {
    case 1: pins = one; break;
    case 4: pins = four; break;
}

Однако это вызывает проблемы и не позволяет мне загружать его, потому что везде просто ломается.

У меня ограниченные знания о C ++, только то, что он похож на Java, о которой я знаю довольно много.

Я чувствую, что кормлю акул с недостаточной защитой, и этот бит в моем коде меня беспокоит.

У меня вопрос: как инициализировать массив, а потом изменить его?

1
TheBrenny 3 Авг 2014 в 06:02

2 ответа

Лучший ответ

Как написано, это не скомпилируется, потому что pins не имеет определенного размера и присвоение массива другому массиву другого размера не допускается. Однако вы можете использовать указатель на массив, чтобы добиться того, что вы пытаетесь сделать:

int one[] = {1,2};
int four[] = {1,2,3,4};
int* pins = nullptr; // use NULL if your compiler doesn't support C++11.
size_t pinslen = 0;

switch (num) {
case 1:
    pins = one;
    pinslen = sizeof one;
    break;
case 4:
    pins = four;
    pinslen = sizeof four;
    break;
}
5
user3553031 3 Авг 2014 в 04:46

int one[] = {1,2};, int four[] = {1,2,3,4}; не одного типа, у нас есть int one[2] и int four[4]. Они оба могут распасться до int*, но вы теряете информацию о размере и должны оставить размер самостоятельно.

Есть возможность использовать std::vector следующим образом:

std::vector<int> one = {1, 2};
std::vector<int> four = {1, 2, 3, 4};
std::vector<int>* pins = nullptr;
switch (num) {
    case 1: pins = &one; break;
    case 4: pins = &four; break;
}

А для C ++ 03:

const int c_one[] = {1, 2};
const int c_four[] = {1, 2, 3, 4};
std::vector<int> one(c_one, c_one + 2);
std::vector<int> four(c_four, c_four + 4);
std::vector<int>* pins = 0;// or NULL
switch (num) {
    case 1: pins = &one; break;
    case 4: pins = &four; break;
}

В качестве альтернативы вы можете скопировать контакты и не использовать указатель, например:

const int one[] = {1, 2};
const int four[] = {1, 2, 3, 4};
std::vector<int> pins;
switch (num) {
    case 1: pins.assign(one, one + 2); break;
    case 4: pins.assign(four, four + 4); break;
}
1
Jarod42 3 Авг 2014 в 08:07