*Флейм* | Учить или не учить - вот в чём вопрос!
-
mrcnn
Re: *Флейм* | Учить или не учить - вот в чём вопрос!
Отсчет битов ведется с 0, поэтому утверждение "вы вытащили 3 бита с 5, а не с 4 позиции"' было ошибочно.
-
frizzn
Re: *Флейм* | Учить или не учить - вот в чём вопрос!
Надо топик в Forums OSzone.net » Общий » О сайте и форуме создать.
-
Savant
Re: *Флейм* | Учить или не учить - вот в чём вопрос!
Эээ.... такой вопросик: а в чём, собственно, различие двух следующих вызовов функций (на Си)?
Код:
Ну и, соответственно, что предпочтительнее?
Код:
Код: Выделить всё
::GetWindowText(hWnd,str,n);
GetWindowText(hWnd,str,n);Ну и, соответственно, что предпочтительнее?

-
frizzn
Re: *Флейм* | Учить или не учить - вот в чём вопрос!
Это C++. В C оператора разрешения области видимости ( :: ) нет.
Если в одном пространстве имен есть глобальная функция FuncName() и она перекрыта локальной функцией FuncName(), то форма вызова ::FuncName() вызывает глобальную, а FuncName() - локальную функцию.
Код:
Или тоже самое с переменными:
Код:
Если в одном пространстве имен есть глобальная функция 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;
}-
Savant
Re: *Флейм* | Учить или не учить - вот в чём вопрос!
frizzn, супер. Мгновенно врубился. Правда пока не знаю как это использовать (с функциями-то понятно, а с переменными... хм... запутаться легко, проще наверно разные имена давать).
Это у меня тут такие вопросы пошли, поскольку я за Си вцепился. У меня просто по нему весьма поверхностные знания (в основном из ДОСа). За день съел томик Кернигана с Ричем, а потом ушел в кодинг. Видно надо почитать еще и про С++
Кстати, 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;
}-
frizzn
Re: *Флейм* | Учить или не учить - вот в чём вопрос!
Когда ничего не найдено, надо возвращать такое число, которое явно покажет, что ничего не найдено. Напр. -1 ( 0 - это первый символ)Никогда так не пиши:

Код:
Т.е. должно получиться вроде такого:
Код:

Код:
Код: Выделить всё
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;
}-
Savant
Re: *Флейм* | Учить или не учить - вот в чём вопрос!
Thanks, frizzn. Дааа, с ошибкой return 0; соглашусь, уж слишком я привык к Object Pascal. Абсолютно согласен с const char в заголовке. А вот что не так с for(int i=0;s2[i++]!='\0'; )? Переменная i увеличивается после ее использования в качестве индекса. Побочных действий нет.
Через 2 минуты
Аааааа... Я балда!

Все, догнал....
Если бы совпадение было на первом символе (m.e. на s2[0]), то ни фига бы не нашлось.
Спасибо за помощь
Через 2 минуты
Аааааа... Я балда!

Все, догнал....
Если бы совпадение было на первом символе (m.e. на s2[0]), то ни фига бы не нашлось.
Спасибо за помощь