Математика, но не простая...

Планы, идеология, архитектура и т.п.

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

Re: Математика, но не простая...

Сообщение xdsl » 20.03.2014 23:35:29

SSerge писал(а):1. Речь идет не о языке как таковом. Хотя, что вы считаете достоинством языка, на самом деле совершенно надуманный ход извращенной мысли г-на Вирта и в ряде случаев напрямую провоцирует ошибки программирования при попытке перевести программы с/на паскаль.
Если разговор об массивах, то проблемы только в переводе с Паскаля на другие языки, которые беднее по синтаксису.
SSerge писал(а): Вы еще забыли упомянуть перечислимые типы (которыми емнип тоже можно индексировать), кои были введены исключительно для того, чтобы омериканоязычный программер мог не шевеля извилинами вывести ейное символьное наименование оператором writeln, и это типа невиданный прогресс. То, что при этом epic fail при любых других языках - кого волновало.
Ничего я не забыл. Я сказал порядковые типы, куда перечислимые тоже входят. Насчет "невиданного прогресса" не в курсе, но при отладке очень удобно. Хотя я и не "омериканоязычный программер".
SSerge писал(а): Еще раз подчеркиваю - исходный паскаль - язык учебный и теоретизированный, в исходном виде - далёкий от практики программирования.
Да, изначально - учебный. И сейчас на нем очень удобно концепции объяснять. Далее, что значит в исходном виде? В том, котором его Вирт придумал? или без подключения сторонних модулей? Если первое, то современный паскаль от виртовского далеко ушел. Если второе - то лично я мелкие автономные утилиты под конкретные прикладные задачи проще и быстрее на паскале пишу, чем на си, именно потому, что в самом языке возможностей богато, даже без всяких внешних модулей. Особенно если приходится работать со строками или множествами.
SSerge писал(а):Если бугурт продолжается, давайте приведем следующий пример: есть стандартная библиотека строковых функций языка Си. В ней принято, чтобы строка-результат или строка, по которой ведется обработка, всегда была первым элементом списка аргументов функции. Если не очень понятно -
Код: Выделить всё
const char * strstr ( const char * исходная_строка, const char * шаблон_поиска );

Как вы думаете, есть ли у вас шансы ошибиться, переводя текст программы, использующий эти вызовы, наpascal, в котором и это:
Код: Выделить всё
function Pos( const substr: shortstring;  const s: shortstring)):SizeInt;

и это
Код: Выделить всё
function strpos( str: PChar;  substr: PChar):PChar;

и даже внутри самого паскаля.
Сами не заметите, как при очередном вызове случайно переставите аргументы. И это не единственное.
Хм, Pos - он и в исходном паскале был, а это, знаете, 70-е годы прошлого века. Согласовывать имена функций и порядок параметров с Си смысла не имело, ибо сам Си еще к тому времени не устаканился. Что касается strpos, то это, если память не изменяет, Борландовское нововведение специально для поддержки типа PChar и обеспечение совместимости с языком Си. Сейчас то все некритично, можете Pos и на Pchar использовать, и на все виды String или UnicodeString. Или подключить модуль strings и вперед - пользоваться импортированными из Си функциями с сишным порядком параметров. И это будет Ваш личный выбор.
И да, можете написать аналог паскалевской функции Pos на Си, а потом ругать язык Си, что в нем есть функции, несовместимые по порядку передачи параметров со стандартными :D.
SSerge писал(а):Хотите вы или нет, эталон все таки Си/С++
Да мне без разницы. Передо мной руководство ставит задачи, которые решать надо, а средства я сам выбираю. Пока выбор Си был в всего в двух случаях и оба раза - системные задачи: разрабатывал модуль ядра для линукса, да еще UDF для MySQL. Все остальное - на freepascal, lazarus, php, javascript и еще на паре-тройке языков. И во всех случаях выбирал язык программирования на основе его возможностей в решении поставленной задачи, а никак ни по эталонности, популярности или распиаренности.
SSerge писал(а):2. см. п.1; причем здесь внутренняя реализация
Вот и я удивился. Автор нигде в коде массивы, от единицы индексированные, не использует, а Вы на него обрушиваетесь. Вернее даже на язык, что вообще непонятно. Если разговор про свойства-массивы класса, то это вообще не массивы, строго говоря.
SSerge писал(а):3. Не надо делать индексацию, как в математике. Базовый класс, должен иметь индексы, отсчитывающиеся от нуля. Точка. Так работает процессор, так принято в ассемблере, так принято во всех языках программирования, кроме бейсика и фортрана. Если нужна математическая адресация - есть смысл создать класс-надстройку, в котором индексация будет от единицы. Это, imho, должно решить проблемы индейцев.
Это смотря для кого библиотека пишется. Если для математиков - то надо. Если для программистов - то нет.
SSerge писал(а):Да, я не люблю синтаксис языка паскаль.
У меня есть основания его не любить.
И да, в свое время я много чего накодил на турбе. И вот сейчас я смотрю на этот код, и иногда, когда возникает необходимость, с нехорошими словами, запускаю его под эмулятором доса. Потому что, сцуко, я слишком хорошо знал Borland Pascal и внутреннюю организацию его менеджера памяти, библиотек и прочего. Вот и напрограммил. Я де-факто не могу взять этот код и просто откомпилировать современными средствами - его придется писать заново. Даже для freePascal. И у вас будет то же. Позже. Поэтому настоятельно рекомендую писать как можно проще и не привязываться к фишкам, ставящим в тупик при необходимости перевести ваш код на другой язык программирования.
Ну, не знаю. Я в 20-м веке и на Си писал и на Паскале досовском. На паскале больше и до сих пор бывает свои модули старые поднимаю, подключаю и работаю. Бывает, что и править приходится, но обычно только в сторону расширения. Ну там {H+} поставить, integer на int64 заменить и т.п. В корзину ушли только системозависимые ассемблерные вещи, где у меня процедуры обычно были такими: procedure x;asm ... end, программы обработки прерываний и прямого доступа к устройствам (принтеру, клаве, мыши, видеодаптеру и т.п.) через порты ввода вывода. Тут уж ничего не поделаешь и от языка это не зависит. Но вот чтобы пришлось выбрасывать модули обработки текста или математической обработки - такого не упомню.

Добавлено спустя 2 минуты 11 секунд:
SSerge писал(а):Ну и товарищ настоятельно доказывает, чтобы индексация у класса работы с матрицами могла быть с произвольного индекса, как типо все привыкли в паскале.

Да ну? Где это я такое доказывал?
xdsl
постоялец
 
Сообщения: 131
Зарегистрирован: 15.01.2009 13:49:03

Re: Математика, но не простая...

Сообщение Vadim » 21.03.2014 06:38:18

xdsl писал(а):Это смотря для кого библиотека пишется. Если для математиков - то надо. Если для программистов - то нет.

Этот модуль предназначен, скорее, для программистов, которые уже привыкли к Pascal и которым недостаточно стандартного модуля Math. И, соответственно, для математиков (точнее, для тех людей, которые вынуждены, по тем или иным причинам, использовать в своих программах нетривиальную математику), которые тоже привыкли решать свои задачи именно в Pascal.
Идея написания модуля (группы связанных модулей) с более серьёзной математикой, чем Math, возникла из-за того, что хоть в инете математических модулей пруд пруди, но все они предназначены либо для TurboPascal, либо для Delphi. Согласен, что адаптировать их для FreePascal может быть и не сложно, но людям это не интересно, т.к. им нужны уже готовые модули\функции для решения своих специфических задач.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Математика, но не простая...

Сообщение sign » 21.03.2014 07:08:02

SSerge писал(а):1. Речь идет не о языке как таковом. Хотя, что вы считаете достоинством языка, на самом деле совершенно надуманный ход извращенной мысли г-на Вирта и в ряде случаев напрямую провоцирует ошибки программирования при попытке перевести программы с/на паскаль.

Значит, товарищ взялся не за своё дело, раз делает ошибки при переводе.
В смысле, не знаешь паскаля, зачем браться переводить?

SSerge писал(а):Вы еще забыли упомянуть перечислимые типы (которыми емнип тоже можно индексировать), кои были введены исключительно для того, чтобы омериканоязычный программер мог не шевеля извилинами вывести ейное символьное наименование оператором writeln, и это типа невиданный прогресс. То, что при этом epic fail при любых других языках - кого волновало.

Эта ваша фраза говорит о том, что вы писали не на паскале, а на си, языком паскаля.
Перечисляемые типы это очень и очень замечательно.
Это сильнейшее средство от ошибок и для контроля.

SSerge писал(а):Еще раз подчеркиваю - исходный паскаль - язык учебный и теоретизированный, в исходном виде - далёкий от практики программирования.

Где вы нашли исходный паскаль?
Все пишут на реальном инструменте, который имеет корнями исходный паскаль, но им не является.

