Помогите с кодом с++
- Войдите на сайт для отправки комментариев
Пнд, 09/03/2020 - 15:40
Привет.
Нужна помощь от владеющих c++
Задача:
Есть массив (в данном случае 18 байт, но может быть до 64-х)
byte thing[18] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
Нужна ф-я которая разобьет его в многомерный массив char* Array по 10 байт. т.е.:
01020304050607080910
1112131415161718
Написал ф-ю, но отладить не получается
printPacket(thing, 18); void printPacket(byte* myBuffer, byte len) { char stringBuffer[7][36]; byte k = 0; for (byte i = 1; i <= len; i++) { char byteBuffer[4]; sprintf(byteBuffer, "%02X", (uint8_t)myBuffer[i - 1]); strcat(stringBuffer[k], byteBuffer); if ((i % 10) == 0) k++; } for (byte i = 0; i < 7; i++) { if (strlen(stringBuffer[i]) > 0) { lcd.workScreen(stringBuffer[i]); Serial.println(i); Serial.println(stringBuffer[i]); } } }
...а в чем вопрос?
Заставить либо мою ф-ю работать, у меня знаний не хватает, либо предложить свою за огромное спасибо!
В вашей-то что не работает?
В выходном массиве хрень какая то
Показывайте, что за хрень...
Ну выполни. Или свою ф-ю предложи под задачу. Показывать нечего. В массиве белеберда
Нечего, так нечего. Проблема не у меня.
это просто от незнания по организации адресации в двумерном массиве, брать текущий и прямо по нужному адресу двумерного копировать
Абсолютно согласен про адресацию. Можно пример на пальцах?
ТС такие конечные функции не завязанные на логике программы удобнее писать и отлаживать в Visual Studio... там богатейшие возможности у дебаггера...
пошагово исполняешь тут же видишь какие изменения в данных в окне memory
Абсолютно согласен про адресацию. Можно пример на пальцах?
Вот тут гляньте первые 4-5 минут, там и пример
DimaD, вы можете внятно объяснить, что должна делать ваша функция? Как только я встретил в ней массив размером 7х36 - я понял что совершенно ничего не понимаю в коде...
Такие функции вообще не надо писать. Нужно просто обращаться к тому же самому массиву по "двумерной схеме".
ТС, тут просто не нужна никакая функция.
Я, всё же, без функции не обошёлся. Но и думал, вобщем-то, больше о жареном картоше...
Такие функции вообще не надо писать. Нужно просто обращаться к тому же самому массиву по "двумерной схеме".
ТС, тут просто не нужна никакая функция.
а так можно? оно понятно, что в памяти это оно одно и тоже, можно пример???
Такие функции вообще не надо писать. Нужно просто обращаться к тому же самому массиву по "двумерной схеме".
ТС, тут просто не нужна никакая функция.
а так можно? оно понятно, что в памяти это оно одно и тоже, можно пример???
Любой одномерный массив можно представить как двумерный, простая арифметика. Допустим, у нас есть массив из 10 элементов, и мы хотим обращаться к нему как к двумерному массиву из 5 строк по две ячейки в каждой. Строки - X (5 штук), ячейки - Y (по две на строку). Начальный адрес строки N будет Y*N, первая ячейка строки - Y*N, вторая ячейка строки - Y*N+1. Нумерация, ессно, с нуля.
Я, всё же, без функции не обошёлся. Но и думал, вобщем-то, больше о жареном картоше...
На исходник можно взглянуть?
Такие функции вообще не надо писать. Нужно просто обращаться к тому же самому массиву по "двумерной схеме".
ТС, тут просто не нужна никакая функция.
а так можно? оно понятно, что в памяти это оно одно и тоже, можно пример???
Любой одномерный массив можно представить как двумерный, простая арифметика. Допустим, у нас есть массив из 10 элементов, и мы хотим обращаться к нему как к двумерному массиву из 5 строк по две ячейки в каждой. Строки - X (5 штук), ячейки - Y (по две на строку). Начальный адрес строки N будет Y*N, первая ячейка строки - Y*N, вторая ячейка строки - Y*N+1. Нумерация, ессно, с нуля.
по адресу любой сможет, классически бы по новому имени массива двумерного, к примеру aaa [0] [0]
по адресу любой сможет, классически бы по новому имени массива двумерного, к примеру aaa [0] [0]
Ну, так и сделайте, кто не даёт? Это ж просто синтаксический сахар.
Как всегда молодых подстёбывают, а те не понимают. )))
В памяти машины любые многомерные данные представляются единой последовательностью битов (в одну линию).
DIYMan все верно написал, никто не слышит или не слушает...
Как всегда молодых подстёбывают, а те не понимают. )))
В памяти машины любые многомерные данные представляются единой последовательностью битов (в одну линию).
DIYMan все верно написал, никто не слышит или не слушает...
а в коде можно? - PS Любой одномерный массив можно представить как двумерный...
вот имею я массив byte bbb[18] {xxxxxxxxxxxxxx....}
и как к элементам массива обратится через двумерный byte aaa[2][10] ??? и в размерности, там 18 байт, здесь двадцать... именно из языка С чтобы обращаться к одномерному как к двухмерному
насколько я помню взять указатель на плоский массив и закастить его к типу двумерного массива и пиши потом обычное обращение с двумя скобочками с этим указателем, компилятор сам нужные смещения добавит
ох давно я студию не открывал к своему стыду
как то так
Закастить проблем нет. В тутошнем случае один массив на другой ровно не ложится - все равно надо хвост вычислять и отрабатывать вывод с его учётом.
читаю и не пойму. о чем вы спорите.
Помойму :) ТС хотел не просто отобразить одномерный массив в двумерный. а сначала перевести байты в их символьное представление, типа 0x01 => "01" . а уже потом собрать полученные строчки в две строки.
И еще - почему никто не обратил внимание. что массив в заглавном сообщении бредовый? После 0x09 должно идти 0x0A, а вовсе не 0x10. И при преобразовании 0x10 должно давать вовсе не "10", а 16!
Да тут диспут о правильной навигации по массиву. А сбор в строку может и не нужен будет ;) С учётом значений исходного массива...
если диспут только о "правильной выборке из массива" - зачем тут что-то кастить? используйте адрессную арифметику
вывод
читаю и не пойму. о чем вы спорите.
Помойму :) ТС хотел не просто отобразить одномерный массив в двумерный. а сначала перевести байты в их символьное представление, типа 0x01 => "01" . а уже потом собрать полученные строчки в две строки.
И еще - почему никто не обратил внимание. что массив в заглавном сообщении бредовый? После 0x09 должно идти 0x0A, а вовсе не 0x10. И при преобразовании 0x10 должно давать вовсе не "10", а 16!
если ему нужен строковый и в каждой строке по два байта, то это будет совсем другом массив )))
преобразование числа в строку где-то применялось тут при по байтном выводе содержимого EEPROM в монитор порта, но я так понимаю, сам массив строковый на стадии компиляции уже должен быть и проинициализирован!?
если диспут только о "правильной выборке из массива" - зачем тут что-то кастить? используйте адрессную арифметику
Теперь выведи так исходный массив из пяти айтемов, например. ;)
Теперь выведи так исходный массив из пяти айтемов, например. ;)
и в чем прорблема? - главное вовремя остановится :)
Теперь выведи так исходный массив из пяти айтемов, например. ;)
Вы вообще о чём? Если один массив не налазит на другой, то никак Вы его не натяните.
Всё же просто, представьте вот такой диалог
- Я сделал супер-пуперную реализацию двумерного массива на базе одномерного!
- А что будет, если на последнюю строку не хватает данных или иным способом вылезти за границы твоего двумерного массива?
- Да, тоже самое, что и если вылезти за границы честно объявленного двумерного массива!
Тоже самое! Ну не контролируются в этом языке границы массивов!
У меня нет проблемы, она у ТС, который включает босса и бросает на прилавок свой исходник, требуя разобраться с его багами или выдать ему более лучший (видимо подразумевая гарантийный случай) вариант.
Теперь выведи так исходный массив из пяти айтемов, например. ;)
Вы вообще о чём? Если один массив не налазит на другой, то никак Вы его не натяните.
Так я , вроде, именно это в #23 и писал.
используйте адрессную арифметику
Насколько я понял, ua6em спрашивал не об этом. Он хотел "синтаксического сахара", чтобы писать как с "честно объявленным" двумерным массивом и не париться.
Любой одномерный массив можно представить как двумерный...
вот имею я массив byte bbb[18] {xxxxxxxxxxxxxx....}
и как к элементам массива обратится через двумерный byte aaa[2][10] ???
Можно и уважить, только вот сдаётся мне, что ua6em всё знает и сам, только нас троллит.
В общем, ладно, троллит - так троллит, будем считать, что я попался. Вот пример, в котором Ваша адресная операция выведена в шаблон из трёх строк, а с ним уже можно писать "как обычно" - "с сахаром". (Если у кого-то есть вопросы типа "а что, если там нецелое количество строк?", см. мой пост #30)
Результат
ua6em, Вы этого хотели?
ua6em, Вы этого хотели?
Точно!!! И это не троллинг. Я имею представление как это организовать на ассемблере (точнее в кодах, но не атмеги), хотелось бы увидеть как на С. Увидел. Осталось разобраться!
По сути то надо было объявить нужной мерности массив и передать (заменить адрес переменной массива) ему в качестве адреса, адрес существующего массива. Так?
То-есть получили даже не сахар, а мёд )))
(В вашем примере)
а у ТС есть проблемы???
По сути то надо было объявить нужной мерности массив и передать (заменить адрес переменной массива) ему в качестве адреса, адрес существующего массива. Так?
совсем нет.
Насколько я понимаю код Евгения (а мне кажется что понимаю) - по сути эта та же адресная арифметика что у меня(сорри за нескромность :) в сообщении #26, но только оформленная в общем виде - как перегрузка оператора взятия элемента по индексу
По сути то надо было объявить нужной мерности массив и передать (заменить адрес переменной массива) ему в качестве адреса, адрес существующего массива. Так?
совсем нет.
Насколько я понимаю код Евгения (а мне кажется что понимаю) - по сути эта та же адресная арифметика что у меня (сорри за нескомность :), но только оформленная в виде перегрузки оператора взятия элемента по индексу
создаю два массива, один проинициализирован, второму (он нужной мерности), я в качестве адреса подсуну адрес первого массива, на ассемблере это делается за один так процессора, это на С (стандартными средствами) как-то делается?
стандартными ИМХО, нет. Адрес переменной в Си - насколько я знаю, константа, подменить его нельзя.
создаю два массива, один проинициализирован, второму (он нужной мерности), я в качестве адреса подсуну адрес первого массива, на ассемблере это делается за один так процессора, это на С (стандартными средствами) как-то делается?
стандартными ИМХО, нет. Адрес переменной в Си - насколько я знаю, константа, подменить его нельзя.
Да уж...смотреть надо в более адекватной среде скомпилировав, там всё так запутано средой IDE, так запутано )))
Да уж...смотреть надо в более адекватной среде скомпилировав, там всё так запутано средой IDE, так запутано )))
https://godbolt.org/
Насколько я понимаю код Евгения (а мне кажется что понимаю) - по сути эта та же адресная арифметика что у меня(сорри за нескромность :) в сообщении #26, но только оформленная в общем виде - как перегрузка оператора взятия элемента по индексу
Абсолютно точно. Так я же там так и написал (обращаясь к Вам): "пример, в котором Ваша адресная операция выведена в шаблон из трёх строк".
создаю два массива, один проинициализирован, второму (он нужной мерности), я в качестве адреса подсуну адрес первого массива, на ассемблере это делается за один так процессора, это на С (стандартными средствами) как-то делается?
стандартными ИМХО, нет. Адрес переменной в Си - насколько я знаю, константа, подменить его нельзя.
b707, Вы ж поначалу правильно говорили, а сейчас, похоже ua6em, похоже так загадил мозги неправильной терминологией, что Вы сбились и Вас понесло.
Давайте я ему отвечу.
ua6em, Вы путаете c прямым углом. Не делается это в ассемблере ни за один такт, ни за десять, потому, что нету там никаких массивов.
То, что Вы пишете, делается одной командой на любом языке, но только не объявлением доп массива (нахрена Вам под него память выделять), а объявлением указателя:
b707, Вы ж поначалу правильно говорили, а сейчас, похоже ua6em, похоже так загадил мозги неправильной терминологией, что Вы сбились и Вас понесло.
ну тогда видимо совсем понесло :). потому что Вы немного не о том, как мне кажется.
То. что вы показали - обычный указатель. Использование указателя на одномерный массив не позволит вам обратится к нему как к многомерному.
То есть вот такой пример не сработает:
А ua6em предлагает обьявить переменную как двумерный массив, и потом изменить ее адрес, присвоив ей адрес другой переменной - одномерного массива
Не, Вы окончательно запутались, вернее ua6em всех запутал задавая по сто вопросов без перехода с одного на другой. По мне так вопрос про переназначения уже не касался двумерности.
Хотя, почему к указателю нельзя как к двумерному? Подсуньте указатель escheMassiv из прошлого поста в шаблон, что я определил выше. Он его сожрёт за милую душу - вот и двумерность. Адресную арифметику ж никто не отменял.
Вообще-то, Си - не мой родной язык, но у меня как-то отложилось, что в Си массив и указатель - это одно и то же.
Скорее "имя массива является указателем на его первый элемент".
Увы, вряд ли эту фразу можно понять однозначно, если не знать, чем при этом является имя простой переменной (для сравнения).
Вообще-то, Си - не мой родной язык, но у меня как-то отложилось, что в Си массив и указатель - это одно и то же.
По гамбургскому счёту - да, но есть существенный нюанс. При объявлении массива под все его элемент выделяется память, а отдельно под указатель - не выделяется. При объявлении указателя - память выделяется под указатель, а под элементы - не выделяется.
а как этот указатель понимает двумерность и размерности двумерности?