Как мне более удобным образом передать эту строку C# в Фортран?C#

Место общения программистов C#
Ответить
Anonymous
 Как мне более удобным образом передать эту строку C# в Фортран?

Сообщение Anonymous »

В настоящее время у меня есть база кода, написанная на Фортране, а код взаимодействия написан на C#. В коде Фортрана имеется множество структур. Все массивы и строки имеют фиксированный размер. В C# и Fortran существуют повторяющиеся определения этих структур. Например,

Код: Выделить всё

type :: my_type
character(4) :: foo
end type

Код: Выделить всё

[StructLayout(LayoutKind.Sequential)]
public struct MyType
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
byte[] Foo;
}
Мы используем здесь byte[], потому что символ (4) в Фортране представляет собой строку из четырех символов без нулевого терминатора. Это работает хорошо, однако взаимодействовать с кодом C# сложно, потому что вам приходится постоянно преобразовывать byte[] в строку, а также потому, что значение массива по умолчанию равно нулю . Но если я объявлю Foo как строку C#, маршаллер добавит \0 в конец, что нарушит работу Фортрана.
Если я завернул byte[]< /code> в пользовательской структуре я могу объявить неявные преобразования строк:

Код: Выделить всё

[StructLayout(LayoutKind.Sequential)]
public struct MyStringWrapper
{
private byte[] value;
public static implicit operator string(MyStringWrapper w) => Encoding.ASCII.GetString(w.value);
public static implicit operator MyStringWrapper(string s)
{
MyStringWrapper w;
w.value = Encoding.ASCII.GetBytes(s);
return w;
}
}
Но теперь я не знаю, как применять атрибуты в MyType к полям типа MyStringWrapper, чтобы правильно маршалировать базовое значение , как фиксированный буфер. Обратите внимание: не все экземпляры MyStringWrapper будут иметь одинаковый фиксированный размер. Итак, я ищу либо
  • способ объявить поля непосредственно как строки и упорядочить их значения ASCII фиксированного размера без нулевых значений. терминаторы
  • способ использовать эту оболочку и передавать ей любые атрибуты для маршалинга или что-то еще, что необходимо, чтобы это работало
  • что-то еще, чтобы получить это работает
Существует около 200 таких объявлений строк фиксированного размера. Я бы хотел избежать объявления нового типа для каждой длины фиксированной строки, поскольку их несколько десятков.

Подробнее здесь: https://stackoverflow.com/questions/793 ... enient-way
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»