Помощь новичкам

Тип string в .NET внутри - ссылочный. Он находится под управлением сборщика мусора.

Так что “нормальных” строк в вашем понимании нет.

Нужно понимать, что PascalABC.NET - это не Free Pascal, работающий на нативной платформе - это язык платформы .NET.

Главный вопрос тут даже не “Как сделать…”, а “Зачем делать?”. Кому надо - идет во Free Pascal и там ностальгирует тихонько, чтобы никто не увидел.

В целом солидарен с @RAlex, но вместо того чтоб посылать - @Catcher лучше объясните что вы пытались сделать, чтоб можно было судить о том как это же делается под .Net .

var
	p: ^shortstring;
begin
	new(p);
	p^ := 'Hello, dynamic world!';
	writeln(p^);
	dispose(p);
end.

PABCSystem.__FixPointer тут вызывается уже после того как объект строки был засунут за указатель. Если сборка мусора вызовется до __FixPointer - строку может удалить.

Добрый день всем. У меня программа, графическая, разработано с применением GraphWpf. Откомпилированная программа exe на других компьютерах (Windows7 и более) не запускается. Почему так происходит?

Это ни о чём - нужны симптомы. Если пишет просто “прекращение работы программы”, без возможности диагностики, то используйте такую программу:

##

System.AppDomain.CurrentDomain.UnhandledException += (o,e)->
begin
  Writeln(e.ExceptionObject);
  Readln;
  Halt;
end;

var prog_path := System.IO.Path.GetFullPath('Program2.exe');
System.Reflection.Assembly.LoadFile(prog_path).EntryPoint.Invoke(nil, nil);
Writeln('Успешный выход');
Readln;

Только не запускайте её из IDE - паскалевский дебагер не дружит с .UnhandledException .

uses System.Text.RegularExpressions;
var x: match; // Встречено 'match', а ожидалось выражение
begin
end. 

Не могу задать тип. Учусь по этому учебнику link .

match — ключевое слово

var x: &match;

Спасибо! Похоже браузер съел амперсанды в учебнике.

Тогда match еще не было

Хотел добавить пример для OpenCLABC:

Игра жизнь.rar (46.7 КБ)

С полем 100х100 OpenCLABC справляется практически моментально, но вывод через GraphWPF сильно лагает. @Admin есть идеи как оптимизировать?

Выводить через прямые вызовы Windows API без WPF?

Если всё равно медленно — портировать на FPC или лучше FPC+Lazarus (в смысле его граф либу).

Та я могу и с моим же модулем OpenGL, но тут для примера хотел написать что то простое.

Подскажите аналог из Python:

@lru_cache(None)

Полного аналога нет и быть не может в языке со статической типизацией. Есть [Cache].

[Cache] это и есть @lru_cache(None). Никакой логики чистки кэша у [Cache] нет.

Спасибо.

Прошу помощи. Задание 21 ЕГЭ.

Решение на Питон

from functools import lru_cache
def moves(h):
    a,b=h
    return(a+1,b),(a*2,b),(a,b+1),(a,b*2)
@lru_cache(None)
def game(h):
    if sum(h)>=62:
        return "w"
    if any(game(m)=="w" for m in moves(h)):
        return "P1"
    if all(game(m)=="P1" for m in moves(h)):
        return "B1"
    if any(game(m)=="B1" for m in moves(h)):
        return "P2"
    if all(game(m)=="P1" or game(m)=="P2" for m in moves(h)):        
        return "B2"

for s in range(1,52):
    if game((10,s)) is not None:
        print(s,  game((10,s)) )

Переписал на PascalABC.NET как сумел:

function moves(h:(integer,integer)):((integer,integer),
                                      (integer,integer),
                                      (integer,integer),
                                      (integer,integer));
  var a,b:integer;
begin
  (a,b):=h;
  result:=((a+1,b),(a*2,b),(a,b+1),(a,b*2))
end;

[Cache]
function game(h:(integer,integer)):string ;
begin
  result := 'N';
  
  if (h[0]+h[1])>=62 then 
    begin
      result:='w';
      exit
    end;  
  if (game(moves(h)[0])='w') or
     (game(moves(h)[1])='w') or
     (game(moves(h)[2])='w') or
     (game(moves(h)[3])='w') then 
     begin
       result := 'P1';
       exit
     end;
  if (game(moves(h)[0])='P1') and
     (game(moves(h)[1])='P1') and
     (game(moves(h)[2])='P1') and
     (game(moves(h)[3])='P1') then 
     begin
       result := 'B1';
       exit
     end;
     
  if (game(moves(h)[0])='B1') or
     (game(moves(h)[1])='B1') or
     (game(moves(h)[2])='B1') or
     (game(moves(h)[3])='B1') then   
     begin
       result := 'P2';
       exit
     end;
  
  if ((game(moves(h)[0])='P1') or (game(moves(h)[0])='P2')) and
     ((game(moves(h)[1])='P1') or (game(moves(h)[1])='P2')) and
     ((game(moves(h)[2])='P1') or (game(moves(h)[2])='P2')) and
     ((game(moves(h)[3])='P1') or (game(moves(h)[3])='P2')) then 
     begin
       result := 'B2';  
       exit
     end;
end;  
begin
  for var s:=1 to 51 do 
    begin
      if game((10,s)) <> 'N' then writeln(s, game((10,s)))
    end
end.     

Работает медленнее. Как ускорить или написать решение по другому (проще)?

А что такое медленнее? У меня мгновенно. К тому же время не выдаётся