Я написал расширение PHP для доступа к функциям в статической библиотеке, я построил PHP как CGI, и все, казалось, работало (после нескольких дней работы над этим..)
Взволнованный тем, что все заработало, я перекомпилировал PHP без отладочных сообщений, которые у меня были. (php_printf("here111");
.... php_printf("sending arguments...");
)
Потом он просто перестал работать. Функция, которую я вызываю в статической библиотеке, работает, я проверил ее, вызвав ее непосредственно из другого исполняемого файла.
Я построил PHP с символами отладки (--enable-debug
) и могу до некоторой степени отладить его в gdb.
Я все еще пытаюсь понять, что не так. Кажется, что функция в библиотеке (diffFst
) не может прочитать входные аргументы.
268 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ssssssd",
269 &filA, &filA_len,
270 &nomvarA, &nomvarA_len,
271 &filB, &filB_len,
272 &nomvarB, &nomvarB_len,
273 &filO, &filO_len,
274 &newnomvar, &newnomvar_len,
275 &mult
276 ) == FAILURE) {
277 RETURN_LONG(-100);
278 }
279
280 php_printf("Read arguments:\nfilA: %s, nomvara: %s\nfilB: %s, nomvarB: %s\nfilO: %s, nomvarO: %s\nMult: %0.3f\n",
281 filA,nomvarA, filB,nomvarB, filO,newnomvar, mult);
282
285 ier = difffst_(filA,nomvarA, filB,nomvarB, filO,newnomvar, mult);
Когда я вызываю эту функцию, оператор php_printf()
работает и выводит правильные значения. Однако, когда я позволяю ей вызывать функцию difffst_, я получаю segfault, когда она пытается прочитать входные переменные.
Функция diffFst написана на фортране:
5 function diffFst(filA, nomvara, filB, nomvarb, filO, newnomvar, change, write_tictac, in_verbose) result(ier)
10 implicit none
11
12 character (len=*), intent(IN) :: filA, filB, filO
13 character (len=*), intent(IN) :: nomvara, nomvarb, newnomvar
14
16 real, intent(IN) :: change
17 logical, intent(IN) :: write_tictac
18
19 logical, intent(IN), optional :: in_verbose
21 logical :: verbose = .false.
27 integer :: ier
...
117 ier = fstouv(iuna, 'RND')
118 IF (ier < 0) THEN
119 if (verbose) write(stderr,'(2A)') "Could not fstouv FST file ", trim(filA)
120 ELSE
121 nmax = fstnbr(iuna);
122 if (verbose) write(stdout,'(3A,I6,A)') "Succesfully opened ", trim(filA), ' with ', nmax, ' records'
123 allocate(liste(nmax))
124 END IF
В частности, он терпит неудачу в строке 122 (согласно отладчику), когда пытается прочитать filA
.
Я понятия не имею, почему, я пробовал:
- Превращение функции в подпрограмму
- Преобразование функции в функцию фортрана
- Превращение функции в «чистую» функцию
- Наличие возвращаемых значений (это то, что есть сейчас,
ier = ..
) - Наличие
return
операторов в коде, удалениеreturn
операторов - Пробовал распечатывать данные на стандартный вывод и в файлы журналов.
Просто кажется, что данные не передаются должным образом. Даже в отладчике я не могу прочитать аргументы.
Разочаровывает то, что в какой-то момент это просто сработало. Я проверил права доступа к файлам, проверил пути и т. Д. И я могу нормально запустить функцию из исполняемого файла оболочки fortran.
Есть ли трюк, который мне не хватает?
Спасибо
make clean
отредактировал, перестроил... и т. д. - person Matt   schedule 02.01.2013character (len=*)
, C передает указатель, и Фортран не может его прочитать. Работаю над решением, опубликую, как только смогу заставить его работать. - person Matt   schedule 02.01.2013