windows аналог crt-функции memcmp

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by realcoder, 30 Dec 2011.

  1. realcoder

    realcoder Member

    Joined:
    9 Dec 2010
    Messages:
    226
    Likes Received:
    11
    Reputations:
    4
    привет кодерам ачата! такой вопрос: есть ли в windows api аналог функции memcmp из стандартной сишной библиотеки? погуглил - так и не понял толи есть, толи нету. если есть то ткните носом в msdn, если нету - то как написать? превое, что приходит на ум - сравнивать память как массив unsigned char-ов(то бишь байт):
    PHP:
    int my_memcmp(void *block1void *block2int size)
    {
    for(
    int i=0;i<size;i++) if(block1[i]!=block2[i]) return 0;
    return 
    1;
    }
    но тут возможен выход за пределы выделенной памяти. как избежать такого?оператор sizeof не проканывает для указателей, так что сделать так:
    PHP:
    int my_memcmp(void *block1void *block2int size)
    {
    if((
    sizeof(*block1)<size) || (sizeof(*block2)<size)) return -1;
    for(
    int i=0;i<size;i++) if(block1[i]!=block2[i]) return 0;
    return 
    1;
    }
    не получиться. как быть?
    да и еще: какие в windows api есть аналоги функциям copy delete pos из дельфы?
     
  2. mrazota

    mrazota New Member

    Joined:
    8 Dec 2011
    Messages:
    20
    Likes Received:
    1
    Reputations:
    0
  3. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Если чего-то не знаешь как сделать, то никто не запрещает посмотреть как это сделано в CRT. (VS 2008 Prof в комплекте имеет исходники CRT)

    А еще можно заюзать старый добрый CRT из винды (msvcrt.dll) чтобы прилонковать её надо найти lib файл от Visual C++ 6.0 хотя бы
     
  4. realcoder

    realcoder Member

    Joined:
    9 Dec 2010
    Messages:
    226
    Likes Received:
    11
    Reputations:
    4
    нашел на msdn функцию heapsize чтоб узнавать размер кучи. написал свое memcmp:
    PHP:
    bool my_memcmp(void *block1,void *block2,DWORD size)
    {
         
    u_char buf1,buf2=0;
        if(
    HeapSize(GetProcessHeap(),0,block1)>size || HeapSize(GetProcessHeap(),0,block2)>size) return false;//проверим размер чтобы продупредить выход за пределы выделенной памяти
         
    for(u_long i=0;i<size;i++) //сравниваем память по байтам
         
    {
                 
    CopyMemory((void *)&buf1,(void *)((u_long)block1+i),1);//берем по 1-му байту
                 
    CopyMemory((void *)&buf2,(void *)((u_long)block2+i),1);
                 if(
    buf1!=buf2) return false;//если разные - вернем false(если хотябы один не совпадает - блоки не идентичны)
         
    }
         return 
    true;//если досих пор не вышли  - все байты абсолютно одинаковые. вернем true
    }
    P.S. я пишу в dev c++, есть ли на msdn отдельно исходники crt-шки?
     
  5. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Проще динамически подгрузить из этой дллки все нужные ф-ции