ООП: доступ к методу класса из-вне

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

zub писал(а):Это скорее к программе, не к коду.


есть языки, на которых сложнее создавать компилируемый но неправильный код. Конечно, всегда есть "гении", которые ухитряются.

zub писал(а):Паскаль какраз и есть С с парой плюшек, только для людей, а не для роботов))


Я бы так не сказал. У Вас получается, что все языки одинаковы потому что в них используются одинаковые слова.
Описание правил паскаля, например, более компактное.

zub писал(а):ООПом головного мозга тоже страдать ненадо, ооп подходы невсегда оправданы, зачастую проще какраз без них по другому.


вообще, ООП парадигма создавалась для облегчения написания большого объема сложноструктурированного кода. К сожалению, данная задача не выполнена в получивших широкое распространение языках. Да чего уж там... сейчас нет даже нормальной IDE заточенной под ООП. Лазарус наиболее подходящий из известных мне.

debi12345 писал(а):Также можно собирать ядро-зависимые проекты под неактуальную версию ядра, если нужны объявления в хэдекрах не изменились.

То есть, чтобы не исправлять косяки линкера/формата библиотеки нормальным решением считается создать костыль? Шикарно...
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Лекс Айрин
Голый си (не ++) в паскаль переводится почти 1 в 1 и никто не мешает говнякать на паскале также как на си - указатели и арифметика с ними в паскале есть)) Единственное ИМХО значимое отличие это наличие Interface\Implementation.

>>То есть, чтобы не исправлять косяки линкера/формата библиотеки нормальным решением считается создать костыль? Шикарно...
Аналог такого сишного .h в паскале это юнит с объявлением констант и внешних процедур\функций в Interface и пустой секцией Implementation

Mirage
>>Свои чтоли прикрутить к этому тесту...
Конечно прикрутить)) это конечно не совсем полноценный тест, но какоето представление о производительности дает, особенно о наличии "лишних - поэлементных" выделений памяти при постепенном заполнении контейнера от 0 до ...

скалогрыз
>>ну не обязательно использовать указатель, можно скажем TObject, и проверять тип в run-time, если нужно.
Если в контейнере хранить record`ы то от TObject`а проку никакого нет, да и проверка типа в рантайме никчему - она в compile-time нужна
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

Аналог такого сишного .h в паскале это юнит с объявлением констант и внешних процедур\функций в Interface и пустой секцией Implementation

А где тогда описать имплементации-? Разве можно заюзать такой юнит в другом юните и прописать для его имплементацию ?
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

zub писал(а):переводится почти 1 в 1


ну нет... тут Вы не правы... некоторые конструкции С (любого) в паскале не повторить 1 к 1 -- он просто не будет это безобразие компилировать... например, вырожденный if /for
zub писал(а):Аналог такого сишного .h в паскале это юнит с объявлением констант и внешних процедур\функций в Interface и пустой секцией Implementation

лично я использовал inc файл, что, имхо, правильнее. юнит, в этом случае, излишен. А уж переделать его в юнит, при необходимости, плевое дело.

zub писал(а):указатели и арифметика с ними в паскале есть))

это да... к сожалению, они нужны.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

debi12345
>>А где тогда описать имплементации-? Разве можно заюзать такой юнит в другом юните и прописать для его имплементацию ?
В соответствующей дллке. Мы разве не про хидеры для уже скомпиленых бинарников?

Лекс Айрин
>>например, вырожденный if /for
Пример? если только макрос какойнить придется в функцию переделать и вычисляться он будет в рантайме а не в компилтайме
А заменить хитрый for на repeat\while или union на вариативный рекорд или пересечение нескольких рекордов - по мне это 1 в 1
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

zub писал(а): Мы разве не про хидеры для уже скомпиленых бинарников?


вообще-то нет. Про использование стандартных скомпилированных библиотек.

zub писал(а):Пример?


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

if() 
{}
else
{}
-- в паскале подобное не запустится.
zub писал(а):А заменить хитрый for на repeat\while или union на вариативный рекорд или пересечение нескольких рекордов - по мне это 1 в 1


но это НЕ так.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Лекс Айрин писал(а):if()
{}
else
{}
-- в паскале подобное не запустится.

