Generics Ada:所选组件中的前缀无效

Generics Ada:所选组件中的前缀无效,generics,filter,compiler-errors,tree,ada,Generics,Filter,Compiler Errors,Tree,Ada,我正在开发一个通用程序,用Ada过滤数据。 我试着用一个列表和一棵树来做到这一点 带有列表实现的程序运行良好。 我的问题是这棵树 我有不同的通用软件包: Arbre\u Binaire\u Recherche\u g.ads generic TYPE Element IS PRIVATE; WITH FUNCTION "="(E1,E2 : IN Element) RETURN Boolean; WITH FUNCTION "<"(E1,E2 : IN Element)

我正在开发一个通用程序,用Ada过滤数据。 我试着用一个列表和一棵树来做到这一点

带有列表实现的程序运行良好。 我的问题是这棵树

我有不同的通用软件包:

Arbre\u Binaire\u Recherche\u g.ads

generic
   TYPE Element IS PRIVATE;
   WITH FUNCTION "="(E1,E2 : IN Element) RETURN Boolean;
   WITH FUNCTION "<"(E1,E2 : IN Element) RETURN Boolean;
   WITH PROCEDURE Liberer_Element(E : IN OUT Element);
   WITH FUNCTION Element_To_String(E : IN Element) RETURN String;

package Arbre_Binaire_Recherche_g is

[...]

with function critere(E : in element) return Boolean;
 procedure Filtrer(A : in Arbre; B : out Arbre);
private
    TYPE Noeud;

  TYPE Arbre IS ACCESS Noeud;

  TYPE Noeud IS RECORD
     Info : Element;
     Gauche : Arbre;
     Droite : Arbre;
  END RECORD;

END Arbre_Binaire_Recherche_g;
WITH Arbre_Binaire_Recherche_G, Acteurs;  
USE Acteurs;


package ABR_acteurs is new Arbre_Binaire_Recherche_G(acteur,"=","<",Liberer_acteur,Acteur_To_String);
generic
   TYPE Element IS PRIVATE;
   WITH FUNCTION "="(E1,E2 : IN Element) RETURN Boolean;
   WITH FUNCTION "<"(E1,E2 : IN Element) RETURN Boolean;
   WITH PROCEDURE Liberer_Element(E : IN OUT Element);
   WITH FUNCTION Element_To_String(E : IN Element) RETURN String;
   with function critere(E : in element) return Boolean;
package ABR_acteurs is new Arbre_Binaire_Recherche_G(acteur,"=","<",Liberer_acteur,Acteur_To_String, Critere_acteur);
with Ada.Unchecked_Deallocation;

generic
   type Element is private;
   with function "<"(E1, E2 : in Element) return Boolean;
   with function "="(E1, E2 : in Element) return Boolean;
   with procedure Liberer_Element(E : in out Element);
   with function Element_To_String(E : in Element) return String;

package Liste_Ordonnee_G is

    type Liste is private;

 [...]

generic
    with function Critere(E:Element) return Boolean;

function Filtrer(L : Liste) return Liste;

private

type Cellule;
type Lien is access Cellule;
type Cellule is record
    Info : Element;
    Suiv : Lien;
end record;

type Liste is record
    Debut : Lien;
    Cardinal : Natural;
end record;

-- procedure de liberation de la memoire occupee par la cellule
procedure Liberer_Cellule is new Ada.Unchecked_Deallocation(Cellule, Lien);

end Liste_Ordonnee_G;
abr_演员广告

generic
   TYPE Element IS PRIVATE;
   WITH FUNCTION "="(E1,E2 : IN Element) RETURN Boolean;
   WITH FUNCTION "<"(E1,E2 : IN Element) RETURN Boolean;
   WITH PROCEDURE Liberer_Element(E : IN OUT Element);
   WITH FUNCTION Element_To_String(E : IN Element) RETURN String;

package Arbre_Binaire_Recherche_g is

[...]

with function critere(E : in element) return Boolean;
 procedure Filtrer(A : in Arbre; B : out Arbre);
private
    TYPE Noeud;

  TYPE Arbre IS ACCESS Noeud;

  TYPE Noeud IS RECORD
     Info : Element;
     Gauche : Arbre;
     Droite : Arbre;
  END RECORD;

