根据命令行参数跳过部分代码

时间:2014-11-10 10:09:31

标签: fortran goto continue

我最近编写了一个FORTRAN代码,其中包含我使用冒泡排序算法的部分。现在,由于对非常大的文件进行排序(约7/8分钟)需要很长时间。但是,大多数输入文件的排列方式可以跳过排序并节省一些时间。其中 GO TO CONTINUE 是我的朋友。但我并不确切知道将这些构造放在何处。

variable declaration

!****************** Name of the *.inp file from command line *****************
numargs=iargc()
IF (numargs.eq.3) THEN
  CALL getarg(1,inputfile)
  WRITE(*,*) ' Input: ',trim(inputfile)
  CALL getarg(2,outputfile)
  WRITE(*,*) 'Output: ',trim(outputfile)
  CALL getarg(3,carg)
  WRITE(*,*) 'Sorting invoked...'

ELSE IF (numargs.eq.2) THEN
  CALL getarg(1,inputfile)
  WRITE(*,*) ' Input: ',trim(inputfile)
  CALL getarg(2,outputfile)
  WRITE(*,*) 'Output: ',trim(outputfile)

**maybe IF statement for skipping the sorting part using GO TO (how?? IDK.)**

ELSE
  WRITE(*,*) '****** The input and output filenames are missing! ******'
  CALL exit(0)
END IF


INQUIRE(file=inputfile,exist=lex)

IF(.not.lex) THEN
 WRITE(*,*) '**** file ', trim(inputfile), ' Does not exist!'
 CALL exit(-1)
ENDIF

INQUIRE(file=outputfile,exist=lex)

IF(lex) THEN
  WRITE(*,*) '**** file ', trim(outputfile), ' exists!'
  WRITE(*,*) 'Delete and run the program again'
 CALL exit(-1)
ENDIF 

**estimation of records in input file**

**reading input file**

**bubble sort** (to be skipped or not depending upon command line argument)

**some more computation**

END    

我希望我足够清楚!期待您的建议和指导。

PT

1 个答案:

答案 0 :(得分:3)

我不会使用goto。我宁愿做类似于以下的事情

Logical :: sort_needed

sort_needed = .True.

... skip first part ...

ELSE IF (numargs.eq.2) THEN
  CALL getarg(1,inputfile)
  WRITE(*,*) ' Input: ',trim(inputfile)
  CALL getarg(2,outputfile)
  WRITE(*,*) 'Output: ',trim(outputfile)

  sort_needed = .False.

ELSE
  WRITE(*,*) '****** The input and output filenames are missing! ******'
  CALL exit(0)
END IF

... skip to sort ....

If( sort_needed ) Then
   Call sort( appropriate_arguments )
End If 

...

End

一般来说,避免使用goto,往往会导致令人困惑的代码。虽然我不是现代Fortran中的狂热者,但它很少是最好的方式 - 实际上我真的不记得我最后一次用它来生气了

其他一些事情

1)这个很容易遵循,但养成发布完整代码而不是片段的习惯。它通常会澄清你想要问的内容。

2)冒泡排序是一种非常低效的算法。只要文件不大,至少要使用类似选择排序的东西。然而,从长远来看,像快速或堆排序这样的东西可能会为你节省大量时间

3)Fortran具有访问命令行的标准方法,iargcgetarg不是这样做的。我建议您查阅并使用command_argument_countget_command_argument,任何好的,最新的Fortran书籍都将涵盖这些