|
проблемы с atol |
|
|
|
Aug 10 2008, 11:47
|
Частый гость
 
Группа: Участник
Сообщений: 149
Регистрация: 9-08-08
Пользователь №: 39 519

|
Подскажыте пожалуйста почему не исполняется условые "atol(st)==nn" в следующем коде: Код char *st; long int nn=123; ltoa(nn, st); if(atol(st)==nn) { PORTD.1=1; } притом что следующий код исполняется нормально: Код char *st; long int nn=123; itoa(nn, st); if(atoi(st)==nn) { PORTD.1=1; } Мне нужен atol так как работаю с большыми числами... Компилятор CodeVisionAVR
Сообщение отредактировал Integral - Aug 10 2008, 11:48
|
|
|
|
|
Aug 10 2008, 12:26
|
Частый гость
 
Группа: Участник
Сообщений: 149
Регистрация: 9-08-08
Пользователь №: 39 519

|
в хелпе прототип выглядит следующим образом: Цитата long int atol(char *str)
converts the string str to long integer.
void ltoa(long int n, char *str)
converts the long integer n to characters in string str.
|
|
|
|
|
Aug 10 2008, 12:38
|
Частый гость
 
Группа: Участник
Сообщений: 149
Регистрация: 9-08-08
Пользователь №: 39 519

|
Цитата 1.ltoa/ itoa ничего не возвращает,соответсвенно что вы сравниваете? я сравнываю не ltoa/ itoa а atol/atoi а оны возвращают значеные long int/int которые спрятаны в строке. Этот код мне не нужен, я его прывел только чтобы разобраться и в реальной програме тоже непашет.... Вот косочек реального кода: Код long int len(long int ln) { char *st; ltoa(ln, st); return strlen(st); } должно возвратыть длину числа в переменной ln, а возвращает чето все время 1.... Еслы вместо ltoa поставить іtoa то все работает, а с ltoa нет. Поетому я и спросить решыл вчем дело?
Сообщение отредактировал Integral - Aug 10 2008, 12:56
|
|
|
|
|
Aug 10 2008, 13:57
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Integral @ Aug 10 2008, 14:26)  в хелпе прототип выглядит следующим образом: Ну функция, конечно, не ANSI, но тем не менее в общепринятых реализациях все не так ltoa(long integer, char *string, int radix) Чего-то тут бельгийцы наваяли. Цитата(Integral @ Aug 10 2008, 14:38)  Вот косочек реального кода: Код long int len(long int ln) { char *st; ltoa(ln, st); return strlen(st); } Прикольно, а то, что st указывает пальцем в небо... Вы бы хоть с какой книжки сишной начали, для общего понимания.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 10 2008, 15:42
|
Частый гость
 
Группа: Участник
Сообщений: 149
Регистрация: 9-08-08
Пользователь №: 39 519

