int APIENTRY WinMain
И что делает строка srand (time(0)), поподробней если можно:)
например, LPSTR это char *, LPSTR обозначает как Long Pointer to STRing (Long Pointer достался еще от реального режима x86 процов, Windows разрабатывается с 1985 года)
DWORD это unsigned int, мы можем писать и то и другое. Но Microsoft предлагает некоторые правила именования
-имена типов заглавными буквами POINT,INT,BOOL
-перед именем переменной префикс, обозначающий её тип или назначение nCount, chBuffer, xDelta, yDelta
-слова в именах ф-ций писать с большой буквы CreateWindow, RegisterClass, CoInitialize
- и т.д.
так вот
LRESULT - это просто long, а слово введено для читаемости
CALLBACK - это __stdcall, т.е. такая ф-ция вызывается по данному соглашению, это необходимо указывать, чтобы вызывающий правильно работал со стеком. Параметры помещаются справа налево, и вызываемая ф-ция очищает стэк.
есть вариант __cdecl - соглашения Си, там тоже параметры справа налево, то стек очищает вызывающая ф-ция.
Если соглашение не писать void Foo(), то подразумевается такое соглашение, которое прописано в параметрах компилятора, например, ключ /Gz для Microsoft Visual C++ делает все ф-ции __stdcall.
Так вот
LRESULT CALLBACK WinMain(...)
это
long __stdcall WinMain(...)
разницы, особой нет, НО есть такое НО
Синонимы типов, делаю более гибким перенос с платформы на платформу, достаточно поменять только определение, а всю прогу не надо. Грядёт 64-битная платформа от Intel и AMD, Microsoft ввела еще ряд типов для определённости
DWORD32, DWORD64, INT32, INT64, LONG32,... UINT32, UINT64,... и DWORD_PTR, INT_PTR,... для арифметики с указателями.
там где размер важен (сетевой протокол, структуры в файле) надо использовать эти типы, а то придётся всю прогу перебирать.
О вызове srand(time(0));
1. Ф-ция void srand( unsigned int seed );
устанавливает генератор случайных чисел в некоторое состояние seed, где seek это любое 32-битное число.
2. Ф-ция long time( long *pTimer );
возвращет кол-во секунд прошедших с полуночи, первого января 1970 года (по Гринвичу), также если pTimer не NULL то это же значение записывается в адрес указываемый pTimer.
3. имеем, что srand(time(0)) устанавливает генератор случайных чисел в разное состояние при каждом запуске программы.
4. ф-ция int rand( void ) возвращает псевдослучайное число в диапазоне от 0 до RAND_MAX, и это число зависит от параметра seed в srand(). RAND_MAX в MSVC++ определён как 32767. Если надо сгенерировать число в другом диапазоне [a,b) используйте формулу r = a + rand() % (b-a)
Пример, эта программа будет при каждом запуске выдавать ОДИНАКОВЫЕ a и b
#include <stdio.h>
#include <stdlib.h>
void main()
{
int a = rand() % 10; // п-случ. число от 0 до 9
int b = rand() % 10; // другое число.
printf("a = %d\nb = %d\n", a, b);
}
а вот эта РАЗНЫЕ
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main()
{
srand(time(NULL));
int a = rand() % 10; // п-случ. число от 0 до 9
int b = rand() % 10; // другое число.
printf("a = %d\nb = %d\n", a, b);
}
Вот такие дела
0xFFFFFFFF!
Цитата:
On 2002-02-20 2306, Anonymous wrote
а что будет с функцией time(time_t) через 136 лет после 1970??? wink
0xFFFFFFFF!
Програм её использующих не будет ) ведь это стандартная библиотечная ф-ция. Windows предлагает более гибкие решения, timeGetTime() и уж совсем крутую QueryPerformanceCounter. А для текущего времени GetSystemTime, GetLocalTime.