Чудеса с массивами

Slazonger
Offline
Зарегистрирован: 15.07.2015

Здравствуйте! 

Вопрос не могу разобрать один. Код следующий:


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

так вот, почему то первые два массивавыводятся нормально, как и задано, а третий выводит непонятную ерунду.

цифры с потолка. Что я упускаю?

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

строка 8, запятая зачем после 3 массива?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Valera19701 пишет:

строка 8, запятая зачем после 3 массива?

Это на его вопрос не влияет.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Slazonger пишет:

так вот, почему то первые два массивавыводятся нормально, как и задано

Это случайность. Сделайте первые два массива разными и убедитесь, что это не так.

Теперь по-поводу кода.

1. Позвольте выразить сомнение в том, что это вообще компилируется - у Вас разбаллансированы фигурные скобки. Скобка в строке 27 явно лишняя.

2. Что Вы имели в виду, когда писали "&MainSet[3]" в строке 8? Не знаю, чего Вы хотели, но то, что написано означает "начало массива PressSet" (т.к. Вы берёте адрес следующий за массиовм MainSet). Если Вам нужно написать адреса своих массивов, так не мудрите и пишите 

byte* Sets[3] = { MainSet, PressSet, PresetSet };

3. Дальше. Что делает "<=" в строке 17? У Вас сколько элементов? 3? С номерами 0, 1 и 2. Так нафига Вам там равенство? Пишите просто "<"

Попробуйте.

Slazonger
Offline
Зарегистрирован: 15.07.2015

Valera19701 пишет:

строка 8, запятая зачем после 3 массива?

это случайно. Там до этого еще один элемент был

Slazonger
Offline
Зарегистрирован: 15.07.2015

ЕвгенийП пишет:

Slazonger пишет:

так вот, почему то первые два массивавыводятся нормально, как и задано

Это случайность. Сделайте первые два массива разными и убедитесь, что это не так.

Теперь по-поводу кода.

1. Позвольте выразить сомнение в том, что это вообще компилируется - у Вас разбаллансированы фигурные скобки. Скобка в строке 27 явно лишняя.

2. Что Вы имели в виду, когда писали "&MainSet[3]" в строке 8? Не знаю, чего Вы хотели, но то, что написано означает "начало массива PressSet" (т.к. Вы берёте адрес следующий за массиовм MainSet). Если Вам нужно написать адреса своих массивов, так не мудрите и пишите 

byte* Sets[3] = { MainSet, PressSet, PresetSet };

3. Дальше. Что делает "<=" в строке 17? У Вас сколько элементов? 3? С номерами 0, 1 и 2. Так нафига Вам там равенство? Пишите просто "<"

Попробуйте.

 

В строке 27 скобка закрывает for. знак & я использовал как указатель на массив. Разве это неправильно?

Сейчас попробую.

Slazonger
Offline
Зарегистрирован: 15.07.2015

Спасибо всем. 

замена строки:

byte* Sets[3] = {&MainSet, &PressSet, &PresetSet};

на byte* Sets[3] = {MainSet, PressSet, PresetSet};

помогла.

Объясните пожалуйста, что здесь написано? Я пытаюсь разобраться с указателями и ссылками. Но не до конца понимаю пока.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Slazonger пишет:

В строке 27 скобка закрывает for. знак & я использовал как указатель на массив. Разве это неправильно?

А что делает скобка в строке 28? Закрывает loop()? Ладно, а что тогда делает скобка в строке 30?

У Вас количество открывающих скобок не равно количеству закрывающих - это не может компилироваться. Код руами переносили?

Slazonger пишет:

& я использовал как указатель на массив. Разве это неправильно?

Во-первых не на массив, а на его третий элемент (Вы же там [3] написали), которого (элемента) в массиве попросту нет.

А во-вторых, конечно, неправильно - указателем на массив является его имя, а приписав & Вы берёте указатель на указатель.

 

 

__Alexander
Offline
Зарегистрирован: 24.10.2012

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Slazonger пишет:

на byte* Sets[3] = {MainSet, PressSet, PresetSet};

Объясните пожалуйста, что здесь написано? 

Так то и написано - массив указателей.

Slazonger пишет:

Я пытаюсь разобраться с указателями и ссылками. Но не до конца понимаю пока.

http://people.toiit.sgu.ru/Sinelnikov/PT/C/Kern_Ritch.pdf

 

 

Slazonger
Offline
Зарегистрирован: 15.07.2015

Со скобкой понял. Просто недоудалял. Там еще был цикл. 

Slazonger
Offline
Зарегистрирован: 15.07.2015

Спасибо. Почитаю.  у меня такой нет почему-то.

Спасибо всем откликнувшимся...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Запись указателя на массив, на его нулевой элемент) может быть сделана двумя способами

int a[] = {3, 5, 6, 7, 2 };

int *pA = a;

// или
int *ppA = &a[0]

Разницы никакой.

Slazonger
Offline
Зарегистрирован: 15.07.2015

Я делал так, до этого:

int* OptionArray [] = {&Options.Correct, &Options.Delay, &Options.Slow, и т. д.

а потом ниже обращаюсь к этим переменным:

if (btn == MODE)
      *OptionArray[NumOfParam] += 100;
    else if (btn == ENTER)
      *OptionArray[NumOfParam] += 10;

ит.д.

может, это как то по другому можно написать?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Всё можно написать по-другому. Всегда есть 100500 способов написать одно и тоже.