Ленивые вычисления в PascalABC.NET

У меня вот такая программа работает:

begin
  WriteLines('a.pas',Seq('aaa','bbb','ccc'));
  var q := ReadLines('a.pas');
  q.Println(NewLine);
  writeln('*'*10);
  q.Println(NewLine);
  WriteLines('a.pas',Seq('aaa','bbb','ccc'));
end.

По идее, файл должен закрываться. Плохо, что Вы не публикуете исходники. Вдруг это Photoshop? :wink: ))

1 лайк

Виноват, текст упустил приложить. Вот, исправляюсь.

// PascalABC.NET 3.1, сборка 1204 от 24.03.2016
begin
  var a:=Arr('Это строка №1','Это строка №2');
  WriteLines('H:\PABCWork.NET\data.txt',a.Println(NewLine));
  Writeln('*'*10);
  var b:=ReadLines('H:\PABCWork.NET\data.txt');
  b.Println(NewLine); 
  Writeln('*'*10);
  b.Println(NewLine); 
end.

И даже еще одну “фотошопу” могу показать

Кстати, Ваша программа у меня выдает аналогичную ошибку. Возможно, это проявляется именно под Windows XP? К сожалению, у меня нет другой операционной системы.

PascalABCCompiler.Core v3.1.0.1204 (24.03.2016), debug version
Runtime version: 4.0.30319.1
OS version: Microsoft Windows NT 5.1.2600 Service Pack 3
Processor count: 2
WorkingSet: 86524 kb

Запуск без оболочки из исполняемого файла, созданного “со снятыми птичками” в опциях компилятора также дает ошибку.

Понятно. Ваша программа у меня работает нормально. И должна вообщем-то.

А не можете попробовать на другом компьютере с Win7 или выше?

Ощущение, что это .NET 4.0 виновата - в .NET 4.5 и выше всё будет ОК. Но это лишь версия.

Еще попробуйте напрямую вызывать метод

System.IO.File.ReadLines(path,en) и симметричный WriteLines.

Ещё попробуйте поисключать строчки - какой минимальный набор строк дает исключение? Вот этот даёт?

var b:=ReadLines('H:\PABCWork.NET\data.txt');
  b.Println(NewLine); 
  b.Println(NewLine); 

Увы, у меня только этот компьютер.

По-прежнему та же ошибка.

begin
  var b:=ReadLines('H:\PABCWork.NET\data.txt');
  b.Println(NewLine); 
  b.Println(NewLine); 
end.

Даже такая дает, читающая имеющийся файл.

Понятно. Видимо, дело в .NET 4.0, которая неверно отрабатывает эту ситуацию

Собственно, я прав:

“I know this is old, but i actually just ran into this while working on some code on a Windows 7 machine. Contrary to what people were saying here, this actually was a bug. See this link. So the easy fix is to update your .net framefork. I thought this was worth updating since this was the top search result.”

1 лайк

Да. Но тогда надо или как-то это поправлять, или делать оговорку, что файловые операции в Windows XP полноценно не поддерживаются. Потому что, если правильно помню, о системе PascalABC.NET где-то там говорится, что она совместима со всеми Windows, начиная с XP.

Мы не можем говорить о багах во фреимворках в документации по языку. А потом, если Вы обратили внимание, некторые говорили, что это не баг и надо создавать другой ReadLines, а потом это поведение изменили.

Зачем обсуждать фреймворки? Фреймворк 4.0 соответствует уровню WinXP. Фреймворк 4.5 на ХР не становится. Пользователю компилятора все равно, почему не работает программа - виноват ли тут компилятор, операционная система или какой-то третий компонент. Но он должен быть предупрежден о том, чего нельзя использовать в языке, если он пользуется той или иной операционной системой со всеми её последними обновлениями. Иначе все равно будут всплывать вопросы.

В данном конкретном случае мне пришлось сохранять результат в массиве через .ToArray, чтобы исключить возможность повторно обращаться к файлу. Но ведь мы помним, что не все объекты горят желанием превратиться в массив…

Ну, я бы Вам предложил конечно установить .NET 4.5. Я ж всегда предлагаю скачать новую версию :smile:

Была у нас конечно идея перейти на .NET 4.5 и порубить всех пользователей Windows XP. Это неизбежно произойдёт рано или поздно.

А “семерку” я не могу поставить, потому что в ней нет нормальных драйверов для моего железа. А заменить все это железо - это заменить системный блок, который для имеющегося функционала обойдется примерно в 95-100 тыс рублей при сегодняшнем уровне цен. Дороговато за PascalABC.NET

Сложно всё…