Проблема с двумерным массивом
- Войдите на сайт для отправки комментариев
Втр, 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 на экран не выводится ничего. При компиляции ошибок не вижу. Что я делаю не так?
Похоже памяти не хватает.
#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); }Пока размер массива маленький - всё работает. Как только увеличиваю - сразу начинают появляться артефакты. Такое впечатление, что память под массив не выделяется.
Попробовал на двух разных NANO
Почитайте скетч от strarbit - она всё правильно написала. Вы заводите массив указателей на char, но память под сами char не резервируете. Поэтому ждите от своего скетча каких угодно проблем.
Дак я собственно скетч от strarbit и использую теперь.
Немного подправил
/**/ //------поле---------------------------- #define SIZEX 85 #define SIZEY 10 char mas[SIZEX][SIZEY]; void clear() { for (int y = 0; y < SIZEY; y++) { for (int x = 0; x < SIZEX; x++) { mas[x][y] = ' '; } } } void viev() { Serial.println("__________________________"); for (int y = 0; y < SIZEY; y++) { Serial.println(); for (int x = 0; x < SIZEX; x++) { Serial.print(mas[x][y]); } Serial.println(); } Serial.println("__________________________"); } void set(int x, int y, char c) { mas[x][y] = c ; } //-------main---------------- void setup() { Serial.begin(9600); clear(); } void loop() { set(5, 5, '*'); viev(); delay(1000); } /**/Вы будете смеяться, но результат тот же. А нет ли у Вас возможности проверить код на настоящей ардуинке?
Память резервируется под указатели - здесь ошибки не вижу, хотя смысла в этом не вижу тоже - 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, Спасибо!