#1 2019-10-03 11:55:42

Homo Faber
Учасник
Зареєстрований: 2019-09-27
Повідомлень: 7

Странное поведение массива

Привет знатокам программирования Arduino.
Столкнулся со странным поведением 2-х мерного массива. Решил проверить содержимое.
Вот код:

const byte K_Dt=6;                                          //  Размерность массива
byte M_Dt[2][K_Dt]=                                        // Объявление массива
     {
      {1,1,1,1,1,1},                                          // Заполнение массива
      {1,1,1,1,1,1}                                         
     };

void setup()
{

for (byte N_Dt=0;N_Dt<K_Dt;N_Dt++)                 // Проверка заполнения массива
{
Serial.print("M_Dt[1][");
Serial.print(N_Dt);
Serial.print("]=");
Serial.print(M_Dt[1][N_Dt]);
Serial.print("\t");
Serial.print("M_Dt[2][");
Serial.print(N_Dt);
Serial.print("]=");
Serial.println(M_Dt[2][N_Dt]);
}
}

И вот что получилось в результате:

M_Dt[1][0]=1    M_Dt[2][0]=1
M_Dt[1][1]=1    M_Dt[2][1]=0
M_Dt[1][2]=1    M_Dt[2][2]=0
M_Dt[1][3]=1    M_Dt[2][3]=178
M_Dt[1][4]=1    M_Dt[2][4]=4
M_Dt[1][5]=1    M_Dt[2][5]=128

Если с первой строкой всё в порядке, то во второй - явно какой-то мусор.
Может кто подскажет, что приключилось? Казалось бы просто заполнение массива, а в результате...
Заранее спасибо всем откликнувшимся.

Неактивний

#2 2019-10-03 12:09:44

opengl
Гість

Re: Странное поведение массива

Выходишь за пределы массива. В качестве первого индекса нужно использовать 0 и 1, а ты используешь 1 и 2.

#3 2019-10-03 12:16:54

Watchdog
Гість

Re: Странное поведение массива

Непонятно почему компилятор не сообщил об ошибке. В размерности массива должен быть литерал а не константа.

#4 2019-10-03 12:35:50

Homo Faber
Учасник
Зареєстрований: 2019-09-27
Повідомлень: 7

Re: Странное поведение массива

opengl пише:

Выходишь за пределы массива. В качестве первого индекса нужно использовать 0 и 1, а ты используешь 1 и 2.

Вот я тупой... В другом массиве-то так и делаю.
Спасибо огромное!!!!

Неактивний

#5 2019-10-03 13:18:16

Watchdog
Гість

Re: Странное поведение массива

opengl пише:

Выходишь за пределы массива. В качестве первого индекса нужно использовать 0 и 1, а ты используешь 1 и 2.

И в этом случае также, должно быть хотя бы предупреждение о выходе константы за диапазон. Включите вывод сообщений компилятора в настройках и читайте, что он пишет.

#6 2019-10-03 19:44:48

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 411

Re: Странное поведение массива

Watchdog пише:

В размерности массива должен быть литерал а не константа.

Что, в языке изменения вышли? Вроде, никогда такого требования не было, и в последнем стандарте тоже нет. Что-то поменялось в последние дни?

Watchdog пише:

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

Кому (и кто) так задолжал? Никому это не должно. Ощущение, что ты про какой-то другой язык говоришь.

Watchdog пише:

Включите вывод сообщений компилятора в настройках и читайте, что он пишет.

Ничего он там не пишет - это совершенно нормальная операция в этом языке.

Homo Faber пише:

Странное поведение массива

Скорее? странное поведение Homo Faber smile))

Остання редакція Kaka (2019-10-03 19:47:02)

Неактивний

#7 2019-10-03 20:30:13

Watchdog
Гість

Re: Странное поведение массива

Kaka пише:
Watchdog пише:

В размерности массива должен быть литерал а не константа.

Что, в языке изменения вышли? Вроде, никогда такого требования не было, и в последнем стандарте тоже нет. Что-то поменялось в последние дни?

Да, вы правы, я ошибся. По стандарту, должно быть константное выражение, что по сути мало отличается, поскольку вычисляется на стадии компиляции.

Kaka пише:
Watchdog пише:

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

Кому (и кто) так задолжал? Никому это не должно. Ощущение, что ты про какой-то другой язык говоришь.

Или другой компилятор, или с другой настройкой предупреждений. Доказывать я не буду. Обычно анализатор определяет ошибки стадии компиляции и предупреждает о неоднозначностях.

#8 2019-10-04 09:14:35

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 411

Re: Странное поведение массива

Watchdog пише:

По стандарту, должно быть константное выражение

Да. А если говорить конкретно про Ардуино (тут же специализированный форум), то там используется GCC, а у него есть расширение, которое вообще позволяет динамические массивы (т.е. даже константа времени компиляции необязательна). Например, вполне себе правильный  код

#include <Printing.h>

