Ошибочка, делаю олимпиаду не знаю что делать


#1

При компиляции у себя, работает все в норме. Загружаю, а там эта ошибка… Как понимаю, он а лямбду ругается. Там v3.2.0.1325

[0]Internal compiler error in module Compiler.Compile[019687.pas] :'System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
  at System.Collections.Generic.Dictionary`2[TKey,TValue].get_Item (TKey key) [0x00021] in <90910314e0f14f998fc0d35c0199e8a7>:0 
  at TreeConverter.LambdaExpressions.Closure.CapturedVariablesSubstitutor.SubstituteForLoopVariables () [0x00179] in <413a0309438d4d96ad21e3260ff28d14>:0 
  at TreeConverter.LambdaExpressions.Closure.CapturedVariablesSubstitutor.Substitute (PascalABCCompiler.SyntaxTree.statement_list statementList) [0x00048] in <413a0309438d4d96ad21e3260ff28d14>:0 
  at TreeConverter.LambdaExpressions.Closure.CapturedVariablesSubstitutionsManager.Substitute (PascalABCCompiler.TreeConverter.syntax_tree_visitor _visitor, PascalABCCompiler.SyntaxTree.declarations decls, PascalABCCompiler.SyntaxTree.statement_list _statementList) [0x00048] in <413a0309438d4d96ad21e3260ff28d14>:0 
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit (PascalABCCompiler.SyntaxTree.block _block) [0x00437] in <413a0309438d4d96ad21e3260ff28d14>:0 
  at PascalABCCompiler.SyntaxTree.block.visit (PascalABCCompiler.SyntaxTree.IVisitor visitor) [0x00000] in <d8edc471811b484487c5180ed5c099ba>:0 
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.hard_node_test_and_visit (PascalABCCompiler.SyntaxTree.syntax_tree_node tn) [0x00023] in <413a0309438d4d96ad21e3260ff28d14>:0 
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit (PascalABCCompiler.SyntaxTree.program_module _program_module) [0x000cc] in <413a0309438d4d96ad21e3260ff28d14>:0 
  at PascalABCCompiler.SyntaxTree.program_module.visit (PascalABCCompiler.SyntaxTree.IVisitor visitor) [0x00000] in <d8edc471811b484487c5180ed5c099ba>:0 
  at PascalABCCompiler.TreeConverter.SyntaxTreeToSemanticTreeConverter.CompileInterface (PascalABCCompiler.SyntaxTree.compilation_unit SyntaxUnit, PascalABCCompiler.TreeRealization.unit_node_list UsedUnits, System.Collections.Generic.List`1[T] ErrorsList, System.Collections.Generic.List`1[T] WarningsList, PascalABCCompiler.Errors.SyntaxError parser_error, System.Collections.Hashtable bad_nodes, PascalABCCompiler.TreeRealization.using_namespace_list namespaces, System.Collections.Generic.Dictionary`2[TKey,TValue] docs, System.Boolean debug, System.Boolean debugging) [0x00120] in <413a0309438d4d96ad21e3260ff28d14>:0 
  at PascalABCCompiler.Compiler.CompileUnit (PascalABCCompiler.TreeRealization.unit_node_list Units, PascalABCCompiler.SyntaxTree.unit_or_namespace SyntaxUsesUnit) [0x0071f] in <6867db1680754045981a5e167df065a5>:0 
  at PascalABCCompiler.Compiler.Compile () [0x000b9] in <6867db1680754045981a5e167df065a5>:0 '

#2

Нет, это не просто на лямбду, они тогда были. Это он вылетает (не выдаёт ошибку, это именно падение), наверное 1 из ошибок которые недавно исправили. Дайте код я попробую найти.


#3
function FindIndex<T>(Self: array of T; p: T->boolean): integer; 
extensionmethod;
begin
Result := System.Array.FindIndex(self, p);  
end;

var
  n, q, c, x, y, ot, g, t: int64;
  s: string;
  d: char;
  o: array of int64;

label m;
begin
  ReadLn(n, q);
  ReadLn(s);
  var arr := s.ToIntegers;
  setlength(o, q);
  for c := 1 to q do
  begin
    ReadLn(d, x, y);
    x -= 1;
    if d = '!' then
      Arr[x] := y;
    if d = '?' then
    begin
      ot += 1;
      for g := 0 to y do
      begin
        t := arr[x:y].FindIndex(x -> x = g);//.PrintLn;
        if t = -1 then
        begin
          //WriteLn(t);
          o[ot] := g;
          break;
        end;
      end;
      m: 
    end;
  end;
  for c := 1 to ot do
    WriteLn(o[c]); 
end.

`


#4

Что то не могу найти такого… Попробую сейчас добыть старую версию, а вы пока тоже тут посмотрите:


#5

Я сейчас ещё в эту ошибку вчитаться попробовал… Возможно проблема в этом:

То есть лямбда не может захватить переменную цикла for в той версии. Попробуйте сделать дополнительную переменную, к примеру var _g := g и её уже использовать в лямбде.


#6
Офф

Не знаю, обновляют ли Олимпиадные работы в Задачнике PABC.NEТ, но где можно ознакомиться с недавними заданиями на международном уровне, которые были, например, в Болгарии?


#7

Ищите это на сайтах организаций проводящих олимпиады.
Только вы это… Присядьте, а то ещё упадёте))) Потому что 3.2 это ещё не так ужасно.

Вроде разработчики ещё договаривались с яндексом что они последнюю версию зальют, и в итоге яндекс просто забыл:


#8

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

Аналогично все обстоит с сайтами для самообучения, проведения конкурсов.