Dictionary 为什么我不能在这里创建一个简单的字典

Dictionary 为什么我不能在这里创建一个简单的字典,dictionary,hashmap,freepascal,Dictionary,Hashmap,Freepascal,我正在尝试使用TFPGmap创建和使用一个简单的字典: program rnTFPGmap; {$mode objfpc} uses fgl; var mydict: specialize TFPGmap<string, string>; key: string; i: longint; begin mydict.create; mydict.add('k1','v1'); mydict.add('k2','v2')

我正在尝试使用TFPGmap创建和使用一个简单的字典:

program rnTFPGmap; 
{$mode objfpc}
uses fgl; 

var 
    mydict: specialize TFPGmap<string, string>; 
    key: string; 
    i: longint; 

begin
    mydict.create; 
    mydict.add('k1','v1'); 
    mydict.add('k2','v2');
    mydict.add('k3','v3');
    //for key in mydict.keys do   {does not work either;}
    for i := 1 to length(mydict) do  {line 17: first error from here. }
        writeln(mydict[i]); 
end.
编辑:我试图根据文档修改代码,并得出以下版本:

program rnTFPGmap; 
{$mode objfpc}
uses fgl; 
type 
    tuple = specialize TFPGmap<string, string>; 
    mydict = Array of tuple;
var 
    dict: mydict; 
    i: tuple; 
    item: string; 
begin
    setlength(dict, length(dict)+3); 
    dict.add('k1','v1');   {error on this line: "CREATE" expected but "ADD" found}
    dict.add('k2','v2');
    dict.add('k3','v3');
    writeln('dict.count: ', dict.count); 
    for i in dict do    
            writeln(i); 
end.

无法解决此问题。

以下代码有效。有关一些解释,请参见注释:

program rnTFPGmap; 
{$mode objfpc}
uses fgl; 
type 
    Rndict = specialize TFPGmap<string, string>;{define type under type}
var 
    dict: Rndict;               {define object under var}
    i: integer; 
{main: }
begin
    dict := Rndict.Create;      {create object in main}
    dict.add('k1','v1'); 
    dict.add('k2','v2'); 
    dict.add('k3','v3'); 
    for i := 0 to (dict.count-1) do begin 
        writeln('i: ',i, '; key: ', dict.getkey(i), '; value: ', dict.getdata(i)); 
        end; 
end.

我感谢@DavidHeffernan的指导。

以下代码有效。有关一些解释,请参见注释:

program rnTFPGmap; 
{$mode objfpc}
uses fgl; 
type 
    Rndict = specialize TFPGmap<string, string>;{define type under type}
var 
    dict: Rndict;               {define object under var}
    i: integer; 
{main: }
begin
    dict := Rndict.Create;      {create object in main}
    dict.add('k1','v1'); 
    dict.add('k2','v2'); 
    dict.add('k3','v3'); 
    for i := 0 to (dict.count-1) do begin 
        writeln('i: ',i, '; key: ', dict.getkey(i), '; value: ', dict.getdata(i)); 
        end; 
end.

我感谢@DavidHeffernan的指导。

你认为这里为什么可以使用长度?你用什么作为参考?看起来你在猜。我可以告诉你答案,但问题会一直出现,直到你开始使用一个适当的参考。而且,这不是实例化对象的方式。另请参见,在这种语言中,我们基于零计数。我尝试了:
for I:=0 to mydict.count do writeln(mydict[I])但得到错误:
错误:参数1的不兼容类型:得到“LongInt”,预期为“ShortString”
我正在使用的一些文档:,,您缺少的关键文档是您正在使用的类的文档。我可以给你这个链接,但是如果你能自己用websearch找到它,那就太好了。它有所有的答案。这不是一个德尔菲问题。你为什么认为这里可以使用长度?你用什么作为参考?看起来你在猜。我可以告诉你答案,但问题会一直出现,直到你开始使用一个适当的参考。而且,这不是实例化对象的方式。另请参见,在这种语言中,我们基于零计数。我尝试了:
for I:=0 to mydict.count do writeln(mydict[I])但得到错误:
错误:参数1的不兼容类型:得到“LongInt”,预期为“ShortString”
我正在使用的一些文档:,,您缺少的关键文档是您正在使用的类的文档。我可以给你这个链接,但是如果你能自己用websearch找到它,那就太好了。它有所有的答案。这不是德尔菲问题。
program rnTFPGmap; 
{$mode objfpc}
uses fgl; 
type 
    Rndict = specialize TFPGmap<string, string>;{define type under type}
var 
    dict: Rndict;               {define object under var}
    i: integer; 
{main: }
begin
    dict := Rndict.Create;      {create object in main}
    dict.add('k1','v1'); 
    dict.add('k2','v2'); 
    dict.add('k3','v3'); 
    for i := 0 to (dict.count-1) do begin 
        writeln('i: ',i, '; key: ', dict.getkey(i), '; value: ', dict.getdata(i)); 
        end; 
end.
i: 0; key: k1; value: v1
i: 1; key: k2; value: v2
i: 2; key: k3; value: v3