Ви не увійшли.
Сторінки 1
Привет знатокам программирования 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
Если с первой строкой всё в порядке, то во второй - явно какой-то мусор.
Может кто подскажет, что приключилось? Казалось бы просто заполнение массива, а в результате...
Заранее спасибо всем откликнувшимся.
Неактивний
Выходишь за пределы массива. В качестве первого индекса нужно использовать 0 и 1, а ты используешь 1 и 2.
Непонятно почему компилятор не сообщил об ошибке. В размерности массива должен быть литерал а не константа.
Выходишь за пределы массива. В качестве первого индекса нужно использовать 0 и 1, а ты используешь 1 и 2.
Вот я тупой... В другом массиве-то так и делаю.
Спасибо огромное!!!!
Неактивний
Выходишь за пределы массива. В качестве первого индекса нужно использовать 0 и 1, а ты используешь 1 и 2.
И в этом случае также, должно быть хотя бы предупреждение о выходе константы за диапазон. Включите вывод сообщений компилятора в настройках и читайте, что он пишет.
В размерности массива должен быть литерал а не константа.
Что, в языке изменения вышли? Вроде, никогда такого требования не было, и в последнем стандарте тоже нет. Что-то поменялось в последние дни?
И в этом случае также, должно быть хотя бы предупреждение о выходе константы за диапазон.
Кому (и кто) так задолжал? Никому это не должно. Ощущение, что ты про какой-то другой язык говоришь.
Включите вывод сообщений компилятора в настройках и читайте, что он пишет.
Ничего он там не пишет - это совершенно нормальная операция в этом языке.
Странное поведение массива
Скорее? странное поведение Homo Faber ))
Остання редакція Kaka (2019-10-03 19:47:02)
Неактивний
Watchdog пише:В размерности массива должен быть литерал а не константа.
Что, в языке изменения вышли? Вроде, никогда такого требования не было, и в последнем стандарте тоже нет. Что-то поменялось в последние дни?
Да, вы правы, я ошибся. По стандарту, должно быть константное выражение, что по сути мало отличается, поскольку вычисляется на стадии компиляции.
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) {
}
Неактивний
Watchdog пише:По стандарту, должно быть константное выражение
Да. А если говорить конкретно про Ардуино (тут же специализированный форум), то там используется GCC, а у него есть расширение, которое вообще позволяет динамические массивы (т.е. даже константа времени компиляции необязательна).
Да, в последних усовершенствованиях С/С++ (С11,С17) можно объявлять локальные массивы переменных с параметризированной длиной, и инициализировать их списками констант. И ещё много всяких удобностей. Хочу сказать, что gcc и g++, для различных архитектур процессоров имеют свои особенности и не совсем совместимые. Ардуино - ведь это очень просто!
в последних усовершенствованиях С/С++ (С11,С17) можно объявлять локальные массивы переменных с параметризированной длиной
Вы путаете, в стандарте такого нет, там требуется константное выражение (ISO/IEC 14882:2017, п. 11.3.4, стр. 220). Возможность иметь переменную - самодеятельность (расширение) GCC.
для различных архитектур
Не хотите нарваться - пользуйте только то, что есть в стандарте. Но вообще, здесь форум про ардуино и обсуждать другие архитектуры как-то странно.
Неактивний
Watchdog пише:в последних усовершенствованиях С/С++ (С11,С17) можно объявлять локальные массивы переменных с параметризированной длиной
Вы путаете, в стандарте такого нет, там требуется константное выражение (ISO/IEC 14882:2017, п. 11.3.4, стр. 220). Возможность иметь переменную - самодеятельность (расширение) GCC.
Watchdog пише:для различных архитектур
Не хотите нарваться - пользуйте только то, что есть в стандарте. Но вообще, здесь форум про ардуино и обсуждать другие архитектуры как-то странно.
Может и путаю, в этих стандартах чёрт ногу сломит и не все из них доступны даром. Искать я не хочу. Ардуино поддерживает три архитектуры: AVR-8, ARM-Cortex и MIPS-Tensilica. Настройка компилятора для *.ino как С++. GCC это не самодеятельность, это большая индустрия США. Стандарты, во всём мире, есть постфактум, кроме нас.
Нет ориентироваться как раз нужно в первую очередь на стандарт языка.
Допустим сейчас Arduino IDE использует gcc как компилятор, а завтра вдруг взбредет в голову заменить на clang что будет с Вашим кодом?
Остання редакція Avazart (2019-10-04 23:35:38)
Неактивний
Нет ориентироваться как раз нужно в первую очередь на стандарт языка.
А чего ж Вы сами с упорством, достойным лучшего применения, в целой пачке постов настаивали, что я не прав, следуя его (стандарта) рекомендациям?
Остання редакція Kaka (2019-10-05 13:54:01)
Неактивний
Вы наверное что то попутали или причудилось, что-то не знаю.
А там где мы спорили было ровно на оборот, Вы отказывались признать рекомендации не использовать нижнее подчеркивание в именовании(хотя я привел ссылку где указывалось место в стандарте).
Остання редакція Avazart (2019-10-05 16:01:02)
Неактивний
Вы отказывались признать рекомендации не использовать нижнее подчеркивание в именовании
Парень, никогда не спорь о том, чего ты не знаешь (и с теми. кого не знаешь).
Речь там шла о пользовательских литералах. Ты о них раньше слышал? Писал их? А если нет, в чём я уверен, чего ж ты не посмотрел, а сразу спорить-то полез?
Так вот, именно в них (пользовательских литералах) стандарт настоятельно рекомендует использовать подчерки для отделения собственно литерала от суффикса. А беподчерковые литералы считаются зарезервированными для развития языка (сейчас используются "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)
Неактивний
Парень, никогда не спорь о том, чего ты не знаешь (и с теми. кого не знаешь).
Типа никогда не спорь с идиот м?
Я не знаю насчет пользовательских литералах. Я их не использовал ни разу в своем коде ни разу уж специфичное и спорное у них применение. Не знаю есть ли отдельные правила для них. Я говорил про обычное именование.
И я рад что хоть гуглить Вы за момент с последнего спора научились.
тем более со специалистами.
Тем более со специалистом по надменности и высокомерию ...
Остання редакція Avazart (2019-10-05 17:53:02)
Неактивний
Я не знаю насчет пользовательских литералах.
То, что ты не знаешь языка о котором берёшься спорить, я давно понял, но судя по хамскому ответу, ты и сейчас не посмотрел стандарт, хотя я тебе даже номера страниц указал (я уж молчу о благодарности за это).
Я говорил про обычное именование.
Ну, да, ты посмотрел на мой пример с литералами и сделал к нему замечание "про обычное применение". Зачем? Впрочем, можешь не отвечать, я уже всё понял.
Остання редакція Kaka (2019-10-05 18:13:29)
Неактивний
Вопрос не в том зачем я спрашивал...
Вопрос как Вы на это отреагировали и как реагируете сейчас.
Собственно ник соответствует поведению...
И так в принципе в каждом Вашем посте ...
То место на которое ссылаются по твоей ссылке я конечно знаю, но оно не про литералы. Именно это разночтение я и имел в виду, когда писал тебе "В одних местах тон такой, а в других - эдакий"
Конечно все должны читать Ваши мысли ....
И понимать какие "труднодоступные" места Вы имеете ввиду.
Остання редакція Avazart (2019-10-05 19:28:20)
Неактивний
Вопрос как Вы на это отреагировали и как реагируете сейчас.
И как же я отреагировал? Написал: "Это кому как.", а на Ваше категоричное утверждение, что "Это не кому как это правило хорошего тона", добавил "Да, нет, это как раз "кому как". В одних местах тон такой, а в других - эдакий"
Что-то не так в моей реакции?
Неактивний
А что нормально в этом ответе?
Кроме того что там есть какой то глубинный смысл который я не понял...
(ожидал нормальной аргументации: ссылки на статью или стандарт)
Остання редакція Avazart (2019-10-05 19:33:07)
Неактивний
Ну, теперь ты получил ссылку на стандарт с номером раздела и страницы. Не прочитал, правда, но получил. Нахамил в ответ. Доволен? Ну, давай заканчивать - иди штаны отстирывай, и впредь не спорь о предметах, о которых, по твоим же словам, ничего не знаешь.
Неактивний
Да сейчас может засунуть ссылку уже куда по дальше, как бы поздно оправдываться.
Хамят боярам. Вы боярин? Так нех указывать что и кому делать...
Касательно грубости так сами заслужили своим стилем общения.
и впредь не спорь о предметах, о которых, по твоим же словам, ничего не знаешь.
Звучало бы убедительнее если бы это не говорил человек советующий начинающему глючную MSGEQ7 с которой сам не имел дел никогда.
(про "посыл" меня на другой форум в этой теме вообще молчу)
Остання редакція Avazart (2019-10-06 00:30:14)
Неактивний
Сторінки 1