Интересно, почему антивирусу так сильно не нравится отладочная информация в программе? с чем это связано?
Трудно сказать. Анализатор - эвристический. Скорее всего ложно находит какую-то сигнатуру.
Надо сказать, что последний 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
Нет, у меня 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# как раз не является каким-то общепринятым. Наоборот, всем известно, что это плохо, но так сложилось.
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);
Компиляция прошла успешно! На всякий случай прикреплю пруф, ибо выглядит это все как бред.
Ну, выложите сюда проект с исходниками в архиве.