Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передать строку из структуры в функицю 
:(
    Опции темы
Lockdog88
Дата 17.3.2017, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 22.4.2010

Репутация: нет
Всего: нет



Добрый день!
У меня есть структура в которой есть переменная 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 просто строку символов в кавычках, то всё в порядке.

В чём моя ошибка?
Спасибо.
PM MAIL   Вверх
vpf
Дата 17.3.2017, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 14.11.2016
Где: Moscow

Репутация: нет
Всего: нет



Почему в вызове функции  sendData((char*)nmea.checksum, 6); отсутствует знак &
PM MAIL IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Lockdog88
Дата 17.3.2017, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 22.4.2010

Репутация: нет
Всего: нет



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

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

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

Это сообщение отредактировал(а) Lockdog88 - 17.3.2017, 21:32
PM MAIL   Вверх
volatile
Дата 17.3.2017, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2092
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



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


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

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

PM MAIL   Вверх
Lockdog88
Дата 18.3.2017, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 22.4.2010

Репутация: нет
Всего: нет



А как мне правильно сделать, подскажите, пожалуйста.
Если я знаю длины всех полей, мне в структуре сделать переменные фиксированной длины?
PM MAIL   Вверх
volatile
Дата 18.3.2017, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2092
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



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

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

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

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

PM MAIL   Вверх
Lockdog88
Дата 18.3.2017, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 22.4.2010

Репутация: нет
Всего: нет



Цитата(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);), но как передать в эту функцию переменную из структуры - у меня возникают проблемы.
PM MAIL   Вверх
volatile
Дата 18.3.2017, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2092
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Lockdog88, что у вас в структуре?
бинарные данные, и вам нужно их передать?

PM MAIL   Вверх
Lockdog88
Дата 18.3.2017, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 22.4.2010

Репутация: нет
Всего: нет



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

Там символьные данные.
PM MAIL   Вверх
volatile
Дата 18.3.2017, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2092
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



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

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


PM MAIL   Вверх
Lockdog88
Дата 19.3.2017, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 22.4.2010

Репутация: нет
Всего: нет



Сейчас делаю так:
Код

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);


Но с другой стороны опять пустые данные
PM MAIL   Вверх
volatile
Дата 19.3.2017, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2092
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



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


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

Это сообщение отредактировал(а) volatile - 19.3.2017, 18:08
PM MAIL   Вверх
Lockdog88
Дата 19.3.2017, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 22.4.2010

Репутация: нет
Всего: нет



Спасибо большое!
Объясните дураку, что изменило добавление ещё одного байта? Там нуль-терминатор хранится?
PM MAIL   Вверх
volatile
Дата 19.3.2017, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2092
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



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

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

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

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

юзать
Код

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

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

PM MAIL   Вверх
Lockdog88
Дата 19.3.2017, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 22.4.2010

Репутация: нет
Всего: нет



Спасибо вам большое!
PM MAIL   Вверх
Google
  Дата 26.5.2017, 01:06 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1211 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.