Чудеса с массивами
- Войдите на сайт для отправки комментариев
Пнд, 22/02/2016 - 10:57
Здравствуйте!
Вопрос не могу разобрать один. Код следующий:
byte i; byte MainSet[3] = {13, 0, 3}; // {1 параметр по х, 2й пар-р по х(плюсом к первому), сколько строк на экране} byte PressSet[3] = {13, 0, 3}; byte PresetSet[3] = {7, 15, 3}; //Ссылки на массивы byte* Sets[3] = { &MainSet[3], &PressSet[3], &PresetSet[3], }; void setup() { Serial.begin(9600); } void loop() { //выводим элементы всех массивов for (i = 0; i <= 3; i++) { Serial.print("Sets #"); Serial.print(i); Serial.println(" : "); Serial.print(Sets[i][0]); Serial.print(" "); Serial.print(Sets[i][1]); Serial.print(" "); Serial.print(Sets[i][2]); Serial.println(" "); } } delay(5000); }
так вот, почему то первые два массивавыводятся нормально, как и задано, а третий выводит непонятную ерунду.
цифры с потолка. Что я упускаю?
строка 8, запятая зачем после 3 массива?
строка 8, запятая зачем после 3 массива?
Это на его вопрос не влияет.
так вот, почему то первые два массивавыводятся нормально, как и задано
Это случайность. Сделайте первые два массива разными и убедитесь, что это не так.
Теперь по-поводу кода.
1. Позвольте выразить сомнение в том, что это вообще компилируется - у Вас разбаллансированы фигурные скобки. Скобка в строке 27 явно лишняя.
2. Что Вы имели в виду, когда писали "&MainSet[3]" в строке 8? Не знаю, чего Вы хотели, но то, что написано означает "начало массива PressSet" (т.к. Вы берёте адрес следующий за массиовм MainSet). Если Вам нужно написать адреса своих массивов, так не мудрите и пишите
byte* Sets[3] = { MainSet, PressSet, PresetSet };
3. Дальше. Что делает "<=" в строке 17? У Вас сколько элементов? 3? С номерами 0, 1 и 2. Так нафига Вам там равенство? Пишите просто "<"
Попробуйте.
строка 8, запятая зачем после 3 массива?
это случайно. Там до этого еще один элемент был
так вот, почему то первые два массивавыводятся нормально, как и задано
Это случайность. Сделайте первые два массива разными и убедитесь, что это не так.
Теперь по-поводу кода.
1. Позвольте выразить сомнение в том, что это вообще компилируется - у Вас разбаллансированы фигурные скобки. Скобка в строке 27 явно лишняя.
2. Что Вы имели в виду, когда писали "&MainSet[3]" в строке 8? Не знаю, чего Вы хотели, но то, что написано означает "начало массива PressSet" (т.к. Вы берёте адрес следующий за массиовм MainSet). Если Вам нужно написать адреса своих массивов, так не мудрите и пишите
byte* Sets[3] = { MainSet, PressSet, PresetSet };
3. Дальше. Что делает "<=" в строке 17? У Вас сколько элементов? 3? С номерами 0, 1 и 2. Так нафига Вам там равенство? Пишите просто "<"
Попробуйте.
В строке 27 скобка закрывает for. знак & я использовал как указатель на массив. Разве это неправильно?
Сейчас попробую.
Спасибо всем.
замена строки:
byte* Sets[3] = {&MainSet, &PressSet, &PresetSet};
на byte* Sets[3] = {MainSet, PressSet, PresetSet};
помогла.
Объясните пожалуйста, что здесь написано? Я пытаюсь разобраться с указателями и ссылками. Но не до конца понимаю пока.
В строке 27 скобка закрывает for. знак & я использовал как указатель на массив. Разве это неправильно?
А что делает скобка в строке 28? Закрывает loop()? Ладно, а что тогда делает скобка в строке 30?
У Вас количество открывающих скобок не равно количеству закрывающих - это не может компилироваться. Код руами переносили?
& я использовал как указатель на массив. Разве это неправильно?
Во-первых не на массив, а на его третий элемент (Вы же там [3] написали), которого (элемента) в массиве попросту нет.
А во-вторых, конечно, неправильно - указателем на массив является его имя, а приписав & Вы берёте указатель на указатель.
помогло не это, а удаление троек, т.е. вы брали указатель на третий элемент массива, а надо на нулевой, что идентично ваще ничему.
на byte* Sets[3] = {MainSet, PressSet, PresetSet};
Объясните пожалуйста, что здесь написано?
Так то и написано - массив указателей.
Я пытаюсь разобраться с указателями и ссылками. Но не до конца понимаю пока.
http://people.toiit.sgu.ru/Sinelnikov/PT/C/Kern_Ritch.pdf
Со скобкой понял. Просто недоудалял. Там еще был цикл.
Спасибо. Почитаю. у меня такой нет почему-то.
Спасибо всем откликнувшимся...
Запись указателя на массив, на его нулевой элемент) может быть сделана двумя способами
Разницы никакой.
Я делал так, до этого:
а потом ниже обращаюсь к этим переменным:
ит.д.
может, это как то по другому можно написать?
Всё можно написать по-другому. Всегда есть 100500 способов написать одно и тоже.