Несколько вопросов по FreePascal (скорее опрос некий)

Любые обсуждения, не нарушающие правил форума.

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

Re: Несколько вопросов по FreePascal (скорее опрос некий)

Сообщение debi12345 » 12.03.2013 10:52:01

Оправдано ли для вас использование индексации массивов не с нуля? Зачастую индексация ваших массивов начинается с нуля или же с других значений?

Еще как оправдана, например при конверсии символов.
Код: Выделить всё
{ MSEgui Copyright (c) 2007 by IvankoB

    See the file COPYING.MSE, included in this distribution,
    for details about the copyright.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
}
unit mseucs2toru;
{$ifdef FPC}{$mode objfpc}{$h+}{$endif}

interface
uses
msestrings;

function ucs2to866(const avalue: msechar): char;
function ucs2to866(const avalue: msestring): ansistring;

function cp866toUCS2(const avalue: char): msechar;
function cp866toUCS2(const avalue: ansistring): msestring;

implementation

const

cp866_2: array[$2550..$256C] of byte = (
  $cd,$ba,$d5,$d6,$c9,$b8,$b7,$bb,$d4,$d3,$c8,$be,$bd,$bc,$c6,
  $c7,$cc,$b5,$b6,$b9,$d1,$d2,$cb,$cf,$d0,$ca,$d8,$d7,$ce
);

cpUCS2_1: array[$b5..$be] of longword = (
  $2561,$2562,$2556,$2555,$2563,$2551,$2557,$255D,$255C,$255B
);

cpUCS2_2: array[$c6..$d8] of longword = (
  $255E,$255F,$255A,$2554,$2569,$2566,$2560,$2550,$256C,$2567,
  $2568,$2564,$2565,$2559,$2558,$2552,$2553,$256B,$256A
);



function ucs2to866(const avalue: msechar): char;
var
  i: longword;
begin
i:= longword(avalue);
case i of
  $0..$7f:      result:= char(avalue);
  $A0:          result:= char($ff);
  $A4:          result:= char($fd);
  $B0,$BA:      result:= char($f8);
  $B7:          result:= char($fa);
  $401:         result:= char($f0);
  $404:         result:= char($f2);
  $407:         result:= char($f4);
  $40E:         result:= char($f6);
  $410..$43f:   result:= char(i-$390);
  $440..$44f:   result:= char(i-$360);
  $451:         result:= char($f1);
  $454:         result:= char($f3);
  $457:         result:= char($f5);
  $45E:         result:= char($f7);
  $2116:        result:= char($fc);
  $2219:        result:= char($f9);
  $221A:        result:= char($fb);
  $2500:        result:= char($c4);
  $2502:        result:= char($b3);
  $250C:        result:= char($da);
  $2510:        result:= char($bf);
  $2514:        result:= char($c0);
  $2518:        result:= char($d9);
  $251C:        result:= char($c3);
  $2524:        result:= char($b4);
  $252C:        result:= char($c2);
  $2534:        result:= char($c1);
  $253C:        result:= char($c5);
  $2550..$256C: result:= char(cp866_2[i]);
  $2580:        result:= char($df);
  $2584:        result:= char($dc);
  $2588:        result:= char($db);
  $258C:        result:= char($dd);
  $2590:        result:= char($de);
  $2591:        result:= char($b0);
  $2592:        result:= char($b1);
  $2593:        result:= char($b2);
  $25A0:        result:= char($fe);
else
  result:= char($20);
end;
end;


function ucs2to866(const avalue: msestring): ansistring;
var
  i,i1: integer;
begin
i1:= length(avalue);
setlength(result,i1);
for i:= 1 to i1 do begin
  result[i]:= ucs2to866(avalue[i]);
end;
end;


function cp866toUCS2(const avalue: char): msechar;
var
  i: byte;
