Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Передать строку из структуры в функицю


Автор: Lockdog88 17.3.2017, 17:34
Добрый день!
У меня есть структура в которой есть переменная uint8_t:
Код

typedef struct {
    uint8_t checksum;
    ...
} gnss_gprmc_t;


Я разбираю строку из UART'a и записываю необходимые данные в структуру:

Код

strcpy((char*)&nmea.checksum,*(tokens + i));


Потом мне необходимо отправить эти данные по другому интерфейсу
Код

sendData((char*)nmea.checksum, 6);

void sendData(const char * buffer, uint8_t size)
{
    for (uint8_t i = 0; i < size; i++){
        writeBuffer(buffer[i]);
    }
}

Но на принимаемой стороне приходят пустые данные, но если я отправлю через функцию sendData просто строку символов в кавычках, то всё в порядке.

В чём моя ошибка?
Спасибо.

Автор: vpf 17.3.2017, 20:06
Почему в вызове функции  sendData((char*)nmea.checksum, 6); отсутствует знак &

Автор: Lockdog88 17.3.2017, 21:28
Цитата(vpf @ 17.3.2017,  20:06)
Почему в вызове функции  sendData((char*)nmea.checksum, 6); отсутствует знак &

Потому что тогда я получаю ошибку:
error: pointer targets in passing argument 1 of 'sendData' differ in signedness

UPD. Извиняюсь, это я объявление функции не поправил. Ошибки больше нет, но на принимаемой стороне так же пустая строка

Автор: volatile 17.3.2017, 23:07
Цитата(Lockdog88 @  17.3.2017,  17:34 Найти цитируемый пост)
strcpy((char*)&nmea.checksum,*(tokens + i));


вы копируете в однобайтную переменную всю строку
она затирает вашу структуру, и черт знает что еще, расположенное после.

ps: такие приведения типов - верный путь прострелить себе ногу, 

Автор: Lockdog88 18.3.2017, 13:02
А как мне правильно сделать, подскажите, пожалуйста.
Если я знаю длины всех полей, мне в структуре сделать переменные фиксированной длины?

Автор: volatile 18.3.2017, 14:09
Цитата(Lockdog88 @  18.3.2017,  13:02 Найти цитируемый пост)
А как мне правильно сделать

Чтоб ответить на ваш вопрос, нужно сначала понять что вы хотите сделать.
Из вашего кода (не имеющего смысла), ничего не понятно.

Например, если вы хотите хранить строку в структуре, и вы уверены что длина этой строки никогда не превысит допустим 15 байт, то соответственно:
Код

typedef struct {
    сhar str [16];
    ...
} gnss_gprmc_t;

Автор: Lockdog88 18.3.2017, 16:37
Цитата(volatile @ 18.3.2017,  14:09)
Цитата(Lockdog88 @  18.3.2017,  13:02 Найти цитируемый пост)
А как мне правильно сделать

Чтоб ответить на ваш вопрос, нужно сначала понять что вы хотите сделать.
Из вашего кода (не имеющего смысла), ничего не понятно.

Например, если вы хотите хранить строку в структуре, и вы уверены что длина этой строки никогда не превысит допустим 15 байт, то соответственно:
Код

typedef struct {
    сhar str [16];
    ...
} gnss_gprmc_t;

Да, я хочу хранить данные фиксированного размера в структуре, далее, мне нужно эти данные отправить по радиоканалу, собственно, текущая функция, которая их отправляет (sendData) корректно работает, со строковыми константами (типа sendData("blah-blah"), 9);), но как передать в эту функцию переменную из структуры - у меня возникают проблемы.

Автор: volatile 18.3.2017, 17:18
Lockdog88, что у вас в структуре?
бинарные данные, и вам нужно их передать?

Автор: Lockdog88 18.3.2017, 18:42
Цитата(volatile @ 18.3.2017,  17:18)
Lockdog88, что у вас в структуре?
бинарные данные, и вам нужно их передать?

Там символьные данные.

Автор: volatile 18.3.2017, 18:49
Цитата(Lockdog88 @  18.3.2017,  18:42 Найти цитируемый пост)
Там символьные данные. 

ну тогда смотри выше
Цитата(volatile @  18.3.2017,  14:09 Найти цитируемый пост)
typedef struct {
    сhar str [16];
    ...
} gnss_gprmc_t;


Автор: Lockdog88 19.3.2017, 17:25
Сейчас делаю так:
Код

typedef struct {
    uint8_t header[6];
} gnss_gprmc_t;


Код

strcpy((char*)&nmea.header, "$GPRMC");


Код

void sendData(uint8_t buffer[], uint8_t size)
{
    for (uint8_t i = 0; i < size; i++){
        writeBuffer(buffer[i]);
    }
}


Значение из структуры передаю в функцию так:
Код

sendData(nmea.header, 6);


Но с другой стороны опять пустые данные

Автор: volatile 19.3.2017, 18:07
Места для терминатора нет:
Цитата(Lockdog88 @  19.3.2017,  17:25 Найти цитируемый пост)
typedef struct {
    uint8_t header[6 7];
} gnss_gprmc_t;


больше вроде фатальных ошибок нет, и должно работать.
Ели нет, то вы что-то не договариваете  smile 

Автор: Lockdog88 19.3.2017, 18:15
Спасибо большое!
Объясните дураку, что изменило добавление ещё одного байта? Там нуль-терминатор хранится?

Автор: volatile 19.3.2017, 18:22
Цитата(Lockdog88 @  19.3.2017,  18:15 Найти цитируемый пост)
Там нуль-терминатор хранится? 

Да, строки в С/С++ имеют тенденцию оканчиваться нулём. )

Кстати если у вас строка жестко равна 6 байтам, можно отвести под них ровно 6 байт

тогда вместо
Цитата(Lockdog88 @  19.3.2017,  17:25 Найти цитируемый пост)
strcpy((char*)&nmea.header, "$GPRMC");

юзать
Код

memcpy (nmea.header, "$GPRMC", 6);

остальное без имзенений

Автор: Lockdog88 19.3.2017, 20:30
Спасибо вам большое!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)