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

 
 
> Странная работа оператора 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
 
Start new topic
Ответов
Skaf
сообщение Oct 22 2010, 17:36
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 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



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

 


RSS Текстовая версия Сейчас: 4th August 2025 - 23:40
Рейтинг@Mail.ru


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