Помощь новичкам


#1834

Мы не какой-то абстрактный параметр передаем, а ссылку. Если ее не передать, назад ничего не получишь.


#1835

Вот это не понял… Побочные эффекты не являются нормой сегодня. Передачу параметров в/из процедуры нельзя считать побочным эффектом: как может быть побочным эффект, описанный в техзадании? Вот если бы из процедуры глобальные переменные меняли – то да. Но в этом случае о чистоте говорить уже не приходится…


#1836

По определению термина “побочный эффект”. Изначально он был придуман для функций, которые кроме результирующего значения могли менять значения своих параметров, но был определен именно как изменение значения параметра, заданного при входе в программную единицу. Т.е. параметр передавал подпрограмме какое-то значение, но при этом сам мог измениться. Поэтому получается, что любой read-write параметр фактически использует побочный эффект. Только у процедур его не называют таковым. Но ведь мы знаем языки, в которых нет процедур, только функции, поскольку любая из них всегда возвращает некоторое значение. И что, там нельзя говорить о побочном эффекте?


#1837

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

Наверное, правильнее говорить, что побочный эффект подпрограммы состоит в дополнительном, не предусмотренном её интерфейсом изменении глобального состояния программы. В противном случае и вызов var y := sin(x) можно окрестить “побочным эффектом” на том основании, что ведь y изменилась…

Что касается функциональных языков, то там чистота функций часто прописана прямо в катехизисе :slight_smile: Так что говорить о побочном эффекте можно, но сделать его нельзя (неположено!) :slight_smile:


#1838

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

В принципе, да.


#1839

Добрый день. Занимаюсь разработкой программы, которая считывает из XML листа определенный список файлов и создает установочный каталог. Пользователь сам решает, что будет устанавливать, а что ему не нужно. Так вот, интерфейс я разработал, но столкнулся с трудностью. Пользователь отмечает нужные файлы в чекбоксе, после чего нажимает кнопку установить. Так вот, столкнулся с трудностью, как составить список файлов, в которых пользователь отметил установку, все это происходит в процессе реального времени и файлов может быть очень много. Есть у кого идеи, заранее спасибо. Вот часть кода

uses
  System.Windows.Forms, System, System.Management, System.Diagnostics, System.Drawing, System.IO, System.Net, System.Xml;

type
  mode = class (GroupBox)
  private 
    form2: form;
    
    procedure clickmouse(sender: object; e: EventArgs);
    begin
      form2.Close;
    end;
    
    procedure pictureBox_Click(sender: object; e: EventArgs);
    begin
      var pic := sender as pictureBox;
      var picbox := new PictureBox;
      picbox.Image := pic.Image;
      var sz := new System.Drawing.Size(1280, 720);
      form2 := new Form;
      form2.size := sz;
      form2.Controls.Add(picbox);
      picbox.SizeMode := PictureBoxSizeMode.StretchImage;
      picbox.Size := sz;
      form2.FormBorderStyle := system.Windows.Forms.FormBorderStyle.Fixed3D;
      form2.MaximizeBox := false;
      picbox.Click += clickmouse;
      var t := new ToolTip;
      t.SetToolTip(picbox, 'Щелкните, что бы скрыть увеличение');
      form2.ShowDialog;
    end;
    
    procedure CBCheckedChanged(sender: object; e: EventArgs);
    begin  
      
    end;
  
  public 
    constructor create(r: system.Drawing.size; name, txt, path: string);
    begin
      var pic := new PictureBox;
      self.Size := r;
      self.Text := ' ' + name.ToUpper;
      pic.Location := new Point(10, 19);
      pic.Size := new System.Drawing.Size(240, round(240 * 9 / 16));
      pic.Load(path);
      pic.SizeMode := PictureBoxSizeMode.StretchImage;
      var l := new &Label;
      l.Location := new Point(270, 19);
      l.Width := self.Width - 280;
      l.Height := self.Height - 55;
      l.Text := txt;
      l.SendToBack;
      pic.Click += pictureBox_Click;
      self.Controls.Add(pic);
      self.Controls.Add(l);
      var t := new ToolTip;
      t.SetToolTip(pic, 'Щелкните для увеличения изображения');
      var cb := new CheckBox;
      cb.Text := 'Установить';
      cb.Checked := false;
      cb.AutoSize := true;
      cb.Location := new Point(self.Width - cb.Width - 10, self.Height - cb.Height - 10);
      cb.BringToFront;
      cb.CheckedChanged += CBCheckedChanged;
      self.Controls.Add(cb);
    end;
  end;

begin
  var Forma := new Form;
  forma.Size := new Size(800, 600);
  var ds := new System.Xml.XmlDocument;
  ds.Load(ExtractFilePath(GetEXEFileName) + 'file.xml');
  var Rs := ds.LastChild;
  var tb := new tabcontrol;
  forma.Controls.Add(tb);
  tb.Size := new Size(forma.Width - 15, forma.Height - 10);
  tb.Location := new point(0, 0);
  tb.AutoSize := true;
  foreach var category: xmlelement in rs do 
  begin
    var v := new TabPage(category.Name);
    v.AutoScroll := true;
    var nr := 10;
    foreach var modlist: xmlelement in category do 
    begin
      var m := new mode(new System.Drawing.Size(740, 165), modlist.Name, modlist['description'].InnerText, modlist['image'].InnerText);
      m.Location := new Point(10, nr);
      nr += 175;
      v.Controls.Add(m);
    end;
    tb.Controls.Add(v);
  end;
  Application.Run(Forma);
end.

#1840

