На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> Непонятный Warning , и непонятная секция
    Цитата rmf @
    Цитата
    Сам себе геморрой и ищешь.... 6к жалко. Офигеть...

    Мда... наверное ты прав, но на си я перехожу из-за маленького размера, хочется пользоватся этой возможностью по полной!

    Переходи на ассемблер - там всего будет по-полной...

    Цитата
    но блин, из списка вызываемых библиотек, и ф-ций исчез только strstr!!! хотя заменил все ф-ции! в чем может быть дело? :(

    Значит, кто-то продолжает их юзать. /NODEFAULLIB применял?
      и на асме пробовал, далье программ типа вызова нескольких апи не решился пойти, решил на си остановится!

      угу, получаю
      myprj.obj : error LNK2001: unresolved external symbol _memcpy
      myprj.obj : error LNK2001: unresolved external symbol _memset

      Цитата
      Значит, кто-то продолжает их юзать.

      Кто? в коде нету их вызова!
      Сообщение отредактировано: rmf -
        Цитата rmf @
        Цитата
        Значит, кто-то продолжает их юзать.

        Кто? в коде нету их вызова!

        Компилятор. Вполне может memset вставить на безобидную конструкцию вроде int a[1000] = { 0 };
        Выход - напиши свою функцию memset и memcpy, чтобы он не волновался
          Хм.. вот это я сглупил, точно, можно было создать ф-ции с этми именами,
          но вот ещё что случилось :)
          теперь показывает ошибку

          .\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
          Сообщение отредактировано: rmf -
            Цитата 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


            Попробуй написать:
            ExpandedWrap disabled
              #pragma function(memset, memcpy)
            Сообщение отредактировано: Hryak -
              #pragma function(memset, memcpy), угу, 2 ошибки ичесли, а что она делает?

              FillMemory - это макрос, и раскрывающийся в memset
              т.е. FillMemory это не замена memset, а всего лишь вызов memset, и надо написать свой аналог memset? правильно понял?
                Цитата rmf @
                #pragma function(memset, memcpy), угу, 2 ошибки ичесли, а что она делает?

                Это указание компилятору не пытаться использовать встраиваемые версии данных фукнций.

                Цитата
                т.е. FillMemory это не замена memset, а всего лишь вызов memset, и надо написать свой аналог memset? правильно понял?

                Да.
                  Используй RtlFillMemory и иже с ним из kernel32.lib. Тока на одноименные макросы не нарвись :)

                  Добавлено
                  Нечто вроде
                  ExpandedWrap disabled
                    #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);
                  Сообщение отредактировано: Adil -
                    Ну а как сделать? пишу что то типа

                    ExpandedWrap disabled
                      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)?
                      Цитата rmf @
                      Как полностью замениить memset (ну и memcpy)?

                      Ну напиши сам-то.
                      ExpandedWrap disabled
                        /***
                        *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);
                        }
                      Copyright © Microsoft Corporation. All rights reserved.
                        Ну дык еслибы знал бы, написал бы!
                        (яж говорю, я с Delphi, и особо не понимаю, смысл этого- выделение, осовобождение памяти, и т.д. Как там легко сделать str1:=str1+str2+'hello', а здесь... ф-ции вызывать)

                        Ты где этот код взял(дай пожалуйста и на strrchr и strstr, а то я свои версии сделал, но не уверен что они безглючные, и лучше MS'овских)? На Go To Defenition другое совсем!

                        Добавлено
                        З.Ы. пасибо большое, столько времени потратил на меня!
                        Сообщение отредактировано: rmf -
                          Всё, спасибо, нашел сам!
                          C:\Program Files\Visual Studio 8\VC\crt\src
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0.0950 ]   [ 16 queries used ]   [ Generated: 1.07.26, 11:56 GMT ]