LINUX.ORG.RU

Lazarus 1.6.4

 , ,


2

3

Вышла новая версия свободной кроссплатформенной среды разработки на языке Object Pascal. Данная версия собрана при помощи Free Pascal версии 3.0.2 (предыдущая использовала 3.0.0).

Данный релиз является корректирующим.

Lazarus по функциональности сопоставим с некогда популярной проприетарной средой разработки Delphi, однако является кроссплатформенным (поддерживает Windows, GNU/Linux, FreeBSD и macOS).

>>> Подробности



Проверено: Shaman007 ()
Последнее исправление: sudopacman (всего исправлений: 2)

Ответ на: комментарий от Deleted

Однако, давно дело было.

Не знаю, поменял ли Керниган своё мнение с тех пор. Но вот тут, в его новой книге, интересная схемка есть (страница xii): http://www.gopl.io/ch1.pdf

anonymous
()
Ответ на: комментарий от Deleted

Вот до чего мы докатились! Появляются здесь и говорят, что они Паскаля не видели.

Vudod ★★★★★
()
Ответ на: комментарий от Deleted

Большую часть — ещё в TP, часть — в ранних Delphi/FPC (например, разделение задания типу алиаса и создание нового типа на базе существующего).
Паскалевый цикл «for счетчик:= значение to/downto do оператор» остался прежним, но нужно понимать, что это совсем другой цикл, нежели сишный for(;;)

переменная:=начальное_значение; { переменная2:=значение2; ...}
while условие do begin
  оператор; { оператор; ...}
  { изменить: переменная, переменная2, ...}
end;

bormant ★★★★★
()
Ответ на: комментарий от Deleted

Ясно. Отвечаем: большинство описанных Керниганом в 81-м году проблем пофикшено ещё в турбо-паскале.

Со стороны Вирта эти проблемы были пофикшены в его следующих языках — потомках паскаля. Тоже давно, ещё в 70-х.

anonymous
()
Ответ на: комментарий от bormant

Он и на тот момент не самым актуальным был, емнип

grem ★★★★★
()
Ответ на: комментарий от bormant

Паскалевый цикл «for счетчик:= значение to/downto do оператор» остался прежним

Он в той бумаге и не отмечается как проблемный.

Deleted
()
Ответ на: комментарий от Deleted

Паскалевый цикл «for счетчик:= значение to/downto do оператор» остался прежним

Он в той бумаге и не отмечается как проблемный.

См. стр.10:

The increment of a for loop can only be +1 or -1, a minor restriction.

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 1)
Ответ на: комментарий от bormant

А, точно, было мельком упомянуто.

Deleted
()
Ответ на: комментарий от anonymous

Мне, пожалуйста, книгу о шахматах - Абрам Яковлевич Ройзман «400 партий-миниатюр».... :-)

anonymous
()
Ответ на: комментарий от anonymous

А ещё была структурная и именная (не)совместимость типов. Вовремя пофикшена.

iZEN ★★★★★
()

А кто-нибудь из присутствующих кросс-компилит в линуксовом лазарусе для винды? Какие-нибудь предварительные телодвижения для этого нужно совершать, кроме, собственно, установки fpc и лазаруса?

Хочется вспомнить молодость, поностальгировать. Ну и увидеть чудо: нажал кнопку «компилять» в линуксе, взял полученный бинарь, отнёс на винду — а там всё работает.

anonymous
()
Ответ на: комментарий от NextGenenration

интересно, какой смысл развивать среду для этого языка? Почему не взять что-то популярнее?

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

Steplton ★★★★★
()
Ответ на: комментарий от Steplton

Подкину задачку.

Есть массив чисел с плавающей точкой. Он может быть пустым.