unsigned getSum(int nSize) {
	unsigned arr[nSize];
	for (int i = 0; i < nSize; i++) arr[i] = analogRead(1);
	for (int i = 1; i < nSize; i++) arr[0] += arr[i];
	return arr[0];
}

void setup(void) { 
	Serial.begin(115200);
	Serial << "Sum: " << getSum(5) << "\n";
}

void loop(void) {
}

Неактивний

#9 2019-10-04 09:32:03

Watchdog
Гість

Re: Странное поведение массива

Kaka пише:
Watchdog пише:

По стандарту, должно быть константное выражение

Да. А если говорить конкретно про Ардуино (тут же специализированный форум), то там используется GCC, а у него есть расширение, которое вообще позволяет динамические массивы (т.е. даже константа времени компиляции необязательна).

Да, в последних усовершенствованиях С/С++ (С11,С17) можно объявлять локальные массивы переменных с параметризированной длиной, и инициализировать их списками констант. И ещё много всяких удобностей. Хочу сказать, что gcc и g++, для различных архитектур процессоров имеют свои особенности и не совсем совместимые. Ардуино - ведь это очень просто!

#10 2019-10-04 12:39:45

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 411

Re: Странное поведение массива

Watchdog пише:

в последних усовершенствованиях С/С++ (С11,С17) можно объявлять локальные массивы переменных с параметризированной длиной

Вы путаете, в стандарте такого нет, там требуется константное выражение (ISO/IEC 14882:2017, п. 11.3.4, стр. 220). Возможность иметь переменную - самодеятельность (расширение) GCC.

Watchdog пише:

для различных архитектур

Не хотите нарваться - пользуйте только то, что есть в стандарте. Но вообще, здесь форум про ардуино и обсуждать другие архитектуры как-то странно.

Неактивний

#11 2019-10-04 13:00:41

Watchdog
Гість

Re: Странное поведение массива

Kaka пише:
Watchdog пише:

в последних усовершенствованиях С/С++ (С11,С17) можно объявлять локальные массивы переменных с параметризированной длиной

Вы путаете, в стандарте такого нет, там требуется константное выражение (ISO/IEC 14882:2017, п. 11.3.4, стр. 220). Возможность иметь переменную - самодеятельность (расширение) GCC.

Watchdog пише:

для различных архитектур

Не хотите нарваться - пользуйте только то, что есть в стандарте. Но вообще, здесь форум про ардуино и обсуждать другие архитектуры как-то странно.

Может и путаю, в этих стандартах чёрт ногу сломит и не все из них доступны даром. Искать я не хочу. Ардуино поддерживает три архитектуры: AVR-8, ARM-Cortex и MIPS-Tensilica. Настройка компилятора для *.ino как С++. GCC это не самодеятельность, это большая индустрия США. Стандарты, во всём мире, есть постфактум, кроме нас.

#12 2019-10-04 23:34:01

Avazart
Учасник
Зареєстрований: 2019-05-05
Повідомлень: 181

Re: Странное поведение массива

Нет ориентироваться как раз нужно  в первую очередь на стандарт языка.
Допустим сейчас Arduino IDE использует gcc как компилятор, а завтра вдруг взбредет в голову заменить на clang что будет с Вашим кодом?

Остання редакція Avazart (2019-10-04 23:35:38)

Неактивний

#13 2019-10-05 13:53:42

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 411

Re: Странное поведение массива

Avazart пише:

Нет ориентироваться как раз нужно  в первую очередь на стандарт языка.

А чего ж Вы сами с упорством, достойным лучшего применения, в целой пачке постов настаивали, что я не прав, следуя его (стандарта) рекомендациям? smile

Остання редакція Kaka (2019-10-05 13:54:01)

Неактивний

#14 2019-10-05 15:57:57

Avazart
Учасник
Зареєстрований: 2019-05-05
Повідомлень: 181

Re: Странное поведение массива

Вы наверное что то попутали или причудилось, что-то не знаю.

А там где мы спорили было ровно на оборот, Вы отказывались признать рекомендации не использовать нижнее подчеркивание в именовании(хотя я привел ссылку где указывалось место в стандарте).

Остання редакція Avazart (2019-10-05 16:01:02)

Неактивний

#15 2019-10-05 17:29:52

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 411

Re: Странное поведение массива

Avazart пише:

Вы отказывались признать рекомендации не использовать нижнее подчеркивание в именовании

Парень, никогда не спорь о том, чего ты не знаешь (и с теми. кого не знаешь).

Речь там шла о пользовательских литералах. Ты о них раньше слышал? Писал их? А если нет, в чём я уверен, чего ж ты не посмотрел, а сразу спорить-то полез?

Так вот, именно в них (пользовательских литералах)  стандарт настоятельно рекомендует использовать подчерки для отделения собственно литерала от суффикса. А беподчерковые литералы считаются зарезервированными для развития языка (сейчас используются "l", "u" и т.п., но планируется расширять). Стандарт настолько настоятельно рекомендует всегда начинать пользовательский литерал с подчерка, что большинство компиляторов выдают предупреждение, если программист этого не сделал. Предупреждение выглядит вот так:

