Page 4 of 7

Re: Liza

Posted: Fri Jan 04, 2013 7:38 pm
by Leency
Нет, упрощает. Там 2 объекта "список". У них одинаковые свойства и методы - зачем мне дублировать код, если можно сделать универсально и притом всю работу со списком вынести в отдельный файл.

Re: Liza

Posted: Fri Jan 04, 2013 7:40 pm
by Leency
Неужели Си не поддержвает такой код?

Code: Select all

struct llist
{
	int x,y,w,h,min_h;
	int line_h;
	int count,visible,first;
	int current;
	void SetSizes(int xx, yy, ww, hh, min_hh, line_hh);
	int MouseScroll(dword scroll_state);
}; 

void llist::SetSizes(int xx, yy, ww, hh, min_hh, line_hh)
{
	x = xx;
	y = yy;
	w = ww;
	h = hh;
	min_h = min_hh;
	line_h = line_hh;
}

int llist::MouseScroll(dword scroll_state)
{
	if (scroll_state == 65535)
	{
		if (first == 0) return 0;
		if (first > 3) first -= 2; else first=0;
		return 1;
	} 
	if (scroll_state == 1)
	{
		if (visible+first+3 >= count) first = count - visible; else first+=2;
		return 1;
	}
	return 0;
}

Re: Liza

Posted: Fri Jan 04, 2013 8:23 pm
by hidnplayr
So, when will we see the first glimpse of this magnificient creature?

Re: Liza

Posted: Fri Jan 04, 2013 8:58 pm
by Leency
When it will be done.

Re: Liza

Posted: Sat Jan 05, 2013 8:33 am
by SoUrcerer
Нет, не поддерживает. Структуры, содержащие функции, не допускаются, и этр, я считаю, правильно.

Re: Liza

Posted: Sat Jan 05, 2013 9:36 am
by Serge
Структуры могут содержать указатели на функции. Такой первобытный ООП.

Re: Liza

Posted: Sat Jan 05, 2013 2:23 pm
by Artyom
Поддерживает, но в структуре должен быть указатель (тип *) перед объявлением прототипа функции(процедуры).

Re: Liza

Posted: Sat Jan 05, 2013 3:17 pm
by SoUrcerer
Указатели - это указатели. А реально функции в структурах - это немного другое.

Re: Liza

Posted: Sun Jan 06, 2013 1:45 am
by Serge
SoUrcerer
Реализуется компилятором как же указатели.

Re: Liza

Posted: Tue Jan 08, 2013 2:52 pm
by Leency
Столкнулся с проблемой создания динамических массивов и разработка остановилась.

Re: Liza

Posted: Tue Jan 08, 2013 3:01 pm
by Leency
Есть код, но он не работает как надо.

Code: Select all

struct line_element
{
   char type;
   char header[256];
   int size;
}
dword db;

dword GetCurrentElement(int el_N)
{
	return sizeof(line_element)*el_N + #db;
}

void main()
{
   db = free(db);
   db = malloc( count * sizeof(line_element) );

   for (i=0; i < 10; i++)
   {
      EBX = GetCurrentElement(i);
      EBX.line_element.size = i; //мне кажется тут мы забиваем значение в переменную, а не "по адресу" в указателе
   }
   for (i=0; i < 10; i++)
   {
      EBX = GetCurrentElement(i);
      debugi(EBX.line_element.size); // вывод сплошные нули, а не 0 1 2 3 4...
   }
}

Re: Liza

Posted: Tue Jan 08, 2013 5:27 pm
by Artyom
Leency wrote:Есть код, но он не работает как надо.

Code: Select all

struct line_element
{
   char type;
   char header[256];
   int size;
}
dword db;

dword GetCurrentElement(int el_N)
{
	return sizeof(line_element)*el_N + #db;
}

void main()
{
   db = free(db);
   db = malloc( count * sizeof(line_element) );

   for (i=0; i < 10; i++)
   {
      EBX = GetCurrentElement(i);
      EBX.line_element.size = i; //мне кажется тут мы забиваем значение в переменную, а не "по адресу" в указателе
   }
   for (i=0; i < 10; i++)
   {
      EBX = GetCurrentElement(i);
      debugi(EBX.line_element.size); // вывод сплошные нули, а не 0 1 2 3 4...
   }
}
На чём писанно?

Если, даже
dword GetCurrentElement(int el_N) - возвращает элемент по номеру(в массиве), - то зачем нужно получать
в возврате размер данного элмента + адрес его (массива) базы (#db):
return sizeof(line_element)*el_N + #db;

Тебе нужен указатель на массив элементов - GetCurrentElement(line_element *el_N),
это во-первых, а во-вторых, - у тебя функция возвращает элементы {char type; char header[2]}, а не указатель на:
line_element *Имя_нечто[Некого_размера].
Если не запямятовал.

Re: Liza

Posted: Tue Jan 08, 2013 6:13 pm
by Albom
Artyom wrote:то зачем нужно получатьв возврате размер данного элмента + адрес его (массива) базы (#db)
Нет, всё логично.
У меня (да и у компилятора) сомнения по поводу строк:

Code: Select all

EBX.line_element.size = i;
и

Code: Select all

debugi(EBX.line_element.size); 
.
В общем, после

Code: Select all

   EBX = GetCurrentElement(i);
в EBX находится адрес нужной нам структуры. Не знаю, как в C--, а в C нужно было бы написать что-то вроде:

Code: Select all

EBX->line_element.size = i;
.

Re: Liza

Posted: Tue Jan 08, 2013 6:25 pm
by lev
Слепил тест, при первом нажатии кнопки под KlbrInWin выдаёт:
Attempt to work with uninitialized heap!
при втором работает как предполагалось
с инициализацией heap разбираться лень

Re: Liza

Posted: Wed Jan 09, 2013 4:11 am
by lev
закомментировал
//db = free(db);
работает без сообщений