END Arbre_Binaire_Recherche_g;
WITH Arbre_Binaire_Recherche_G, Acteurs;  
USE Acteurs;


package ABR_acteurs is new Arbre_Binaire_Recherche_G(acteur,"=","<",Liberer_acteur,Acteur_To_String);
generic
   TYPE Element IS PRIVATE;
   WITH FUNCTION "="(E1,E2 : IN Element) RETURN Boolean;
   WITH FUNCTION "<"(E1,E2 : IN Element) RETURN Boolean;
   WITH PROCEDURE Liberer_Element(E : IN OUT Element);
   WITH FUNCTION Element_To_String(E : IN Element) RETURN String;
   with function critere(E : in element) return Boolean;
package ABR_acteurs is new Arbre_Binaire_Recherche_G(acteur,"=","<",Liberer_acteur,Acteur_To_String, Critere_acteur);
with Ada.Unchecked_Deallocation;

generic
   type Element is private;
   with function "<"(E1, E2 : in Element) return Boolean;
   with function "="(E1, E2 : in Element) return Boolean;
   with procedure Liberer_Element(E : in out Element);
   with function Element_To_String(E : in Element) return String;

package Liste_Ordonnee_G is

    type Liste is private;

 [...]

generic
    with function Critere(E:Element) return Boolean;

function Filtrer(L : Liste) return Liste;

private

type Cellule;
type Lien is access Cellule;
type Cellule is record
    Info : Element;
    Suiv : Lien;
end record;

type Liste is record
    Debut : Lien;
    Cardinal : Natural;
end record;

-- procedure de liberation de la memoire occupee par la cellule
procedure Liberer_Cellule is new Ada.Unchecked_Deallocation(Cellule, Lien);

end Liste_Ordonnee_G;
但是,在编译时,有一个错误: 所选组件“Arbre\u Binaire\u Recherche\u G”中的前缀无效
第行:

procedure Filtrer_acteur is new Arbre_Binaire_Recherche_G.Filtrer(Filtrage);  
在客户端文件中


如果我执行此实例化,则会出现错误。 但是如果我将我的泛型critere函数与其他泛型过程/函数放在一起,如下所示:

Arbre\u Binaire\u Recherche\u g.ads

generic
   TYPE Element IS PRIVATE;
   WITH FUNCTION "="(E1,E2 : IN Element) RETURN Boolean;
   WITH FUNCTION "<"(E1,E2 : IN Element) RETURN Boolean;
   WITH PROCEDURE Liberer_Element(E : IN OUT Element);
   WITH FUNCTION Element_To_String(E : IN Element) RETURN String;

package Arbre_Binaire_Recherche_g is

[...]

with function critere(E : in element) return Boolean;
 procedure Filtrer(A : in Arbre; B : out Arbre);
private
    TYPE Noeud;

  TYPE Arbre IS ACCESS Noeud;

  TYPE Noeud IS RECORD
     Info : Element;
     Gauche : Arbre;
     Droite : Arbre;
  END RECORD;

END Arbre_Binaire_Recherche_g;
WITH Arbre_Binaire_Recherche_G, Acteurs;  
USE Acteurs;


package ABR_acteurs is new Arbre_Binaire_Recherche_G(acteur,"=","<",Liberer_acteur,Acteur_To_String);
generic
   TYPE Element IS PRIVATE;
   WITH FUNCTION "="(E1,E2 : IN Element) RETURN Boolean;
   WITH FUNCTION "<"(E1,E2 : IN Element) RETURN Boolean;
   WITH PROCEDURE Liberer_Element(E : IN OUT Element);
   WITH FUNCTION Element_To_String(E : IN Element) RETURN String;
   with function critere(E : in element) return Boolean;
package ABR_acteurs is new Arbre_Binaire_Recherche_G(acteur,"=","<",Liberer_acteur,Acteur_To_String, Critere_acteur);
with Ada.Unchecked_Deallocation;

generic
   type Element is private;
   with function "<"(E1, E2 : in Element) return Boolean;
   with function "="(E1, E2 : in Element) return Boolean;
   with procedure Liberer_Element(E : in out Element);
   with function Element_To_String(E : in Element) return String;

package Liste_Ordonnee_G is

    type Liste is private;

 [...]