begin
i:= byte(avalue);
case i of
  $0..$7f:    result:= widechar(avalue);
  $80..$af:   result:= widechar(i + $390);
  $b0:        result:= widechar($2591);
  $b1:        result:= widechar($2592);
  $b2:        result:= widechar($2593);
  $b3:        result:= widechar($2502);
  $b4:        result:= widechar($2524);
  $b5..$be:   result:= widechar(cpUCS2_1[i]);
  $bf:        result:= widechar($2510);
  $c0:        result:= widechar($2514);
  $c1:        result:= widechar($2534);
  $c2:        result:= widechar($252C);
  $c3:        result:= widechar($251C);
  $c4:        result:= widechar($2500);
  $c5:        result:= widechar($253C);
  $c6..$d8:   result:= widechar(cpUCS2_2[i]);
  $d9:        result:= widechar($2518);
  $da:        result:= widechar($250C);
  $db:        result:= widechar($2588);
  $dc:        result:= widechar($2584);
  $dd:        result:= widechar($258C);
  $de:        result:= widechar($2590);
  $df:        result:= widechar($2580);
  $e0..$ef:   result:= widechar(i + $360);
  $f0:        result:= widechar($401);
  $f1:        result:= widechar($451);
  $f2:        result:= widechar($404);
  $f3:        result:= widechar($454);
  $f4:        result:= widechar($407);
  $f5:        result:= widechar($457);
  $f6:        result:= widechar($40E);
  $f7:        result:= widechar($45E);
  $f8:        result:= widechar($B0);
  $f9:        result:= widechar($2219);
  $fa:        result:= widechar($b7);
  $fb:        result:= widechar($221A);
  $fc:        result:= widechar($2116);
  $fd:        result:= widechar($a4);
  $fe:        result:= widechar($25A0);
  $ff:        result:= widechar($a0);
else
  result:= widechar($20);
end;
end;

function cp866toUCS2(const avalue: ansistring): msestring;
var
  i,i1: integer;
begin
i1:= length(avalue);
setlength(result,i1);
for i:= 1 to i1 do begin
  result[i]:= cp866toUCS2(avalue[i]);
end;
end;

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

Re: Несколько вопросов по FreePascal (скорее опрос некий)

Сообщение Vadim » 12.03.2013 10:55:57

bormant
А как в модулях отдельные области видимости делаются? :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Несколько вопросов по FreePascal (скорее опрос некий)

Сообщение debi12345 » 12.03.2013 11:17:23

Используете ли var в параметрах функции или всё же предпочитаете указатели?

В данном котексте указатель = извращение, требующее дереференсинга :)

Пользуетесь ли ООП? Если да, то чем вас не устраивают модули?

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

Re: Несколько вопросов по FreePascal (скорее опрос некий)

Сообщение Лекс Айрин » 12.03.2013 13:08:47

bormant писал(а):Если бы это утверждение было верным, то не было бы необходимости в отдельных областях видимости в модулях, в интерфейсной части и части реализации.


Тут дело в особенностях компоновки модуля. Если бы сделано было по другому, то модуль пришлось бы перекомпилировать каждый раз. Сейчас, когда мощностей поболее это не так важно, а во времена ТР и ранее, когда все это создавалось, все это было остро необходимо.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Несколько вопросов по FreePascal (скорее опрос некий)

Сообщение absdjfh » 12.03.2013 13:11:37

Vadim писал(а):А вот класс (объект) - это действительно, логически завершённый кусок кода, который как раз и занимается тем, что берёт данные, обрабатывает их и выдаёт наружу.

Не всегда верно. В классе тоже можно написать набор никак несвязанных функций, переменных (полей) и процедур. Или связанных, но не с данными объекта, а только между собой. Просто это делать не принято, у класса специфическое предназначение. Пользуясь логикой dedm0zaj, можно сказать, что класс - это развитие модуля, к которому прибавили специфику - функции только для работы с теми данными, которые представляют непосредственно объект, а также наследование классов и прочие особенности.
absdjfh
новенький
 
Сообщения: 60
Зарегистрирован: 21.01.2012 13:59:00

Re: Несколько вопросов по FreePascal (скорее опрос некий)

Сообщение Vadim » 12.03.2013 13:32:18

absdjfh писал(а):В классе тоже можно написать набор никак несвязанных функций, переменных (полей) и процедур.

Никогда так не делал и Вам не советую. :D В этом случае возникает резонный вопрос - а зачем тогда вообще класс городить, если там ничего друг с другом не связано? Чем, в таком случае, это будет отличатся от не-ООП программы? Можно ведь и строки на древнегреческом на экран выводить, однако Вас за это немедленно подвергнут древнегреческому же остракизму. Так что не будем доводить до абсурда, хорошо? ;)
absdjfh писал(а):можно сказать, что класс - это развитие модуля

