Про указатели вопрос
- Войдите на сайт для отправки комментариев
Пнд, 18/06/2018 - 21:23
//есть
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
в чем ошибка?
а если так
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)));спасибо!
спасибо!
поняли, в чем дело было?
да, вроде разобрался с указателями :)
осталось на практике закрепить понятое.
Какие сообразительные люди пошли. Меня до сих пор указатели в ряде случаев в ступор вводят, а тут на трех строчках обучение прошел ))
да я с указателями познакомился ещё на СМ4/PDP11 . так что тут осталось только в применении к С разобраться
практика использования...
есть структура
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], этой структуры
А в чем вопрос? Serial.println(in_comm->delim);
in_comm это тип структуры. тогда уж так (наверное) Serial.println(in->comm);
но компилятор ругается
no matching function for call to 'String(String [5])'
Ну правильно - у тебя там массив из 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]; } }там апечатка
typedef struct { byte ws[2]; char comm[5]; char delim ; char data[10]; } in_comm;Ну и в чём проблема-то?
void test(void* data1) { in_comm* in; in=(in_comm*) data1; Serial.println(in->comm); }? Опечатка у тебя нормальная такая - вместо массива char массив из экземпляров String. Приведённый в этом посте вариант - для массива char - выведет тебе всю строку.
Да, не заметил ещё, что ты дичь делаешь - в функцию передаёшь экземпляр класса 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 держит свои данные.
спасибо
не совсем про указатели , но близко
есть такое
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?
Подсказать, что есть strcmp / memcmp ? ))
в Явах этих ваших бесовских функций нет.
Подсказать, что есть strcmp / memcmp ? ))