Итак, я программировал для своего 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, о которой я знаю довольно много.
Я чувствую, что кормлю акул с недостаточной защитой, и этот бит в моем коде меня беспокоит.
У меня вопрос: как инициализировать массив, а потом изменить его?
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;
}
pins
— это не указатель на массив, а просто указатель на int
. Он указывает на адрес первого элемента одного из этих двух массивов.
y = pins[3];
Этот пример демонстрирует опасность: если pins = четыре, то pins[3] в порядке, если pins = one, то pins[3 ] делает что-то не так.
pinslen
решает эту проблему? for(int i = 0; i < pinslen; i++);
правильно?
int* pins = nullptr;
не работает. Однако int *pins = 0;
сделал... Это странно. Я набирал последний много раз, но он работает только сейчас. Что ж, это работает, возможно, обновите свой ответ, и я снова отмечу его.
nullptr
— это новое дополнение к C++.
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;
}
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.