Можно, но только осторожно. :) Товарищ dedm0zaj в своей тронной речи противопоставил ООП и модули. Этого делать не надо было. Поэтому мы не можем, в данном случае, руководствоваться словами товарища dedm0zaj, а будем руководствоваться тем, что класс - это не модуль. Класс - это тип данных. Вот если бы модуль когда-нибудь, во глубине веков, был бы типом данных, а потом, прибавив ему некий необходимый функционал, он стал классом, тогда ещё можно было бы согласится. А так, модуль как был файлом, так файлом и остался. Его суть, по мере развития компилятора языка нисколько не поменялась. Не наследуется класс от модуля, хоть ты тресни. :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Несколько вопросов по FreePascal (скорее опрос некий)

Сообщение alexey38 » 12.03.2013 14:53:26

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

Автор топика говорит о неком подходе (стиле) к программированию, с использованием тех или иных конструкций конкретного языка.
Для начала следует отметить, что именно паскалевские модули исходно были праобразом ООП, да и соственно Виртовское развитие языка привело к появлению языков Модула и Модула-2.
Учитывая, что есть такие понятия как указатель на переменную, и есть процедурные типы и переменные, то используя только инструментарий модулей можно реализовать большую часть функционала из классического ООП, а именно:
- в модулях данные (глобальные переменные) связаны с процедурами, их обрабатывающими
- есть зоны видимости (публичная и не публичная)
- есть глобальный конструктор и деструктор в виде секций инициализаций и финализации
- есть указатели на переменные, в т.ч. можно делать указатели на глобальные переменные в модулях
- есть процедурные типы и переменные процедурного типа, что позволяет делать наследование модулей.
- очередность объявления модулей в секции uses определяет порядок работы секций секций инициализаций и финализации.

Можно выделить два применения, в одном случае удобно использовать модули, а в другом классы.

Там, где нужно иметь множество экземпляров классов - там классы без вариантов, реализация всего этого на уровне модулей будет извращением, хотя вполне реализуемое.

Модули, как элемент структурного и объектного программирования, можно использовать в случаях, когда идеологически для данной задачи экземпляр конкретного объекта может быть только один. Наглядный пример, главный модуль и главная форма. То, что главная форма есть класс - это ничего не дает. Есть набор функций, работа с которой связана с тем экземпляром объекта, который нужен всегда в единственном числе.

Я сам модульную технику использую, когда к программе нужно прицепить некий общий функционал. Например, так подключаю систему логирования (которую мы с коллегами разработали лет 15 назад), написал: uses log; И программа уже их поддерживает, в инициализации и финализации этого модуля написаны всякие действия по созданию файла, архивации предыдущего лога и т.п. В тексте программы просто в нужных местах пишешь операторы для вывода в лог. Можно это обернуть в класс, но это ничего не дает. Пространство имен и так есть, для наглядности пишешь: log.WriteError(...); Аналогичным образом, мы еще некоторый базовый функционал реализовали. Причем даже с наследственностью. Например, если в главном модуле помимо "uses log" написать "uses log, VisualLog;", то команда "log.WriteError(...);" не только запишет в текстовый файл, но и выдаст сообщение на экран. Вполне удобно, и не нужно писать конструкторы и деструкторы в главном модулей каждой программы.

Еще один пример применения модульной техники в структурном и объектном программировании. Имеем иерархическую и древовидную структуру классов, связанных с реальными объектами. Например, имеем 3 уровне иерархии, и на каждом уровне имеем разветвление на 3 дочерних класса, т.е. имеем всего 13 классов, 1 базовый, и 12 дочерних к нему. Предположим, что для операции с экземплярами классов для разных задач нужно использовать 1000 различных операций. Если мы все 1000 операций реализуем, как 1000 методов в базовом классе, то это будет нечитаемый код, и полный "пи..ц". Если мы для наглядности базовый класс 10 раз дополнительно пронаследуем, то можем при каждом наследовании дописывать всего по 100 методов, будет немного нагляднее, но не намного. И главное, конечный экземпляр класса все равно будет иметь 1000 функций, так что помощники по вводу текста из RADStudio и подобного будут только мешать, т.к. в выпадающем списке выбрать 1 из 1000 нереально. Задача вполне реальная. Выходом из ситуации является отделение функций от экземпляров класса. Иерархия классов - это собственно данные реального объекта, и некоторые функции помогающие работать с этими данными. И есть отдельные функции обработчики, которые сгруппированы по задачам. Например, функции по анализу, функции по объединению объектов, функции по поиску в объектах, функции по прикладной задаче №1, по задаче №2 и т.п. Сами функции работают с данными из экземпляра класса или нескольких экземпляров класса, и не имеют своих переменных. Их можно запихать в классы, но это ничего не дает. А можно распихать по модулям. И я для таких случаев использую распихивание по модулям.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Несколько вопросов по FreePascal (скорее опрос некий)

