представление адреса в 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) в Ada -- делает это означает 4 бита или 4 байта памяти. 2) Если я предполагаю, что Last_Address указывает на последний элемент массива, который равен «K», как арифметическое Storage_Offset (40) удовлетворяет фактической реализации?

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

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

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


person maddy    schedule 27.04.2010    source источник
comment
Пожалуйста, взгляните на свой вопрос и подумайте, как кто-то должен его понять. Также принимайте дополнительные ответы.   -  person Marcelo Cantos    schedule 27.04.2010
comment
Пожалуйста, скажите мне, какая часть вопроса неясна? Было бы лучше, чем просто пометить этот вопрос как неясный.   -  person maddy    schedule 27.04.2010
comment
Откуда бы вы это ни взяли, это не на языке Ада. Он показывает все признаки того, что он был буквально переведен с Фортрана или Си или чего-то подобного. Ни один даже немного компетентный программист на Аде не стал бы писать такой код. Я или кто-то другой здесь мог бы просто прочитать код и сказать, что он делает, но вы можете получить это, прочитав код самостоятельно. Что не понятно, так это то, что этот код должен пытаться выполнить; если мы это знаем, если мы можем понять это, тогда мы можем дать лучшее объяснение того, что означает код. (И да, принимайте больше ответов.)   -  person Marc C    schedule 27.04.2010
comment
Переформатированный код; пожалуйста, верните, если неправильно.   -  person trashgod    schedule 27.04.2010
comment
Я переписал большую часть своего ответа на основе вашего последнего редактирования.   -  person T.E.D.    schedule 29.04.2010


Ответы (2)


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_Elements, то есть байтам, после Myarr('A').

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

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

Myarr (Myarr'Last)'Address
person Simon Wright    schedule 27.04.2010

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

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

Ада может прекрасно взаимодействовать с C, поэтому было бы гораздо разумнее оставить неизмененный код в Аде и только «портировать» то, что вам нужно изменить.

Если вы столкнетесь с каким-либо кодом задач, защищенными типами или пользовательскими потоками, вам будет очень больно. У этих вещей нет простых аналогов C.

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

person T.E.D.    schedule 27.04.2010