Malaja
|
|
« : 06-12-2004 12:10 » |
|
Narod, u menja tormoz Posmotrite pogalujsta - prawilno ili net ja ih priwogu??? A to u menja snachala dage woprosow ne woznikalo, a sejchas wdrug probilo (na swoju golowu s kollegoj poobshalas) - woistinu peremudrit wsegda opasno dlja gizni okrugajushih : :twisted: size_t nHandle = 123456; char sHandle[1024]; ... 1) strcpy (sHandle, "123456"); nHandle = atol(sHandle); // ulu atoi hotja size_t wrode bi proishodit ot long 2) sprintf(sHandle, "%d", nHandle ); // ili nado chto-to drugoe ispolzowat???
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
baldr
|
|
« Ответ #1 : 06-12-2004 12:18 » |
|
typedef unsigned int size_t Значит, надо atoi()
|
|
|
Записан
|
Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
|
|
|
Malaja
|
|
« Ответ #2 : 06-12-2004 12:34 » |
|
baldr, spasibochki! Taki horosho, chto zadumalas! U menja pochemu-to w golowe sidelo, chto eto long :oops:
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #3 : 06-12-2004 20:08 » |
|
baldr, ты не прав. Типы, формата что-то_t придуманы именно для отвязывания от конкретных размеров. Порой встречается софт, который не может работать с файлами более 2Г - они отталкивались именно от int (unsigned int32 на i386), хотя система может работать с 64-х битными длинами. Так что, стоит десять раз подумать, прежде чем заглядывать в заголовки и "упрощать" себе жизнь: если софт пишется под конкретную задачу и для _короткого_срока_пользования_, то коверкай как хошь, а иначе ты (или те, к кому попадут твои исходники) будешь мучатся при переделке программы.
Malaja, для работы с особо длинными величинами есть ф-ия long long atoll(const char *). Правда, тип long long относится к стандарту GNU и в других системах может называться иначе. Хотя стиль твой отдает школой MS, но ф-ии, которые ты привела, как правило, в MS программах не используются. Отсюда делаю вывод, что тебе не под MS надо писать, а под более POSIX-совместимую ОС. Рекомендую заглянуть в man atol и на сайт opengroup.org - наверняка там и другие ф-ии этой серии описаны. Если не секрет, какая ОС? А вообще-то, рекомендую более гибкий подход - директивы условной компиляции - так можно предусмореть больше вариантов под разные ОС и процемморы.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
npak
|
|
« Ответ #4 : 07-12-2004 10:45 » |
|
Malaja, не sprintf а sscanf Можешь воспользоваться самодельной функцией перевода из строки в число. Программа перевода может быть реализована так: #include <stdio.h>
long int str_to_int)const char * str: | long int result = 0; const char * p_c; for )p_c = str; isdigit)*p_c:; p_c ++: | result *= 10; result += *p_c - '0'; " return result; "
|
|
|
Записан
|
|
|
|
Migmile
Помогающий
Offline
|
|
« Ответ #5 : 10-12-2004 13:00 » |
|
А может быть поступить проще? Уйти от непонятного (в данном примере) size_t nHandle = 123456; и перейти к int или long или что-нибудь более осмысленное? А при преобразованиях, если не известен точный размер, лучше использовать с запасом - ведь никогда не знаешь, в какой системе понадобиться по новой использовать этот код. Насчет самодельной - это, конечно, можно, только стоит-ли? (встают вопросы оптимальности, надежности, времени отладки и т.д.) Обычно и так хватает, что придумывать...
|
|
|
Записан
|
|
|
|
Malaja
|
|
« Ответ #6 : 17-12-2004 10:49 » |
|
Ljudi, izwinite, tu nedelju swalilas s grippom, posemu bilo ne do ineta, a na etoj, kak tolko prishla, srazu bila pojmana i usagena na gorjashie proekti, poetomu sjuda eshe ne doshla :oops: Wo-perwih, wsem ogromnoe spasibo. Wo-wtorih, izwinite, ja dala malo infi : Sejchas objasnju - ja ispolzuju chuguju Dll (pod Linuxom - .so), w kotoroj nekotorie funkzii imejut parametr size_t, opisiwajushij handle rezultata. Ranshe eto bil long, potom oni reshili w swjazi s 64Bit - versiej perejti na size_t. Moj kod dolgen bit max universalnim (posemu bilo uslowie pisat tolko na c) i rabotat kak pod windoj, tak i pod linuxom, hpunixom i prochej erundoj Kak minimum sejchas est klienti, ispolzujushie soft pod win i linux. Ja uge zadajus woprosom, moget nado ispolzowat _atoi64? Wo wsjakom sluchae atoll w winde net.
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #7 : 17-12-2004 23:00 » |
|
Malaja, там где ф-ии в разных ОС разные, используй директивы условной компиляции и/или макросы. Примерчик, но не образец: #if defined)_WIN32_: #define ATOLL _atoi64 #else #if defined)_LINUX_: #define ATOLL atoll #else #define ATOLL ???? что-то еще #endif /* _LINUX_ */ #endif /* _WIN32_ */
.....
size_t i=ATOLL)str:;
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Malaja
|
|
« Ответ #8 : 20-12-2004 08:52 » |
|
RXL,
spasibo za primer!
Ostaetsja odin wopros - podhodit li w etom sluchae _atoi64 ili net? Moget bit, kto-to s etim uge stalkiwalsja? Prosto esli atoi() ne sowsem werno, to proizojdet poterja dannih, a eto awtomatom wizowet problemi. Tut ge c-kod, nikakih tebe udobstw w wide try-catch itd. :new_shot: Ja popitalas pojmat wse, chto mogno, prowerjaja wse parametri i prochaja, no esli weshi tipa newernogo preobrazowanija sigrajut, to eto chrewato...
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
npak
|
|
« Ответ #9 : 20-12-2004 10:28 » |
|
Malaja, в данном случае наиболее переносимый код -- написанный самой. Проблема в том, что чтение 64-битных чисел из строки не стандартизовано, поэтому при пользовании системно-зависимых функций ты рискуешь закопаться в особенностях ОСей и библиотек. Пример, предложенных RXL, хорош только для небольшого и хорошо определённого множества целевых платформ. Например, код, сгенерированный из #if defined)_WIN32_: #define ATOLL _atoi64 #else может не сработать на Win95. Надо либо статически линковаться с libc в которой есть _atoi64, либо тащить с собой MSVCRT.dll в которой гарантированно есть нужная функция. На мой взгляд, проблем с переносом и поддержкой ты получишь больше, чем выгод от экономии собственных сил при использовании нестандартных фич библиотеки.
|
|
|
Записан
|
|
|
|
|
npak
|
|
« Ответ #11 : 20-12-2004 14:21 » |
|
Migmile, надо чётко определять целевые платформы и стараться использовать стандартные функции.
|
|
|
Записан
|
|
|
|
Malaja
|
|
« Ответ #12 : 21-12-2004 10:41 » |
|
npak,
spasibo za sowet. Nado budet poprobowat.
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
|