generic
    with function Critere(E:Element) return Boolean;

function Filtrer(L : Liste) return Liste;

private

type Cellule;
type Lien is access Cellule;
type Cellule is record
    Info : Element;
    Suiv : Lien;
end record;

type Liste is record
    Debut : Lien;
    Cardinal : Natural;
end record;

-- procedure de liberation de la memoire occupee par la cellule
procedure Liberer_Cellule is new Ada.Unchecked_Deallocation(Cellule, Lien);

end Liste_Ordonnee_G;
这里有critere(A.all.Info)

        if critere(A.all.Info) then  
           Inserer_element(B, A.all.info);  
        end if;  
        Filtrer_hihi(A.Droite, B);  
     end if;  
      end Filtrer;    
      if Critere(Aux.all.Info) then
     Inserer(Aux.all.Info, New_Liste);
      end if;
      Aux := Aux.all.Suiv;
   end loop;
   return New_Liste;
end Filtrer;
所以,如果我以这种方式实例化我的过程,这是正常的,因为(参见2)

  • 这就是我如何处理我的通用列表:
套餐列表或广告

generic
   TYPE Element IS PRIVATE;
   WITH FUNCTION "="(E1,E2 : IN Element) RETURN Boolean;
   WITH FUNCTION "<"(E1,E2 : IN Element) RETURN Boolean;
   WITH PROCEDURE Liberer_Element(E : IN OUT Element);
   WITH FUNCTION Element_To_String(E : IN Element) RETURN String;

package Arbre_Binaire_Recherche_g is

[...]

with function critere(E : in element) return Boolean;
 procedure Filtrer(A : in Arbre; B : out Arbre);
private
    TYPE Noeud;

  TYPE Arbre IS ACCESS Noeud;

  TYPE Noeud IS RECORD
     Info : Element;
     Gauche : Arbre;
     Droite : Arbre;
  END RECORD;

END Arbre_Binaire_Recherche_g;
WITH Arbre_Binaire_Recherche_G, Acteurs;  
USE Acteurs;


package ABR_acteurs is new Arbre_Binaire_Recherche_G(acteur,"=","<",Liberer_acteur,Acteur_To_String);
generic
   TYPE Element IS PRIVATE;
   WITH FUNCTION "="(E1,E2 : IN Element) RETURN Boolean;
   WITH FUNCTION "<"(E1,E2 : IN Element) RETURN Boolean;
   WITH PROCEDURE Liberer_Element(E : IN OUT Element);
   WITH FUNCTION Element_To_String(E : IN Element) RETURN String;
   with function critere(E : in element) return Boolean;
package ABR_acteurs is new Arbre_Binaire_Recherche_G(acteur,"=","<",Liberer_acteur,Acteur_To_String, Critere_acteur);
with Ada.Unchecked_Deallocation;

generic
   type Element is private;
   with function "<"(E1, E2 : in Element) return Boolean;
   with function "="(E1, E2 : in Element) return Boolean;
   with procedure Liberer_Element(E : in out Element);
   with function Element_To_String(E : in Element) return String;

package Liste_Ordonnee_G is

    type Liste is private;

 [...]

generic
    with function Critere(E:Element) return Boolean;

function Filtrer(L : Liste) return Liste;

private

type Cellule;
type Lien is access Cellule;
type Cellule is record
    Info : Element;
    Suiv : Lien;
end record;

type Liste is record
    Debut : Lien;
    Cardinal : Natural;
end record;

-- procedure de liberation de la memoire occupee par la cellule
procedure Liberer_Cellule is new Ada.Unchecked_Deallocation(Cellule, Lien);

end Liste_Ordonnee_G;
这里有critere(A.all.Info)

        if critere(A.all.Info) then  
           Inserer_element(B, A.all.info);  
        end if;  
        Filtrer_hihi(A.Droite, B);  
     end if;  
      end Filtrer;    
      if Critere(Aux.all.Info) then
     Inserer(Aux.all.Info, New_Liste);
      end if;
      Aux := Aux.all.Suiv;
   end loop;
   return New_Liste;
end Filtrer;
在这里,我实例化了没有函数critere的通用包:

liste\u ordonee\u actors.ads

function Filtrer(L : Liste) return Liste is
   New_Liste : Liste;
   Aux :Lien ;
