Ошибки PascalABC.NET

Ошибки, замеченные в работе компилятора

http://vozmifail.rusfolder.net/files/43097312 Ссылка на файл, модуль. Ошибка в 1 строке всегда при каждой компиляции. MyFiles.pas(1) : Встречено ‘C’, а ожидался раздел описаний или begin

У меня компилируется. А какая у вас ОС и версия .NET Framework?

@ibond, учитывая, что вопрос @Ara_Ellaryan был перенесён (и вначале был отреплаен для меня), имеет смысл делать меншн

//Здесь вы можете добавить свой комментарий

02.03.2015 19:14:09 PascalABCCompiler.Core v2.2.0.842 (08.02.2015), debug version Runtime version: 4.0.30319.34014 OS version: Microsoft Windows NT 6.2.9200.0 Processor count: 4 WorkingSet: 66492 kb StatesList: CompilationFinished Program1.pas Ready

Error[0]: Внутренняя ошибка компилятора в модуле [pabcnetc.exe] :'System.Exception: System.IO.IOException: Устройство не готово.

в System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) в System.IO.Directory.SetCurrentDirectory(String path) в PascalABCCompiler.Compiler.Compile()’

Это что за ошибка? И почему, кстати, не сохранили пользовательские данные с прошлого форума?

Обновил версию паскаля и проблема исчезла, хотя после нескольких компиляций появилась один раз та же ошибка, но с литерой ‘D’.

Это что за ошибка?

Program1.pas лежит, например, на недоступном сетевом диске, вообщем на не готовом устройстве

И почему, кстати, не сохранили пользовательские данные с прошлого форума?

Этот вопрос лучше задать в специализированном подфоруме. Я этим не занимаюсь

http://forum.mmcs.sfedu.ru/c/meta

Здравствуйте! Я решил поработать с регистром, набрал следующий код (Сам паскаль отображал подпункты):

begin
  Microsoft.Win32.Registry.SetValue('HKEY_CLASSES_ROOT\pas_auto_file\shell\open\command','','hh',string);
end.

А при запуске выдается ошибка “Disk.pas(12) : Неизвестное имя ‘Microsoft’”. Откуда взялась эта ошибка?

Да, пространство Microsoft как-то обделили. подключите uses Microsoft.Win32; и Registry.SetValue должно работать. Баг исправим в следующем билде.

Пишем присваивания:

переменная := выражение;

потом выделяем переменная (или просто поставим курсор после переменная перед пробелом) и нажимаем правый кнопку миши. Программа проверяет путь который написан в файле “C:\Program Files\PascalABC.NET\samples.pct”:

28 [if]
29 !Tutorial\05_IfCaseBoolean\ //если меняем это путь то проверяет новый путь.

Если это путь существует то нормально открывается контекстный меню, а если не существует то передаёт ошибка: Не удалось найти часть пути "C:\PABCWork.NET\Samples!Tutorial\05_IfCaseBoolean"

PascalABCCompiler.Core v2.2.0.849 (03.03.2015)

PascalABCCompiler.Core v2.2.0.849 (03.03.2015)

uses System, System.Runtime.InteropServices, Microsoft.Win32.SafeHandles;

type ushort = word;

// const sss = 1; если раскомментировать эту строку - ошибки компиляции не будет

[DllImport('kernel32.dll', SetLastError = true)]
function GetStdHandle(nStdHandle:System.Int32): System.IntPtr; external;

begin
    var U:ushort:= 0;
    var cHandleI:IntPtr := GetStdHandle(-10);
end.

не компилируется с ошибкой “: Встречено ‘function’, а ожидался идентификатор”

ЗЫ… если переместить “type ushort = word;” ниже импортируемой функции то все компилируетсяся нормально

Да. сделали - теперь Auto можно писать без закорючек

Да, сделали.

   [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
   KEY_EVENT_RECORD = packed record
     bKeyDown: boolean;
     wRepeatCount: word;
     wVirtualKeyCode: word;
     wVirtualScanCode: word;
     UnicodeChar: char;
     dwControlKeyState: longword;
   end;

  [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Unicode)]
   KEY_EVENT_RECORD = packed record
     [FieldOffset(0)] bKeyDown: boolean;
     [FieldOffset(4)] wRepeatCount: word;
     [FieldOffset(6)] wVirtualKeyCode: word;
     [FieldOffset(8)] wVirtualScanCode: word;
     [FieldOffset(10)] UnicodeChar: char;
     [FieldOffset(12)] dwControlKeyState: longword;
   end;

   [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Unicode)]
   INPUT_RECORD = packed record
     [FieldOffset(0)] EventType: ushort;