Задача. 1) Наглядно показать в программе, как на FPC минимальными средствами можно обработать массив, вычислив, к примеру, среднее арифметическое элементов массива, и допустив возможность использования кода в других программах, в том числе возможность написания новых обработчиков элементов массива; 2) Обрабатывать и дать возможность другим обрабатывать исключения в случае «неправильного» или пустого массива, элементы которого по некоторым причинам не поддаются обработке. 3) Обеспечить расширяемый вывод информации о массиве и результатах его обработки; для начала - в стандартное устройство вывода (текстовую консоль).

Пример вывода результатов работы программы в консоль:

Среднее значение элементов массива [1.0, 2.0, 3.0, 4.0] = 2.5
Среднее значение элементов массива [] = Массив пуст!

iZEN ★★★★★
()
Последнее исправление: iZEN (всего исправлений: 4)
Ответ на: комментарий от iZEN

Задачка не ясна, условие неполно.

function Avg(const a: array of Double): Double;
var t: Double;
begin
  Result:=0;
  for t in a do Result+=t/Length(a);
end;

function Avg(const a: array of Double; n: Integer): Double;
var j: Integer;
begin
  Result:=0;
  for j:=0 to n-1 do Result+=a[j]/n;
end;

bormant ★★★★★
()
Ответ на: комментарий от bormant

Здесь отдельные функции. А надо предоставить текст законченной программы, выполняющей три требования. Неужели так трудно?

iZEN ★★★★★
()
Ответ на: комментарий от iZEN
{$mode ObjFPC}
uses v;
var a: TDblArr;
begin
  if vRead(a,input) then begin
    Write('Среднее значение элементов массива ');
    vWrite(a,output);
    Write(' = ');
    try
      WriteLn(vAvg(a):0:1);
    except
      WriteLn('Массив пуст!')
    end;
  end;
end.


{$mode ObjFPC}
unit v;

interface

uses SysUtils;

type TDblArr = array of Double;

function  vAvg(const a: TDblArr): Double;
procedure vWrite(const a: TDblArr; var f: Text; const d: Integer = 1);
function  vRead(var a: TDblArr; var f: Text): Boolean;

implementation

function  vAvg(const a: TDblArr): Double;
var t: Double;
begin
  Result:=0;
  if Length(a)=0 then
    raise EDivByZero.Create('vAvg: empty vector');
  for t in a do Result+=t;
  Result/=Length(a);
end;

procedure vWrite(const a: TDblArr; var f: Text; const d: Integer = 1);
var i: Integer;
begin
  Write(f,'[');
  if Length(a)>0 then Write(f,a[0]:0:d);
  for i:=1 to Length(a)-1 do Write(f,' ',a[i]:0:d);
  Write(f,']');
end;

function  vRead(var a: TDblArr; var f: Text): Boolean;
var n: Integer;
begin {$I-}
  Result:=False;
  Read(f,n); SetLength(a,n);
  for n:=0 to n-1 do Read(f,a[n]);
  if IOResult<>0 then begin
    SetLength(a,0); Exit;
  end;
  Result:=True;
end;

end.

bormant ★★★★★
()
Ответ на: комментарий от quickquest

класс, помню такую штуку писал на Делфи когда Пентиум/Целерон вышли.

Vlad-76 ★★★★
()
Ответ на: комментарий от bormant

Сравните

на Java:

/** Исключение на обработку пустого массива */
public class EmptyArrayException extends Exception {
    public EmptyArrayException() {
        super("Массив пуст!");
    }
}
/** Функциональный интерфейс с методом обработки, способным бросать исключение */
public interface NumericArrayFunc {
    public double func(double [] n) throws EmptyArrayException;
}
/** Функциональный интерфейс с методом, формирующим отображение массива в строке */
public interface StringImageNumericArray {
    public String getImage(double[] n);
}
/** Основная программа демонстрации операций с массивами */
public class ArrayOperationDemo {

    //Утилита формирования результата
    static String printResults(StringImageNumericArray im, NumericArrayFunc naf, double [] m) {
        String result = "Среднее значение элементов массива " + im.getImage(m) + " = ";
        try {
            result += naf.func(m);
        } catch (EmptyArrayException e) {
            result += e.getMessage();
        }
        return result;
    }

