2017-09-18 2 views
-1

Je ne parviens pas à corriger cette erreur !!! Voici la partie du code dans laquelle l'erreur s'est produite. Je n'arrive pas à déterminer où utiliser la surcharge.E2267 La déclaration précédente de 'ExtractTokens' n'était pas marquée avec la directive 'overload'

function ExtractTokens(const line: AnsiString; const sep: AnsiChar; autoUnquote: boolean = true): TStringArray; 
var 
    lineIndex: integer; 

    function NextChar(out ch: char): boolean; 
    begin 
    if lineIndex <= length(line) then 
    begin 
     result := true; 
     ch := line[lineIndex]; 
     inc(lineIndex); 
    end 
    else 
     result := false; 
    end; 
    function PeekFor(const ch: AnsiChar): boolean; 
    begin 
    result := false; 
    if lineIndex <= length(line) then 
    begin 
     if line[lineIndex] = ch then 
     begin 
     inc(lineIndex); 
     result := true; 
     end; 
    end; 
    end; 
    function UnquoteIfNecessary(const tok: string; quoteChar: char): string; 
    var 
    pch: PChar; 
    begin 
    if autoUnquote then 
    begin 
     pch := pchar(tok); 
     result := AnsiExtractQuotedStr(pch, quoteChar); 
    end 
    else 
     result := tok; 
    end; 
var 
    token: string; 
    stok: string; 
    ch: char; 
    lastChar: char; 
    strSep: char; 
    inString: boolean; 

    function IsSep(aChar: char): boolean; 
    begin 
    result := (aChar = sep) or ((sep = #0) and (ord(aChar) < 33)); 
    end; 

    procedure AddToken(var tokens: TStringArray; const tkn: string; addEmpty: boolean = true); 
    var 
    s: string; 
    begin 
    s := trim(tkn); 
    if addEmpty or (s <> '') then 
    begin 
     SetLength(tokens, length(tokens) + 1); 
     tokens[high(tokens)] := s; 
    end; 
    token := ''; 
    end; 
begin 
    result := nil; 
    token := ''; 
    stok := ''; 
    lastChar := #0; 
    strSep := #0; // for compiler 
    inString := false; 
    lineIndex := 1; 
    while true do 
    begin 
    if not NextChar(ch) then 
    begin 
     AddToken(result, token, (lastChar <> #0) and IsSep(lastChar)); 
     exit; 
    end; 

    if ch in ['"', ''''] then 
    begin 
     stok := stok + ch; 
     if inString then 
     begin 
     if ch = strSep then 
     begin 
      if PeekFor(strSep) then 
      stok := stok + strSep 
      else 
      begin 
      token := token + UnquoteIfNecessary(stok, strSep); 
      inString := false; 
      stok := ''; 
      end; 
     end; 
     end 
     else 
     begin 
     strSep := ch; 
     inString := true; 
     end; 
    end 
    else if IsSep(ch) and not inString then 
     AddToken(result, token, true) 
    else 
    begin 
     if inString then 
     stok := stok + ch 
     else 
     token := token + ch; 
    end; 
    lastChar := ch; 
    end; 
end; 

Dans Delphi 10.2 donne une erreur: [Erreur dcc32] commutil.pas (3101): E2267 déclaration précédente de 'ExtractTokens' n'a pas été marquée la directive 'surcharge'

Je ne comprendre comment réparer cette erreur !!!

+0

Apparemment, vous avez une autre fonction appelée 'ExtractTokens', ou peut-être avez-vous une déclaration qui diffère de l'implémentation. – GolezTrol

+0

Oui, j'ai une autre fonction ExtractTokens – ValertonGT

Répondre

2

L'indice est dans le message d'erreur. Regardons-le.

E2267 Previous declaration of 'ExtractTokens' was not marked with the 'overload' directive

Apparemment, vous avez une déclaration antérieure d'une fonction nommée ExtractTokens. Trouvez-le et votre solution sera évidente.

Soit vous marquez les deux déclarations avec overload, soit vous en retirez une, selon vos intentions.

+0

Merci beaucoup cette erreur a disparu. Mais il y en avait un autre: E2010 Types incompatibles: 'Char' et 'AnsiChar' – ValertonGT

+0

C'est un problème différent. Je ne peux pas vous aider à cette question. –

+0

@ValertonGT: vous utilisez une version Unicode de Delphi mais ce code mélange les caractères/chaînes Ansi et Unicode ensemble. Vous devez réécrire le code pour utiliser 'string' au lieu de' AnsiString', et 'Char' à la place de' AnsiChar'. –