Монитор порта не отображает структуру из массивов char

Tima123
Offline
Зарегистрирован: 29.01.2020

Здравствуйте, уважаемые форумчане. Изучаю структуру. Не могу понять почему она не выводится в монитор порта (выводит кракозябру).

Использую Arduino Mega2560

Вот код

struct data
{
  char a1[9];
  char a2[7];
  char a3[10];
  char a4[3];
};

data d;

void setup()
{
  Serial.begin(115200);
}

void loop()
{
      displayInfo();
}

void displayInfo()
{  
  d.a1[9] = 12354323;
  d.a2[7] = 453235;
  d.a3[10] = 5643.2312;
  d.a4[3] = "AA";

for (int i = 0; i < sizeof(d); i++)
{
 Serial.write(*((char*)&d+i));
}
     printdata(&d);
  
  Serial.println();
}

void printdata(const void * v) {

      const data * d = (const data *) v;
      Serial.print(d->a1[9]);
      Serial.print(";");
      Serial.print(d->a2[7]);
      Serial.print(";");
      Serial.print(d->a3[10]);
      Serial.print(";");
      Serial.print(d->a4[3]);     
 }

 Монитор порта

 

rkit
Offline
Зарегистрирован: 23.11.2016

Tima123 пишет:

  d.a1[9] = 12354323;
  d.a2[7] = 453235;
  d.a3[10] = 5643.2312;
  d.a4[3] = "AA";

ничего из этого не является типом char

Tima123
Offline
Зарегистрирован: 29.01.2020

А как правильнее тогда написать?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Tima123 пишет:

А как правильнее тогда написать?

Ну например

d.a1[9] = '1';

 

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

Tima123 пишет:

А как правильнее тогда написать?

элементы массива не копируются при присваивании массивов, чтобы присвоить массиву char значение "Hello!" после инициализации- нужно последовательно присвоить каждую букву строки каждому элементу массива:

char t[9];
....
....

t[0] ='H';
t[1] ='e';
t[2] = 'l';
t[3] = 'l';

// и так далее

 

но вообще, конечно, так никто не делает. Массивы либо инициализируются строкой сразу :

char t[] = "Hello!";

либо заполняются копированием при помощи функций библиотеки string

 

Tima123
Offline
Зарегистрирован: 29.01.2020

Спасибо, попробую

Tima123
Offline
Зарегистрирован: 29.01.2020

Получается нужно разбить каждый массив на отдельные элементы, присвоить значение а потом снова вместе собрать?

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

Tima123 пишет:

Получается нужно разбить каждый массив на отдельные элементы, присвоить значение а потом снова вместе собрать?

Получается перед тем как садится программировать надо читать учебник с корки до корки. Здесь "русский метод" не читать инструкций не выйдет. 

ПС: http://cppstudio.com/post/690/

Tima123
Offline
Зарегистрирован: 29.01.2020

Спасибо, изучу

Tima123
Offline
Зарегистрирован: 29.01.2020

Изменил я код программы, вроде получилось, но вылезло кое что другое (выводится два раза)


struct data
{
  char a1[9];
  char a2[7];
  char a3[10];
  char a4[3];
  
};

data d;

void setup()
{
  Serial.begin(9600);

}

void loop()
{
     displayInfo();
}


void displayInfo()
{  

  char a1[]= "12354323";
  strncpy(d.a1, a1, 9);
  d.a1[9] = '\n';

  char a2[]= "453235";
  strncpy(d.a2, a2, 7);
  d.a2[7] = '\n';

  char a3[]= "5643.2312";
  strncpy(d.a3, a3, 10);
  d.a3[10] = '\n';

  char a4[]= "AA";
  strncpy(d.a4, a4, 3);
  d.a4[3] = '\n';

 
for (int i = 0; i < sizeof(d); i++)
{
 Serial.write(*((char*)&d+i));
}
     printdata(&d);
     
     
  Serial.println();
}


void printdata(const void * v) {

      const data * d = (const data *) v;
      Serial.print(d->a1);
      Serial.print(";");
      Serial.print(d->a2);
      Serial.print(";");
      Serial.print(d->a3);
      Serial.print(";");
      Serial.print(d->a4);
      
  }

  

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

Tima123, книгу не читаем по регилиозным причинам. Мол нормальные русские пасаны засмеют и обзавут ботаном. Намекну все же почитайте про массивы, объявление и адрес последней ячейки 

Tima123
Offline
Зарегистрирован: 29.01.2020

Пробовал разные варианты, в том числе и  вместо strncpy использовал strcpy. Выводит тоже самое

 

char a11[]= "12354323";
  strcpy(d.a1, a11);
  d.a1[9];

  char a22[]= "453235";
  strcpy(d.a2, a22);
  d.a2[7];

  char a33[]= "5643.2312";
  strcpy(d.a3, a33);
  d.a3[10];

  char a44[]= "AA";
  strcpy(d.a4, a44);
  d.a4[3];

 

rkit
Offline
Зарегистрирован: 23.11.2016

Может перечитать программу и посмотреть, нет ли в ней случайно второго вывода?

Tima123
Offline
Зарегистрирован: 29.01.2020

Точно))). Огромное спасибо что заметили и подсказали.

Удалил  это кусочек и все нормально.

for (int i = 0; i < sizeof(d); i++)
{
 Serial.write(*((char*)&d+i));
}

 

Tima123
Offline
Зарегистрирован: 29.01.2020

Всем спасибо за помощь)