Сообщение daesher » 12.03.2013 16:38:14

1. Оправдано. Логично начинать массивы с 1, правда, нумерация многих индексных свойств идёт с 0. Массив с чего-нибудь другого - редкость, но теоретически тоже возможен.
2. Не часто. Иногда в операциях сравнения и выбора.
3. И то, и другое. var-параметры следует использовать по логике, указатели - либо когда речь идёт об экспорте/импорте функций, либо var-параметр неочевиден.
4. Само собой. Теперь без этого тяжело. Модуль - нечто другое, несмотря на внешнее сходство. Тем более, о наследовании модулей речи не идёт.
5. Дело привычки. К тому же, он более распространён.
daesher
постоялец
 
Сообщения: 221
Зарегистрирован: 09.03.2010 22:17:14

Re: Несколько вопросов по FreePascal (скорее опрос некий)

Сообщение dedm0zaj » 12.03.2013 17:04:24

Vadim писал(а):класс - это не модуль. Класс - это тип данных.

а я и не сопоставлял класс с модулем. я сопоставлял экземпляр класса (т.е объект) с модулем.

Vadim писал(а):Согласитесь, сами по себе коды клавиш, как их не разглядывай, никоим образом "логически завершённым кодом" не выглядят.

а мне кажется, что вполне выглядит. да и ничто мне не мешает то же самое сделать с классом.

alexey38 писал(а):Там, где нужно иметь множество экземпляров классов - там классы без вариантов, реализация всего этого на уровне модулей будет извращением, хотя вполне реализуемое.

множество экземпляров класса это массив. при чём, на сколько я знаю, в памяти создаётся множество экземпляров полей и по одному экземпляру методов. методы управляют массивом полей.
если применять модули, то для множественности экземпляров применяется тоже массив - массив на структуру данных. а функций по управлению этим массивом тоже в единственном числе.
так что особой разницы я не вижу.

ну может разница этого всего в наглядности. операции с объектами выглядят так, что мы сначала выбираем объект, а потом говорим, что ему нужно сделать. а операции с экземплярами структуры из модуля выглядят так, как будто у нас есть единый инструмент по управлению массивом структур, и мы сначала выбираем, что будем делать, а потом указываем, с каким экземпляром структуры будем это делать.
dedm0zaj
постоялец
 
Сообщения: 108
Зарегистрирован: 05.10.2012 19:55:20

Re: Несколько вопросов по FreePascal (скорее опрос некий)

Сообщение alexey38 » 12.03.2013 21:33:27

dedm0zaj писал(а):множество экземпляров класса это массив. при чём, на сколько я знаю, в памяти создаётся множество экземпляров полей и по одному экземпляру методов. методы управляют массивом полей.
если применять модули, то для множественности экземпляров применяется тоже массив - массив на структуру данных. а функций по управлению этим массивом тоже в единственном числе.
так что особой разницы я не вижу.

Массив структур и экземпляр класса - это несколько разное, в части философии программирования.
Массивы - это линейная структура, с индексным доступом, т.е. это жесткая конфигурация. Как формат хранилища - нормальное явление. Как способ структуризации данных - обычно не соответствует предметной области.

Экземпляры классов можно хранить как угодно, например, в переменных других экземпляров классов. Есть предметная область, описываемая различными экземплярами различных классов, ссылки одних экземпляров классов на другие - это способ приближения программы к самой предметной области. Аналогичная логика на массивах возможна, но ненаглядна, и является источником ошибок.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Несколько вопросов по FreePascal (скорее опрос некий)

Сообщение Mirage » 13.03.2013 21:24:21

dedm0zaj писал(а):1. Оправдано ли для вас использование индексации массивов не с нуля? Зачастую индексация ваших массивов начинается с нуля или же с других значений?
2. Часто ли используете множества, кроме объявлений массивов?
3. Используете ли var в параметрах функции или всё же предпочитаете указатели?
4. Пользуетесь ли ООП? Если да, то чем вас не устраивают модули? Какие вы видите различия между модулями и ООП?
5. Почему выбрали фрипаскаль, а не оберон, оберон-2 или компонентный паскаль?