// Очередность следующих полей влияет на FieldOffset в KEY_EVENT_RECORD ... 
     [FieldOffset(4)] KeyEvent: KEY_EVENT_RECORD;
     [FieldOffset(4)] MouseEvent: MOUSE_EVENT_RECORD;
     [FieldOffset(4)] WindowBufferSizeEvent: WINDOW_BUFFER_SIZE_RECORD;
     [FieldOffset(4)] MenuEvent: MENU_EVENT_RECORD;
     [FieldOffset(4)] FocusEvent: FOCUS_EVENT_RECORD;
    end;

// Очередность записей при LayoutKind.Explicit влияет на FieldOffset в подчиненных записях … если они описаны как LayoutKind.Sequential это Баг или Фича?

LayoutKind.Sequential означает, что данные в структуре должны идти последовательно друг за другом.

LayoutKind.Explicit позволяет задавать смещения в самом коде, в частности реализовать так называемые “записи с вариантами”

https://msdn.microsoft.com/ru-ru/library/system.runtime.interopservices.layoutkind(v=vs.110).aspx

теоретически данные структуры должны быть одинаковыми … но при компиляции ведут себя по разному возможно в данном случае что-то не так с обработкой LayoutKind.Explicit, LayoutKind.Sequential или вложенных структур …

{$apptype console}
uses System, System.Runtime.InteropServices, Microsoft.Win32.SafeHandles;

type

   [StructLayout(LayoutKind.Sequential)]
   aType  = packed record
     bValue1: boolean;
     iValue2: integer; 
   end;

   [StructLayout(LayoutKind.Sequential)]
   bType  = packed record
     iValue1: integer;
     bValue2: boolean; 
   end;

   [StructLayout(LayoutKind.Sequential,CharSet = CharSet.Unicode)]
   cType  = packed record
     bValue1: boolean; 
     cValue2: char;
     wValue3: word;
   end;

   [StructLayout(LayoutKind.Sequential)]
   dType  = packed record
     iValue1: integer;
     iValue2: integer; 
   end;

   [StructLayout(LayoutKind.Explicit)]
   BrokenType  = packed record
     [FieldOffset(0)] B:bType;
     [FieldOffset(0)] A:aType;
     [FieldOffset(0)] D:dType; 
     [FieldOffset(0)] C:cType; 
     // изменение последовательности полей данной структуры сильно влияет на результат !!!!
   end;

procedure CheckTrueResult(aTrue:boolean;aStr:string);
begin
  if aTrue then WriteLn(aStr,' : result = true - PASS') else WriteLn(aStr,' : result = false - ERROR !!!!!!');
end;

begin   
    var rawvalues: array of longword := (2,13); 
    
    WriteLn('... Check aType ...');
    var a: aType := aType(Marshal.PtrToStructure(GCHandle.Alloc(rawvalues, GCHandleType.Pinned).AddrOfPinnedObject(), typeof(aType)));
        CheckTrueResult(a.bValue1 = true,'a1 = true');
        CheckTrueResult(a.iValue2 = 13,'a2 = 13');
    WriteLn('... Check bType ...');
    var b: bType := bType(Marshal.PtrToStructure(GCHandle.Alloc(rawvalues, GCHandleType.Pinned).AddrOfPinnedObject(), typeof(bType)));
        CheckTrueResult(b.iValue1 = 2,'b1 = 2');
        CheckTrueResult(b.bValue2 = true,'b2 = true');
        
    var broken: BrokenType := BrokenType(Marshal.PtrToStructure(GCHandle.Alloc(rawvalues, GCHandleType.Pinned).AddrOfPinnedObject(), typeof(BrokenType)));

    WriteLn('');
    WriteLn('... Check BrokenType ... Explicit');

    WriteLn(Format('SizeOf(aType)={0}, Marshal.SizeOf(typeof(aType))={1}',SizeOf(aType),Marshal.SizeOf(typeof(aType))));
    WriteLn(Format('SizeOf(bType)={0}, Marshal.SizeOf(typeof(bType))={1}',SizeOf(bType),Marshal.SizeOf(typeof(bType))));
    WriteLn(Format('SizeOf(cType)={0}, Marshal.SizeOf(typeof(cType))={1}',SizeOf(cType),Marshal.SizeOf(typeof(cType))));
    WriteLn(Format('SizeOf(broken)={0}, Marshal.SizeOf(typeof(broken))={1}',SizeOf(BrokenType),Marshal.SizeOf(typeof(BrokenType))));
    WriteLn('');
    WriteLn(Format('rawvalues[0]={0}, rawvalues[1]={1}',rawvalues[0], rawvalues[1]));
    WriteLn(Format('broken.a1={0}, broken.a2={1}',broken.a.bValue1,broken.a.iValue2));
    WriteLn(Format('broken.b1={0}, broken.b2={1}',broken.b.iValue1,broken.b.bValue2));
    WriteLn(Format('broken.c1={0}, broken.c2=#{1}, broken.c3={2}',broken.c.bValue1,word(broken.c.cValue2), broken.c.wValue3));
    WriteLn(Format('broken.d1={0}, broken.d2={1}',broken.d.iValue1,broken.d.iValue2));
    WriteLn('');


        CheckTrueResult(broken.a.bValue1 = true,'BrokenType.a1 = true');
        CheckTrueResult(broken.a.iValue2 = 13,'BrokenType.a2 = 13');
        CheckTrueResult(broken.b.iValue1 = 2,'BrokenType.b1 = 2');
        CheckTrueResult(broken.b.bValue2 = true,'BrokenType.b2 = true');
        CheckTrueResult(broken.c.bValue1 = true,'BrokenType.b1 = true');
        CheckTrueResult(broken.c.cValue2 = #13,'BrokenType.a2 = #13');


    WriteLn('');
    WriteLn('... Check BrokenType ... additional');

        CheckTrueResult(broken.a.iValue2 <> 1,'BrokenType.a2 <> 1 (a2 Must be 13)');
        CheckTrueResult(broken.a.iValue2 <> 2,'BrokenType.a2 <> 2 (a2 Must be 13)');
        CheckTrueResult(broken.a.iValue2 <> 13,'BrokenType.a2 <> 13 (a2 Must be 13)');

        CheckTrueResult(broken.a.bValue1 = true,'BrokenType.a1 = true');
       
        CheckTrueResult(broken.b.iValue1 <> 1,'BrokenType.b1 <> 1 (b1 Must be 2)');
        CheckTrueResult(broken.b.iValue1 <> 2,'BrokenType.b1 <> 2 (b1 Must be 2)');
        CheckTrueResult(broken.b.iValue1 <> 13,'BrokenType.b1 <> 13 (b1 Must be 2)');
        
        CheckTrueResult(broken.b.bValue2 = true,'BrokenType.b1 = true');
       
end.

у меня результат такой: … Check aType … a1 = true : result = true - PASS a2 = 13 : result = true - PASS … Check bType … b1 = 2 : result = true - PASS b2 = true : result = true - PASS

… Check BrokenType … Explicit SizeOf(aType)=8, Marshal.SizeOf(typeof(aType))=8 SizeOf(bType)=8, Marshal.SizeOf(typeof(bType))=8 SizeOf(cType)=8, Marshal.SizeOf(typeof(cType))=8 SizeOf(broken)=8, Marshal.SizeOf(typeof(broken))=8

rawvalues[0]=2, rawvalues[1]=13 broken.a1=True, broken.a2=0 broken.b1=851969, broken.b2=False broken.c1=True, broken.c2=#13, broken.c3=0 broken.d1=851969, broken.d2=0

BrokenType.a1 = true : result = true - PASS BrokenType.a2 = 13 : result = false - ERROR !!! BrokenType.b1 = 2 : result = false - ERROR !!! BrokenType.b2 = true : result = false - ERROR !!! BrokenType.b1 = true : result = true - PASS BrokenType.a2 = #13 : result = true - PASS

… Check BrokenType … additional BrokenType.a2 <> 1 (a2 Must be 13) : result = true - PASS BrokenType.a2 <> 2 (a2 Must be 13) : result = true - PASS BrokenType.a2 <> 13 (a2 Must be 13) : result = true - PASS BrokenType.a1 = true : result = true - PASS BrokenType.b1 <> 1 (b1 Must be 2) : result = true - PASS BrokenType.b1 <> 2 (b1 Must be 2) : result = true - PASS BrokenType.b1 <> 13 (b1 Must be 2) : result = true - PASS BrokenType.b1 = true : result = false - ERROR !!!

PS: если написать [FieldOffset(-1)] будет ошибка компилятора

Вообще в WriteConsoleInput надо использовать [MarshalAs(UnmanagedType.LPArray)] и для функции задать CharSet = CharSet.Unicode и EntryPoint = “WriteConsoleInputW”

данные замечания никак не влияют на результат выполнения программы :slight_smile: можешь сам попробовать … щас в личку кину ЗЫ пришлось для стабильности все структуры перевести на LayoutKind.Explicit и FieldOffset задать …

uses
  System.Collections.Generic;
type
    XParameter = class
    private
        mColumnName: string;
    end;
    TestCollection = List<XParameter>;

procedure TestCollection.Add(iparam: XParameter); 
begin
  //добавляем в общую коллекцию
  self.List.Add(iparam);
end;

begin
end.

а тут просто ошибка компилятора вылетает :slight_smile: