Непонятный Warning
, и непонятная секция
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.217.58] |
|
|
Правила раздела Visual C++ / MFC / WTL (далее Раздела)
FAQ Раздела
Обновления для FAQ Раздела
Поиск по Разделу
MSDN Library Online| Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Непонятный Warning
, и непонятная секция
|
Сообщ.
#16
,
|
|
|
|
Цитата rmf @ Цитата Сам себе геморрой и ищешь.... 6к жалко. Офигеть... Мда... наверное ты прав, но на си я перехожу из-за маленького размера, хочется пользоватся этой возможностью по полной! Переходи на ассемблер - там всего будет по-полной... Цитата но блин, из списка вызываемых библиотек, и ф-ций исчез только strstr!!! хотя заменил все ф-ции! в чем может быть дело? ![]() Значит, кто-то продолжает их юзать. /NODEFAULLIB применял? |
|
Сообщ.
#17
,
|
|
|
|
и на асме пробовал, далье программ типа вызова нескольких апи не решился пойти, решил на си остановится!
угу, получаю myprj.obj : error LNK2001: unresolved external symbol _memcpy myprj.obj : error LNK2001: unresolved external symbol _memset Цитата Значит, кто-то продолжает их юзать. Кто? в коде нету их вызова! |
|
Сообщ.
#18
,
|
|
|
|
Цитата rmf @ Цитата Значит, кто-то продолжает их юзать. Кто? в коде нету их вызова! Компилятор. Вполне может memset вставить на безобидную конструкцию вроде int a[1000] = { 0 }; Выход - напиши свою функцию memset и memcpy, чтобы он не волновался |
|
Сообщ.
#19
,
|
|
|
|
Хм.. вот это я сглупил, точно, можно было создать ф-ции с этми именами,
но вот ещё что случилось теперь показывает ошибку .\myprj.cpp(129) : error C3861: 'memset': identifier not found на строку FillMemory(recvbuffer,1024,0); (ну и на другие тоже, где используются эти ф-ции) ну и как это объяснить? memset использует FillMemory, или наоборот? в Delphi IDE если нажать на Ctrl и мышкой на имя ф-ции, то показывается где она объявленна и её код, в VS такое можно? Добавлено ой, и ещё ошибки: \myfunc.cpp(13) : error C2169: 'memcpy' : intrinsic function, cannot be defined \myfunc.cpp(18) : error C2169: 'memset' : intrinsic function, cannot be defined |
|
Сообщ.
#20
,
|
|
|
|
Цитата rmf @ ну и как это объяснить? memset использует FillMemory, или наоборот? FillMemory - это макрос, и раскрывающийся в memset (совсем дырявая голова стала ). Вообщем, напиши целиком свои функции, благо это несложно.Цитата в Delphi IDE если нажать на Ctrl и мышкой на имя ф-ции, то показывается где она объявленна и её код, в VS такое можно? Правая кнопка - "Go To Definition" Цитата \myfunc.cpp(13) : error C2169: 'memcpy' : intrinsic function, cannot be defined \myfunc.cpp(18) : error C2169: 'memset' : intrinsic function, cannot be defined Попробуй написать: ![]() ![]() #pragma function(memset, memcpy) |
|
Сообщ.
#21
,
|
|
|
|
#pragma function(memset, memcpy), угу, 2 ошибки ичесли, а что она делает?
FillMemory - это макрос, и раскрывающийся в memset т.е. FillMemory это не замена memset, а всего лишь вызов memset, и надо написать свой аналог memset? правильно понял? |
|
Сообщ.
#22
,
|
|
|
|
Цитата rmf @ #pragma function(memset, memcpy), угу, 2 ошибки ичесли, а что она делает? Это указание компилятору не пытаться использовать встраиваемые версии данных фукнций. Цитата т.е. FillMemory это не замена memset, а всего лишь вызов memset, и надо написать свой аналог memset? правильно понял? Да. |
|
Сообщ.
#23
,
|
|
|
|
Используй RtlFillMemory и иже с ним из kernel32.lib. Тока на одноименные макросы не нарвись
Добавлено Нечто вроде ![]() ![]() #ifdef RtlFillMemory #undef RtlFillMemory #endif extern "C" NTSYSAPI VOID NTAPI RtlFillMemory ( VOID UNALIGNED *Destination, SIZE_T Length, IN BYTE Fill ); char ss[10]; RtlFillMemory(ss,10,0x22); |
|
|
|
|
|
Ну а как сделать? пишу что то типа
![]() ![]() void *memset( void *dest, int i, size_t count ) { void *dst; RtlFillMemory(dst,count,i); return dst; } а он пишет warning C4717: 'memset' : recursive on all control paths, function will cause runtime stack overflow и что это значит? опять эта ф-ция использует memset? Как полностью замениить memset (ну и memcpy)? |
|
Сообщ.
#25
,
|
|
|
|
Цитата rmf @ Как полностью замениить memset (ну и memcpy)? Ну напиши сам-то. ![]() ![]() /*** *char *memset(dst, val, count) - sets "count" bytes at "dst" to "val" * *Purpose: * Sets the first "count" bytes of the memory starting * at "dst" to the character value "val". * *Entry: * void *dst - pointer to memory to fill with val * int val - value to put in dst bytes * size_t count - number of bytes of dst to fill * *Exit: * returns dst, with filled bytes * *Exceptions: * *******************************************************************************/ void * __cdecl memset ( void *dst, int val, size_t count ) { void *start = dst; #if defined (_M_IA64) || defined (_M_AMD64) { __declspec(dllimport) void RtlFillMemory( void *, size_t count, char ); RtlFillMemory( dst, count, (char)val ); } #else /* defined (_M_IA64) || defined (_M_AMD64) */ while (count--) { *(char *)dst = (char)val; dst = (char *)dst + 1; } #endif /* defined (_M_IA64) || defined (_M_AMD64) */ return(start); } /*** *memcpy - Copy source buffer to destination buffer * *Purpose: * memcpy() copies a source memory buffer to a destination memory buffer. * This routine does NOT recognize overlapping buffers, and thus can lead * to propogation. * * For cases where propogation must be avoided, memmove() must be used. * *Entry: * void *dst = pointer to destination buffer * const void *src = pointer to source buffer * size_t count = number of bytes to copy * *Exit: * Returns a pointer to the destination buffer * *Exceptions: *******************************************************************************/ void * __cdecl memcpy ( void * dst, const void * src, size_t count ) { void * ret = dst; #if defined (_M_IA64) { __declspec(dllimport) void RtlCopyMemory( void *, const void *, size_t count ); RtlCopyMemory( dst, src, count ); } #else /* defined (_M_IA64) */ /* * copy from lower addresses to higher addresses */ while (count--) { *(char *)dst = *(char *)src; dst = (char *)dst + 1; src = (char *)src + 1; } #endif /* defined (_M_IA64) */ return(ret); } |
|
Сообщ.
#26
,
|
|
|
|
Ну дык еслибы знал бы, написал бы!
(яж говорю, я с Delphi, и особо не понимаю, смысл этого- выделение, осовобождение памяти, и т.д. Как там легко сделать str1:=str1+str2+'hello', а здесь... ф-ции вызывать) Ты где этот код взял(дай пожалуйста и на strrchr и strstr, а то я свои версии сделал, но не уверен что они безглючные, и лучше MS'овских)? На Go To Defenition другое совсем! Добавлено З.Ы. пасибо большое, столько времени потратил на меня! |
|
Сообщ.
#27
,
|
|
|
|
Всё, спасибо, нашел сам!
C:\Program Files\Visual Studio 8\VC\crt\src |