1. Можно легко прожить и без этого, а значит не оправдано.;) А вот индексация перечислимым типом часто полезна.
2. Повсеместно, вместо битовых флагов. В объявлениях массивов использовать не умею. :P
3. Указатели только по необходимости.
4. Пользуюсь, ибо синтаксис языка как бэ настаивает. Модули тоже использую. Различия в отсутствии наследования (вообще не проблема, даже хорошо) и в том, что модуль - всегда синглтон. Отсюда забавляют самодельные реализации синглтонов через классы.
5. Куда большее сообщество, больше библиотек и инструментов.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Несколько вопросов по FreePascal (скорее опрос некий)

Сообщение Сквозняк » 24.03.2013 05:00:55

1. С чего в конкретном случае удобнее, с того и начинается.

2. Часто. Если данные записаны в переменные типа byte то обрабатываются паскалевским IN, в других случаях своими функциями. Множества позволяют профильтровать и обработать некие события, записанные числами, к которым есть произвольный доступ.

3. Если можно обойтись без указателей, то так и надо делать.

4. Смысл ООП в автоматизированной копипасте чужого кода, почему бы и не покопипастить если есть что полезное. Но если нужен микроконтроль при выполнении или доступ ко всем данным то можно обойтись и без него - всё равно пока не написано копипастить нечего. Много экземпляров объекта можно создать и процедурно: берём массив глобальных переменных и каждой процедуре выдаём индекс элемента массива с которым она будет работать, причём на её работу можно повлиять извне а данные можно сохранить и прочитать как текст.

5. Турбо/Борланпаскаль --> фрипаскаль. Основы знакомые и проверенные временем, готовые книжки на русском для начинающих. Более поздние виртовские разработки похоже сделаны по принципу "как бы придумать заменители goto и хз зачем переделать паскалевский синтаксис" - ну нету сейчас в них огромной пользы и смысла для массового применения.
Сквозняк
энтузиаст
 
Сообщения: 1123
Зарегистрирован: 29.06.2006 22:08:32

Re: Несколько вопросов по FreePascal (скорее опрос некий)

Сообщение Vapaamies » 24.03.2013 22:41:06

Сквозняк писал(а):Более поздние виртовские разработки похоже сделаны по принципу "как бы придумать заменители goto и хз зачем переделать паскалевский синтаксис"

В рамочку и на стенку!
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: Несколько вопросов по FreePascal (скорее опрос некий)

Сообщение Mirage » 25.03.2013 01:06:37

Сквозняк писал(а):Более поздние виртовские разработки похоже сделаны по принципу "как бы придумать заменители goto и хз зачем переделать паскалевский синтаксис" - ну нету сейчас в них огромной пользы и смысла для массового применения.


Не знаю про заменители goto, не видел, но если нужна совместимость по синтаксису любой ценой, то есть же С-семейство. Там синтаксис не менялся аж с самого начала. Только нагромождался.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Несколько вопросов по FreePascal (скорее опрос некий)

Сообщение Сквозняк » 25.03.2013 09:38:59

Mirage писал(а):Не знаю про заменители goto, не видел

http://ru.wikipedia.org/wiki/Модула-2
Код: Выделить всё
IF Условие THEN
  Операторы
ELSIF Условие THEN
  Операторы
ELSIF Условие THEN
  Операторы
...
ELSE
  Операторы
END

Вышеприведённый условный оператор призван как-то заменить несколько паскалевских обладающих большей гибкостью и редактируемостью.
Код: Выделить всё
IF условие THEN GOTO 1;
IF условие THEN GOTO 1;
IF условие THEN GOTO 1;
IF условие THEN GOTO 100;
выполняется некий полезный код
1:

Mirage писал(а): но если нужна совместимость по синтаксису любой ценой, то есть же С-семейство. Там синтаксис не менялся аж с самого начала. Только нагромождался.

Там неудобный для паскалиста синтаксис, для нечеловеческой логики и экономии байтов исходника.
Сквозняк
энтузиаст
 
Сообщения: 1123
Зарегистрирован: 29.06.2006 22:08:32

Пред.След.

Вернуться в Потрепаться

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21

Рейтинг@Mail.ru