Ошибки PascalABC.NET

По умолчанию исполняемые файлы удаляются после закрытия приложения. Зачем?

Казалось бы, в настройках можно снять галочки и тем самым избежать удаления исполняемого файла:

Не тут-то было! ИСР всё равно галочки поставит и файл сотрёт.

Если такое поведение ИСР отражает принципиальную позицию разработчиков, то для чего дразнить пользователей нереализованной свободой выбора?

Физически эти настройки хранятся в файле “PascalABCNET.ini” в рабочей папке по-умолчанию (C:\PABCWork.NET). Лично у меня галочка снята, настройки сохраняются, exe-файлы после компиляции остаются.

Проверьте права доступа к этой папке, возможно у процесса PascalABCNET.exe нет прав на изменение этого файла. Попробуйте запустить Паскаль от имени администратора и снимите галочку. Проверьте, не удаляется ли (кем-нибудь) файл настроек.

Спасибо за информацию!

Нашёл файл в рабочей папке, которую задал при установке. Сейчас он обновляется, и все настройки сохраняются. Возможно, проблема в том, что эта папка на разных компьютерах лежит как бы на разных дисках - G и H. Диск, конечно, один и тот же, а буквы разные. Проверю ещё и на втором компьютере…

Доброго времени суток!

Вот пишется у меня программа, в которой надо учитывать некорректный ввод данных с помощью Assert, но окошко, появляющееся для того, чтобы оповестить об этом самом некорректном вводе, находится подо всеми другими открытыми окнами, и получается, что его просто не видно…

begin
  var a, b : integer;
  writeln('Введите a и b');
  read(a, b);
  Assert((a > 0) and (b > 0), 'Числа должны быть положительны!');
  Assert(a >= b);
  while a >= b do
    a := a - b;
  writeln(a);  
end.
2 лайка

Здравствуйте! Дело в том, что при написании программ я сталкиваюсь с такой проблемой: при нажатии комбинации Ctrl+Shift+F нижний комментарий пропадает. Пример ниже:

{проверка работы}
begin
  var a := ReadInteger();
  Writeln(a - 1);
end.
{если набрать комбинацию ctrl+shift+f, то данный комментарий исчезнет}
2 лайка

A post was merged into an existing topic: Замечания и предложения

Program pr2_1;

var

y,a,x,e: real;

begin

writeln(‘Vvedite a,x,e’);

readln(a,x,e);

if (x>-1) and (A<15) then

y:=A/(x+1)

else

if (x<-2) or (A>3) then

y:=A*exp

else

y:=125,4

writeln(y);

end.

Program1.pas(13,7): Встречено ‘,’, а ожидалось ‘;’

помогите

Правильный код:

begin var a, x, e: double;

writeln(‘Введите a,x,e’); readln(a, x, e);

var y: double; if (x > -1) and (a < 15) then y := a / (x + 1) else if (x < -2) or (a > 3) then y := a * e else y := 125.4;

writeln(y); end.

В большинстве ЯП принято разделять целую и дробную часть чисел точкой, а не запятой.

1 лайк

В WDE не работает Assert. Это так и должно быть?

не знаю Ошибка это или нет (прошу пояснить) … замечено что при попытке сделать аналог оператора с# using

uses
  system.IO;

procedure Save2File(fn: string);
begin
    var fs: Stream := new System.IO.FileStream(fn, FileMode.Create, FileAccess.Write, FileShare.Read);
    try 
      fs.WriteByte(0);
    finally 
      if fs <> nil then
        fs.Dispose; //IDisposable
    end;
end;

begin
  Save2File('test');
end.

при просмотре с помощью ILSpy видим следующий код:

	public static void Save2File(string fn)
		{
			Stream stream = new FileStream(fn, FileMode.Create, FileAccess.Write, FileShare.Read);
			try
			{
				stream.WriteByte(0);
				bool flag = true;
				throw new Exception();
			}
			catch (Exception)
			{
				if (stream != null)
				{
					stream.Dispose();
				}
				bool flag;
				if (!flag)
				{
					throw;
				}
			}
		}

хотя вроде должно было получиться:

	public static void Save2File(string fn)
		{
			Stream stream = new FileStream(fn, FileMode.Create, FileAccess.Write, FileShare.Read);
			try
			{
				stream.WriteByte(0);
			}
			finally
			{
				if (stream != null)
				{
					stream.Dispose();
				}
			}
		}

или в идеале :slight_smile:

	public static void Save2File(string fn)
		{
			using (Stream stream = new FileStream(fn, FileMode.Create, FileAccess.Write, FileShare.Read))
			{
				stream.WriteByte(0);
			}
		}

Ну, а в чем ошибка-то?

для чего нужен “лишний код?”

bool flag = true; throw new Exception();

и

bool flag; if (!flag) { throw; }

ну этот код реализует finally

сборка 1052 баг: при переименовании модуля с формой:

если Unit открыт в редакторе, то внутри модуля меняется имя модуля и НЕ меняется имя модуля в {$region FormDesigner}

если Unit НЕ открыт в редакторе, то внутри модуля НЕ меняется имя модуля и меняется имя модуля в {$region FormDesigner}

и ещё при изменении имени формы файлы со старым именем НЕ удаляются

Что я делаю не так? Программа пропускает вторую строковую переменную постоянно http://1drv.ms/1GEtSoT

Для каждой строки пользуйтесь readln

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

Приведите код здесь не в виде картинки, а в виде текста.

Напишите readln(a); readln(b); readln©;

И проверьте

сборка 1052:

uses System.Collections;
type
  Base = class  
    procedure VirtProc; virtual; begin end;
  end;
  Base2 = class(Base)
    procedure VirtProc; override; begin writeln('Derived'); end;
  end; 

  AbsBase = abstract class  
    procedure VirtProc; virtual; begin end;
  end;
  AbsBase2 = class(AbsBase)
    procedure VirtProc; override; begin writeln('Derived'); end; //Ошибка компиляции:Нет метода для переопределения
  end; 

begin
end.