SSerge писал(а): Если бугурт продолжается, давайте приведем следующий пример: есть стандартная библиотека строковых функций языка Си. В ней принято, чтобы строка-результат или строка, по которой ведется обработка, всегда была первым элементом списка аргументов функции.
...
Сами не заметите, как при очередном вызове случайно переставите аргументы. И это не единственное.

Ну дак, язык знать надо.
А ежели заметили за собой такие вот косяки, напишите свои функции - это дело пяти минут.

SSerge писал(а):Хотите вы или нет, эталон все таки Си/С++

Для сишника.
А в прологе другие правила.
Например, предикат member(Element,List) написан по правилам Паскаля.

SSerge писал(а):Да, я не люблю синтаксис языка паскаль.

Вот с этого и надо начинать, что дело не в языке, а в религии.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Математика, но не простая...

Сообщение xdsl » 21.03.2014 07:18:41

Имхо, программисту всегда проще готовую математическую формулу в неизменном виде применять, а в обработке матриц все формулы, если память не изменяет, используют индекс от единицы.

Например: http://ru.wikipedia.org/wiki/Умножение_матриц
Везде индекс от 1, во всех формулах.

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

Добавлено спустя 18 минут 11 секунд:
На мой взгляд, превозносить синтаксис одного языка и опускать другой - контрпродуктивно, как любят сейчас выражаться политики. У всего свои плюсы и минусы. Вот принято в Си-образных языках применять для равенства два знака равно, а скажем в паскале или SQL - один знак равно. Или к полям динамических экземпляров классов в С++ обращаются с помощью "->", а в паскале или javascript достаточно точки. И что? Можно ли теперь говорить, что на паскаль лучший, а си - отстой? Да ничего подобного! Каждой задаче - свой инструмент.
xdsl
постоялец
 
Сообщения: 131
Зарегистрирован: 15.01.2009 13:49:03

Re: Математика, но не простая...

Сообщение Vadim » 21.03.2014 07:39:56

xdsl писал(а):Имхо, программисту всегда проще готовую математическую формулу в неизменном виде применять, а в обработке матриц все формулы, если память не изменяет, используют индекс от единицы.

Хм... Не стал бы утверждать это категорически. ;-) Лично меня совершенно не напрягает, с какого числа начинается массив. В Си и PHP я без проблем обрабатываю массивы с 0, а когда начинал программировать в досовском basic - то с 1. :-) Проблема в укоренившейся привычке. Математик, к примеру, который всю жисть пользовался в вычислениях ручкой с бумажкой (изредка калькулятором :-) ) уже рефлекторно начинает массив с 1. В Си у него явно будут проблемы. Другое дело, что человек, который всю жисть пользовался Си, у него точно так же будут большие проблемы при математической интерпретации массива когда он забудет дома свой ноут и попытается решить уравнение на смартфоновском калькуляторе. :-)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Математика, но не простая...

Сообщение SSerge » 21.03.2014 08:14:47

Господа, в процессе дискуссии о политике и вере, вы полностью упускаете единственное в моем тезисе, что к религии не относится: сделать базовый класс с нумерацией индексов от нуля и сделать его потомка, в котором базу индексации задавать произвольно - хоть от отрицательного числа. Мне кажется, так будет правильнее. На любом языке, если на то пошло.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Математика, но не простая...

Сообщение xdsl » 21.03.2014 10:14:48

SSerge писал(а):Господа, в процессе дискуссии о политике и вере, вы полностью упускаете единственное в моем тезисе, что к религии не относится: сделать базовый класс с нумерацией индексов от нуля и сделать его потомка...
Согласен, это единственное в Ваших тезисах, что к религии не относится. И да, имеет смысл сделать именно так.
xdsl
постоялец
 
Сообщения: 131
Зарегистрирован: 15.01.2009 13:49:03

Re: Математика, но не простая...

Сообщение Дож » 21.03.2014 14:34:24

Надо ещё не забывать, что и в самом паскале динамические массивы нумеруются с нуля, и (как мне кажется) обычные массивы используются гораздо реже, чем динамические. И если человек пишет на паскале, то, наверно, он должен быть привычен к динамическим массивам и не пугаться нумераций с нуля.

Если уж на то пошло, то математик сможет у себя в программе вычесть единицу в индексации при копипасте формул.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Математика, но не простая...

Сообщение Vadim » 23.03.2014 19:00:21

Очередная версия. :-)

- Добавлена возможность устанавливать начальный индекс матрицы.
По умолчанию начальный индекс - 0.
Вложения
Matrixes.pas.7z
(7.18 КБ) Скачиваний: 752
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Математика, но не простая...

Сообщение sign » 12.05.2014 12:39:44

Стоит, наверное, заменить
Код: Выделить всё
constructor TMatrix.Create(const Rows, Cols: Word);
var
  i, j: Word;
begin                               
...
  for i := 0 to RowCount - 1 do
    for j := 0 to ColCount - 1 do
      FData[i, j] := 0;
  FOrigin := 0;
end;


на

Код: Выделить всё
constructor TMatrix.Create(const Rows, Cols: Word);
begin                               
...
  FillChar(FData, SizeOf(FData), 0);
  FOrigin := 0;
end;
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Математика, но не простая...

Сообщение Vadim » 12.05.2014 13:20:59

sign
Да, согласен. Это я прохлопал. Будет в следующей версии, вместе с дополнительным модулем всяких синусов-котангенсов. :D
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Математика, но не простая...

Сообщение Дож » 12.05.2014 14:36:08

А я не согласен. Посмотрите что будет при выполнении предложенного кода
Код: Выделить всё
var
  A: array of array of Extended;
  I, J: Integer;
begin
  SetLength(A, 4, 4);
  FillChar(A, SizeOf(A), 0);
  for I := 0 to 3 do
    for J := 0 to 3 do
      Writeln(A[I, J], ' ');
end.


Или даже такого
Код: Выделить всё
var
  A: array of array of Extended;
  I, J: Integer;
begin
  SetLength(A, 4, 4);
  FillChar(A[0, 0], 4 * 4 * SizeOf(Extended), 0);
  for I := 0 to 3 do
    for J := 0 to 3 do
      Writeln(A[I, J], ' ');
end.


И до кучи:
Код: Выделить всё
var
  A: array of array of Extended;
begin
  SetLength(A, 4, 4);
  Writeln(SizeOf(A));
end.


A — это указатель, SizeOf(A) — это размер указателя, статически полученный при компиляции, A[0] начинает область памяти, в которой массив указателей на другие динамические массивы.

Кроме того, мне непонятно откуда взялось предположение, что при заполнении Extended нулями в памяти он и сам становится нулевым. Верно ли это на Arm архитектуре, например?
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Математика, но не простая...

Сообщение sign » 12.05.2014 15:41:19

Согласен. Это же просто массив.

Нужно вот так:

Код: Выделить всё
  SetLength(FData, Rows, Cols);
  FillChar(FData, Length(FData) * Length(FData[0]), 0);


А ещё лучше, сразу завести

Код: Выделить всё
    FDataSize: Integer;
...
    property DataSize: Integer read FDataSize write SetDataSize;
   


Чтобы потом в Create:

Код: Выделить всё
constructor TMatrix.Create(const Rows, Cols: Word);
begin                               
  if Rows = 0 then Error(SRowIndexError, Rows);
  if Cols = 0 then Error(SRowIndexError, Cols);
 
  SetLength(FData, Rows, Cols);

  FDataSize :=  Length(FData) * Length(FData[0]); // Так, чтобы сразу учесть размер элемента

  FillChar(FData, FDataSize), 0);
  FOrigin := 0;
end;
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Математика, но не простая...

Сообщение Дож » 12.05.2014 15:53:52

sign писал(а):Согласен. Это же просто массив.

Нужно вот так:

Код: Выделить всё
  SetLength(FData, Rows, Cols);
  FillChar(FData, Length(FData) * Length(FData[0]), 0);



Т.е. на написанные мною программы Вы не посмотрели? :) Повторюсь: попробуйте скомпилировать и запустить такую программу
Код: Выделить всё
var
  A: array of array of Extended;
  I, J: Integer;
begin
  SetLength(A, 4, 4);
  FillChar(A, 4 * 4 * SizeOf(Extended), 0);
  for I := 0 to 3 do
    for J := 0 to 3 do
      Writeln(A[I, J], ' ');
end.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Математика, но не простая...

Сообщение sign » 12.05.2014 16:14:26

Согласен.

Всё забываю, что это и не просто массив и ещё не из целых.

И вообще, фигню я какую-то написал!

Добавлено спустя 3 минуты 10 секунд:
FillChar - он для целых и для строк!
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Пред.След.

Вернуться в Разработки на нашем сайте

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

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

Рейтинг@Mail.ru