И это не 1 в 1? Нет then, но принципиально это ничего не меняет
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

Лично мне в Паскале очень не хватает DEFINE-макрорасширений подобного рода:

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

wchar_t* mb2wstr(const char* inval) {
    size_t size = strlen(inval);
#define OUTSZ (size+1)*sizeof(wchar_t)
    wchar_t* buf = (wchar_t*)malloc(OUTSZ);
    memset(buf, 0, OUTSZ);
    setlocale(LC_CTYPE,""); //  необходима, чтобы отработала "mbstowcs"
    size = mbstowcs(buf, inval, size);
    if ( size == (size_t)(-1) ) {
   free(buf);
   buf = NULL;
    } else {
   buf = (wchar_t*)realloc(buf,OUTSZ);
    }
    return buf;
#undef OUTSZ
}

но видимо на одно-проходовом (быстром) компиляторе это не вырулишь.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

zub писал(а):Если в контейнере хранить record`ы то от TObject`а проку никакого нет, да и проверка типа в рантайме никчему - она в compile-time нужна

согласен от TObject-а проку не будет.

Но тогда правильно ли я понимаю, что данные из рекорда используются в только в этом самом дереве (т.е. даже если дубляж этих данных есть где-то ещё, то им можно принебречь), а сами рекорды маленькие (расход на копирование данных при сортировке "дерева").
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

а сами рекорды маленькие (расход на копирование данных при сортировке "дерева").

Эти тесты измеряют оверхэды САМИХ контейнеров - именно поэтому выбраны самые миниатюрные (с наименьшим временем манипуляций в памяти) типа.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

скалогрыз
Незнаю, правильно ли я делаю, но хотелка примерно такая:
Высокоуровневые "сложные" примитивы - в дереве в виде ссылок на объекты в куче - так гораздо проще из любых соображений и их относительно немного - десятки тысяч.
Низкоуровневые - только в дереве (сам примитив это object c VMT). Массив низкоуровневых примитивов в ветке дерева это массив байтов в котором лежат инстансы примитивов, пробежка по этому массиву с учетом SizeOf каждого инстанса. Низкоуровневых примитивов очень много, и память под каждый выделять отдельно - медленно, надо выделять пачками. По другому не представляю как организовать "экономный" полиморфизм
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

zub писал(а): Нет then, но принципиально это ничего не меняет


вот как раз отсутствие then это ерунда. Данный код, перенесенный в паскаль, даже если добавить then вызовет ошибку времени компиляции.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

zub писал(а):Незнаю, правильно ли я делаю, но хотелка примерно такая:

хорошо получается.
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

Низкоуровневых примитивов очень много, и память под каждый выделять отдельно - медленно, надо выделять пачками.

Array of <type> => SetLength(<array>,<elements_of_type>) ? Это идеальный по эффективности способ. Обмен внутри такого массива тоже мгновенный - если делать как Мартин, применяя очень хорошо оптимизируемые под процы блочные MOVE-операции:

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

function additem(var dest: longwordarty; const value: longword;
                             var count: integer): boolean;
begin
 result:= false;
 if length(dest) <= count then begin
  setlength(dest,count+arrayminlenghtstep+2*length(dest));
  result:= true;
 end;
 dest[count]:= value;
 inc(count);
end;

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

procedure deleteitem(var dest: integerarty; index: integer);
begin
 if (index < 0) or (index > high(dest)) then begin
  tlist.Error(SListIndexError, Index);
 end;
 move(dest[index+1],dest[index],sizeof(dest[0])*(high(dest)-index));
 setlength(dest,high(dest));
end;

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

procedure insertitem(var dest: integerarty; index: integer; value: integer);
begin
 setlength(dest,high(dest) + 2);
 move(dest[index],dest[index+1],(high(dest)-index) * sizeof(dest[0]));
 dest[index]:= value;
end;
Аватара пользователя
runewalsh
энтузиаст
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Сообщение runewalsh »

debi12345 писал(а):Лично мне в Паскале очень не хватает DEFINE-макрорасширений подобного рода:

Они есть:

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

{$macro on}
{$define sum :=
  (a + b)
{$undef a} {$undef b}}

x := {$define a := 2} {$define b := 3} sum;
Ответить