Ошибка при компиляции «Cannot use local variable»

Стартовая страница Форумы Ошибки в работе Ошибки Сервера Ошибка при компиляции «Cannot use local variable»

Просмотр 12 сообщений - с 1 по 12 (из 12 всего)
  • Автор
    Сообщения
  • #40852
    vg
    Участник

    Здравствуйте!

    Воспользовался конвертером проекта из 5-й версии в 6-ю. Теперь пытаюсь перенести формулы: вручную скопировал из xml 5-й версии в редактор скриптом в 6-й версии (через ScadaAdmin). По всем формулам лезет ошибка при компиляции «error CS8801: Cannot use local variable or local function ‘GetMin’ declared in a top-level statement in this context.»

    В движке, если открыть через visual studio, никаких ошибок не подчёркивает. Понимаю, что движок это лишь часть системы и к этому классу потом, вероятно, идёт обращение из служб и они похоже не видят из контекста, но не приложу ума почему такая ошибка появилась?

    P.S.
    Все скрипты написаны на C#, начинаются после 101-го номера в списке скриптов.
    Используются скрипты во входных и выходных формулах входных и расчётных/выходных каналах (входные формулы для входных и входные-выходные для расчётных/выходных).

    Это обычные формулы по типу:

    public class PreviousStatus
    		{
    			public int PrevSpeedStat { get; set; }
    			public int PrevDelaySpeedStat { get; set; }
    			public double PrevSpeedValue { get; set; }
    			public int PrevAccelStat { get; set; }
    			public int PrevDelayAccelStat { get; set; }
    			public double PrevAccelValue { get; set; }
    			public int PrevMovementStat { get; set; }
    			public int PrevDelayMovementStat { get; set; }
    			public double PrevMovementValue { get; set; }
    			public bool AlarmCheck { get; set; }
    			public bool DangerCheck { get; set; }
    			public bool WarningCheck { get; set; }
    			public bool NormalCheck { get; set; }
    			public bool LowCheck { get; set; }
    			public DateTime AlarmDT { get; set; }
    			public DateTime DangerDT { get; set; }
    			public DateTime WarningDT { get; set; }
    			public DateTime NormalDT { get; set; }
    			public DateTime LowDT { get; set; }
    		}
    
    public double GetAccelValue(int status, double value, PreviousStatus prevStatus)
    		{
    			if (status != prevStatus.PrevDelayAccelStat)
    			{
    				prevStatus.PrevDelayAccelStat = status;
    				prevStatus.PrevAccelValue = value;
    				return value;
    			}
    			else
    			{
    				return prevStatus.PrevAccelValue;
    			}
    		}
    #40853
    manjey73
    Участник

    Номер строки указывает при ошибке?
    Потом в файле формул найти по строке и сделать вывод почему?

    #40854
    vg
    Участник

    Номер строки и позиция ошибки указывается для движка «CalcEngine.cs», а не файла с формулами (если вы имели ввиду файл «script.dat»). В движке выглядит всё чисто.

    • Ответ изменён 1 месяц, 2 недели назад пользователем vg.
    • Ответ изменён 1 месяц, 2 недели назад пользователем vg.
    #40857
    manjey73
    Участник

    CalcEngine.cs — Открываете в папке логов этот файл и ищите по строке.
    нужен текстовый редактор, который считает строки :).

    И смотрите что не так, что типа ему не нравится.

    #40859
    vg
    Участник

    В этом и проблема: ему всё нравится 😀

    #40860
    manjey73
    Участник

    Так начните с малого, чтобы понять, что не нравится.

    #40861
    Mikhail
    Модератор

    Добрый день!
    Ошибка связана в Вашей функцией GetMin. Нужно найти в скриптах, где она описана и где используется.

    #40862
    manjey73
    Участник

    ошибка cs8801: Не удается использовать локальную переменную или локальную функцию ‘getMin’, объявленную в инструкции верхнего уровня в этом контексте

    Или переменной (функции) нет, или к ней доступа, потому что она не public.
    В 6-й версии вроде обязательно указывать, иначе не алё

    #40863
    manjey73
    Участник

    А может что-то другое.

    #40888
    vg
    Участник

    Проблема была в том, что для экземпляров класса, например класса PreviousStatus, необходимо было указать модификатор public.

    То есть написать
    PreviousStatus prevStatus = new PreviousStatus();
    неправильно.

    А вот
    public PreviousStatus prevStatus = new PreviousStatus();
    работает

    #40889
    vg
    Участник

    Но ещё одним моментом является «кривой» перенос символов «>», «<«, «&».
    В xml они закодированы как «& gt;», «& lt;» и «& amp;» соответственно.

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

    Тоже нужно быть внимательным.

    #40890
    manjey73
    Участник

    Я для работы с текстовыми файлами использую AcelPad, если не ошибся в названии.
    У вас все файлы должны быть в кодировке utf без BOM.
    Это некоторая особенность, так как все файлы должны работать и в Windows и в Linux.

    Не сохраняйте их виндовым NotePad и будет вам щастье 😀

Просмотр 12 сообщений - с 1 по 12 (из 12 всего)
  • Для ответа в этой теме необходимо авторизоваться.