Угу, если бы у всех CRT-символов были аналоги в API windows, то нафига бы она была нужна. Не надо проводить четкую аналогию между CRT и API, её нет. То, что у strlen() есть аналог lstrlen() в kernel32.dll считайте чистой случайностью. Вообще посмотри экспорт ntdll - найдешь очень много ф-ий типа strstr(). Ну можно вручную переписать много чего. Я конечно хотел понтануться и кинуть листинг на осенблере всех этих ф-ий, но потом подумал что заебался понтоваться. Я и так крутой ИМХО. Code: bool lstrncmp( char *s1, char *s2, size_t iMaxLen ) { for (size_t i = 0; i < iMaxLen; i++) { if (!s1[i] || !s2[i]) return true; if (s1[i] != s2[i]) return true; } return false; } void lmemset( void *dst, char v, size_t s ) { for (size_t i = 0; i < s; i++) { ((char*)dst)[i] = v; } } void lmemcpy( void *dst, void *src, size_t s ) { for (size_t i = 0; i < s; i++) { ((char*)dst)[i] = ((char*)src)[i]; } } bool lmemcmp( void *p1, void *p2, size_t s ) { for (size_t i = 0; i < s; i++) { if (((char*)p1)[i] != ((char*)p2)[i]) return true; } return false; } void *lmalloc( size_t s ) { return HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, s ); } void lfree( void *p ) { HeapFree( GetProcessHeap(), 0, p ); } void* __cdecl operator new( size_t s ) { return lmalloc( s ); } void __cdecl operator delete( void *p ) { lfree( p ); }
Кез, прекратите понтоваться, пришло время нового поколения. У них есть пинч, а у вас знания по какимто С и онсемблеру, фуу.. не модно. Я конечно тоже решил понтонуться и заделал аналог strlen() на ассемблере. Кстати, большинство функций crt переводятся на ассемблер за пару минут, при определенном знании конечно. Code: unsigned int _strlen(char *str) { unsigned int len = 0; __asm { xor eax, eax mov edi, str or ecx, 0xffffffff repne scasb not ecx dec ecx mov len, ecx } return len; } И даже пример использования! Code: #include <stdio.h> #include <stdlib.h> unsigned int _strlen(char *str) { unsigned int len = 0; __asm { xor eax, eax mov edi, str or ecx, 0xffffffff repne scasb not ecx dec ecx mov len, ecx } return len; } int main(int argc, char *argv[]) { unsigned int ls = _strlen("WJWIdske83"); printf("%d\n", ls); system("PAUSE"); return 0; }
2KEZ ну вот с нью и делитом все не так хорошо тк их основное достоинство в том, что они помимо выделения\освобождения памяти вызывают конструктор\деструктор к применяемым обьектов. зы все операции к отдельным байтам памяти лучше конечно заменять обращениями по dword если это позволяется.
Выскакивает ошибка при компиляции: (Visual C++ 6.0) Code: --------------------Configuration: Unit1 - Win32 Debug-------------------- Compiling... Unit1.cpp C:\Documents and Settings\*******************\exe\Unit1.cpp(110) : error C2065: 'StatusOnTaskBar' : undeclared identifier C:\Documents and Settings\*******************\exe\Unit1.cpp(243) : error C2374: 'i' : redefinition; multiple initialization C:\Documents and Settings\*******************\exe\2\Unit1.cpp(161) : see declaration of 'i' Error executing cl.exe. Unit1.exe - 2 error(s), 0 warning(s) Кто может помочь?
StatusOnTaskBar нужно указать прототип перед ее использованием скорее всего у тебя два цикла и ты два раза написал int i... так как кода ты не привел это всего лишь догадки.
Народ! Спрашиваю еще раз ибо надо... как при помощи указателей можно составить список целых чисел(вводится с клавиатуры) и потом посчитать сколько в нем содержится максимальных элементов. То есть найти самый большой и посчитать сколько таких в этом списке... Если можно - то напишите сразу код плз. А то я с указателями вообще на "вы"... а задачу надо сдать =\ PS: у меня борландовский цпп... так что модуля algorithm там нет) вобщем на циклах писать или как-то так... спасибо заранее СПАСИБО. ПРОБЛЕМУ УЖЕ РЕШИЛ если кому интересно, то вот решение... может пригодится... Code: #include <stdio.h> struct tlist { long value; tlist *next; }; void main(void) { tlist *list=NULL,*t=NULL,*t2; int a; puts("Enter numbers; enter non-number value to finish"); while(scanf("%d",&a)==1) { t2=t; t=new tlist; t->next=NULL; t->value=a; if(!list)list=t; else t2->next=t; } int cnt=0; t=list; while(t) { if(!cnt||a<t->value) { cnt=1; a=t->value; } else if(a==t->value)cnt++; t=t->next; } printf("Maximum %d, %d times\n",a,cnt); }
Реализация линейного списка на С, с остальными задачами думаю сам справишься. http://slil.ru/24889243
Спасибо... но мне надо все это написать при помощи обычных модулей... то есть не насилуя так сильно мозг...
1) как обнулить массив типа char или char *? 2) как перевести из char * массива (массив вида x[0]='0', x[1]='1', x[2]='2', x[n]='n'... итд) в тип unsigned long (чтобы было x = 0123, кстати, как убрать 0?)
1) Code: VOID ZeroMemory( PVOID Destination, // address of block to fill with zeros DWORD Length // size, in bytes, of block to fill with zeros ); 2) Под винапи ты не найдешь таких функций, либо используй crt, либо сам пиши, ничего сложного не вижу.
как пользоваться бинд шеллом установленым на сервере через телнет. и должно ли в телнете результат команды? и как пользоваться через собствииный клиент?
оффтоп >>Опера тоже на си >>Давайте теперь все вопросы когда будем сидеть в этом броузере задавать только в этой теме
_PARAZIT_, а ну да... Это сильно меняет дело... Я то думал, как ты к этой теме смог отнести... Шелл на то и шелл, что он должен принимать команды, выполнять и отдавать результат клиенту. Коннектится нужно на соответствующий прибинденный порт, клиент любой, передающий RAW-данные в сокет, в общем любой telnet-совместимый. Как пользоваться? Вводить команды, определённый в системе...
функция SetFilePointer возвращает the low-order DWORD of the new file pointer. что это такое? хендл на файл, начинающийся с нового поинтера?