Почтовый клиент Liza

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

    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;
    }
    Из хаоса в космос
  • 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
  • When it will be done.
    Из хаоса в космос
  • Нет, не поддерживает. Структуры, содержащие функции, не допускаются, и этр, я считаю, правильно.
  • Структуры могут содержать указатели на функции. Такой первобытный ООП.
  • Поддерживает, но в структуре должен быть указатель (тип *) перед объявлением прототипа функции(процедуры).
    Программист не тот, кто постоянно пишет КОД, а тот кто сможет понять чужой КОД!!!
  • Указатели - это указатели. А реально функции в структурах - это немного другое.
  • SoUrcerer
    Реализуется компилятором как же указатели.
  • Столкнулся с проблемой создания динамических массивов и разработка остановилась.
    Из хаоса в космос
  • Есть код, но он не работает как надо.

    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...
       }
    }
    Из хаоса в космос
  • 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 *Имя_нечто[Некого_размера].
    Если не запямятовал.
    Программист не тот, кто постоянно пишет КОД, а тот кто сможет понять чужой КОД!!!
  • 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;
    .
  • Слепил тест, при первом нажатии кнопки под KlbrInWin выдаёт:
    Attempt to work with uninitialized heap!
    при втором работает как предполагалось
    с инициализацией heap разбираться лень
    Attachments
    arr.zip (1.33 KiB)
    Downloaded 348 times
  • закомментировал
    //db = free(db);
    работает без сообщений
  • Who is online

    Users browsing this forum: No registered users and 3 guests