Ошибки PascalABC.NET

Ошибочка в Aggregate

const
  n = 2;

begin
  var r := Range(1, 3);
  r.Println;
  
  var p := 0;
  foreach var x in r do
    p += n * x;
  Println(p);
  
  var s := r.Aggregate((s, x) -> s + n * x);
  Println(s);
end.

выдает

1 2 3
12 
11

хотя сумы должны быть равными если убрать умножение, то ошибки нет

Вы неправильно понимаете, как работает функция Aggregate. s в начале не 0, а первый элемент последовательности.

как же тогда правильно составить код?

Например, r.Select(x -> x *n).Sum.

сравните, как этот код работает в турбо паскале скажите - почему в АБС.НЕТ - иначе :slight_smile:

имеется ввиду не один оператор, а приведенный мною код.

п.с. А вообще можно не заморачиваться - я уже написал код, который делает всё как положено.

Доброго времени суток! У меня возникла проблема. Компилятор пишет: Unit1.Form1.inc(9) : Нельзя преобразовать тип System.Windows.Forms.Button к Button Как это понимать? Файл .inc вообще пишется автоматически. Я не знаю, как там изменять код, и нужно ли его там менять. Главный файл проекта:

uses Unit1;

begin
  System.Windows.Forms.Application.EnableVisualStyles();
  System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false);
  System.Windows.Forms.Application.Run(new Form1)
end.

Файл модуля формы:

Unit Unit1;

interface

uses System, System.Drawing, System.Windows.Forms,FormsABC;

type
  Form1 = class(Form)
    procedure button1_Click(sender: Object; e: EventArgs);
    procedure button2_Click(sender: Object; e: EventArgs);
    procedure button3_Click(sender: Object; e: EventArgs);
  {$region FormDesigner}
  private
    {$resource Unit1.Form1.resources}
    flowLayoutPanel1: FlowLayoutPanel;
    flowLayoutPanel2: FlowLayoutPanel;
    flowLayoutPanel3: FlowLayoutPanel;
    label1: &Label;
    label2: &Label;
    label3: &Label;
    button1: Button;
    label4: &Label;
    button2: Button;
    textBox1: TextBox;
    button3: Button;
    {$include Unit1.Form1.inc}
  {$endregion FormDesigner}
  public
    constructor;
    begin
      InitializeComponent;
    end;
  end;

implementation

procedure Form1.button1_Click(sender: Object; e: EventArgs);
begin
  label4.Text:='Этот студент должен получить';
  textbox1.addline(flowlayoutpanel1.text);
  textbox1.addline(flowlayoutpanel2.text);
  textbox1.addline(flowlayoutpanel3.text);
  button2.Visible:=true;
  button3.Visible:=true;
end;

procedure Form1.button2_Click(sender: Object; e: EventArgs);
begin
  form1.backcolor:=clred;
end;

procedure Form1.button3_Click(sender: Object; e: EventArgs);
begin
  form1.backcolor:=clblue;
end;

end.

Прошу помочь в решении данной проблемы.

Этот прикол наверное из .Net. Скорее всего в подключенных вами библиотеках встречается две разных Button. Потому надо использовать или полные имена типа или придумывать псевдонимы

Подключены FormsABC и System.Windows.Forms. В обоих Button есть, если я про первый правильно помню… Один надо выпилить.

FormsABC - это Вы сами подключили - его нельзя подключать

Вот эта программа зацикливается, хотя FreePascal компилирует так как и должно работать

program RGB_PWM_Mutator;

Procedure Delay_ms(i:Integer); Begin WriteLn('Delay(',i,')'); End;


Type
    Intensity = Byte;

    RGB = Record
        r,g,b:Intensity;
    End;

    Tcol = Record
        color:RGB; Delay:Byte;
    End;

