Ошибки PascalABC.NET


#1370

У меня всё работает. Использую следующий код:

{$Reference 'System.Windows.Forms.dll'}
Begin
Var ping := new System.Diagnostics.ProcessStartInfo();
ping.UseShellExecute := false;
ping.RedirectStandardOutput := true;
ping.FileName := 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe';
ping.Arguments := '-target:library -r:System.Threading.dll -r:System.Drawing.dll -r:System.IO.dll -optimize -unsafe -out:ColorRestorer.dll ColorRestorer.cs';
Var process := new System.Diagnostics.Process();
process.StartInfo := ping;
process.Start();
Var output := process.StandardOutput.ReadToEnd();
System.Windows.Forms.MessageBox.Show(output);
process.WaitForExit();
End.

А что именно нужно сделать?


#1371

Вы мой код запустите, мне компилятор C# не нужен сейчас. Нужно - мне пока что ничего, для соседней темы писал программу и увидел что это не работает если запускать обычным F9 а не Shift+F9…


#1372

Я предложил Вам не компилятор, а метод, с помощью которого я его вызывал. Принцип тот-же.

Может объясните наконец, почему нужна привязка к оболочке?


#1373

я писал:


#1374

Undefined FileName(0) : Ошибка при сохранении сборки: Процесс не может получить доступ к файлу, так как этот файл занят другим процессом. (Исключение из HRESULT: 0x80070020)

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

И опять же потому что она Undefined FileName - ужасно мешает.


#1375

Попробую объяснить, почему возникает ошибка. Ваша программа запускает внешнюю программу, перенаправляя его выходной поток в поток Вашей программы. Я не могу точно сказать механизм, но мне кажется что происходит следующее: Вы запускаете программу в режиме связи с оболочкой. Оболочка перехватывает выходной и входной потоки программы, однако выходной поток связан с другим, внешним потоком. Эта цепочка вызывает исключение во внешнем потоке. Либо другой вариант: Программа считывает выходной поток до конца, однако конец не определён, следовательно программа останавливает своё выполнения, ожидая конца потока. При этом обновляя данные. Оболочка влезает в выполнение программы, создавая внешние задержки и воздействуя на выходной поток. Это опять таки приводит к исключению.


#1376

В новой версии 3.3.5.1669 происходит ошибка компиляции шахмат game2.pas

game2.pas(61) : Несколько подпрограмм могут быть вызваны


#1377

#1378

Я ещё обратил внимание, когда смотрел что-то на GitHub, что прошёл коммит ABCPascal.y с изменением в const_variable, где была закомментирована часть с tkRoundOpen const_expr tkRoundClose. Может и не связано, но всё равно непонятно зачем.


#1379

Да, оно даёт конфликт в грамматике


#1380

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


#1381

4 сообщения перенесены в тему Болталка PascalABC.NET


#1382
function f1:byte;
begin
  var p:procedure;
  p := procedure->writeln(Result);
end;

begin end.

В данной версии компилятора не поддерживается замыкание данного типа символов

Тут ошибка в не правильном сообщении об ошибке или в том что эта фича не реализована? Стоит ли вообще разрешать использовать Result более высокого уровня если последняя лямбда - процедура?


#1383

Если в программе есть форматная строка без параметров - анализатор кода и точки сворачивания сломаны во всей программе.

begin
  Writeln($'test');
end.

Это ошибка? И если да, то в том что форматную строку без параметров не даёт делать, или в том что анализатор кода ломается?


#1384

В справке не сказано о количестве аргументов в кортежном присвоении… Т.к. „большие“ кортежи очень редки, то данная тонкость забывается!

begin
  var(a,b,c,d,e,f,g,h):=(1,2,3,4,5,6,7,8);
end.

Такой код выдаст ошибку ;–(


#1385

Пишите какую ошибку выдаёт после кода, пожалуйста.

Возможно кортежи и не должны быть больше 7 элементов, но Undefined FileName это всегда ошибка которую надо исправить.


#1386

Исправили все ошибки с неверными сообщениями в туплах


#1387

В Справке по методу cast приведен такой пример:

begin
  var a: sequence of integer; 
  var b: sequence of real;
  a:=Seq(1,3,5);
  b:=a.Cast&<real>;
end.

Естественно ожидать, что как и описано, мы получим последовательность элементов типа real. Но она какая-то “неправильная”. Во-первых, её не понимает ни Writeln(b), ни b.Println. Во вторых, к ней нельзя применить ни одно расширение типа .Min, First, Sum и т.п. Да и тип у этого b, если отладчиком стать на end и посмотреть в “локальных переменных” - System.Linq.Enumerable+d__95`1[System.Double] - ну очень мало похож на описанный парой строк выше.

Не спешу открывать issue, может, просто что-то я не так понял?


#1388

В описании .NET нашёл, что tuple могут иметь произвольное количество элементов, но если их больше семи, то они представляются как цепочка, связанная через TRest.


#1389

У нас нет. Для этого пользуйтесь типом Tuple<>. И сами стройте такие цепочки