Règles du forum

Le langage Ada uniquement, pas les compilateurs. Les questions de sémantique et de langage et les questions techniques liées à une application en particulier, son deux choses différentes. Si nécessaire, un forum sur GNAT et les autres compilateurs, tel JanusAda, sera ouvert.

Auteur Message
Beau Parleur
Avatar de l’utilisateur
Bonjour,
J'ai un problème, j'ai pas suivi de cours OO et j'arrive pas à saisir comment écrire la suite sans avoir de problème avec Gnat.

Le problème est un problème d'ambiguïté avec une fonction abstraite.

Voici l'erreur :
Citation : 
digitalizer-composer.adb:9:48: ambiguous expression (cannot resolve "Instrument_Id")
digitalizer-composer.adb:9:48: possible interpretation at digitalizer-midi-gm_instruments-virus.ads:8
digitalizer-composer.adb:9:48: possible interpretation at digitalizer-midi-gm_instruments.ads:10


Voici mes codes :


Source ada : 

package Digitalizer is   
pragma Pure (Digitalizer);
end Digitalizer;

Source ada : 

with Interfaces.C;
use Interfaces;
package Digitalizer.MIDI is

type MIDI_Name_Type is (VirusTI2);

end Digitalizer.MIDI;

Source ada : 

package Digitalizer.MIDI.GM_Instruments is

type GM_Instrument_Type(MIDI_Name : MIDI_Name_Type) is
abstract
tagged
record
null;
end record;

function Instrument_Id (GM_Instrument : in GM_Instrument_Type'Class)
return Integer is abstract;
end Digitalizer.MIDI.GM_Instruments;

Source ada : 

package Digitalizer.MIDI.GM_Instruments.Virus is

type VirusTI2_Type is new GM_Instrument_Type(VirusTI2) with
record
Identifiant : Integer := 0;
end record;

function Instrument_Id (VirusTI : in VirusTI2_Type)
return Integer;
end Digitalizer.MIDI.GM_Instruments.Virus;

Source ada : 

package body Digitalizer.MIDI.GM_Instruments.Virus is

function Instrument_Id (VirusTI : in VirusTI2_Type'Class) return Integer is
begin
return VirusTI.Identifiant;
end Instrument_Id;

end Digitalizer.MIDI.GM_Instruments.Virus;

Source ada : 

with Digitalizer.MIDI.GM_Instruments;
use Digitalizer.MIDI;
generic
GM_Instrument : MIDI.GM_Instruments.GM_Instrument_Type 'Class;
package Digitalizer.Composer is
function Instrument_Id return Integer;
end Digitalizer.Composer;

Source ada : 

with Digitalizer.MIDI.GM_Instruments.Virus;
use Digitalizer.MIDI.GM_Instruments.Virus;
package body Digitalizer.Composer is

function Instrument_Id return Integer is
begin
case Gm_Instrument.MIDI_Name is
when VirusTI2 =>
return VirusTI2_Type(GM_Instrument).Instrument_Id;
when others =>
raise Program_Error;
end case;
end Instrument_Id;
end Digitalizer.Composer;





Source ada : 

-- Digializer is small virtual MIDI composer.
-- Digitalizer Copyright 2015 (C) Manuel De Girardi.
with Ada.Text_Io;
with Ada.Integer_Text_Io;
use Ada;
with Digitalizer.MIDI.GM_Instruments;
with Digitalizer.MIDI.GM_Instruments.Virus;
use Digitalizer.MIDI.GM_Instruments;
use Digitalizer.MIDI.GM_Instruments.Virus;
use Digitalizer;
with Digitalizer.Composer;
procedure Main is
begin

declare

VirusTI2 : VirusTI2_Type;
package Composer is new Digitalizer.Composer(GM_Instrument => VirusTI2);
begin

Text_Io.Put_Line("GM Instrument Id : ");
Integer_Text_Io.Put(Composer.Instrument_Id);
Text_Io.New_Line;
end;
end Main;



Je souhaiterais simplement récupérer l'Id de l'istrument VirusTI2.


Si vous pouviez me donner un petit coup de main ?
S'il vous plaît !
Merci.
Profil
zen
Modératrice
Avatar de l’utilisateur
Image Peut être que Hibou pourra t'aider mais moi en tout cas je sèche complètement. Ce n'est vraiment pas du tout ma partie. Désolée.
Profil
Beau Parleur
Avatar de l’utilisateur
Bonjour Zen !

Je peux pas t'aider pour comprendre, je n'y connais pas grand chose non plus.

Néanmoins, j'ai solutionné mon problème.

En fait, j'ai mal placé l'attribut 'Class aux paramètres de la fonction Instrument_Id.

En supprimant cet attribut des paramètres, ça compile bien.

Merci à toi en tout cas.
Et merci à Hibou quand même.
Profil