Const
    Col_Sz = 6;

    Col:Array[0 .. Col_Sz] of Tcol = (
        (color:(r:255; g:  0; b:  0); Delay:3), (* 0 *)
        (color:(r:255; g: 30; b:  0); Delay:3), (* 1 *)
        (color:(r:255; g: 70; b:  0); Delay:3), (* 2 *)
        (color:(r:  0; g:  0; b:  0); Delay:3), (* 3 *)
        (color:(r: 51; g:153; b:255); Delay:3), (* 4 *)
        (color:(r:  0; g:  0; b:255); Delay:3), (* 5 *)
        (color:(r:100; g:  0; b:255); Delay:3)  (* 6 *)
    );

(* ------------------------------------------------------------------------- *)
Procedure colorSetHW(color:RGB);
Begin
    With color Do Begin
    End;
End;

(* ------------------------------------------------------------------------- *)
Function mapIntensityTo(cLimit:Intensity; var cIn:Intensity):Boolean;
Begin
    If cIn = cLimit Then mapIntensityTo := False Else Begin
        If cIn < cLimit Then cIn := cIn + 1 Else cIn := cIn - 1;
        mapIntensityTo := True
    End
End;

Function colorMutate(var color:RGB; limit:RGB):Boolean;
Var rFlag, gFlag, bFlag:Boolean;
Begin
Write(color.r,' ', color.g,' ', color.b,' ', '   ');
    rFlag := mapIntensityTo(limit.r, color.r);
    gFlag := mapIntensityTo(limit.g, color.g);
    bFlag := mapIntensityTo(limit.b, color.b);
Write(
    color.r,' = ', limit.r, ' ? ', rFlag,'   ',
    color.g,' = ', limit.g, ' ? ', gFlag,'   ',
    color.b,' = ', limit.b, ' ? ', bFlag,'   ',
'   ');
    colorMutate := rFlag OR gFlag OR bFlag
End;

(* ------------------------------------------------------------------------- *)
Var i:Byte; CurrentColor:RGB = (r:0; g:0; b:0);
Begin
  
    While True Do
    Begin
        For i := 0 To Col_Sz Do (* Main interpretation cycle *)
        Begin  

            While colorMutate(CurrentColor, Col[i].color) Do
            Begin
                colorSetHW(CurrentColor);

                Delay_ms(Col[i].Delay
                    + Col[i].Delay
                    + Col[i].Delay
                    + Col[i].Delay
                    + Col[i].Delay
                );
            End;
Break;

            Delay_ms(3000);
        End;
Break;
    End
End.

проблема в mapIntensityTo которая должна возвращать False для 255 = 255

Действительно странно, такое поведение только с типом byte. если в методе использовать integer, то отрабатывает как положено. Видимо есть какие-то особенности реализации типа byte.

Слегка сокращенный код с локализованной ошибкой.

function F(b1: byte ; var b2: byte):boolean;
begin
  F := b1 = b2;
end;

begin
  var b:byte;
  
  b:= 127;            //Старший разряд = 0
  writeln(F(b, b));   //True - правильно
  
  b:= 128;            //Старший разряд = 1
  writeln(F(b, b));   //False - ошибка
end.

//По версии DotPeek функция выглядит как-то так:
(*
public static bool F(byte b1, ref byte b2)
{
    return (int) (sbyte) b1 == (int) b2;  
}
*)

И вот это преобразование в sbyte портит результат если в старшем разряде единица, то есть для чисел [128-255]

A post was split to a new topic: Вопрос по Windows Forms

2 posts were split to a new topic: System и Random

Исправили

A post was merged into an existing topic: System и Random

Скачал консольный компилятор с сайта, на пустом файле падает с исключением:

Unhandled Exception:
System.IO.FileNotFoundException: Could not load file or assembly 'SyntaxTreeConverters, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies.

Линукс, Моно.

Качал потому, что в какой-то из последних версий в assert'ах перестал отображаться номер строки, где упал ассёрт — может, это проверите заодно. Аналогичная проблема в WDE.

Так консольный компилятор не будете чинить? А то поработать хочется, а не на чем…

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