|
Цитата Ну, во первых для того, чтобы функция сделала из long строку, ей конечно надо дать указатель, НО, указатель на существующую строку размером не менее ожидаемой или максимальной длины long-а, это 10 цифр + знак + завершающий 0. Итого, надо объявить char st[12]; --- конец во-первых ---- Спасибо. Все работает.... сколько под винду програмировал с такими проблемами не встречался.... компилятор вроде должен был сам выделить нужное место под строку...
|
|
|
|
|
Aug 10 2008, 18:13
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Integral @ Aug 10 2008, 17:42)  сколько под винду програмировал с.. Это говорит только об одном, что программированием на "C" Вы вообще не занимались. Цитата например, прям в цикле фор немогу оголосить переменную что очень не удобно.... Ну если уж пользуетесь ворованными компиляторами, то стоит пользоваться максимально приличными. Цитата в функции задержки (например delay_us() не передаются переменные только нужно числом писать А что в винде delay_us() появились  Прежде, чем продолжать что-то делать советую разабраться в том, чем delay_us() от sleep() фатально отличается, равно чем отличается программирование в под операционную систему и голого контроллера.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 10 2008, 18:22
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 23-11-07
Из: Украина, Волынь
Пользователь №: 32 613

|
были проблемы с atoi. (использую winAvr). Функция работает если ее вызывать внутри другой функции, вызываемой из main(). Если степень вложения больше, то функция не работает. Вот что выдает компилятор : Код 000061c2 <atoi>: 61c2: fc 01 movw r30, r24 61c4: 88 27 eor r24, r24 61c6: 99 27 eor r25, r25 61c8: e8 94 clt 61ca: 21 91 ld r18, Z+ 61cc: 20 32 cpi r18, 0x20; 32 61ce: e9 f3 breq .-6 ; 0x61ca <atoi+0x8> 61d0: 29 30 cpi r18, 0x09; 9 61d2: 10 f0 brcs .+4 ; 0x61d8 <atoi+0x16> 61d4: 2e 30 cpi r18, 0x0E; 14 61d6: c8 f3 brcs .-14 ; 0x61ca <atoi+0x8> 61d8: 2b 32 cpi r18, 0x2B; 43 61da: 41 f0 breq .+16 ; 0x61ec <atoi+0x2a> 61dc: 2d 32 cpi r18, 0x2D; 45 61de: 39 f4 brne .+14 ; 0x61ee <atoi+0x2c> 61e0: 68 94 set 61e2: 04 c0 rjmp .+8 ; 0x61ec <atoi+0x2a> 61e4: 0e 94 f3 31 call 0x63e6; 0x63e6 <__mulhi_const_10> 61e8: 82 0f add r24, r18 61ea: 91 1d adc r25, r1 61ec: 21 91 ld r18, Z+ 61ee: 20 53 subi r18, 0x30; 48 61f0: 2a 30 cpi r18, 0x0A; 10 61f2: c0 f3 brcs .-16 ; 0x61e4 <atoi+0x22> 61f4: 1e f4 brtc .+6 ; 0x61fc <atoi+0x3a> 61f6: 90 95 com r25 61f8: 81 95 neg r24 61fa: 9f 4f sbci r25, 0xFF; 255 61fc: 08 95 ret Код 000061fe <atol>: 61fe: 1f 93 push r17 6200: fc 01 movw r30, r24 6202: 99 27 eor r25, r25 6204: 88 27 eor r24, r24 6206: bc 01 movw r22, r24 6208: e8 94 clt 620a: 11 91 ld r17, Z+ 620c: 10 32 cpi r17, 0x20; 32 620e: e9 f3 breq .-6 ; 0x620a <atol+0xc> 6210: 19 30 cpi r17, 0x09; 9 6212: 10 f0 brcs .+4 ; 0x6218 <atol+0x1a> 6214: 1e 30 cpi r17, 0x0E; 14 6216: c8 f3 brcs .-14 ; 0x620a <atol+0xc> 6218: 1b 32 cpi r17, 0x2B; 43 621a: 51 f0 breq .+20 ; 0x6230 <atol+0x32> 621c: 1d 32 cpi r17, 0x2D; 45 621e: 49 f4 brne .+18 ; 0x6232 <atol+0x34> 6220: 68 94 set 6222: 06 c0 rjmp .+12 ; 0x6230 <atol+0x32> 6224: 0e 94 de 31 call 0x63bc; 0x63bc <__mulsi_const_10> 6228: 61 0f add r22, r17 622a: 71 1d adc r23, r1 622c: 81 1d adc r24, r1 622e: 91 1d adc r25, r1 6230: 11 91 ld r17, Z+ 6232: 10 53 subi r17, 0x30; 48 6234: 1a 30 cpi r17, 0x0A; 10 6236: b0 f3 brcs .-20 ; 0x6224 <atol+0x26> 6238: 3e f4 brtc .+14 ; 0x6248 <atol+0x4a> 623a: 90 95 com r25 623c: 80 95 com r24 623e: 70 95 com r23 6240: 61 95 neg r22 6242: 7f 4f sbci r23, 0xFF; 255 6244: 8f 4f sbci r24, 0xFF; 255 6246: 9f 4f sbci r25, 0xFF; 255 6248: 1f 91 pop r17 624a: 08 95 ret Думаю что во всем виновата команда push в atol().
Сообщение отредактировал alex1979 - Aug 10 2008, 18:56
|
|
|
|
|
Aug 10 2008, 18:48
|
Частый гость
 
Группа: Участник
Сообщений: 149
Регистрация: 9-08-08
Пользователь №: 39 519

|
Цитата Это говорит только об одном, что программированием на "C" Вы вообще не занимались. Может когдато в децтве.... сразу перешел на С++
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|