Board.KolibriOS.org

Official KolibriOS board
It is currently Tue May 21, 2019 1:53 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 98 posts ]  Go to page Previous 1 2 3 4 5 6 7 Next
Author Message
 Post subject: Re: Liza
PostPosted: Fri Jan 04, 2013 7:38 pm 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 5047
Нет, упрощает. Там 2 объекта "список". У них одинаковые свойства и методы - зачем мне дублировать код, если можно сделать универсально и притом всю работу со списком вынести в отдельный файл.

_________________
Через тернии к звездам


Top
   
 Post subject: Re: Liza
PostPosted: Fri Jan 04, 2013 7:40 pm 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 5047
Неужели Си не поддержвает такой код?

Code:
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;
}

_________________
Через тернии к звездам


Top
   
 Post subject: Re: Liza
PostPosted: Fri Jan 04, 2013 8:23 pm 
Offline
Mentor/Kernel Developer
User avatar

Joined: Fri Jun 30, 2006 9:01 am
Posts: 1247
So, when will we see the first glimpse of this magnificient creature?

_________________
"Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction." Albert Einstein


Top
   
 Post subject: Re: Liza
PostPosted: Fri Jan 04, 2013 8:58 pm 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 5047
When it will be done.

_________________
Через тернии к звездам


Top
   
 Post subject: Re: Liza
PostPosted: Sat Jan 05, 2013 8:33 am 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2814
Нет, не поддерживает. Структуры, содержащие функции, не допускаются, и этр, я считаю, правильно.


Top
   
 Post subject: Re: Liza
PostPosted: Sat Jan 05, 2013 9:36 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Структуры могут содержать указатели на функции. Такой первобытный ООП.


Top
   
 Post subject: Re: Liza
PostPosted: Sat Jan 05, 2013 2:23 pm 
Offline
User avatar

Joined: Mon Jul 25, 2011 6:22 pm
Posts: 93
Поддерживает, но в структуре должен быть указатель (тип *) перед объявлением прототипа функции(процедуры).

_________________
Программист не тот, кто постоянно пишет КОД, а тот кто сможет понять чужой КОД!!!


Top
   
 Post subject: Re: Liza
PostPosted: Sat Jan 05, 2013 3:17 pm 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2814
Указатели - это указатели. А реально функции в структурах - это немного другое.


Top
   
 Post subject: Re: Liza
PostPosted: Sun Jan 06, 2013 1:45 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
SoUrcerer
Реализуется компилятором как же указатели.


Top
   
 Post subject: Re: Liza
PostPosted: Tue Jan 08, 2013 2:52 pm 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 5047
Столкнулся с проблемой создания динамических массивов и разработка остановилась.

_________________
Через тернии к звездам


Top
   
 Post subject: Re: Liza
PostPosted: Tue Jan 08, 2013 3:01 pm 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 5047
Есть код, но он не работает как надо.
Code:
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...
   }
}

_________________
Через тернии к звездам


Top
   
 Post subject: Re: Liza
PostPosted: Tue Jan 08, 2013 5:27 pm 
Offline
User avatar

Joined: Mon Jul 25, 2011 6:22 pm
Posts: 93
Leency wrote:
Есть код, но он не работает как надо.
Code:
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 *Имя_нечто[Некого_размера].
Если не запямятовал.

_________________
Программист не тот, кто постоянно пишет КОД, а тот кто сможет понять чужой КОД!!!


Top
   
 Post subject: Re: Liza
PostPosted: Tue Jan 08, 2013 6:13 pm 
Offline
Mentor
User avatar

Joined: Tue Jan 15, 2008 11:27 am
Posts: 752
Artyom wrote:
то зачем нужно получатьв возврате размер данного элмента + адрес его (массива) базы (#db)

Нет, всё логично.
У меня (да и у компилятора) сомнения по поводу строк:
Code:
EBX.line_element.size = i;

и
Code:
debugi(EBX.line_element.size); 
.
В общем, после
Code:
   EBX = GetCurrentElement(i);

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


Top
   
 Post subject: Re: Liza
PostPosted: Tue Jan 08, 2013 6:25 pm 
Offline

Joined: Tue Oct 05, 2010 6:05 pm
Posts: 214
Слепил тест, при первом нажатии кнопки под KlbrInWin выдаёт:
Attempt to work with uninitialized heap!
при втором работает как предполагалось
с инициализацией heap разбираться лень


Attachments:
arr.zip [1.33 KiB]
Downloaded 140 times
Top
   
 Post subject: Re: Liza
PostPosted: Wed Jan 09, 2013 4:11 am 
Offline

Joined: Tue Oct 05, 2010 6:05 pm
Posts: 214
закомментировал
//db = free(db);
работает без сообщений


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 98 posts ]  Go to page Previous 1 2 3 4 5 6 7 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Limited