    public static void main(String [] args) {

        //Тестовые данные
        final double [] values1 = {1.0, 2.0, 3.0, 4.0};
        final double [] values2 = {-11.0, 4, -562.0, 3.0, 400.0};
        final double [] empty = {};

        //Способ отображения массива
        StringImageNumericArray image = a -> {
            String shape = "[";
            for(int i = 0; i < a.length-1; i++)
                shape += a[i] + ", ";
            if(a.length > 0)
                shape += a[a.length-1];
            return shape + "]";
        };

        //Способ обработки (в данном случае - вычисления среднего значения) элементов массива
        NumericArrayFunc average = n -> {
            double sum = 0;
            if(n.length == 0)
                throw new EmptyArrayException();
            for (double aN : n) sum += aN;
            return sum / n.length;
        };

        //Вывод результата
        System.out.println(printResults(image, average, values1));
        System.out.println(printResults(image, average, values2));
        System.out.println(printResults(image, average, empty));
    }
    /* Результат выполнения
     Среднее значение элементов массива [1.0, 2.0, 3.0, 4.0] = 2.5
     Среднее значение элементов массива [-11.0, 4.0, -562.0, 3.0, 400.0] = -33.2
     Среднее значение элементов массива [] = Массив пуст!
     */
}

iZEN ★★★★★
()
Ответ на: комментарий от bormant

Про интерактивный ввод информации в техническом задании ничего нет. Не надо выдумывать отсебятину.

iZEN ★★★★★
()

А мне и BASIC нравится...:-)

anonymous
()
Ответ на: Сравните от iZEN

И чем это получилось лучше? Такой же громоздкий код. При желании и в fpc (objfpc) можно классов насоздавать.

И где

обрабатывать исключения в случае «неправильного» ... массива

grem ★★★★★
()
Последнее исправление: grem (всего исправлений: 2)
Ответ на: Сравните от iZEN

К слову, вашему коду ближе вот такой вариант:

{$mode ObjFPC}{$H+}
uses SysUtils;
type
  TDblArr = array of Double;
  NumericArrayFunc = function (const a: TDblArr): Double;
  StringImageNumericArray = function (const a: TDblArr): String;
  EEmptyArray = class(Exception); //Исключение на обработку пустого массива

//Утилита формирования результата
function PrintResults(im: StringImageNumericArray; naf: NumericArrayFunc; m: TDblArr): String;
begin
  Result:='Среднее значение элементов массива ' + im(m) + ' = ';
  try
    Result+=FloatToStr(naf(m));
  except
    on e: EEmptyArray do
      Result+=e.Message;
  end;
end;

//Способ обработки (в данном случае - вычисления среднего значения) элементов массива
function daAverage(const a: TDblArr): Double;
var t: Double;
begin
  Result:=0;
  if Length(a)=0 then
    raise EEmptyArray.Create('Массив пуст!');
  for t in a do Result+=t;
  Result/=Length(a);
end;

//Способ отображения массива
function daImage(const a: TDblArr): String;
var i: Integer;
begin
  Result:='[';
  if Length(a)>0 then Result+=FloatToStr(a[Low(a)]);
  for i:=Low(a)+1 to High(a) do Result+=', '+FloatToStr(a[i]);
  Result+=']';
end;

var values1, values2, empty: TDblArr;
begin
  DecimalSeparator:='.';
  //Тестовые данные
  values1:=TDblArr.Create(1, 2, 3, 4);
  values2:=TDblArr.Create(-11, 4, -562, 3, 400);
  //Вывод результата
  WriteLn(PrintResults(@daImage,@daAverage,values1));
  WriteLn(PrintResults(@daImage,@daAverage,values2));
  WriteLn(PrintResults(@daImage,@daAverage,empty));
end.
Если и сравнивать, то его.

Можно, безусловно, daImage и daAverage обернуть в классы, но тут это явно лишнее.

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 1)
Ответ на: комментарий от bormant

Получите

Ввод значений элементов массива из стандартного потока:

import java.util.Locale;
import java.util.Scanner;

public class ArrayInputFromStdIn {

    public static double [] interactiveBuildDoubleArray() {

        int arraysize = 0;

        Scanner coin = new Scanner(System.in);
        coin.useLocale(Locale.ENGLISH);//Точка вместо десятичной запятой

        System.out.print("Введите размер массива: ");
        while(coin.hasNext()) {
            //System.out.println("Попытка ввода размера.");
            if(coin.hasNextInt()) {
                arraysize = coin.nextInt();
                System.out.printf("Размер массива %s элементов.\n", arraysize);
                break;
            } else {
                String str = coin.next();
                System.out.println("Ошибочный формат значения. Повторите ввод размера массива.");
            }
        }
        double [] n = new double [arraysize];

        System.out.printf("Создан массив из %s элементов.\n", n.length);

        int count = 0;
        //coin.useDelimiter(", ");
        System.out.println("Введите значения элементов массива в строку через пробел или по одному:");
        while(coin.hasNext()) {
            System.out.printf("Ввод значения элемента [%s]. ", count);
            if(coin.hasNextDouble()) {
                double k = coin.nextDouble();
                n[count] = k;
                System.out.printf("Элемент [%s] = %s записан.\n", count, n[count]);
                count++;
            } else {
                System.out.println("Нераспознанный формат. Повторите ввод последнего значения.");
                String str = coin.next();
            }
            if (count > n.length-1) break;
        }
        return n;
    }

    /** Тестовая процедура */
    public static void main(String [] args) {
        double [] a = interactiveBuildDoubleArray();
        double sum = 0.0;
        for(double x : a) { sum += x; }
        System.out.println("Среднее значение = " + sum / a.length);
    }
}
Изменённая программа:
/** Основная программа демонстрации операций с массивами */
public class ArrayOperationDemo {

    //Утилита формирования результата
    static String printResults(StringImageNumericArray im, NumericArrayFunc naf, double [] m) {
        String result = "Среднее значение элементов массива " + im.getImage(m) + " = ";
        try {
            result += naf.func(m);
        } catch (EmptyArrayException e) {
            result += e.getMessage();
        }
        return result;
    }

    public static void main(String [] args) {

        //Тестовые данные
        final double [] values1 = {1.0, 2.0, 3.0, 4.0};
        final double [] values2 = {-11.0, 4, -562.0, 3.0, 400.0};
        final double [] empty = {};
        final double [] values3 = ArrayInputFromStdIn.interactiveBuildDoubleArray();

        //Способ отображения массива
        StringImageNumericArray image = a -> {
            String shape = "[";
            for(int i = 0; i < a.length-1; i++)
                shape += a[i] + ", ";
            if(a.length > 0)
                shape += a[a.length-1];
            return shape + "]";
        };

        //Способ обработки (в данном случае - вычисления среднего значения) элементов массива
        NumericArrayFunc average = n -> {
            double sum = 0;
            if(n.length == 0)
                throw new EmptyArrayException();
            for (double aN : n) sum += aN;
            return sum / n.length;
        };

        //Вывод результата
        System.out.println(printResults(image, average, values1));
        System.out.println(printResults(image, average, values2));
        System.out.println(printResults(image, average, empty));
        System.out.println(printResults(image, average, values3));
    }
    /* Результат выполнения
Введите размер массива: 4
Размер массива 4 элементов.
Создан массив из 4 элементов.
Введите значения элементов массива в строку через пробел или по одному:
56
Ввод значения элемента [0]. Элемент [0] = 56.0 записан.
-38.4 16.982
Ввод значения элемента [1]. Элемент [1] = -38.4 записан.
Ввод значения элемента [2]. Элемент [2] = 16.982 записан.
хренотень
Ввод значения элемента [3]. Нераспознанный формат. Повторите ввод последнего значения.
45.782
Ввод значения элемента [3]. Элемент [3] = 45.782 записан.
Среднее значение элементов массива [1.0, 2.0, 3.0, 4.0] = 2.5
Среднее значение элементов массива [-11.0, 4.0, -562.0, 3.0, 400.0] = -33.2
Среднее значение элементов массива [] = Массив пуст!
Среднее значение элементов массива [56.0, -38.4, 16.982, 45.782] = 20.091
     */
}

iZEN ★★★★★
()
Последнее исправление: iZEN (всего исправлений: 1)
Ответ на: комментарий от grem

И где

обрабатывать исключения в случае «неправильного» ... массива

В данном случае обработка исключения лежит на пользователе функциональных интерфейсов. Также пользователь должен написать свои обработчики данных массивов и вывода на экран. Я лишь предоставил ему такую возможность и сделал примеры кода. ;)

iZEN ★★★★★
()
Ответ на: комментарий от grem

Смотря какие классы и что они из себя представляют.

Вот, кстати, видеолекция про ООП с альтернативным взглядом на положение дел: «Егор Бугаенко — Объектно-ориентированное вранье»: https://www.youtube.com/watch?v=lfdAwl3-X_c

И обсуждение этой же темы на прошедшей конференции в Киеве (автор, Егор Бугаенко, является непосредственным участником дискуссии): «JavaDay Kyiv 2016: Trial by combat for OOP honor (Y. Bugayenko, E. Borisov, B. Sadogursky)»: https://www.youtube.com/watch?v=AshxbePAbCM

Кто чего думает?

iZEN ★★★★★
()
Ответ на: комментарий от Inshallah

Ответ на комментарий:

по-моему у нас пока не запрещено называть что-то говном, тем более с аргументами.

Я тут где-то год назад объяснял почему Firefox под Android мне не нравится и предпочитаю использовать Opara Mini. Так у местных адептов швабодки пердаки поразрывало, пришла уборщица лет сорока и поудаляла мои комментарии с конца, из-за чего меня выкинуло из толксов. Лол, мужику лет 40, а бомбит как у прыщешкольника. Зачем вы трёте с конца?

#t13283937

anonymous
()
Ответ на: комментарий от navrocky

Вернуть эту локальную функцию с забинденными переменными можно?

utf8nowhere ★★★
()
Ответ на: комментарий от anonymous

Мне, например, приятно видеть приложение с полноценным гуём, которое полноценно работает с базой данных и жрёт при этом АЖ 8 мб оперативки

Ты из тех, кто любит с DOS stub шаманить, чтобы уменьшить размер файла на 20 байт?

utf8nowhere ★★★
()
Ответ на: комментарий от Pinkbyte

На фоне жырнотулкитов - вполне себе.

.so шарятся между процессами, так что пофиг.

utf8nowhere ★★★
()
Ответ на: комментарий от anonymous

в C тоже нет прямой связи. Что будет если return не вызван?

Flowing off the end of a function is equivalent to a return with no value; this results in undefined behavior in a value-returning function.

utf8nowhere ★★★
()
Ответ на: комментарий от anonymous

Сишный return - это вообще преступление. Сколько багов с утечкой ресурсов он породил

У тебя все выделенные в функции ресурсы в ней же и освобождаются?

utf8nowhere ★★★
()
Ответ на: комментарий от anonymous

В моей домашней библиотеке есть книга:

К. Боон. Паскаль для всех. Пер с голл. В. С. Макарова. Москва, Энергоатомиздат, 1988. С рисунками. 190 страниц.

А в моей есть:

Джермейн К.Б. Программирование на IBM/360.

utf8nowhere ★★★
()
19 мая 2017 г.
Ответ на: комментарий от anonymous

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

виртовские языки и юникс — это оберон против инферно, PL/I и Multics против BCPL и юникса, ога :-)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.