Ошибки PascalABC.NET

Антивирус отключите и проверьте

А что генерируется в папке с Program1.pas? Program1.exe? Мне кажется, надо просто запретить досовские имена в системе. Непонятно, почему в 10-ке их до сих пор не выкинули

https://support.microsoft.com/en-us/help/121007/how-to-disable-8.3-file-name-creation-on-ntfs-partitions

Сообщение перенесено в новую тему: Проблема с Point в PascalABC.NET

пробовал запретить, но ничего не получилось. а в папке генерируется файл с таким текстом: [Common] Version=1.2

[Window] Maximized=0 Width=1206 Height=576 Left=80 Top=64

[View] ShowOutWindow=0 OutWindowHeight=100

[Print] Left=10 Top=15 Right=10 Bottom=15 Header=10 Footer=10 LineNumbers=0 Wrap=1 Highlight=1 Colors=0 HeaderLine=1 HeaderBox=0 HeaderShaded=0 FooterLine=0 FooterBox=0 FooterShaded=0

[Editor] FontSize=10

[Files] File1=G:\Новая папка\программы\матрица.pas

[Assembler] Background=536870911 Foreground=536870911 Style=0 [Character] Background=536870911 Foreground=536870911 Style=0 [Comment] Background=536870911 Foreground=32768 Style=2 [Float] Background=536870911 Foreground=536870911 Style=0 [Hexadecimal] Background=536870911 Foreground=536870911 Style=0 [Identifier] Background=536870911 Foreground=536870911 Style=0 [Number] Background=536870911 Foreground=536870911 Style=0 [Preprocessor] Background=536870911 Foreground=536870911 Style=2 [Reserved Word] Background=536870911 Foreground=-16777190 Style=1 [Space] Background=536870911 Foreground=536870911 Style=0 [String] Background=536870911 Foreground=-16777190 Style=0 [Symbol] Background=536870911 Foreground=536870911 Style=0

О_О это норма? если описывать просто точку то работает норм, а если как статичную переменную записи - сходит с ума

версия 3.2 сборка 1398(07.03.2017)

Неприятно удивил yield вкупе с кортежным присваиванием. По отдельности они работают, а вот вместе…

Вот так все работает (особого смысла в программе прошу не искать - это демонстрационное)

type
  TF=(integer,integer);

function f(a:TF):sequence of integer;
begin
  var p,q:integer;
  p:=a[0]; q:=a[1];
  yield p;
  yield q;
end;

begin
  f((-3,5)).Println
end.

А вот так не компилируется, причем с “убойной” диагностикой ошибки: "неизвестное имя ‘a’ в строке с кортежным присваиванием…

type
  TF=(integer,integer);

function f(a:TF):sequence of integer;
begin
  var p,q:integer;
  (p,q):=a;
  yield p;
  yield q;
end;

begin
  f((-3,5)).Println
end.

Два дня молчания… И вспомнилось мне опять из “Золотого телёнка”…

Остап молча взял европейского гостя за руку, подвел его к висевшему на стене ящику для жалоб и сказал, как глухому: — Сюда! Понимаете? В ящик. Шрайбен, шриб, гешрибен. Писать. Понимаете? Я пишу, ты пишешь, он пишет, она, оно пишет. Понимаете? Мы, вы, они, оне пишут жалобы и кладут в сей ящик. Класть. Глагол класть. Мы, вы, они, оне кладут жалобы… И никто их не вынимает. Вынимать! Я не вынимаю, ты не вынимаешь…

Хочется быть правильно понятым. Я вовсе не топочу копытцами, чтобы “немедля поправили”. Жили с этим - и дальше проживем)). Но хочется понять, что это кто-то просмотрел из тех, “от кого зависит”. И оставил пометку “исправим” или “сам дурак!”. Была бы какая-то определенность. А то, может, так недопустимо писать в программе, а я жду чего-то…

Лучше Вы пишите сразу в Issues. Так правильнее всего. Там гарантированно видят все разработчики и - без соплей.

