Преобразование Фортрана 77 кодов к C++

Использование EditText setOnClickListener будет работать, если вы установите setTextIsSelectable в true.

В XML:

<android.support.design.widget.TextInputLayout 
    android:id="@+id/textInpuLayout" 
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:hint="@string/hint_edit_text" 
    app:layout_constraintEnd_toEndOf="parent" 
    app:layout_constraintStart_toStartOf="parent" 
    app:layout_constraintTop_toTopOf="parent">

<android.support.design.widget.TextInputEditText 
    android:id="@+id/textInpuEditText" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:enabled="false" 
    android:inputType="date"/>
</android.support.design.widget.TextInputLayout>

В соответствующем фрагменте или задании :

mTextInpuEditText.setEnabled(true);
mTextInpuEditText.setTextIsSelectable(true);
mTextInpuEditText.setFocusable(false);
mTextInpuEditText.setFocusableInTouchMode(false);
mTextInpuEditText.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Log.d(TAG, "Edit Text is clicked");
    }
});
14
задан Todd Gamblin 17 June 2009 в 09:13
поделиться

6 ответов

Это добавляет к совету EvilTeach. Следует иметь в виду, что довольно легко связать Фортран 77 и код C/C++, таким образом, можно преобразовать части приложения инкрементно и связать их вместе со старыми частями. Необходимо будет думать обо всех обычных fortran/c несоответствиях (row/column-major массивы, индексация массива, и т.д.), если бы Вы делаете это, но она сохранила бы Вас боль отладки Вашей всей автопереведенной кодовой базы сразу.

Существует много больших гибридных кодов как это в соотечественнике (DOE) лаборатории, которые имеют значительные инвестиции в старый код Фортрана. Если Вы идете этим путем, Вы могли бы рассмотреть использование Babel, который был разработан, чтобы позволить компонентам быть совместно использованными C, C++, Фортраном, Fortran90, Python и Java все в том же приложении. Мотивация для этого в лабораториях связывает модели физики, созданные различными командами для действительно больших моделирований, но Вы могли бы найти это полезным для перехода Вашего кода, также. Это активно сохраняется и используется на большом количестве проектов, хотя это могло бы быть немного слишком сложно, для какого Вы пытаетесь сделать.

10
ответ дан 24 October 2019 в 05:06
поделиться

Я когда-то использовал это: http://manpages.ubuntu.com/manpages/hardy/man1/f2c.html для преобразования маленькой программы Фортрана в C. Преобразование было успешно. Код не был значительно сложен для обнаружения любого вида изменения скорости.

Так как Ваша программа, выделяют больше, я действительно не знаю, собирается ли все работать как она, сделал со мной.

3
ответ дан 24 October 2019 в 05:06
поделиться

Вы могли бы хотеть изучить Promula. Это производит больше читаемого кода C, чем много других автоматических переводчиков. Я не использовал Promula непосредственно, но я преобразовал изрядное количество вывода Promula от C до C++. Легко очистить код C к легальному C++, но конечно это прилагает больше усилий для создания этого действительно хорошим C++.

2
ответ дан 24 October 2019 в 05:06
поделиться

Существует много вещей рассмотреть.

Существует действительно два пути для взятия. Нужно сделать прямую линию с методической точностью преобразование в c. Этим я значу каждый оператор Фортрана для equalivant c оператор.

Другой путь для взятия является переписыванием, и с 500k местоположением +, который был бы намного большим количеством работы. С таким размером я, конечно, искал бы инструмент, чтобы сделать перевод, как f2c.

Проблемы для прямого порта...

gotos переводят непосредственно, необходимо будет создать маркировки для целей goto.

label10:;

    goto label10;

Индексирование массива является potiential проблемой. c является базирующимся нулем, Фортран равняется 1 базирующемуся, таким образом, массивы должны быть определены размеры одно большее в коде Фортрана.

real*4 (10,20) становится

#define XMAX 10 + 1
#define YMAX 20 + 1 
float a[XMAX][YMAX];

разрешение цикла быть записанным как это.

for (x = 1; x <= XMAX; x++)
    for (y = 1; y <= YMAX; y++)
        a[x][y] = 0.0f;

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

real*8 (XMAX, YMAX) (4,2) = 3.14

#define A(X,Y)  a[Y][X]
double a[XMAX][YMAX];
A(4,2) = 3.14;

единица Фортрана io может быть моделирована с файлами типа stdio. если Вы используете единицу 19, то

FILE *fp19 = fopen("file","mode");

Могут быть проблемы с механизмом управления кареткой при использовании механизма управления кареткой Фортрана в файлах. На единицы 5 и 6 можно просто сослаться с stdin и stdout без fopen.

Много форматов может быть обработано с printf семейством функций. Вам, вероятно, придется добавить, что дополнительные циклы для контакта с частью Фортрана выстраивают io.

ЗАПИШИТЕ (6, 200) (PROJ (z, 4), z = 1, 20)

int z;
for (z = 1, z <= 20; z++)
    printf("%lf ", proj[z][4]);


o использующий f2c, вероятно, самый быстрый способ сделать это. Затем Вы застреваете с его rtl.
o выполнение порта для прямого обращения выполнимая вещь сделать. Трудоемкий, но выполнимый
o, если бы Вы хотите поддержать его длительный срок, я рекомендовал бы переписывание. Очень трудоемкий, вероятно, быстрее, но более удобный в сопровождении в конечном счете

Счастливо в любом случае у Вас есть исходная программа для использования в качестве базовой линии для создания ряда модульных тестов для помощи в усилии по разработке.

9
ответ дан 24 October 2019 в 05:06
поделиться

Я работал над приложением, которое, по сути, было преобразовано из кода FORTRAN с использованием for_c . Созданный им код был ужасен. Это было очень сложно поддерживать, так как большая часть информации была неразборчивой. К счастью, этот код был довольно стабильным, и редко когда с ним нужно было что-то делать.

Однако это было сделано много лет назад - примерно в первые 16-битные годы Windows. Может, for_c сейчас лучше?

0
ответ дан 24 October 2019 в 05:06
поделиться

Моя реакция - почему вы хотите его преобразовать.

Вопрос о том, как разработать продукт с большой базой кода Fortran, рассматривался многими компаниями в 1990-х годах. То есть конвертировать, оставаться с Фортраном или производить гибрид. Я думаю, что большинство выбрало гибридный подход, обычно C ++ для пользовательского интерфейса и исходную базу кода Fortran в фоновом режиме.

Я предлагаю взглянуть на «Смешанное языковое программирование с использованием C ++ и FORTRAN 77» Карстена Арнхольма, доступное по адресу http://arnholm.org/software/cppf77/cppf77.htm В первые дни Интернета этот документ имел хорошие ссылки.

В этом документе описывается, как получить приложение, содержащее C ++ и Фортран. Эта книга учит C ++ для программистов на Фортране. В нем есть несколько примеров написания оберток для кода Fortran из C ++. Это хорошая книга по C ++, игнорирующая аспект Fortran. Он был написан до того, как был установлен стандарт, но различия не очень большие.

6
ответ дан 24 October 2019 в 05:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: