Показать полную графическую версию : *Флейм* | Учить или не учить - вот в чём вопрос!
Тут все от шрифта зависит, надо моноширинный ставить. Я этот пример сначала в тэге {CODE} пытался положить, так там такое получилось...Я тут подумал, мож тэг {code} поменять, чтоб он выглядел как-нибудь так (http://grandi.pisem.net/forum/new_code_tag.htm)? А к кому этим обращаться?
Надо топик в Forums OSzone.net » Общий » О сайте и форуме создать.
Эээ.... такой вопросик: а в чём, собственно, различие двух следующих вызовов функций (на Си)?
::GetWindowText(hWnd,str,n);
GetWindowText(hWnd,str,n);Ну и, соответственно, что предпочтительнее? :)
Это C++. В C оператора разрешения области видимости ( :: ) нет.
Если в одном пространстве имен есть глобальная функция FuncName() и она перекрыта локальной функцией FuncName(), то форма вызова ::FuncName() вызывает глобальную, а FuncName() - локальную функцию.
#include "stdafx.h"
namespace OSzone {
int GetWindowText(HWND hWnd, LPTSTR str, int n)
{
::MessageBox(NULL,"This is OSzone::GetWindowText()","",0);
return 0;
}
void CallMyGetWindowText()
{
// Вызывает OSzone::GetWindowText()
GetWindowText(NULL,NULL,0);
}
void CallWinAPIGetWindowText()
{
// Вызывает обычный GetWindowText()
::GetWindowText(NULL,NULL,0);
}
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
OSzone::CallMyGetWindowText();
OSzone::CallWinAPIGetWindowText();
return 0;
}
Или тоже самое с переменными:
#include "stdafx.h"
int i = 5; // глобальная переменная
int main()
{
int i = 0; // Локальная переменная
for (; i < 10; ++i)
{
::i++;
}
printf("i = %d, ::i = %d", i, ::i);
return 0;
}
frizzn, супер. Мгновенно врубился. Правда пока не знаю как это использовать (с функциями-то понятно, а с переменными... хм... запутаться легко, проще наверно разные имена давать).
Это у меня тут такие вопросы пошли, поскольку я за Си вцепился. У меня просто по нему весьма поверхностные знания (в основном из ДОСа). За день съел томик Кернигана с Ричем, а потом ушел в кодинг. Видно надо почитать еще и про С++
Кстати, frizzn, ты не мог бы посмотреть на следующий код с точки зрения оптимизации?
int Pos(char* s1, char* s2) { // Ищет вхождение строки s1 в строку s2
for(int i=0;s2[i++]!='\0';) {
if (s2[i]==s1[0]) {
for(int k=1;(s1[++k]!='\0')&&(s1[k]==s2[i+k]);) ;
if (s1[k]=='\0') return i;
}
}
return 0;
}
Когда ничего не найдено, надо возвращать такое число, которое явно покажет, что ничего не найдено. Напр. -1 ( 0 - это первый символ)
Никогда так не пиши:
:maniac:
for(int i=0;s2[i++]!='\0';)
Т.е. должно получиться вроде такого:
int Pos(const char str[], const char pattern[])
{
int i,j,k;
for (i = 0; str[i] != '\0'; ++i)
{
if (str[i] == pattern[0])
{
// Сравниваем str и pattern пока они равны и не закончились
for (j=i+1,k=1; str[j] == pattern[k] && pattern[k] != '\0'; ++k, ++j)
;
// Если досравнивались до того, что pattern закончился, а наши
// строки до сих пор равны - значит мы нашли! Возвращаем позицию.
if (pattern[k] == '\0')
return i;
}
}
// Не нашли :(
return -1;
}
Thanks, frizzn. Дааа, с ошибкой return 0; соглашусь, уж слишком я привык к Object Pascal. Абсолютно согласен с const char в заголовке. А вот что не так с for(int i=0;s2[i++]!='\0'; )? Переменная i увеличивается после ее использования в качестве индекса. Побочных действий нет.
Через 2 минуты
Аааааа... Я балда! :durak: :down: :down: :down:
Все, догнал....
Если бы совпадение было на первом символе (m.e. на s2[0]), то ни фига бы не нашлось.
Спасибо за помощь :beer:
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.