И - Вы должны понимать, что любая - ЛЮБАЯ - ошибка в компиляторе нами немедленно фиксируется и рано или поздно исправляется.

Но - как приятно читать такие цитаты!

Я напишу, куда скажете и как скажете. Но,… к стыду своему, я не знаю, как туда писать. Готов получить напутствие в личке или тут.

У меня есть несколько “настольных книг”, которые я знаю почти наизусть. Так что, вполне вероятно, это не последняя…)))

Пока про Issues не подсказали, напишу тут.

// PascalABC.NET 3.2, сборка 1417 от 28.03.2017

begin
  (SeqGen(5,i->i)+SeqGen(5,i->i+5)).Println;
  (ArrGen(5,i->i)+ArrGen(5,i->i+5)).Println;
  ((SeqGen(5,i->i).Reverse)+(SeqGen(5,i->i+5).Reverse)).Println;
  //((ArrGen(5,i->i).Reverse)+(ArrGen(5,i->i+5).Reverse)).Println;
end.

Если строку перед end раскомментарить, возникает ошибка компиляции. На мой взгляд, не должна. Есть много аналогичных вариантов возникновения таких ошибок, например, со срезами и т.д., но я думаю, тут причина одна и та же.

P.S. Ошибка не возникает, если после Reverse добавить .Select(i->i)

По крайней мере, в сборке 1427 от 24.04.2017 ошибка уже устранена

В справочный раздел “Методы расширения динамических массивов” влезла вот такая ерунда:

Методы расширения типа array of T
/// Возвращает минимальный элемент 
        oDo Сделать AdjacentGroup с функцией сравнения 
/// Возвращает максинимальный элемент 
        ction Min<T>(Self: array of T): T; extensionmethod; where T: System.IComparable<T>; 
/// Возвращает минимальный элемент 
        ction Max<T>(Self: array of T): T; extensionmethod; where T: System.IComparable<T>; 
/// Возвращает минимальный элемент 
        ction Min(Self: array of integer): integer; extensionmethod; 
/// Возвращает максимальный элемент 
        ction Min(Self: array of real): real; extensionmethod; 
/// Возвращает максимальный элемент 
        ction Max(Self: array of integer): integer; extensionmethod; 

Еще одна ошибка. Вот так не работает:

// PascalABC.NET 3.2, сборка 1417 от 28.03.2017
type
  Point=(real,real);
begin
  var a:Point:=(1.0,2.0)
end.

Выдается ошибка “Program1.pas(5) : Нельзя преобразовать тип ArrayConst к Point<real,real>”

А вот так все нормально:

// PascalABC.NET 3.2, сборка 1417 от 28.03.2017
type
  Point=(real,real);
begin
  var a:Point;
  a:=(1.0,2.0)
end.

Происходит, как будто в первом случае сначала работает конструктор массива, делается попытка автовывода типа, а потом обнаруживается несовместимый с этим автовыводом тип Point.

По крайней мере, в сборке 1427 от 24.04.2017 ошибка уже устранена

Да, поместили в Issues

Сегодня столкнулся с такой проблемой:

Внутренняя ошибка компилятора в модуле [pabcnetc.exe] :‘System.Exception: System.ArgumentNullException: Значение не может быть неопределенным. Имя параметра: key в System.Collections.Generic.Dictionary2.FindEntry(TKey key) в System.Collections.Generic.Dictionary2.ContainsKey(TKey key) в PascalABCCompiler.NETGenerator.ILConverter.ConvertFromTree(IProgramNode p, String TargetFileName, String SourceFileName, CompilerOptions options, String[] ResourceFiles) в PascalABCCompiler.Compiler.Compile()’

Всё было нормально, программу не изменял, Pascal не обновлял. Как будто компилятор сам сломался.

Вы программу приведите, чтобы можно было загрузить её на компьютер и попытаться ситуацию воспроизвести. А то похоже на письмо в конференцию “Помогите, у меня сегодня голова заболела, похоже сама по себе”"

