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

 
 
> проблемы с atol
Integral
сообщение Aug 10 2008, 11:47
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
zltigo
сообщение Aug 10 2008, 12:17
Сообщение #2


Гуру
******

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



А чего это вдруг itoa/ltoa стали без радикса? Вызываем без прототипа sad.gif....


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Integral
сообщение Aug 10 2008, 12:26
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 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.
Go to the top of the page
 
+Quote Post
WHALE
сообщение Aug 10 2008, 12:30
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



Вы сами поняли поняли,что написали?
1.ltoa/ itoa ничего не возвращает,соответсвенно что вы сравниваете?
2.Что вы пытаетсь сделать этим сравнением-проверить работу библиотечной функции?Дык даже если она врет(а она работает,не сомневайтесь)-вы так об этом не узнаете.А чтобы проверить-выведите строку куда-нить или гляньте отладчиком,если есть.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
Integral
сообщение Aug 10 2008, 12:38
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 10 2008, 13:57
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
YAM
сообщение Aug 10 2008, 13:59
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 7-07-04
Из: Ukraine
Пользователь №: 291



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


--------------------
Go to the top of the page
 
+Quote Post
Integral
сообщение Aug 10 2008, 15:42
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 9-08-08
Пользователь №: 39 519



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


Спасибо. Все работает....
сколько под винду програмировал с такими проблемами не встречался.... компилятор вроде должен был сам выделить нужное место под строку...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 10 2008, 15:47
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Integral @ Aug 10 2008, 19:42) *
сколько под винду програмировал с такими проблемами не встречался.... компилятор вроде должен был сам выделить нужное место под строку...

А что на винде какой-то другой "C"? Компилятор Вам ничего не должен.
А вот книжки почитать действительно стоит...
Go to the top of the page
 
+Quote Post
Integral
сообщение Aug 10 2008, 16:03
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 9-08-08
Пользователь №: 39 519



я заметил много недостатков CodeVisionAVR в отличио от Visual Studio... например, прям в цикле фор немогу оголосить переменную что очень не удобно.... в функции задержки (например delay_us()wink.gif не передаются переменные только нужно числом писать, и еще очень много таких приколов... wacko.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 10 2008, 18:13
Сообщение #11


Гуру
******

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



Цитата(Integral @ Aug 10 2008, 17:42) *
сколько под винду програмировал с..

Это говорит только об одном, что программированием на "C" Вы вообще не занимались.
Цитата
например, прям в цикле фор немогу оголосить переменную что очень не удобно....

Ну если уж пользуетесь ворованными компиляторами, то стоит пользоваться максимально приличными.
Цитата
в функции задержки (например delay_us() не передаются переменные только нужно числом писать

А что в винде delay_us() появились smile.gif Прежде, чем продолжать что-то делать советую разабраться в том, чем delay_us() от sleep()
фатально отличается, равно чем отличается программирование в под операционную систему и голого контроллера.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
alex1979
сообщение Aug 10 2008, 18:22
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Integral
сообщение Aug 10 2008, 18:48
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 9-08-08
Пользователь №: 39 519



Цитата
Это говорит только об одном, что программированием на "C" Вы вообще не занимались.


Может когдато в децтве.... сразу перешел на С++
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 10 2008, 19:12
Сообщение #14


Гуру
******

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



Цитата(Integral @ Aug 10 2008, 20:48) *
Может когдато в децтве.... сразу перешел на С++

Полагаю, что это был Паскаль, а не C++. Перепутали sad.gif. Уже советовал - начните с базовых понятий языка и архитектуры контроллеров. Для начала что такое стек.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
WHALE
сообщение Aug 10 2008, 19:17
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



Цитата(zltigo @ Aug 10 2008, 22:13) *
например, прям в цикле фор немогу оголосить переменную что очень не удобно....

Это говорит только об одном, что программированием на "C" Вы вообще не занимались.
Ну если уж пользуетесь ворованными компиляторами, то стоит пользоваться максимально приличными.

Или воровать свежие версии smile.gif


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 11:11
Рейтинг@Mail.ru


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