*Флейм* | Учить или не учить - вот в чём вопрос!

Аватара пользователя
mrcnn

Re: *Флейм* | Учить или не учить - вот в чём вопрос!

Сообщение mrcnn »

Отсчет битов ведется с 0, поэтому утверждение "вы вытащили 3 бита с 5, а не с 4 позиции"' было ошибочно.
Аватара пользователя
frizzn

Re: *Флейм* | Учить или не учить - вот в чём вопрос!

Сообщение frizzn »

Надо топик в Forums OSzone.net » Общий » О сайте и форуме создать.
Аватара пользователя
Savant

Re: *Флейм* | Учить или не учить - вот в чём вопрос!

Сообщение Savant »

Эээ.... такой вопросик: а в чём, собственно, различие двух следующих вызовов функций (на Си)?



Код:

Код: Выделить всё

::GetWindowText(hWnd,str,n);
  GetWindowText(hWnd,str,n);

Ну и, соответственно, что предпочтительнее? Изображение
Аватара пользователя
frizzn

Re: *Флейм* | Учить или не учить - вот в чём вопрос!

Сообщение frizzn »

Это 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;
  }
Аватара пользователя
Savant

Re: *Флейм* | Учить или не учить - вот в чём вопрос!

Сообщение Savant »

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: *Флейм* | Учить или не учить - вот в чём вопрос!

Сообщение frizzn »

Когда ничего не найдено, надо возвращать такое число, которое явно покажет, что ничего не найдено. Напр. -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: *Флейм* | Учить или не учить - вот в чём вопрос!

Сообщение Savant »

Thanks, frizzn. Дааа, с ошибкой return 0; соглашусь, уж слишком я привык к Object Pascal. Абсолютно согласен с const char в заголовке. А вот что не так с for(int i=0;s2[i++]!='\0'; )? Переменная i увеличивается после ее использования в качестве индекса. Побочных действий нет.



Через 2 минуты



Аааааа... Я балда! Изображение Изображение Изображение Изображение

Все, догнал....

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



Спасибо за помощь :beer:
Ответить

Вернуться в «Программирование и базы данных»