после нажатия shift+F9 запускается командная строка и вылетает ошибка programrunner.exe перестал работать. как исправить

uses crt; const n=10; var a,g: array [1…100] of integer; var b : array [1…100] of string; var m,i,j,x,o,k: integer; var p:array[1…100] of integer; f:boolean; begin randomize; m:=1; p[1]:=1+random(10); write(p[1]:4); for i:=2 to 10 do begin repeat f:=false; x:=1+random(10); for j:=1 to m do if p[j]=x then f:=true; until f=false; p[i]:=x; m:=m+1; end; writeln (‘Ответы вводятся строкой без пробелов. Пример: 12345’); b[1]:=‘1. Общество в широком смысле слова – это ‘+NewLine+ ’ 1) территория обитания людей’+NewLine+ ’ 2) история человечества’+NewLine+ ’ 3) совокупность форм объединения людей’+NewLine+ ’ 4) производительные силы’;

b[2]:= ‘2. Обществознание – это ‘+NewLine+ ’ 1) наука’+NewLine+ ’ 2) учебная дисциплина’+NewLine+ ’ 3) комплекс наук об обществе и человеке’+NewLine+ ’ 4) сфера естественнонаучного знания’+NewLine+ ’ 5) сфера гуманитарного знания’;

b[3]:= ‘3. Человек отличается от животного наличием’+NewLine+ ’ 1) языка’+NewLine+ ’ 2) разума’+NewLine+ ’ 3) сознанием’+NewLine+ ’ 4) трудовой деятельности’+NewLine+ ’ 5) мышления’;

b[4]:= ‘4. Личность возможна (Определить неверный ответ)’+NewLine+ ’ 1) без морали’+NewLine+ ’ 2) без гражданственности’+NewLine+ ’ 3) без ответственности’+NewLine+ ’ 4) без диплома о высшем образовании’;

b[5]:= ‘5. Человек и общество’+NewLine+ ’ 1) человек первичен по отношению к обществу’+NewLine+ ’ 2) общество первично по отношению к человеку’+NewLine+ ’ 3) человек и общество взаимно обусловлены’+NewLine+ ’ 4) общество и человек развиваются независимо друг от друга’;

b[6]:= ‘6. Мораль в религии основывается’+NewLine+ ’ 1) на разуме’+NewLine+ ’ 2) на вере’+NewLine+ ’ 3) на долге’+NewLine+ ’ 4) на свободе’;

b[7]:= ‘7. Целью развитой религии является достижение’+NewLine+ ’ 1) материального благополучия’+NewLine+ ’ 2) социального положения и значимости’+NewLine+ ’ 3) спасение души’+NewLine+ ’ 4) познание мира’+NewLine+ ’ 5) управление силами природы’;

b[8]:= ‘8. К монотеистическим религиям относятся’+NewLine+ ’ 1) индуизм’+NewLine+ ’ 2) ислам’+NewLine+ ’ 3) буддизм’+NewLine+ ’ 4) язычество’;

b[9]:= ‘9. К основным моральным категориям относятся (определить неверный ответ)’+NewLine+ ’ 1) добро’+NewLine+ ’ 2) справедливость’+NewLine+ ’ 3) совесть’+NewLine+ ’ 4) выгода’+NewLine+ ’ 5) любовь’;

b[10]:= ‘10. Мораль проявляется в следовании’+NewLine+ ’ 1) интересам власти’+NewLine+ ’ 2) общественному мнению’+NewLine+ ’ 3) анимизму’+NewLine+ ’ 4) гороскопу’+NewLine+ ’ 5) внутреннему «Я» человека’;

a[1]:=3; a[2]:=23; a[3]:=12345; a[4]:=4; a[5]:=3; a[6]:=2; a[7]:=3; a[8]:=23; a[9]:=4; a[10]:=5;

