Проблема с двумерным массивом
- Войдите на сайт для отправки комментариев
Втр, 12/06/2018 - 21:13
Добрый день.
Есть задача: вывести на экран через Serial содержимое двумерного массива. Если SIZEY равна 10 - на экран выводится массив с артефактами (несколько значков в произвольных местах). Если SIZEY больше 10 на экран не выводится ничего. При компиляции ошибок не вижу. Что я делаю не так?
#define SIZEX 85 #define SIZEY 10 int x, y; char* mas[SIZEX][SIZEY]; void setup() { Serial.begin(9600); } void loop() { for (y = 0; y < SIZEY; y++) { for (x = 0; x < SIZEX; x++) { mas[x][y] = " "; } } mas[5][5] = "*"; Serial.println("__________________________"); for (y = 0; y < SIZEY; y++) { for (x = 0; x < SIZEX; x++) { Serial.print(*mas[x][y]); } Serial.println(); } Serial.println("__________________________"); delay(1000); }
Спасибо.
char* mas[SIZEX][SIZEY];
...
for (y = 0; y < SIZEY; y++) { for (x = 0; x < SIZEX; x++) {
Может поэтому?
Простите, а что тут неправильно?
Сорри. Подумал, что типичная ошибка - перепутаны индексы.
Указатели использует, где не надо.
Если SIZEY больше 10 на экран не выводится ничего. При компиляции ошибок не вижу. Что я делаю не так?
Похоже памяти не хватает.
Пока размер массива маленький - всё работает. Как только увеличиваю - сразу начинают появляться артефакты. Такое впечатление, что память под массив не выделяется.
Попробовал на двух разных NANO
Почитайте скетч от strarbit - она всё правильно написала. Вы заводите массив указателей на char, но память под сами char не резервируете. Поэтому ждите от своего скетча каких угодно проблем.
Дак я собственно скетч от strarbit и использую теперь.
Немного подправил
Вы будете смеяться, но результат тот же. А нет ли у Вас возможности проверить код на настоящей ардуинке?
Память резервируется под указатели - здесь ошибки не вижу, хотя смысла в этом не вижу тоже - char'ы хранить конечно логичней и экономней.
Размер указателя, насколько я понимаю - 2 байта. Массив, при заданных SIZEX и SIZEY, занимает в памяти 85x10x2 = 1700 байтов. Для наны это серьёзная цифра, и да, скорей всего памяти просто не хватает.
Память резервируется под указатели - здесь ошибки не вижу, хотя смысла в этом не вижу тоже - char'ы хранить конечно логичней и экономней.
Ну, так-то да - завести 85*10 указателей, записать в них 0x20, в [5][5] засунуть 0x2A, затем читать по этим адресам, - с точки зрения компилятора действие, в принципе, не ошибочное.
Ну, так-то да - завести 85*10 указателей, записать в них 0x20, в [5][5] засунуть 0x2A, затем читать по этим адресам, - с точки зрения компилятора действие, в принципе, не ошибочное.
Как раз записать 0x2A - действие ошибочное, и компилятор обязательно обругался бы.
Но там, у ТС, записывается не '*', а именно "*" - в двойных кавычках. Это строка, и в массив записывается адрес этой строки, то есть указатель.
-------
ЗЫ. Ой, только что заметил. У strarbit всё правильно, но кавычки в одном месте остались как были:
mas[x][y] =
" "
;
Замените их на
'
'
, и всё получится. Я надеюсь.Да я на месте компилятора вообще бы ругался без остановки и даже не залил бы прошивку, однако, как я понимаю, у ТС как-то удалось его переубедить. Но вытаскивать свою ардуину ради проверки я не стану.
Datak: к сожалению, после замены кавычек проблема не исчезла. Похоже действительно не хватает памяти. Странно, что компилятор не ругается. Буду как-то выкручиваться.
Всем спасибо.
Буду как-то выкручиваться.
если это массив констант - например строк - положите их в PROGMEM. войдетзначительно больший массив
Специально залил в свою нану скетч strarbit с исправлением из #14 - все ок, проблем не вижу.
Специально залил в свою нану скетч strarbit с исправлением из #14 - все ок, проблем не вижу.
так у автора небось там массив не 85х10, а 850х100. Или просто пишет за пределы.
faktor, выкладывайте полный код, как вы используете массив.
sadman41, Спасибо!
b707, Спасибо!