begin
   Creer_Liste(New_Liste);
   Aux := L.Debut;
   while Aux /= null loop
with Acteurs, Liste_Ordonnee_G;
use Acteurs;

PACKAGE Liste_Ordonnee_Acteurs IS new Liste_Ordonnee_G(Acteur, "<", "=", Liberer_Acteur, Acteur_To_String);

列表实现工作正常!我不明白为什么树实现不起作用:(..

Arbre\u Binaire\u Recherche\u G
是您的通用包的名称。通用包不是包;它是一个模板,您可以通过实例化(定义实例)来创建包

filter
是通用包中声明的非通用过程

当你写作时:

procedure Filtrer_acteur is new Arbre_Binaire_Recherche_G.Filtrer(Filtrage);
您试图引用的
.filter
名称不是来自某个包,而
filter
本身甚至不是泛型

如果实例化
Arbre\u Binaire\u Recherche\u G
包,则可以引用该实例中定义的
filter
函数(这是一个包):


(但在泛型包中,泛型包的名称指的是当前实例,而不是泛型,因此
Arbre\u Binaire\u Recherche\u G.filter
在该上下文中是有效的过程名称。我不确定这是否与您的问题相关。)

Arbre\u Binaire\u Recherche\u G
是通用包的名称。通用包不是包;它是一个模板,您可以通过实例化(定义实例)来创建包

filter
是通用包中声明的非通用过程

当你写作时:

procedure Filtrer_acteur is new Arbre_Binaire_Recherche_G.Filtrer(Filtrage);
您试图引用的
.filter
名称不是来自某个包,而
filter
本身甚至不是泛型

如果实例化
Arbre\u Binaire\u Recherche\u G
包,则可以引用该实例中定义的
filter
函数(这是一个包):


(但在泛型包中,泛型包的名称指的是当前实例,而不是泛型,因此,
Arbre\u Binaire\u Recherche\u G.filter
在该上下文中是有效的过程名称。我不确定这是否与您的问题相关。)

对于列表版本,您必须

with Acteurs, Liste_Ordonnee_G;
use Acteurs;
PACKAGE Liste_Ordonnee_Acteurs
   IS new Liste_Ordonnee_G(Acteur, "<", "=", Liberer_Acteur, Acteur_To_String);
您成功地将其实例化为

function Filtrage (A : Acteurs.Acteur) return Boolean is
begin
   return Acteurs.Annee(A) = 2000;
end Filtrage;

function Filtrer is new Liste_Ordonnee_Acteurs.filtrer(Filtrage);
您在树版本中所做的工作相当于

function Filtrer is new Liste_Ordonnee_G.filtrer(Filtrage);
所以你需要改变

procedure Filtrer_acteur is new Arbre_Binaire_Recherche_G.Filtrer(Filtrage);


对于列表版本,您有

with Acteurs, Liste_Ordonnee_G;
use Acteurs;
PACKAGE Liste_Ordonnee_Acteurs
   IS new Liste_Ordonnee_G(Acteur, "<", "=", Liberer_Acteur, Acteur_To_String);
您成功地将其实例化为

function Filtrage (A : Acteurs.Acteur) return Boolean is
begin
   return Acteurs.Annee(A) = 2000;
end Filtrage;

function Filtrer is new Liste_Ordonnee_Acteurs.filtrer(Filtrage);
您在树版本中所做的工作相当于

function Filtrer is new Liste_Ordonnee_G.filtrer(Filtrage);
所以你需要改变

procedure Filtrer_acteur is new Arbre_Binaire_Recherche_G.Filtrer(Filtrage);


我认为他已经有了一个
实际的
包,即
ABR\u actors
。这就是他应该使用的。(另外,我认为
过滤器
可能实际上是一个通用过程,因为它前面有
函数
;关键字
generic
可能隐藏在
[…]
中)我认为他已经有了一个
实际的
包,即
ABR\u actors
。这就是他应该使用的。(另外,我认为
过滤器
可能实际上是一个通用过程,因为它前面有
函数
;关键字
generic
可能隐藏在
[…]
中)谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢!当然是这样!有时候,我会很傻!再次谢谢;-)!!谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢!当然是这样!有时候,我会很愚蠢!再次感谢;-)!!