Проблема с двумерным массивом

faktor
Offline
Зарегистрирован: 12.06.2018

Добрый день. 

Есть задача: вывести на экран через 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);
}

Спасибо.

sadman41
Offline
Зарегистрирован: 19.10.2016

faktor пишет:

char* mas[SIZEX][SIZEY];

...

for (y = 0; y < SIZEY; y++) { for (x = 0; x < SIZEX; x++) {

Может поэтому?

faktor
Offline
Зарегистрирован: 12.06.2018

Простите, а что тут неправильно?

sadman41
Offline
Зарегистрирован: 19.10.2016

Сорри. Подумал, что типичная ошибка - перепутаны индексы.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Указатели использует, где не надо.

andryn
Offline
Зарегистрирован: 08.06.2018

faktor пишет:

Если SIZEY больше 10 на экран не выводится ничего. При компиляции ошибок не вижу. Что я делаю не так?

Похоже памяти не хватает.

 

strarbit
Offline
Зарегистрирован: 12.06.2016
#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);
}
Image already added
 
 
 
faktor
Offline
Зарегистрирован: 12.06.2018

Пока размер массива маленький - всё работает. Как только увеличиваю - сразу начинают появляться артефакты. Такое впечатление, что память под массив не выделяется.

Попробовал на двух разных NANO

sadman41
Offline
Зарегистрирован: 19.10.2016

Почитайте скетч от strarbit - она всё правильно написала. Вы заводите массив указателей на char, но память под сами char не резервируете. Поэтому ждите от своего скетча каких угодно проблем.

faktor
Offline
Зарегистрирован: 12.06.2018

Дак я собственно скетч от strarbit и использую теперь. 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Немного подправил 

/**/
//------поле----------------------------
#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);
}
/**/

 

faktor
Offline
Зарегистрирован: 12.06.2018

Вы будете смеяться, но результат тот же. А нет ли у Вас возможности проверить код на настоящей ардуинке?

Datak
Offline
Зарегистрирован: 09.10.2014

sadman41 пишет:
Вы заводите массив указателей на char, но память под сами char не резервируете. Поэтому ждите от своего скетча каких угодно проблем.

Память резервируется под указатели - здесь ошибки не вижу, хотя смысла в этом не вижу тоже - char'ы хранить конечно логичней и экономней.

Размер указателя, насколько я понимаю - 2 байта. Массив, при заданных SIZEX и SIZEY, занимает в памяти 85x10x2 = 1700 байтов. Для наны это серьёзная цифра, и да, скорей всего памяти просто не хватает.

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Datak пишет:

sadman41 пишет:
Вы заводите массив указателей на char, но память под сами char не резервируете. Поэтому ждите от своего скетча каких угодно проблем.

Память резервируется под указатели - здесь ошибки не вижу, хотя смысла в этом не вижу тоже - char'ы хранить конечно логичней и экономней.

Ну, так-то да - завести 85*10 указателей, записать в них 0x20, в [5][5] засунуть 0x2A, затем читать  по этим адресам, - с точки зрения компилятора действие, в принципе, не ошибочное. 

Datak
Offline
Зарегистрирован: 09.10.2014

sadman41 пишет:

Ну, так-то да - завести 85*10 указателей, записать в них 0x20, в [5][5] засунуть 0x2A, затем читать  по этим адресам, - с точки зрения компилятора действие, в принципе, не ошибочное. 

Как раз записать 0x2A - действие ошибочное, и компилятор обязательно обругался бы.

Но там, у ТС, записывается не '*', а именно "*" - в двойных кавычках. Это строка, и в массив записывается адрес этой строки, то есть указатель.

-------
ЗЫ. Ой, только что заметил. У strarbit всё правильно, но кавычки в одном месте остались как были:
mas[x][y] = " ";

Замените их на ' ',  и всё получится. Я надеюсь.

sadman41
Offline
Зарегистрирован: 19.10.2016

Да я на месте компилятора вообще бы ругался без остановки и даже не залил бы прошивку, однако, как я понимаю, у ТС  как-то удалось его переубедить. Но вытаскивать свою ардуину ради проверки я не стану.

faktor
Offline
Зарегистрирован: 12.06.2018

Datak: к сожалению, после замены кавычек проблема не исчезла. Похоже действительно не хватает памяти. Странно, что компилятор не ругается. Буду как-то выкручиваться.

Всем спасибо.

b707
Offline
Зарегистрирован: 26.05.2017

faktor пишет:

Буду как-то выкручиваться.

если это массив констант - например строк - положите их в PROGMEM. войдетзначительно больший массив

sadman41
Offline
Зарегистрирован: 19.10.2016

Специально залил в свою нану скетч strarbit с исправлением из #14 - все ок, проблем не вижу.

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

Специально залил в свою нану скетч strarbit с исправлением из #14 - все ок, проблем не вижу.

так у автора небось там массив не 85х10, а 850х100. Или просто пишет за пределы.

faktor, выкладывайте полный код, как вы используете массив.

strarbit
Offline
Зарегистрирован: 12.06.2016

sadman41, Спасибо!

Image already added
 
 
 
strarbit
Offline
Зарегистрирован: 12.06.2016

b707, Спасибо!

Image already added