Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Два вопроса:)

1.3K
19 февраля 2002 года
ultramax
12 / / 20.09.2000
Почему вместо const используют #define?
Зачем при вызове метода используют стрелку, а не точк:pDC->TextOut?
380
19 февраля 2002 года
Arestov
285 / / 20.09.2000
#define - директива препроцессора, досталась в наследие от C. Препроцессор обрабатывает текст проги еще до компилятора, а const обрабатывает сам компилятор. Основное отличие const имеет тип, а #define просто вставляется в текст. Еще при помощие #define можно делать макросы, опять же без проверки типов, но в C++ есть шаблоны template и они проверяют типы.
в Си пишем так,
#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&amp; a, T&amp; 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();

вот такие дела, я думаю я осветил вопрос достаточно


380
19 февраля 2002 года
Arestov
285 / / 20.09.2000
1.3K
19 февраля 2002 года
ultramax
12 / / 20.09.2000
Понятно! А тогда еще скажите, что за слово стоит между возвращаемым значением и функцией, вот например:
LRESULT CALLBACK WindowProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam),
что за CALLBACK или еще иногда есть APIENTRY?
380
20 февраля 2002 года
Arestov
285 / / 20.09.2000
Для единообразности и читаемости Microsoft просто переопределила многие фишки (т.е. назначила синонимы)
например, 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,... для арифметики с указателями.
там где размер важен (сетевой протокол, структуры в файле) надо использовать эти типы, а то придётся всю прогу перебирать.

Вот такие дела
1.3K
20 февраля 2002 года
ultramax
12 / / 20.09.2000
ВО! А теперь скажите мне пожалуйста, зачем используют #pragma comment(lib, &quot;---&quot;), что за lib? И чем она отличается от *.h?
Аноним
MSDN читать не пробовал?
1.3K
21 февраля 2002 года
ultramax
12 / / 20.09.2000
А ты пробовал:E?
380
21 февраля 2002 года
Arestov
285 / / 20.09.2000
Цитата:

On 2002-02-20 1923, ultramax wrote
ВО! А теперь скажите мне пожалуйста, зачем используют #pragma comment(lib, &quot;---&quot;), что за lib? И чем она отличается от *.h?


Чем отличается lib от h надо понять чётко.
В двух словах
lib - набор из одного или нескольких обектных файлов (соответственно это двоичный файл) В lib хранятся часто используемые ф-ции и стандартные ф-ции Си, также прокси к dll например линкуя user32.lib не значит что мы линкуем всякие TextOut, GetDC и пр. Там только заглушки которые вызывают сами ф-ции из DLL.

h - текстовый файл может использоваться для чего угодно но чаще в нём хранят всякие прототипы, typedef'ы и пр. и приписывают к своему исходному коду директивой #include.

а выше упемянутая прагма просто указывает компоновщику прилинковать либ.

1.3K
21 февраля 2002 года
ultramax
12 / / 20.09.2000
А что означает такая штука:
VOID* pVertices? что означает VOID*?
380
21 февраля 2002 года
Arestov
285 / / 20.09.2000
Цитата:

On 2002-02-20 2346, ultramax wrote
А что означает такая штука
VOID* pVertices? что означает VOID*?



То же что LPVOID

1.3K
22 февраля 2002 года
ultramax
12 / / 20.09.2000
?Так на что этот указатель, я так и не понял,
что дает указатель на &quot;пустоту&quot;?
Аноним
Вот типичный ламер!
То что он не знает некоторых вещей, это нормально, все люди такие. Но в том и отличие ламера от честного чайника, что чайник читает литературу для чайников и умственно развивается. Становится юзером, потом продвинутым юзером, и т.д. до гуру. А вот ламер ждет, что ему все преподнесут на тарелочке и развития мозгов у него не происходит, так он и остается тупым ламером.

