Board.KolibriOS.org
https://board.kolibrios.org/

Почтовый клиент Liza
https://board.kolibrios.org/viewtopic.php?f=40&t=2186
Page 4 of 7

Author:  Leency [ Fri Jan 04, 2013 7:38 pm ]
Post subject:  Re: Liza

Нет, упрощает. Там 2 объекта "список". У них одинаковые свойства и методы - зачем мне дублировать код, если можно сделать универсально и притом всю работу со списком вынести в отдельный файл.

Author:  Leency [ Fri Jan 04, 2013 7:40 pm ]
Post subject:  Re: Liza

Неужели Си не поддержвает такой код?

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

Author:  hidnplayr [ Fri Jan 04, 2013 8:23 pm ]
Post subject:  Re: Liza

So, when will we see the first glimpse of this magnificient creature?

Author:  Leency [ Fri Jan 04, 2013 8:58 pm ]
Post subject:  Re: Liza

When it will be done.

Author:  SoUrcerer [ Sat Jan 05, 2013 8:33 am ]
Post subject:  Re: Liza

Нет, не поддерживает. Структуры, содержащие функции, не допускаются, и этр, я считаю, правильно.

Author:  Serge [ Sat Jan 05, 2013 9:36 am ]
Post subject:  Re: Liza

Структуры могут содержать указатели на функции. Такой первобытный ООП.

Author:  Artyom [ Sat Jan 05, 2013 2:23 pm ]
Post subject:  Re: Liza

Поддерживает, но в структуре должен быть указатель (тип *) перед объявлением прототипа функции(процедуры).

Author:  SoUrcerer [ Sat Jan 05, 2013 3:17 pm ]
Post subject:  Re: Liza

Указатели - это указатели. А реально функции в структурах - это немного другое.

Author:  Serge [ Sun Jan 06, 2013 1:45 am ]
Post subject:  Re: Liza

SoUrcerer
Реализуется компилятором как же указатели.

Author:  Leency [ Tue Jan 08, 2013 2:52 pm ]
Post subject:  Re: Liza

Столкнулся с проблемой создания динамических массивов и разработка остановилась.

Author:  Leency [ Tue Jan 08, 2013 3:01 pm ]
Post subject:  Re: Liza

Есть код, но он не работает как надо.
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...
   }
}

Author:  Artyom [ Tue Jan 08, 2013 5:27 pm ]
Post subject:  Re: Liza

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 *Имя_нечто[Некого_размера].
Если не запямятовал.

Author:  Albom [ Tue Jan 08, 2013 6:13 pm ]
Post subject:  Re: Liza

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;
.

Author:  lev [ Tue Jan 08, 2013 6:25 pm ]
Post subject:  Re: Liza

Слепил тест, при первом нажатии кнопки под KlbrInWin выдаёт:
Attempt to work with uninitialized heap!
при втором работает как предполагалось
с инициализацией heap разбираться лень

Attachments:
arr.zip [1.33 KiB]
Downloaded 161 times

Author:  lev [ Wed Jan 09, 2013 4:11 am ]
Post subject:  Re: Liza

закомментировал
//db = free(db);
работает без сообщений

Page 4 of 7 All times are UTC+03:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/