адресное представление в аде - PullRequest
1 голос
/ 27 апреля 2010

Я вставил приведенный ниже код на языке 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); --'

Теперь я сомневаюсь, что 1) что на самом деле означает P2 + Storage_Offset '(4). Значит ли это, что он возвращает адрес следующего элемента в массиве, который является' B'.Storage_Offset '(4) в Аде - -значает ли это 4 бита или 4 байта памяти. 2) Если я предполагаю, что Last_Address указывает на последний элемент массива, который равен 'K', как арифметический Storage_Offset '(40) удовлетворяет фактической реализации?

Пожалуйста, вернись ко мне, если тебе нужны дополнительные разъяснения.

Пожалуйста, предположите, что функция не существует. На самом деле у меня есть некоторый файл ada, и моя работа заключается в том, чтобы преобразовать их в файлы C. Так как я новичок в ada, у меня возникло много проблем с этим. Прошу прощения, если возникла путаница

Спасибо Мэдди

Ответы [ 2 ]

2 голосов
/ 28 апреля 2010
my_func(int P1,int P2)
{
  return P2 + Storage_Offset'(4);
}

Ну, это функция C, тело которой написано на Аде.Нет оператора «+», принимающего Integer и Storage_Offset;возможно, вы ищете

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

и, возможно, вы хотели позвонить my_func(something, Next_Address)?

В этом случае выражение будет возвращать адрес любого 4 Storage_Element с,т. е. байты, после Myarr('A').

Myarr_Type - это массив Character, который при любом обычном компиляторе в любой обычной архитектуре будет представлять собой стандартный 8-битный байт.Таким образом, Myarr_Type объекты будут иметь длину 11 байт, а не 44, а Myarr('A')'Address + 4 будет адресом Myarr('E').

. Если вам нужен адрес последнего элемента Myarr, попробуйте * 1020.*

Myarr (Myarr'Last)'Address
2 голосов
/ 28 апреля 2010

Storage_Offset - это специальный целочисленный тип в пакете System.Storage_Elements, который можно добавлять к объектам типа System.Address. То, что именно являются единицами Address и Storage_Offset, определяется реализацией, но, вероятно, почти каждая существующая реализация использует байты. Таким образом, Next_Address + Storage_Offset'(4) означает «адрес, который проходит через четыре байта независимо от того, на что ссылается Next_Address».

Вы немного говорили о переносе Ады. В 99% случаев это очень глупая идея (% 1 - это когда вам нужно портировать на платформу без компилятора Ada). Я бы сказал то же самое, независимо от того, на каком языке вы портируете. Это дурацкая игра. лучший результат, на который вы можете надеяться при переносе кода, заключается в том, что после огромных усилий он работает так же, как и раньше. С кодированием лучшего случая никогда не бывает.

Ada может нормально взаимодействовать с C, так что было бы намного разумнее хранить неизменный код в Ada и только "порт" вещи, которые вам нужно изменить.

Если вы столкнетесь с каким-либо кодом задач, защищенными типами или пользовательскими потоками, вы окажетесь в мире боли. Эти вещи не имеют простых аналогов С.

Если у ваших боссов действительно есть стояк для C или чего-то еще, я бы посоветовал изучить AdaMagic Sofcheck , который предоставляет сервис для преобразования кода Ada в ANSI C. Назад в тот день (два владельца ранее ) они привыкли утверждать, что он производит поддерживаемый код C. В любом случае, это, вероятно, будет намного дешевле, чем если бы неопытный (на Аде) разработчик попытался сделать все вручную.

...