реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Странная работа оператора strtol, avr gcc
Skaf
сообщение Oct 22 2010, 17:06
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 228
Регистрация: 4-06-09
Пользователь №: 49 940



Всем привет. Пишу подпрограмму для конвертирования строки типа "00:1c:4f:a2:23:12" в 6 байт.

Использую функцию strtol

Код
unsigned long strtoul (const char * __nptr,  char ** __endptr,  int __base)


Судя по описанию __nptr указатель на строку, __endptr указатель на следующий символ после которого в строке не надо делать обработку, __base - система счисления строки

Долго боролся с глюками, в итоге соорудил маленький код в котором проявляется странное на мой взгляд поведение функции strtol. Объясните, пожалуйста, почему она модифицирует саму строку?

Строка- mac. Запись идет в data. Почему в mac изменяются 2 байта, а именно тот, на который указывает __endptr и следующий за ним? (код в картинке. Там же красным помечены изменившиеся байты из-за действий функции strtol)

PS- Последние 2 строки кода бессмыслены и существуют только для того, чтобы там поставить точку останова.

Сообщение отредактировал Skaf - Oct 22 2010, 17:07
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Xenia
сообщение Oct 22 2010, 17:27
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(Skaf @ Oct 22 2010, 21:06) *
Всем привет. Пишу подпрограмму для конвертирования строки типа "00:1c:4f:a2:23:12" в 6 байт.
Судя по описанию __nptr указатель на строку, __endptr указатель на следующий символ после которого в строке не надо делать обработку, __base - система счисления строки
Долго боролся с глюками, в итоге соорудил маленький код в котором проявляется странное на мой взгляд поведение функции strtol. Объясните, пожалуйста, почему она модифицирует саму строку?

Нет, __endptr - это не указатель на следующий символ, а указатель на указатель! Оттого-то перед ним стоят две звездочки, а не одна.
Заведите себе ОТДЕЛЬНЫЙ указатель, назовите его хотя бы endptr, например так:
char *endptr;
А в функцию strtoul подставите его АДРЕС, например вот так:
rusult = long strtoul("00:1c:4f:a2:23:12", &endptr, 16);
Тогда фунция ПОЛОЖИТ в endptr указатель на следующий символ после конвертированного.
Следующие числа можно будет достать так:
rusult = long strtoul(endptr+1, &endptr, 16);
где 1 прибавляется для пропуска двоеточия.
Go to the top of the page
 
+Quote Post
Skaf
сообщение Oct 22 2010, 17:36
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 228
Регистрация: 4-06-09
Пользователь №: 49 940



Исправил. Заработало. Странно, как же я проворонил там еще одну звездочку ))

Спасибо.

Вот получилась вот такая ПП

Код
void telnet_str2mac(char *str, unsigned char * data){
    char * ptr1, * ptr2;

    ptr1 = str;
    ptr2 = str;

    while(1){
        if (*ptr2 == 0x00) {
            *data = (unsigned char)strtol(ptr1, &ptr2, 16);
            data++;
            break;
        }
        if (*ptr2 != ':'){
            ptr2++;
        } else {
            *data = (unsigned char)strtol(ptr1, &ptr2, 16);
            data++;
            ptr2++;
            ptr1 = ptr2;
        }
    }
}


Получает на вход указатель на строку с MAC адресом и указатель на массив, куда можно записать данные. Вроде работает
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 22 2010, 17:39
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Вы неправильно понимаете значение всех параметров этой функции. Почитайте ее описание, например, тут. Второй параметр функции это указатель на указатель, который служит для возврата значения указателя, который содержит адрес последнего непреобразованного символа в строке. Вместо того, чтобы передать адрес указателя, вы передаете в функцию его значение.
Измените строку
Код
*data=(unsigned char)strtol((const char *)ptr1, &ptr2, 16);


Опс! Тормознул с ответом. Уже ответили smile.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 10th June 2024 - 05:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.01458 секунд с 7
ELECTRONIX ©2004-2016