Доступ к модулю Fortran PARAMETER из python с использованием ctypes [duplicate]

Js - однопоточная.

Браузер можно разделить на три части:

1) Event Loop

2 ) Web API

3) Очередь событий

Событие Loop запускается вечно, т. Е. Тип бесконечного цикла. Очередь ожидания - это то, где вся ваша функция нажимается на какое-либо событие (пример: нажмите) this один за другим выполняется в очереди и помещается в цикл «Событие», который выполняет эту функцию и подготавливает ее для следующего после первого запуска. Это означает, что выполнение одной функции не начинается до тех пор, пока функция, перед которой она в очереди не будет выполнена цикл событий.

Теперь давайте подумаем, что мы поставили две функции в очереди, чтобы получить данные с сервера, а другой использует эти данные. Мы сначала нажали функцию serverRequest () в очереди, а затем применили функцию Data () , Функция serverRequest переходит в цикл событий и делает вызов на сервер, так как мы никогда не знаем, сколько времени потребуется для получения данных с сервера, поэтому ожидается, что этот процесс займет много времени, и поэтому мы заняли наш цикл событий, тем самым повесив нашу страницу, вот где Web API входит в эту роль, он принимает эту функцию из цикла событий и обращается к серверу, создающему цикл событий, так что мы можем выполнить следующую функцию из очереди. Следующая функция в очереди - useData (), которая идет в цикле, но из-за отсутствия данных отходы и выполнение следующей функции продолжаются до конца очереди (это называется Async-вызовом, то есть мы можем сделать что-то еще, пока не получим данные)

Предположим, что наша функция serverRequest () имела оператор возврата в код, когда мы возвращаем данные с сервера Web API, будет выталкивать его в очередь в конце очереди. По мере того, как он заканчивается в очереди, мы не можем использовать его данные, поскольку в нашей очереди нет функции, чтобы использовать эти данные. Таким образом, невозможно вернуть что-то из Async Call.

Таким образом, решение этой проблемы callback или обещают .

A Изображение из одного из ответов здесь, правильно объясняет использование обратного вызова ... Мы (функция, использующая данные, возвращаемые с сервера), чтобы вызвать вызывающий сервер.

 function doAjax(callbackFunc, method, url) {
  var xmlHttpReq = new XMLHttpRequest();
  xmlHttpReq.open(method, url);
  xmlHttpReq.onreadystatechange = function() {

      if (xmlHttpReq.readyState == 4 && xmlHttpReq.status == 200) {
        callbackFunc(xmlHttpReq.responseText);
      }


  }
  xmlHttpReq.send(null);

}

В моем коде он называется

function loadMyJson(categoryValue){
  if(categoryValue==="veg")
  doAjax(print,"GET","http://localhost:3004/vegetables");
  else if(categoryValue==="fruits")
  doAjax(print,"GET","http://localhost:3004/fruits");
  else 
  console.log("Data not found");
}

Прочитайте здесь новые методы в ECMA (2016/17) для создания асинхронного вызова (@Felix Kling Answer сверху) https://stackoverflow.com/a/14220323/7579856

4
задан Martijn Pieters 30 January 2015 в 14:02
поделиться

2 ответа

Это действительно должно быть сохранено в файле .mod. Все типы данных и прототипы функций хранятся там, поэтому вам нужно включить его, когда вы отправляете кому-то файл .lib.

По сути, файл .mod выполняет ту же задачу, что и файл .h в c, поэтому, конечно, вы будете иметь чтобы включить его в вашу библиотеку.

[update:] Если вы пытаетесь использовать это в C, то, как вы сказали, нет средств для упрощения сохранения именованной константы. В качестве альтернативы вы можете использовать защищенный атрибут для объекта. По крайней мере, с Fortran, все, что находится вне модуля, ограничено записью в переменную. Я не знаю, будет ли компилятор C и компоновщик уважать это поведение, но я думаю, что это, вероятно, ваш лучший снимок.

module testMOD
 INTEGER, PROTECTED, BIND(C)  :: globalvar = 1
end module testMOD

К сожалению, я не очень много разбираюсь в интероперабельности с C, поэтому я не могу гарантировать, что C будет уважать защищенный атрибут и не позволять изменять переменную.

4
ответ дан Davron 22 August 2018 в 08:50
поделиться
  • 1
    – Eli Lansey 4 February 2013 в 22:27
  • 2
    Это правда. Таким образом, вы хотите, чтобы код также использовался компилятором c и все еще имел доступный параметр. Мне нужно подумать об этом. Я добавлю что-нибудь, когда придумаю. – Davron 4 February 2013 в 22:30
  • 3
    Используете ли вы какие-либо функции языка 2003, чтобы сделать его совместимым с c? – Davron 4 February 2013 в 22:32
  • 4
    Я использую ISO_C_Binding, когда это необходимо. На самом деле это небольшая часть большей базы кода, которая должна связываться с кодами C и Fortran. – Eli Lansey 4 February 2013 в 22:33
  • 5
    Атрибут protected выделяет это как переменную, тогда как parameter является константой, однако, хотя она является переменной, но пространство не может быть изменено, кроме как внутри этого модуля. Таким образом, вы можете изменить его в этом модуле, если вы изменили его с помощью подпрограммы. Если у вас есть функция или подпрограмма в модуле или, возможно, даже метод типа, вы также можете изменить эту переменную, пока тип был объявлен и распределен внутри модуля. Для внешнего пользователя вашей библиотеки разница заключается в том, что она появится в объектном файле, тогда как параметр `параметр не будет. – Davron 4 February 2013 в 23:45

Как отмечали другие, параметр является именованной константой, и реализации могут не выделять память для этой константы в объектном коде (особенно для скаляров).

Ваша библиотека должна предоставить заголовочный файл для вашего C клиентов. Вы можете определить значение параметра Fortran в этом заголовочном файле, либо с помощью #define или const.

Это требует поддержания значения параметра в двух местах, но у вас уже есть это бремя обслуживания с другими аспекты интерфейса библиотеки.

4
ответ дан IanH 22 August 2018 в 08:50
поделиться
  • 1
    У меня уже есть заголовки, но у них просто есть что-то вроде extern "C" int testmod_mp_thisissaved_. Полагаю, я могу поработать с моим файлом makefile, чтобы он заполнил значения, указанные в файле заголовка. – Eli Lansey 5 February 2013 в 16:51
  • 2
  • 3
    Будет ли использование bind(C) влиять на то, как коды Fortran взаимодействуют с библиотекой? – Eli Lansey 6 February 2013 в 16:31
  • 4
    Для переменных - помимо перекомпиляции (атрибут изменит имя, используемое компоновщиком) - нет. Для процедур - они должны иметь явный интерфейс (при условии, что процедуры модуля автоматически имеют явный интерфейс). Для обоих случаев (процедуры и переменные) атрибут BIND (C) налагает дополнительные требования (ограничения) на предмет, объявляемый / определенный, но обычно, если вы хотите, чтобы что-то было интероперабельным, вы уже сталкивались с этими ограничениями - например. компилятор Companion C для процессора F2008 не будет иметь понятия о указателях Fortran, allocatables и т. д. – IanH 6 February 2013 в 22:34
Другие вопросы по тегам:

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