2010-04-27 17 views
1

J'ai collé un code ci-dessous qui est en langage Ada. J'ai besoin de quelques précisions sur certaines implémentations.représentation de l'adresse dans l'ada

C : character; 

    Char : character; 
    type Myarr_Type is array (character range 'A'..'K') of character; 
    Myarr : Myarr_Type := ('A','B','C','D','E','F','G','H','I','J','K'); 

    Next_Address := Myarr'address --' 
    Last_Address := Next_Address + Storage_Offset'(40); --' 

    return P2 + Storage_Offset'(4); --' 

    Last_Address := Next_Address + Storage_Offset'(4); --' 

Maintenant, mon doute est 1) qu'est-ce que P2 + Storage_Offset '(4) en fait mean.Does que cela veut dire que son retour l'adresse de l'élément suivant du tableau qui est « B'.Storage_Offset » (4) dans Ada - cela signifie 4 bits ou 4 octets de mémoire. 2) Si je suppose que Last_Address pointe vers le dernier élément du tableau qui est 'K', comment l'arithmétique Storage_Offset '(40) satisfait-elle l'implémentation réelle?

S'il vous plaît revenir à moi si vous avez besoin de plus de précisions.

Veuillez supposer que la fonction n'existe pas. En fait, j'ai un fichier ada et mon travail consiste à les convertir en fichiers C. Depuis que je suis un débutant dans l'ada, j'ai fait face à beaucoup de problèmes avec cela.S'il vous plaît pardon en cas de confusion

Merci Maddy

+0

S'il vous plaît jeter un oeil à votre question et d'examiner comment on est censé donner un sens. Aussi ** accepter plus de réponses **. –

+0

Pourriez-vous me dire quelle partie de la question n'est pas claire? Il vaudrait mieux ne pas simplement dire que cette question n'est pas claire. – maddy

+1

D'où vous venez, c'est * pas * "en langue Ada". Il montre tout signe d'avoir été * littéralement * traduit de Fortran ou C ou quelque chose. Aucun programmeur Ada, même marginalement compétent, n'écrirait de code comme celui-ci. Moi ou quelqu'un d'autre ici pourrait simplement vous lire le code et dire ce qu'il fait, mais vous pouvez le lire en lisant vous-même le code. Ce que l'on ne comprend pas, c'est ce que ce code est supposé vouloir accomplir; Si nous le savons, si nous pouvons «comprendre», nous pourrons mieux expliquer ce que le code veut dire. (Et oui, acceptez plus de réponses.) –

Répondre

2

Storage_Offset est un type spécial dans le paquet System.Storage_Elements Intégrale qui peut être ajouté à des objets de type System.Address. Qu'est-ce exactement les unités de Address et Storage_Offset est la mise en œuvre définie, mais probablement à peu près toutes les implémentations en existence utilise des octets. Donc Next_Address + Storage_Offset'(4) signifie "l'adresse quatre octets après tout ce que Next_Address fait référence."

Vous avez parlé un peu du portage Ada. Dans 99% des cas, c'est une idée très stupide (le% 1 étant quand vous devez porter sur une plate-forme qui n'a pas de compilateur Ada). Je dirais la même chose, peu importe la langue que vous portez. C'est un jeu de fous. Le meilleur résultat vous pouvez espérer lorsque le code de portage est que, après une tonne d'efforts, il fonctionne aussi bien qu'avant. Avec le codage, le meilleur cas ne se produit jamais. Ada peut très bien s'interfacer avec C, il serait donc bien plus intelligent de conserver le code inchangé dans Ada et de ne modifier que les paramètres "port".

Si vous rencontrez un code de tâche, des types protégés ou des flux personnalisés, vous serez dans un monde blessé. Ces choses n'ont pas vraiment d'analogues C faciles. Si vos patrons ont vraiment un boner pour C ou quelque chose, je suggère de regarder Sofcheck's AdaMagic, qui fournit un service pour transformer le code Ada en ANSI C. Retour dans la journée (deux propriétaires avant) ils prétendaient que il a produit le code C maintenable. De toute façon, il sera probablement beaucoup moins cher que d'avoir un développeur inexpérimenté (dans Ada) essayer de le faire à la main.

2
my_func(int P1,int P2) 
{ 
    return P2 + Storage_Offset'(4); 
} 

Eh bien, c'est une fonction C dont le corps est écrit en Ada. Il n'y a pas d'opérateur "+" prenant un Integer et un Storage_Offset; peut-être que vous cherchez

function "+"(Left : Address; Right : Storage_Offset) 
return Address; 

et peut-être que vous vouliez appeler my_func(something, Next_Address)?

Dans ce cas, l'expression renverra l'adresse de tout ce qui est 4 Storage_Element s, c'est-à-dire octets, après Myarr('A').

Myarr_Type est un tableau de Character, qui avec tout compilateur normal sur une architecture commune va être un octet standard de 8 bits.Donc, Myarr_Type objets seront 11 octets de long, pas 44, et Myarr('A')'Address + 4 sera l'adresse de Myarr('E').

Si vous souhaitez que l'adresse du dernier élément de Myarr, essayez

Myarr (Myarr'Last)'Address