k:=0; for o:=1 to n do begin i:=p[o]; writeln(b[i]); readln(g[i]); clrscr; if g[i]=a[i] then k:=k+1; end; writeln ('Ваша оценка: ',k/2); end.

  1. Все нормально работает, следовательно проблема конкретно у Вас. Возможные шаги:
  • попробуйте удалить uses Crt и clrscr и запустите обычным путем, а не по Ctrl+F9
  • обновите версию
  • переустановите .NET

Здравствуйте! Не могу решить проблему, прошу помощи.

Имеется модуль RecurWorld, в нём имеется следующая функция LinkMaxChetInList:

function LinkMaxChetInList(l: LinkedList<integer>): LinkedListNode<integer>;
  function LinkMaxChetInListRealization(link, linkMax: LinkedListNode<integer>; max: integer): LinkedListNode<integer>;
  begin
    if link = nil then
    begin
      Result := linkMax;
      exit;
    end;
    
    if (link.Value mod 2 = 0) and (abs(link.Value) >= max) then
      Result := LinkMaxChetInListRealization(link.Next, link, abs(link.Value))
    else
      Result := LinkMaxChetInListRealization(link.Next, linkMax, max);
  end;
begin
  Result := LinkMaxChetInListRealization(l.First, nil, integer.MinValue);
end;

Это рекурсивный алгоритм поиска максимального по модулю чётного числа в списке. Имеется файл, который использует данный модуль и вызывает данную функцию:

uses RecurWorld;

begin
  var a := new LinkedList&<integer>(arr&<integer>(1,2,3)); 
  Writeln(LinkMaxChetInList(a).Value);
end.

Так вот. При компиляции данного файла возникает следующая ошибка:

Внутренняя ошибка компилятора в модуле [pabcnetc.exe] :'System.Exception: System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
   в PascalABCCompiler.NETGenerator.ILConverter.visit(ICommonNestedInFunctionFunctionCallNode value)
   в PascalABCCompiler.NETGenerator.ILConverter.AssignToLocalVariableNode(IExpressionNode to, IExpressionNode from)
   в PascalABCCompiler.NETGenerator.ILConverter.ConvertStatement(IStatementNode value)
   в PascalABCCompiler.NETGenerator.ILConverter.visit(IStatementsListNode value)
   в PascalABCCompiler.NETGenerator.ILConverter.ConvertBody(IStatementNode body)
   в PascalABCCompiler.NETGenerator.ILConverter.ConvertFunctionBody(ICommonFunctionNode func)
   в PascalABCCompiler.NETGenerator.ILConverter.ConvertFunctionsBodies(ICommonFunctionNode[] funcs)
   в PascalABCCompiler.NETGenerator.ILConverter.ConvertFromTree(IProgramNode p, String TargetFileName, String SourceFileName, CompilerOptions options, String[] ResourceFiles)
   в PascalABCCompiler.Compiler.Compile()'

Обновлял .NET и PascalABC.

Вот так работает:

function LinkMaxChetInListRealization(link,linkMax:LinkedListNode<integer>;
    max:integer):LinkedListNode<integer>;
begin
  if link = nil then begin
      Result := linkMax;
      exit
    end;
  if (link.Value mod 2 = 0) and (abs(link.Value) >= max) then
    Result := LinkMaxChetInListRealization(link.Next, link, abs(link.Value))
  else
    Result := LinkMaxChetInListRealization(link.Next, linkMax, max);
end;

function LinkMaxChetInList(l: LinkedList<integer>): LinkedListNode<integer>;
begin
  Result := LinkMaxChetInListRealization(l.First, nil, integer.MinValue);
end;

begin
  var a := new LinkedList&<integer>(arr&<integer>(1,2,3)); 
  Writeln(LinkMaxChetInList(a).Value);
end.

Я не понял, для чего Вы одну функцию объявляете в теле другой. Конечно, компилятор не должен от этого слетать, но все же…

То есть суть проблемы была в том, что я объявил одну функцию в теле другой? Хм. Спасибо за помощь, на будущее учту.