Не понимаю, что тут происходит, ввожу три числа, ждет еще ввода. Ввожу еще одно, это число попадает в индекс максимального при выводе результата. Ерунда какая-то.

begin
  ReadSeqInteger(3).Numerate.MaxBy(x -> x[0]).Println;
end.

#1841

#1815

Хотя ваши симптомы не очень совпадают.

P.S. А, ну да…

.MaxBy(x -> x[0])

Вы же индексы а не числа сравниваете. Надо [1]. В итоге, у вас просто скипает первое введённое число, из за той issue, а остальное ваша ошибка.

Всегда когда не уверены каким элементов кортежа будет индекс - наводите мышку на .Numerate, там всё видно.


#1842

Да, там ошибка, надо .MaxBy(x->x[1]) Но ничего не меняется, все так же, первый элемент не учитывается.


#1843

Внимательно прочитайте мой ответ.


#1844

Похоже, ерунда происходит. Первое введенное значение в MaxBy не учитывается для недетерминированных последовательностей. %D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5


#1845
uses Graph3D;
 
begin
  Graph3D.View3D.ShowGridLines := false;
  
  var SideA := Polygon3D(Arr(
    P3D(3,0,1),
    P3D(3,0,2),
    P3D(1,0,2),
    P3D(1,0,3),
    P3D(3,0,3),
    P3D(3,0,4),
    P3D(0,0,4),
    P3D(0,0,1)
  ));
  var SideB := SideA.Clone;
  SideB.MoveOn(0,1,0);
  
  var g := new Group3D(1.5,0.5,2.5, Arr&<Object3D>(SideA, SideB));
  g.AnimScale(2).AutoReverse.Forever.Begin;
end.

Это нормально что этот код не работает, выдавая какую то внутреннюю ошибку?

Graph3D.pas(375) : Ошибка времени выполнения: Вызывающий поток не может получить доступ к данному объекту, так как владельцем этого объекта является другой поток.


#1846

Нормально. Пишите так:

  var g := Group(SideA, SideB);

Group3D - это сервисный класс, в прикладном коде не должны конструироваться его объекты


#1848

Почему False для строк ‘n’ и ‘N’?

begin
  var a: array of string := ('n', 'N', 'not', 'Not');
  var s: set of string := ['n', 'N', 'not', 'Not'];
  foreach var x in a do
    Print(x in s) // False False True True 
end.

#1849

Это так же ломает и in, потому что к char пытается применить сравнение строк.


#1850

Похоже, дыра. Поскольку:

begin
  var a: array of string := ('n', 'N', 'not', 'Not');
  var ss:=Seq&<string>('n', 'N', 'not', 'Not');
  var s1:=HSet(ss);
  foreach var x in a do
    Print(x in s1); // True True True True 
  Println;
  var s2:set of string;
  foreach var x in ss do
    Include(s2,x);
  foreach var x in a do
    Print(x in s2); // True True True True  
end.

#1851

Вообще, конечно, Н.Вирт со своим стремлением к академичности натворил при создании Паскаля дел, которые расхлебывать совсем непросто. Самое забавное, что он потом это сам признал, создавая на базе Паскаля языки семейства Модула (которые тоже признал не сильно удачными), а на базе Модула он создал Оберон. Наблюдать за этими исканиями в историческом аспекте весьма интересно.

В Модула Н.Вирт убрал оператор GOTO, цикл FOR (!), перечислимые и диапазонные типы данных, записи с вариантами, а нижнюю границу индекса массива зафиксировал нулем, как в языках семейства С. В операторах языка исчез BEGIN, но зато стал обязательным END. Потом Н.Вирт “одумался” и в язык Оберон-2 оператор цикла FOR был с триумфом возвращен, причем с факультативным довеском BY, позволяющим определять шаг изменения управляющей переменной.

И, наконец-то, была устранена противная путаница символов и строк. Что мы имеем в языке Паскаль? В выражении ‘123’ + ‘4’ + ‘56’ что такое ‘4’ - строка длиной один символ или просто символ? Символ. А если по синтаксису требуется именно строка? В Оберон было принято простое, пусть не лучшее решение: одиночные символы нужны редко и поэтому имеют вид шестнадцатиричных констант, а все, что записывается в одиночных или парных апострофах - это строки. Другое (и превосходное!) решение принято в С# - ограничители разного вида для символов и строк.


#1852

Интересный текст, но какое отношение он имеет к теме?)))


#1853

А вдруг даст повод задуматься о том, отчего возникает часть проблем и ошибок? Отвратит от идеи лишний раз использовать односимвольные строки. Ну а нет - администрация решит сама, куда его девать.


#1854
uses Graph3D;
 
begin
  Graph3D.View3D.ShowGridLines := false;
  
  var SideA := Polygon3D(Arr(
    P3D(3,0,1),
    P3D(3,0,2),
    P3D(1,0,2),
    P3D(1,0,3),
    P3D(3,0,3),
    P3D(3,0,4),
    P3D(0,0,4),
    P3D(0,0,1)
  ));
  var SideB := SideA.Clone;
  SideB.MoveOn(0,1,0);
  
  SideA.Color := GColor.FromArgb(255,255,0,0);
  SideB.Color := GColor.FromArgb(255,0,255,0);
  
  Group(SideA, SideB).AnimScale(2).AutoReverse.Forever.Begin;
end.

Этот код меняет только цвет линий. А как можно закрасить многоугольники? И есть ли вообще такое в Graph3D?

Вообще, обычно в 3D графике Polyline это сами линии, а Polygon это залитая фигура.