Официальный сайт компании Arduino по адресу arduino.cc
проблема с массивами
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Пнд, 30/09/2019 - 08:57
Есть код в котором в цикле успешно заполняется массив uint8_t outbuf[3]. После записи трех значений он перезаписывается. И так 35 циклов.
Я успешно вывожу 35х3 = 105 значений в монитор. ВСЕГДА имеем только 105 значений, просто привел упрощенный код.
Теперь, после каждой тройки значений, я перезаписываю эти 3 значения в другой массив. И при выводе в монитор
уже баги... зависание и т.п.
Предположения: 1) outbuf - это типа буфера, который сам очищается при чтении его. 2) нужно применить указатель, а не индекс. 3) тип данных неверный.
int sm = 0; int sm1 = 1; int sm2 = 2; int arr1[105]; void setup() { // put your setup code here, to run once: } void loop() { if ( кнопка нажата, то очищаем sm = 0 и далее по коду) { uint8_t outbuf[3]; uint8_t rc = Midi.extractSysExData(p, outbuf); // тут успешно читается поток данных Serial.print(outbuf[0]); // тут успешно выводим 105 байт данных, 35 строки по 3 байта Serial.print(outbuf[1]); Serial.print(outbuf[2]); // ДАЛЕЕ если сделаем перезапись вот так, то.... число выводимых строк уже не 105, а другое... зависание программы и т.п. arr1[sm] = outbuf[0]; // каждую тройку перезаписываем в буфер.... сначала в 0,1,2 arr1[sm1] = outbuf[1]; arr1[sm2] = outbuf[2]; sm = sm + 3; // стало 3, 4, 5.... потом 6, 7, 8 и т.п. до 105 sm1 = sm + 1; sm2 = sm + 2; } }
Какие интересные предположения. Таких я тут ещё не встречал.
да там больше 105 ничего и нет... А обнуление sm я привел как инициация каждой процедуры чтения. Что -то другое нужно делать((
Какие интересные предположения. Таких я тут ещё не встречал.
Вам все плохо))) Ничего сам не предлагаешь - "почему мозгами не думаешь?"... Что -то предлагаешь - тоже плохо, зачем ахинею несешь)) Лучше бы что-то конструктивное подсказали, чем флудить))
А обнуление sm я привел как инициация каждой процедуры чтения.
у вас нет обнуления sm в коде
Лучше бы что-то конструктивное подсказали, чем флудить))
Так уже подсказали. возьмите код DetSimena и попробуйте - уверен, что все глюки исчезнут.
Хорошо, я проверю. Спс и отпишусь.
Хорошо, я проверю. Спс и отпишусь.
что там проверять-то? так не видите, что у вас sm не обнуляется?
да там больше 105 ничего и нет... А обнуление sm я привел как инициация каждой процедуры чтения. Что -то другое нужно делать((
???? о_О !!!!
Жертва коррекционной педагогики? ;)))
Просто сделай так, как написал Дед.
------------------------
Может и правда идиот? Но я все-таки поясню, что В ЯЗЫКЕ Си НЕТ ПРОВЕРКИ ИНДЕКСОВ МАССИВА!!!
Поэтому никто не знает, есть ли "там что-то больше 105", так стало яснее?
Хорошо, я проверю. Спс и отпишусь.
что там проверять-то? так не видите, что у вас sm не обнуляется?
Понимаете, ведь там читается НЕ непрерывный поток, а максимум - 105 байт данных. Их в МИДИ посылке больше и нет. Я выводил в монитор sm, и он никогда не было больше 105. Процедура делается при каждом нажатии кнопки, и я там sm очищается.
Может быть arr cделать локальным? Или заранее объявить /присвоить нули? Или не ставить размерность?
Я никогда не работал с массивами.
Понимаете, ведь там читается НЕ непрерывный поток, а максимум - 105 байт данных. Их в МИДИ посылке больше и нет.
еще раз: откуда программа это знает? Есть признак конца данных?
Давай ты выведешь sm на печать после 29-ой строки и всё увидишь сам.
Процедура делается при каждом нажатии кнопки, и я там sm очищается.
укажите конкретную строчку в своем коде . где sm очищается? - в коде этого НЕТ!
это у него кусок особо секретного кода. Где p описан - тоже непонятно.
Спасибо что пытаетесь помочь... думаю, я выложу полный код счас... Но если коротко - то есть обработчик кнопки. В нем запрос за инициализацию обмена. А также сброс sm. В обмене идет только 105 байт. Больше слейв устройство НЕ генерит. Естественно, я получаю их и вывожу на монитор. Успешно! Задача - запомнить эти 105 байт. Все.
СТРОКА 116
dim3740 - вы издеваетесь? это же не ваш код. Выкладывайте не то, что вы нашли в инете. а то, как вы этот код пытались переделать
Ок. Я выложил свой код, который есть упрощенный из библы. Мне там не нужны многие функции. Но я мог по незнанию удалить и что было нельзя. Меня устроит и код библы - он еще выше, только ВСТАВЬТЕ плз запоминание полученных байтов в некий массив.
Давайте так... На вид ИМХО код рабочий, потому что НЕ МОЙ, и главное - он работает. Косяк только со стр 18 второй части, но она безобидная. Подскажите, для эксперимента, как переобозвать массив ARR[] , куда его еще попытаться расположить, локально, как инициализировать и т.п. Мб. Мб обращаться по указателю... Код DetSimen - это просто оптимизация, я его вставлю, но это не решение, мне кажется... К сожалению, вы не сможете прогнать код, т.к. нужно реальное железо.
Может конфликт в названиях переменных с зарезервированными в библах - они очень тяжелые(((
я - пас.
я - пас.
Я признателен за все, хоть что-то попробовать еще))) Может этот участок в неком прервании обрабатывается? Что означает на строке 20 перед сетапом.. void MidiPool()?
Еще есть суждение, что якобы по ЮСБ идут байты не только до 127, как по МИДИ, а до 256. Вызывается переполнение, и чтобы данные все же корректно шли, добавляются лишние байты. Т.е. уже не 105, а может и больше. Я их читаю МИДИ устройством, железным, и оно возможно ОБРАТНО переводит все и говорит, что принято 105.
Но код же учитывает что может быть иная длина пакета...
Что означает на строке 20 перед сетапом.. void MidiPool()?
Это декларация функции.
Что означает на строке 20 перед сетапом.. void MidiPool()?
Это декларация функции.
Так, а функция должна что-то возвращать)) (А вот обработчик кнопки - не должен). Мб поэтому и нельзя просто так из этой функции ничего в глобальные переменные записать???
Т.е. в монитор можно выводить, а записывать нельзя. Так? Как в САМОЙ функции что-то сбуферировать? И уже потом как-то передавать "наружу"... будем решать.
ты, родное сердце, везде свои sm1 и sm2 замени на (sm+1) и (sm+2). Они читать станет приятнее и ошибка возможно исчезнет! ;)))
Так, а функция должна что-то возвращать))
В корне не верное утверждение.
sm1 и sm2 заменю... понимаю, что у многих это как бельмо на глазу.... Итак, мнение профессионалов: на вскидку все должно работать. Так? Смотреть железо? Кабели, задержки? Действительно, баг не стабильный, но закономерности не могу обнаружить. Что выложить?Скрины монитора нужны?
Мб поэтому и нельзя просто так из этой функции ничего в глобальные переменные записать???
...
Т.е. в монитор можно выводить, а записывать нельзя. Так?
Пожалуйста, не строй догадки! Ты пишешь такую дичь, что желание помогать может пропасть. Не нужно никакого самолечения, доктора - помогут, только не придумывай глупостей.
Итак, мнение профессионалов: на вскидку все должно работать. Так?
Опять догадки?
Нет, не должно. Ты пишешь в занаятую память. Замени sm1 sm2. Для начала, потом поставим ограничитель. Ты делай, а не суетись.
А ведь все нормально стало!)) после замены/ убрал sm1 sm2. На пару десятков нажатий бага нет. Не совпадение???
Огромное спасибо, а я уж не знал что и думать... Если выползет снова - отпишусь.... Спасибо))
Вот так проверяю... и ОБА значения равные))
учитесь еще правильно польховаться инкрементами. Зачем делать три сложения, когда можно обойтись одним?
ну так компилятор же не просто так "не компилирует", он пишет ошибку. Смотрите сообщения компилятора. Хотите задать вопрос - выкладывайте сообщение компилятора сюда