warning: literal operator suffixes not preceded by '_' are reserved for future standardization

Ну, и наконец, открой всё-таки стандарт ISO/IEC 14882:2017 и посмотри раздел 5.13.8 "User-defined literals" (стр. 37-38). Там много примеров пользовательских литералов, но найди хоть один, чтобы не с подчерка начинался!

То место на которое ссылаются по твоей ссылке я конечно знаю, но оно не про литералы. Именно это разночтение я и имел в виду, когда писал тебе "В одних местах тон такой, а в других - эдакий". С литералами - всё наоборот - без подчерков они зарезервированы! Мне не хотелось сажать тебя в лужу, я думал ты сам в этом разберёшься, но, похоже, гордыня и уверенность в собственной непогрешимости не позволили тебе этого сделать.

Так что, парень, не спорь о том, чего не знаешь, тем более со специалистами.

Надеюсь, недоразумение исчерпано?

Остання редакція Kaka (2019-10-05 17:35:56)

Неактивний

#16 2019-10-05 17:50:21

Avazart
Учасник
Зареєстрований: 2019-05-05
Повідомлень: 181

Re: Странное поведение массива

Парень, никогда не спорь о том, чего ты не знаешь (и с теми. кого не знаешь).

Типа никогда не спорь с идиот big_smile м?

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

И я рад что хоть гуглить Вы за момент с последнего спора научились.

тем более со специалистами.

Тем более со специалистом по надменности и высокомерию ...   big_smile

Остання редакція Avazart (2019-10-05 17:53:02)

Неактивний

#17 2019-10-05 18:12:39

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 411

Re: Странное поведение массива

Avazart пише:

Я не знаю насчет  пользовательских литералах.

То, что ты не знаешь языка о котором берёшься спорить, я давно понял, но судя по хамскому ответу, ты и сейчас не посмотрел стандарт, хотя я тебе даже номера страниц указал (я уж молчу о благодарности за это).

Avazart пише:

Я говорил про обычное именование.

Ну, да, ты посмотрел на мой пример с литералами и сделал к нему замечание "про обычное применение". Зачем? Впрочем, можешь не отвечать, я уже всё понял.

Остання редакція Kaka (2019-10-05 18:13:29)

Неактивний

#18 2019-10-05 18:51:41

Avazart
Учасник
Зареєстрований: 2019-05-05
Повідомлень: 181

Re: Странное поведение массива

Вопрос не в том зачем я спрашивал...
Вопрос как Вы на это отреагировали и как реагируете сейчас.
Собственно ник соответствует поведению...
И так в принципе в каждом Вашем посте ...

То место на которое ссылаются по твоей ссылке я конечно знаю, но оно не про литералы. Именно это разночтение я и имел в виду, когда писал тебе "В одних местах тон такой, а в других - эдакий"

Конечно все должны читать Ваши мысли ....
И понимать  какие "труднодоступные" места Вы имеете ввиду.

Остання редакція Avazart (2019-10-05 19:28:20)

Неактивний

#19 2019-10-05 19:02:12

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 411

Re: Странное поведение массива

Avazart пише:

Вопрос как Вы на это отреагировали и как реагируете сейчас.

И как же я отреагировал? Написал: "Это кому как.", а на Ваше категоричное утверждение, что "Это не кому как это правило хорошего тона", добавил "Да, нет, это как раз "кому как". В одних местах тон такой, а в других - эдакий"

Что-то не так в моей реакции?

Неактивний

#20 2019-10-05 19:31:55

Avazart
Учасник
Зареєстрований: 2019-05-05
Повідомлень: 181

Re: Странное поведение массива

А что нормально в этом ответе?
Кроме того что там есть какой то глубинный смысл который я не понял... 
(ожидал нормальной аргументации: ссылки на статью или стандарт)

Остання редакція Avazart (2019-10-05 19:33:07)

Неактивний

#21 2019-10-05 20:48:26

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 411

Re: Странное поведение массива

Ну, теперь ты получил ссылку на стандарт с номером раздела и страницы. Не прочитал, правда, но получил. Нахамил в ответ. Доволен? Ну, давай заканчивать - иди штаны отстирывай, и впредь не спорь о предметах, о которых, по твоим же словам, ничего не знаешь.

Неактивний

#22 2019-10-06 00:02:53

Avazart
Учасник
Зареєстрований: 2019-05-05
Повідомлень: 181

Re: Странное поведение массива

Да сейчас может засунуть ссылку уже куда по дальше, как бы поздно оправдываться.

Хамят боярам. Вы боярин? Так нех указывать что и кому делать...
Касательно грубости так сами  заслужили своим стилем общения.


и впредь не спорь о предметах, о которых, по твоим же словам, ничего не знаешь.

Звучало бы убедительнее если бы это не говорил человек советующий начинающему глючную MSGEQ7 с которой сам не имел дел никогда.
(про "посыл" меня на другой форум в этой теме вообще молчу)

Остання редакція Avazart (2019-10-06 00:30:14)

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму