Про указатели вопрос

JonHappy1
Offline
Зарегистрирован: 11.06.2018
//есть
uint16_t  dist =0x1234;

uint16_t* h; //указатель на переменнуютипа uint16_t

h=&dist; // в h адрес переменной dist
//вывожу

Serial.print(String((byte) *(h+0)));
Serial.print(" ");
Serial.println(String((byte) *(h+1)));
//должно вывести 18 (=0x12)  и 52 (=0x34) или наоборот
//выводит 52 и 192

в чем ошибка?
 

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

а если так

uint16_t  dist =0x1234;

byte* h; //указатель 

h=(byte *) &dist; // в h адрес переменной dist
//вывожу

Serial.print(String((byte) *(h+0)));
Serial.print(" ");
Serial.println(String((byte) *(h+1)));

 

JonHappy1
Offline
Зарегистрирован: 11.06.2018

спасибо!

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

JonHappy1 пишет:

спасибо!

поняли, в чем дело было?

JonHappy1
Offline
Зарегистрирован: 11.06.2018

да, вроде разобрался с указателями :)
осталось на практике закрепить понятое.

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

Какие сообразительные люди пошли. Меня до сих пор указатели в ряде случаев в ступор вводят, а тут на трех строчках обучение прошел ))

JonHappy1
Offline
Зарегистрирован: 11.06.2018

да я с указателями познакомился ещё на СМ4/PDP11  . так что тут осталось только в применении к С разобраться

JonHappy1
Offline
Зарегистрирован: 11.06.2018

практика использования...

есть структура

typedef struct {
  byte ws[2];
  String comm[5];
  char delim ;
  char data[10];
} in_comm;

есть функция

void test(String data1) {

  Serial.println(data1);

  in_comm* in;
  in=(in_comm*)&data1;
  Serial.println(?????);
}

т.е. есть структура, в функции параметро data , надо "наложить" структуру (пременную с такой структурой) на память data1
что б обращаться к отдельным частям data1 как элементам структуры.
в Serial.println(?????);  вывести (к примеру) String comm[5], этой структуры

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

А в чем вопрос?  Serial.println(in_comm->delim);

JonHappy1
Offline
Зарегистрирован: 11.06.2018

in_comm это тип структуры. тогда уж так (наверное) Serial.println(in->comm);
но компилятор ругается
no matching function for call to 'String(String [5])'

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Ну правильно - у тебя там массив из 5 стрингов. Тебе все эти 5 стрингов надо вывести?

void test(void* data1) {

  in_comm* in;
  in=(in_comm*) data1;
  
  for(size_t i=0;i<5;i++) { Serial.println(in->comm[i]; }
}

 

JonHappy1
Offline
Зарегистрирован: 11.06.2018

там апечатка

typedef struct {
  byte ws[2];
  char comm[5];
  char delim ;
  char data[10];
} in_comm;

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Ну и в чём проблема-то?

void test(void* data1) {

  in_comm* in;
  in=(in_comm*) data1;
  
 Serial.println(in->comm);
}

? Опечатка у тебя нормальная такая - вместо массива char массив из экземпляров String. Приведённый в этом посте вариант - для массива char - выведет тебе всю строку.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Да, не заметил ещё, что ты дичь делаешь - в функцию передаёшь экземпляр класса String и пытаешься скастить его к своей структуре. Так не пойдёт, товарищ ;) Код я поправил.

Если у тебя внутри String data1, что ты передаёшь в функцию, лежит строка с данными структуры, то делать надо примерно вот так:

void test(const String& data1) {

 Serial.println(data1);

  in_comm* in = (in_comm*) data1.c_str();
  
 Serial.println(in->comm);
}

метод c_str() класса String возвращает указатель на область памяти, где класс String держит свои данные.

JonHappy1
Offline
Зарегистрирован: 11.06.2018

спасибо

JonHappy1
Offline
Зарегистрирован: 11.06.2018

не совсем про указатели , но близко

есть такое

typedef struct  {
  char x1[6];
} STR;


STR  str[] = {"xxx04", "xxx05"}


char x1[6] длину надо задавать на 1 больше, чем строка туда записываемая, для ограничения строки в конце нулём. это не совсем подходит. можно обойти это если заполнить таким образом
 

STR  str[] = {{'x','x','x','0','4'}, {'x','x','x','0','5'}}

что просто не красиво.

есть ли чтоб было красиво и без 0 на конце и "красиво"

я сейчас получаю строку xxx04_|111111

in->comm[5] = 0;
  int  i = sizeof(str) / sizeof(str[0]);
  for (int j = 0; j < i; j++) {
    if (! strcmp(str[j].x1 , in->comm)) {
      numeral[j]();
      break;
    };

делаю так  in->comm[5] = 0; чтоб получить строку, тогда сравнивается

есть вариант как сравнить два char/byt/uint8_t без явного for?

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

Подсказать, что есть strcmp / memcmp ? ))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

в Явах этих ваших бесовских функций нет.  

JonHappy1
Offline
Зарегистрирован: 11.06.2018

sadman41 пишет:

Подсказать, что есть strcmp / memcmp ? ))

по названию найду инфу сам. главное знать, что искать :)