Хватит флейм разводить! Если не умеешь читать MSDN, почитай книжки для начинающих. Типа людям больше делать нефиг, как на твои книжные вопросы отвечать.
1.3K
22 февраля 2002 года
ultramax
12 / / 20.09.2000
Господин Ананинус)!Я тебя не прошу отвечать на мои вопросы, так что ты не лезь не в свое дело, а фрейм разводишь здесь только ты. Ты бы оставил свое мыло чтоь, чтоб я мог тебе лично сообщения посылать.

[ Это Сообщение было отредактировано ultramax в 2002-02-22 1323 ]
Аноним
Тов. Ултрамах! Я фРейм не развожу и вообще не представляю как это можно сделать.
А мой адрес пожалуйста - [EMAIL]anan2k1@pochtamt.ru[/EMAIL]
380
23 февраля 2002 года
Arestov
285 / / 20.09.2000
Цитата:

On 2002-02-22 0915, ultramax wrote
?Так на что этот указатель, я так и не понял,
что дает указатель на &quot;пустоту&quot;?



Не на пустоту!
Например, 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]
Я в соседнем форуме видел топик, там человек хотел разобраться, почему на Паскале нельзя написать ОС, а на Си можно... а вот потому, что типизация не строгая, члены структур в том прядке в памяти в котором они написаны, а не как вздумается компилятору.
[/q]
что-то мне подсказывает что ты ошибаешься насчёт Паскаля!
4
23 февраля 2002 года
mike
3.7K / / 01.10.2002
Я восхищаюсь такими людьми как Arestov. Иметь столько терпимости !!! Можно только позавидовать.

А что касается &quot;читать доки&quot;, то всегда лучше спросить у живого человека. И можно позавидовать тому, у кого есть такая возможность.

Ни одна дока не объяснит так, как это сделает человек.

2 ultramax А тебе я рекомендую сначала установить предел времени, после которого можно спрашивать, а пока не достиг этого предела пытаться разобраться самому. С каждым разом время, потраченное на поиск интересующей тебя информации будет становится меньше, а опыт больше, так как ты будешь находить не только ответ на свой вопрос, а еще на кучу смежных.


[ Это Сообщение было отредактировано mike в 2002-02-23 1403 ]
380
23 февраля 2002 года
Arestov
285 / / 20.09.2000
Цитата:

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 ]

Аноним
>>Я в соседнем форуме видел топик, там человек хотел разобраться, почему на Паскале нельзя написать ОС, а на Си можно... а вот потому, что типизация не строгая, члены структур в том прядке в памяти в котором они написаны, а не как вздумается компилятору.

>что-то мне подсказывает, что ты ошибаешься насчёт Паскаля!

я имел ввиду что ты ошибаешься насчёт того &quot;что типизация не строгая&quot;
1.3K
23 февраля 2002 года
ultramax
12 / / 20.09.2000
Я в программе ставлю точки останова, а когда запускаю отладку, они выключаются и отладка идет по ассемблерскому коду,хотя я их пробовал в разных местах ставить:/ И в настройках возился - не выходит:( Почему так может быть?
380
24 февраля 2002 года
Arestov
285 / / 20.09.2000
Цитата:

On 2002-02-23 1716, Anonymous wrote
>>Я в соседнем форуме видел топик, там человек хотел разобраться, почему на Паскале нельзя написать ОС, а на Си можно... а вот потому, что типизация не строгая, члены структур в том прядке в памяти в котором они написаны, а не как вздумается компилятору.

>что-то мне подсказывает, что ты ошибаешься насчёт Паскаля!

я имел ввиду что ты ошибаешься насчёт того &quot;что типизация не строгая&quot;


Я говорил о Си. В Си члены структур в порядке описания, только может добавляться выравнивание, но где нужно это отключается.

Строгая типизация в C++
char *psz = (char*)GlobalAlloc(GPTR, nSize);
иначе еррор.
А в Си
char *psz = GlobalAlloc(GPTR, nSize);
или
short *pwTime = 0x46c;
и приведение автоматом, в крайнем случае, warning.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог