Два вопроса:)
Зачем при вызове метода используют стрелку, а не точк:pDC->TextOut?
в Си пишем так,
#define MAX_ITEMS 10
#define SWAP(a,b,t) t=a; a=b; b=t;
....
int nArray[MAX_ITEMS];
...
int t,a,b;
...
SWAP(a,b,t)
в компилятор после препроцессора это попадёт так
int nArray[10];
...
int t,a,b;
...
t=a; a=b; b=t;
в C++ можно описать это так
const int cnMaxItems = 10;
int nArray[cnMaxItems];
template<class T> void Swap(T& a, T& b)
{
T temp = a;
a = b;
b = temp;
}
плюсы шаблонов в том, что C++ сам нам сгенерит ф-цию Swap для всех типов для которых мы её используем.
int iA,iB;
..
Swap(iA,iB);
...
double dA,dB;
Swap(dA,dB);
// и избавит от ошибок типа
Swap(iA,dA);
а вот Си'шный SWAP просто бы тупо сгенерил
t = iA; iA=dA; dA = t;
и мы бы просто потеряли точность при приведении double к int.
Что касаемо точки и ->
-> используется когда у нас указатель на объект.
А точка когда сам объект или ссылка на него.
class A{
public
int m_nData1;
int m_nData2
..
void Method1(){}
..
}
// если у нас
A *pObject = new A;
// то
pObject->m_nData1 = 10;
pObject->Method1();
если
A Object;
Object.m_nData1 = 10;
Object.Method();
вот такие дела, я думаю я осветил вопрос достаточно
LRESULT CALLBACK WindowProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam),
что за CALLBACK или еще иногда есть APIENTRY?
например, 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,... для арифметики с указателями.
там где размер важен (сетевой протокол, структуры в файле) надо использовать эти типы, а то придётся всю прогу перебирать.
Вот такие дела
On 2002-02-20 1923, ultramax wrote
ВО! А теперь скажите мне пожалуйста, зачем используют #pragma comment(lib, "---"), что за lib? И чем она отличается от *.h?
Чем отличается lib от h надо понять чётко.
В двух словах
lib - набор из одного или нескольких обектных файлов (соответственно это двоичный файл) В lib хранятся часто используемые ф-ции и стандартные ф-ции Си, также прокси к dll например линкуя user32.lib не значит что мы линкуем всякие TextOut, GetDC и пр. Там только заглушки которые вызывают сами ф-ции из DLL.
h - текстовый файл может использоваться для чего угодно но чаще в нём хранят всякие прототипы, typedef'ы и пр. и приписывают к своему исходному коду директивой #include.
а выше упемянутая прагма просто указывает компоновщику прилинковать либ.
VOID* pVertices? что означает VOID*?
On 2002-02-20 2346, ultramax wrote
А что означает такая штука
VOID* pVertices? что означает VOID*?
То же что LPVOID
что дает указатель на "пустоту"?
То что он не знает некоторых вещей, это нормально, все люди такие. Но в том и отличие ламера от честного чайника, что чайник читает литературу для чайников и умственно развивается. Становится юзером, потом продвинутым юзером, и т.д. до гуру. А вот ламер ждет, что ему все преподнесут на тарелочке и развития мозгов у него не происходит, так он и остается тупым ламером.
Хватит флейм разводить! Если не умеешь читать MSDN, почитай книжки для начинающих. Типа людям больше делать нефиг, как на твои книжные вопросы отвечать.
[ Это Сообщение было отредактировано ultramax в 2002-02-22 1323 ]
А мой адрес пожалуйста - [EMAIL]anan2k1@pochtamt.ru[/EMAIL]
On 2002-02-22 0915, ultramax wrote
?Так на что этот указатель, я так и не понял,
что дает указатель на "пустоту"?
Не на пустоту!
Например, int* указывает на целое число,
POINT* указывает на структуру,
а VOID* указывает на что угодно, ведь типа-то нет!
такому указателю можно присваивать любой другой (другого типа) без явного приведения.
Но арифметика к такому указателю неприменима, т.к. неизвестен размер данных.
Язык Си это язык не далеко ушедший от языка ассемблера. Если язык ассемблера язык низкого уровня, то Си - среднего. А C++, Паскаль, и прочие - высокого уровня. Вот только C# в картину не вписывается т.к. обладает качествами Си и Бейсика одновременно, в общем, смесь бульдога с носорогом.
Я в соседнем форуме видел топик, там человек хотел разобраться, почему на Паскале нельзя написать ОС, а на Си можно... а вот потому, что типизация не строгая, члены структур в том прядке в памяти в котором они написаны, а не как вздумается компилятору. Сишные библиотеки с сырцами и видно, что можно использовать, а вот любой даже безобидный вызов паскаля может наломать дров, ведь транслятор предполагает target os = DOS, а, используя тот же Watcom я могу получать объектные модули в любой модели памяти и компоновать с ассемблерными стартапами без всякого гимора. И еще много почему...писать на Паскале очень трудно.
Ведь каждому своё, берём VisualBasic или Delphi - один чёрт, и работаем мышью...вот прога готова за 10 минут, пусть она весит два мега, загружается пол-года, но это не беда. Другая крайность - написать в асме потратить полгода на отладку, зато получить маленькую прогу, которая сдувает кепку ветром при работе. Для каких-то задач важно первое, для других второе. И решать на чем писать, надо зная четко, что и как прога должна делать.
Я делаю так
-C++ и MFC для каких-нить GUI'шных прог, или если надо что-то быстро.
-C++ и ATL или же C# для COM'понентов
-С++ и никакого MFC если надо маленькая быстрая прога.
-C если просто навеет, но точно не для COM
-ассемблер, чаще inline там, где нужна скорость или использование каких-то аппаратных особенностей - 3dnow,MMX и пр.
-VBScript для ASP страниц
-VBScript или JavaScript для HTML
Вот такие дела, куда меня занесло, а начал с указателей...
Я в соседнем форуме видел топик, там человек хотел разобраться, почему на Паскале нельзя написать ОС, а на Си можно... а вот потому, что типизация не строгая, члены структур в том прядке в памяти в котором они написаны, а не как вздумается компилятору.
[/q]
что-то мне подсказывает что ты ошибаешься насчёт Паскаля!
А что касается "читать доки", то всегда лучше спросить у живого человека. И можно позавидовать тому, у кого есть такая возможность.
Ни одна дока не объяснит так, как это сделает человек.
2 ultramax А тебе я рекомендую сначала установить предел времени, после которого можно спрашивать, а пока не достиг этого предела пытаться разобраться самому. С каждым разом время, потраченное на поиск интересующей тебя информации будет становится меньше, а опыт больше, так как ты будешь находить не только ответ на свой вопрос, а еще на кучу смежных.
[ Это Сообщение было отредактировано mike в 2002-02-23 1403 ]
On 2002-02-23 1258, Anonymous wrote
[q]
Я в соседнем форуме видел топик, там человек хотел разобраться, почему на Паскале нельзя написать ОС, а на Си можно... а вот потому, что типизация не строгая, члены структур в том прядке в памяти в котором они написаны, а не как вздумается компилятору.
[/q]
что-то мне подсказывает, что ты ошибаешься насчёт Паскаля!
Не знаю, может быть, но, на мой взгляд, каждому своё
Паскаль - язык для обучения студентов программированию, а затем 99% людей развиваются дальше, а кто нет, тот либо еще просто не дозрел либо просто остановился в развитии как кодер. Мне конечно известно что в Паскаль разжирел и разросся и Borland сделали всё чтобы это стало профессиональным средством разработки.
НО Microsoft еще больше сделали для Basic'a используя своё положение, basic вездё и в Web и VBA в офисе и VisualBasic как таковой.
Си - в семидесятых был разработан группой людей (Керниганом и Ричи в частности) для написания ОС которую было бы легко портировать с платформы на платформу, я думаю не надо напоминать, что это был Unix - папа большинства современных ОС.
C# - разработан недавно в недрах Microsoft. Язык с чистого листа не обременённый хвостом совместимости с предыдущими версиями. Имеет в себе всё лучшее от Objecive-C (теперь можем показать язык NextStep, Rapsody и прочим ), Си, C++, и даже Basic'а. В unsafe блоках есть указатели и управление памятью, а в обычных блоках указателей нет и работает garbage collection.
Я как профессиональный программист могу сказать со всей определённостью, что при разработке коммерческих приложений в подавляющем большинстве случаев используется C/C++. Писать в что-то на паскале могут лишь большие фанаты именно языка, а на Delphi лишь если это оправдано.
При этом могу добавить, что для Web, если под IIS - пишут на VBScript(я ни разу не видел, чтобы использовали JavaScript, а вот на HTML пагах наоборот ), а для не Microsoft'ских HTTP серверов, скажем для Apache чаще Perl или PHP. Хотя все эти языки исполняются интерпретатором. А ведь прошу заметить, что CGI позволяет использовать ЛЮБОЙ обработчик запросов, лови QUERY_STRING и пиши хоть на Паскале
Но всё выше написанное это лично моё мнение и я не требую, чтобы кто-то считал своим долгом меня переубедить или наоборот принять эту точку зрения как единственно правильную.
Вот такие дела.
[ Это Сообщение было отредактировано Arestov в 2002-02-23 1503 ]
>что-то мне подсказывает, что ты ошибаешься насчёт Паскаля!
я имел ввиду что ты ошибаешься насчёт того "что типизация не строгая"
On 2002-02-23 1716, Anonymous wrote
>>Я в соседнем форуме видел топик, там человек хотел разобраться, почему на Паскале нельзя написать ОС, а на Си можно... а вот потому, что типизация не строгая, члены структур в том прядке в памяти в котором они написаны, а не как вздумается компилятору.
>что-то мне подсказывает, что ты ошибаешься насчёт Паскаля!
я имел ввиду что ты ошибаешься насчёт того "что типизация не строгая"
Я говорил о Си. В Си члены структур в порядке описания, только может добавляться выравнивание, но где нужно это отключается.
Строгая типизация в C++
char *psz = (char*)GlobalAlloc(GPTR, nSize);
иначе еррор.
А в Си
char *psz = GlobalAlloc(GPTR, nSize);
или
short *pwTime = 0x46c;
и приведение автоматом, в крайнем случае, warning.