首页 > 解决方案 > 在do循环中相互分配相同变量时的段错误

问题描述

我们正在开发一个在 Fortran 中对 URL 进行编码的函数。 urlencode_one_Text包含字符串的十进制值并将其作为 url 编码返回

错误是Program received signal SIGSEGV: Segmentation fault - invalid memory reference

这不是编译错误,而是运行时错误。有没有办法解决这个错误?

我盯着第 22 行,代码看起来写得正确。我想将 x 除以 16,但我不能。

环境:windows 10,GNU Fortran(x86_64-posix-seh-rev0,由 MinGW-W64 项目构建)8.1.0,PowerShell,vim,存储编码 utf-8,Fortran 95,gfortran 中没有其他选项

program main
implicit none
call urlencode_one_Text(8552931)
end program main
subroutine urlencode_one_Text(x)
implicit none

integer            ::  x, remainder = 0, intlen = 0
character(len=10)  ::  urlencode(10) = ''
character(len=1)   ::  temp_character = ''
data remainder/ 0/
data intlen/    10/
urlencode(10)   =  '\0'

 
do
 print *, 2
 intlen     =  intlen - 1
 print *, 2
 remainder  =  mod(x , 16)
 print *, 2
 x          =  x / 16
 print *, 2

 select case (intlen)
 case (1)
   intlen        =  intlen - 1
   urlencode(1)  =  '%'
 case (4)
   intlen        =  intlen - 1
   urlencode(4)  =  '%'
 case (7)
   intlen        =  intlen - 1
   urlencode(7)  =  '%'
 end select

 select case (remainder)
 case (10)
   print *, 4
   urlencode(intlen) = 'A'
 case (11)
   urlencode(intlen) = 'B'
 case (12)
   urlencode(intlen) = 'C'
 case (13)
   urlencode(intlen) = 'D'
 case (14)
   urlencode(intlen) = 'E'
 case (15)
   urlencode(intlen) = 'F'
 case default
   print *, 5
   write(temp_character, *) remainder
   urlencode(intlen) = temp_character
   temp_character = ''
   print *, 6
 end select

 remainder  =  0
 if ((16 .ge. x) .or. (10 .eq. intlen)) then
   print *, 7
   exit
 end if
end do

print *, urlencode
 
return
end subroutine urlencode_one_Text

标签: fortrangfortranurlencode

解决方案


推荐阅读