Ошибки PascalABC.NET

Интересно, почему антивирусу так сильно не нравится отладочная информация в программе? с чем это связано?

Трудно сказать. Анализатор - эвристический. Скорее всего ложно находит какую-то сигнатуру.

Надо сказать, что последний AVG под Win 10 тоже выдавал вирусное предупреждение при компиляции, точнее, его часть, которая называется Identity Protection. Вирус был другой - какой-то Aloha.51. У себя я отключаю Identity Protection - другого варианта пока не нашел.

А можно текст программы? Мне пока что ни разу не удалось заставить “Касперского” чем-то возмутиться в среде ABC.NET - он ведет себя крайне культурно.

А у Вас Win 10?

У вашего компилятора явные проблемы с наследованием и интерфейсами Пример 1(компилируется, а не должно):

type
  cellstate = (st1, st2, st3);
  Icell = interface
  property State: cellstate read write;
  end;
  
  Cell = class(Icell)
  end;

begin
end.

Пример 2(Компилятор ругает меня за то что, я хочу неявно привести класс к родителю)

type
  cellstate = (st1,st2,st3);
  Icell = interface
    property State: cellstate read write;
  end;
  
  Cell = class(Icell)
  private 
    _state: cellstate;
  public 
    
    constructor create(_st: cellstate);
    begin
      _state := _st;
    end;
    
    property State: cellstate read _state write _state;
  end;



procedure proc(l: array of Icell);
begin
end;

begin
  var arr: array of cell;
  SetLength(arr, 2);
  proc(arr);
end.

В первом случае согласен - исправим.

Во втором случае - ошибка Program1.pas(27) : Нельзя преобразовать тип array of Cell к array of Icell

Это не проблема наследования. Если B - потомок A, то array of B не является потомком array of A

1 лайк

Нет, у меня WinXP. Вы полагаете, что из-за разницы в уровнях Net.Framework Антивирус Касперского будет работать по-разному? Возможно, конечно…

Я не полагаю - у меня с AVG эта проблема. Под Win 7 он работает нормально, под Win 10 его Identity Protection блокирует PascalABC.NET и создаваемые им exeшники во всех режимах через раз. Поэтому под Win 10 Identity Protection я отключаю.

Нет я с вами не согласен, так как на C# всё работает так как я ожидал:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    enum CellState
    {
    St1,St2,St3
    }
    interface ICell
    {
     CellState State { get; set; }
    }

    class Cell : ICell
    {
        private CellState _State;

      public  Cell(CellState state)
        {
            _State=state;
        }
        public CellState State { get { return _State; } set { _State = value; } }
    }


    class Program
    {
        static void proc(ICell[] arr)
        {
            arr[0].State = CellState.St2;
        }

        static void Main(string[] args)
        {
            Cell[] arr = new Cell[2];
            arr[0] = new Cell(CellState.St3);
            arr[1] = new Cell(CellState.St1);
            proc(arr);
            Console.Write(arr[0].State.ToString());
            Console.ReadKey();
        }
    }
}

Ещё раз повторю, что это не наследование, а дополнительные правила, разрешающие то или иное поведение. В C# это поведение разрешено, в PascalABC.NET - запрещено. Это никак не связано с наследованием - это возможность подстановки одного типа вместо другого с обеспечением корректного поведения. Разные ОО языки по-разному решают этот вопрос.

Так общепризнано, и даже Microsoft сама сообщает, что Identity Protection надлежит использовать лишь до тех пор, пока не будет установлено какое-либо антивирусное средство, а затем его следует отключить.

Вы не поняли - Identity Protection есть в AVG. Вот он родимый и глючит. AVG отключает защиту Windows

Действительно не понял, потому что никогда AVG не пользовался. У меня легальный Kaspersky Endpoint Security 10 для Windows и я в полном щенячьем восторге от того, как он работает. Собственно, с “Каперским” дружу с 1996 года и ни разу еще он меня не подводил, где бы я ни лазил и чего бы на компьютере ни запускал.

Надо будет попробовать. Конечно, 1500 р. в год останавливают…

Начнем с того, что Вы можете скачать триальную версию. Понравится - купите регистрационный ключ. Есть и еще кое что, но я не вижу тут, как писать Приватное сообщение )))

Тут есть пример, что может пойти не так, если разрешить то, что вы просите. Для списков (List<ICell>) ваш пример в C# уже не сработает. Причина в том, что когда писались массивы, эту проблему ещё не понимали. При добавлении generic-коллекций уже учли. А в нашем Паскале сразу учли. Умные потому что.

Хорошая цитата на тему:

C# unexpectedly support covariance for array:

Так что это поведение в C# как раз не является каким-то общепринятым. Наоборот, всем известно, что это плохо, но так сложилось.

2 лайка
type
    t = auto class
        a := 1; 
    end;
    
begin
end.

->

Исправили

Намедни что-то необъяснимое произошло с моим проектом в PABC. Началось все с того, что я дописал кое-какой класс в библиотеку, которая используется в проекте. Добавил обновленную dll в проект. Открыл его, успешно откомпилировал, запустил, вижу:

 Ошибка времени выполнения: GraphABC.GraphABCException: w or h <= 0
 Стек:    at GraphABC.Picture..ctor(Int32 w, Int32 h)    at
 textures.textures..cctor()

Но программа не вылетела. Ок. Нажимаю на контрол (он обращается к одному из объектов библиотеки) дабы проверить работоспособность программы вообще. Вижу:

The type initializer for 'textures.textures' threw an exception.

(textures - динамическая библиотека)

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

Часть вторая. Решил проверить таки библиотеку. Помню, что в последний раз, когда я ее запускал(писал в начале) компилировалась она успешно. Открываю проект с библиотекой, компилирую и вижу ошибку в самом неожиданном месте: компилятор перестал видеть методы из одного из подключенных модулей(модуль мой, не стандартный). Этого модуля я не касался с самого момента его добавления в проект. Описал класс, его использующий, и забыл. Ок. Решил сделать из модуля библиотеку. Добавил, откомпилировал, успешно. Перезагрузил проект, откомпилировал, компилятор снова не видит методы. И теперь он то компилируется успешно, то ругается на неизвестные методы в библиотеке.

Добавлено.

Переустановил PABC. Теперь в основном проекте появилась новая и не менее интересная ошибка и опять же в том месте, где компилятор никогда не замечал ее:

form := (Application.OpenForms.Item[0] as mainForm);

Ошибка: Нельзя преобразовать тип integer к string.

Пробуем

form := (Application.OpenForms.Item['0'] as mainForm);

Компиляция прошла успешно! На всякий случай прикреплю пруф, ибо выглядит это все как бред.

Ну, выложите сюда проект с исходниками в архиве.