Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Fortran中的排序,未定义对qsort的引用__Linux_Fortran - Fatal编程技术网

Linux Fortran中的排序,未定义对qsort的引用_

Linux Fortran中的排序,未定义对qsort的引用_,linux,fortran,Linux,Fortran,我是fortran和Linux的初学者。我在Linux上运行了一个名为demo.f90的简单fortran程序。然后发生了一个错误,如下所示 /tmp/cckAhxOW.o: In function `MAIN__': demo.f90:(.text+0x25): undefined reference to `qsort_' 代码附在下面 program trand external compar integer*2 compar INTEGER*4 array(10)/5,1,9,0

我是fortran和Linux的初学者。我在Linux上运行了一个名为
demo.f90
的简单fortran程序。然后发生了一个错误,如下所示

/tmp/cckAhxOW.o: In function `MAIN__':
demo.f90:(.text+0x25): undefined reference to `qsort_'
代码附在下面

program trand

external compar

integer*2 compar

INTEGER*4 array(10)/5,1,9,0,8,7,3,4,6,2/,l/10/,isize/4/

call qsort( array, l, isize, compar )

write(*,'(10i3)') array

end program trand

integer*2 function compar( a, b )

INTEGER*4 a, b

if ( a .lt. b ) compar = -1

if ( a .eq. b ) compar = 0

if ( a .gt. b ) compar = 1

return

end function compar

qsort
不是内置子例程(也称为内部子例程)


您需要告诉程序在哪里可以找到它,例如,通过加载包含此子例程的模块(请参见
使用
关键字)。

尝试包括“libfui.a”库您最好将
比较
放入模块并
使用它。这种方法将允许编译器检查子例程调用与其声明之间的一致性。如果主程序和模块在同一个文件中,请将模块放在第一位

module MySubs

contains

integer*2 function compar( a, b )
...
end function compar

end module MySubs

program trand

use MySubs
use SomeMod

....

end program trand
其中
SomeMod
是另一个文件SomeMod.f90中的模块,带有排序例程qsort。然后编译并链接:

gfortran SomeMod.f90 trand.f90

或者您正在使用的任何编译器和文件名。带有
qsort
的文件需要在带有
program trand
的文件之前

qsort
实际上是一个C标准库函数。您必须声明它的接口。事情是这样的:

module Sort
  use iso_c_binding

  implicit none

  interface
    subroutine qsort(array,elem_count,elem_size,compare) bind(C,name="qsort")
      import
      type(c_ptr),value       :: array
      integer(c_size_t),value :: elem_count
      integer(c_size_t),value :: elem_size
      type(c_funptr),value    :: compare !int(*compare)(const void *, const void *)
    end subroutine qsort !standard C library qsort
  end interface
end module Sort


program trand

use Sort

external compar

integer(c_int) compar

integer(c_int),target :: array(10) = [5,1,9,0,8,7,3,4,6,2]
integer(c_size_t) l/10/,isize/4/

call qsort( c_loc(array(1)), l, isize, c_funloc(compar) )

write(*,'(10i3)') array

end program trand

integer(c_int) function compar( a, b ) bind(C)
use iso_c_binding

integer(c_int) a, b

if ( a .lt. b ) compar = -1

if ( a .eq. b ) compar = 0

if ( a .gt. b ) compar = 1

end function compar

然后像你那样编译。使用gfortran 4.8测试成功。

您没有将程序链接到包含qsort@user3163883如何构建?@user3163883您可以看看gfortran demo.f90-o demoThis对我这样的初学者来说太复杂了。“libfui.a”库是Oracle Fortran编译器运行库的一部分。我真的不建议将其与gfortran一起使用。你也可以使用Oracle编译器。我不相信单凭这一点就能有所帮助。看我的答案。我假设问这个问题的人有qsort的Fortran源代码。如果不是,这不是初学者的问题。