Fortran进行批处理地方法
fortran 排除错误
安装好VISUAL FORTRAN后1、运行Developer studio即可开始编译FORTRAN程序2、选择File菜单中的New选项3、在弹出的对话框选择projects标签,其他标签不用管,projects格式选用Fortran console application;在project name里命名(最好英文名),点击“ok ”4、接下来画面中,选择“an empty project”,点击“finish”5、接下来画面点击“ok”6、再选择一次File菜单中的new7、对话框选用files标签,选择Fortran free format source file ,并在file里命名8、点击“ok”Source Files 放源文件(.c、.cpp)程序的实现代码全放在这里Header Files 放头文件(.h)声明放在这里Resource Files 资源文件(.rc)放图标、图片、菜单、文字之类的,主要用来做界面的东东一般都放这里External Dependencies 除上三种以外的,程序编译时用到的文件全放这里fortran内部函数出错信息解释内部函数出错信息解释[sourcefile(line)]run-time error M62××MATH错误号函数级数学错误信息M6201 functionnames:DOMAIN error函数的自变量超出了约定的取值域,例如sqrt(-1)M6202 functionname:SING error无意义的变量。
例如log10(0)M6203 functionname:OVERFLOW error函数的结果值或其中一个既时计算值太大以致不能表示,例如EXP(250000.0) M6204 functionname:UNDERFLOW error函数的结果值或其中一个既时计算值太小以致不能表示。
M6205 functionname:TLOSS error完全丢失精度,例如COS(1E30)M6206 functionname:PLOSS errorfortran debug模式设置和技巧CVF中有两种编译(连接、执行)模式:release模式和debug模式。
6 Fortran 程序设计6-文件
6 Fortran 程序设计6-文件6 Fortran 程序设计-文件6.1 引言本章将介绍如何在Fortran程序中处理文件输入和输出。
文件输入和输出是Fortran程序中常见的操作,可以用于读取外部数据、将结果写入文件等。
本章将介绍如何打开、关闭、读取和写入文件,并提供一些常用的文件操作示例。
6.2 文件的打开和关闭在Fortran中,可以使用OPEN语句打开一个文件,使用CLOSE语句关闭一个文件。
打开文件时,需要指定文件名、打开模式和文件单元号。
关闭文件时,只需要指定文件单元号即可。
6.2.1 打开文件打开文件的语法如下:OPEN(unit=, , status=status, iostat=iostat)其中,unit是文件单元号,file是文件名,status是文件的打开模式,iostat是一个可选的参数,用于返回执行结果。
status的取值有以下几种:- 'OLD':打开一个已存在的文件,该文件必须已经存在,否则会报错。
- 'NEW':创建一个新文件,如果文件已存在,则会清空文件内容。
- 'UNKNOWN':打开一个已存在的文件,如果文件不存在,则会创建一个新文件。
- 'REPLACE':创建一个新文件,如果文件已存在,则会替换原文件。
打开文件成功后,文件单元号将被用于后续的文件操作。
6.2.2 关闭文件关闭文件的语法如下:CLOSE(unit=, status=status, iostat=iostat)其中,unit是文件单元号,status是一个可选的参数,用于指定关闭文件时的操作。
status的取值有以下几种:- 'KEEP':保留文件,不清空文件内容。
- 'DELETE':删除文件。
文件关闭成功后,文件单元号将无法再用于文件操作。
6.3 文件的读取和写入在Fortran中,可以使用READ和WRITE语句进行文件的读取和写入操作。
Fortran进行批处理地方法
Fortran进行批处理地方法Fortran中批量处理文件的方法总结—循环读取目录下的所有符合条件的文件=====================一、简单的介绍在一年之前,我写过一个程序,主要是对Micaps资料进行批量处理,将逐日资料处理为旬、月的数据,在那个程序中,始终有一个问题困扰我,就是如何自动生成该读取的下一个文件名,这使我真正开始关注fortran中的批处理,时隔一年,决定写下这些文字,将我用到的一些fortran批处理的方法和大家共享,交流。
对于那些只要会用程序,不求其中原理的朋友,请马上跳过这些文字,直接去下载附件吧!程序里有使用说明,但是,如果你不懂原理,估计现成的程序你使用起来也会碰壁哦!这里所说的批处理是指对某一个目录下的指定后缀的文件的批量读取和处理。
我总结的批处理方法大概可以用下面这个示意图来说明:|||将文件目录写入一个文本文件,供fortran循环读取|————手动输入文件名|————运行程序之前命令行工具导出文件名|————程序运行后,未开始计算之前,生成文件名| ————调用CMD命令生成| ————GETFILEINFOQQ方法生成| ————调用WIN32API生成||在程序运行时动态生成文件名||对于第一种方法,我将主要介绍如何将目录写入文件,然后举出一个小的示例来验证。
第二种方法主要是说明其思路。
二、方法的介绍1、将文件目录写入一个文本文件,供fortran循环读取1.1、手动输入文件名这是最基本的方法啦,如果文件个数不多,而且文件名中包含了空格等特殊字符的话,建议使用这种方法,在这里就不多说啦,至于在fortran中的处理,等几个小方法介绍完之后会有一个例子来说明。
1.2、运行程序之前命令行工具导出文件名这是一个既高效又保险的方法,主要思路就是通过强大的CMD命令列出目录下的文件到一个指定的文件中,然后由fortran去循环读取该文件中的文件名信息,从而批量处理。
fortran循环结构及基本语句
fortran循环结构及基本语句Fortran中的循环结构包括DO循环和DO WHILE循环。
基本语句包括赋值语句、条件语句和IO语句。
1.DO循环结构:DO循环结构用于重复执行一段代码块,语法如下:DO variable = start, end, step!代码块ENDDO在循环开始前,将变量初始化为start的值,然后执行代码块。
然后将变量增加step的值,并检查是否达到end的值,如果没有达到则继续执行代码块,直到达到end的值为止。
2.DOWHILE循环结构:DOWHILE循环结构用于在满足条件时重复执行一段代码块,语法如下:DO WHILE (condition)!代码块ENDDO在每次循环开始前,检查condition是否为真,如果为真则执行代码块,然后再次检查condition。
只有当condition为假时,循环才会结束。
3.赋值语句:赋值语句用于将一个值赋给一个变量,语法如下:variable = expression可以使用算术运算符和函数来计算expression的值,并将结果赋给变量。
4.条件语句:条件语句用于根据条件选择执行不同的代码块,常用的条件语句有IF语句和SELECTCASE语句。
-IF语句的语法如下:IF (condition) THEN!代码块1ELSE IF (condition) THEN!代码块2ELSE!代码块3ENDIF根据condition的值选择执行代码块1、代码块2或代码块3-SELECTCASE语句的语法如下:SELECT CASE (expression)CASE (value1)!代码块1CASE (value2)!代码块2CASEDEFAULT!代码块3ENDSELECT根据expression的值选择执行相应的代码块,如果没有匹配的值,则执行默认的代码块。
5.IO语句:IO语句用于输入和输出数据,常用的IO语句有WRITE和READ语句。
fortran format用法
fortran format用法1.引言1.1 概述Fortran是一种编程语言,由IBM公司于1950年代开发。
它被广泛应用于科学计算和数值分析领域,尤其在大规模计算和高性能计算方面表现出色。
Fortran语言的一个重要特性是它的格式化输出功能,即Fortran Format。
Fortran Format是一种格式控制语句,用于指定数据的输出或输入格式。
它可以精确地控制数据的显示方式,包括字段宽度、数值精度、对齐方式等。
通过使用Fortran Format,程序员可以轻松地格式化输出数据,使其更易于阅读和理解。
在Fortran程序中,可以使用一些特定的符号和代码来定义格式控制语句。
例如,可以使用A表示字符型数据、I表示整型数据、F表示浮点型数据等。
通过在格式控制语句中使用这些符号和代码,可以将不同类型和长度的数据格式化为适合打印或写入文件的形式。
除了基本的数据类型,Fortran Format还提供了许多其他功能,如控制字段宽度、指数表示法、对齐方式、填充字符等。
这些功能使得程序员能够自定义数据的输出格式,满足特定需求。
Fortran Format在科学计算和数据处理中扮演着重要的角色。
它可以帮助程序员更好地展示和共享计算结果,提高代码的可读性和可维护性。
此外,由于Fortran Format提供了丰富的格式化选项,它还可以用于数据文件的读写操作。
本文将介绍Fortran Format的基本概念和常用用法。
首先,我们将讨论Fortran Format的基本原理和语法规则。
然后,我们将探讨一些常见的格式化选项,包括字段宽度控制、数值精度控制和对齐方式控制等。
最后,我们将总结Fortran Format的重要性,并展望它在未来发展中的潜力。
通过本篇文章的阅读,读者将能够全面了解Fortran Format的用法和作用,提高对Fortran编程的理解和应用能力。
无论是初学者还是有一定经验的程序员,都可以从中获益,使其编写的Fortran程序更加出色和实用。
fortran语言并行计算程序
fortran语言并行计算程序Fortran是一种编程语言,用于科学和工程计算。
Fortran语言中可以使用并行计算来加速程序的执行。
以下是一个简单的Fortran并行计算程序的示例:```fortranprogram parallel_program! 使用OpenMP库启用并行计算use omp_libimplicit noneinteger :: iinteger, parameter :: N = 1000000real :: x(N), y(N), z(N)! 初始化数组x = 1.0y = 2.0! 使用并行循环计算!$omp parallel dodo i = 1, Nz(i) = x(i) + y(i)end do! 打印部分结果do i = 1, 10print *, z(i)end doend program parallel_program```在上面的示例中,使用OpenMP库来启用并行计算。
通过添加`use omp_lib`语句,可以在程序中使用OpenMP的并行化指令。
在循环计算的部分,使用了`!$omp parallel do`指令,它告诉编译器这个循环可以并行执行。
这样,循环中的每个迭代都可以在不同的处理器上并行执行。
在这个示例中,数组`x`和`y`被初始化为 1.0和2.0。
然后,使用并行循环计算数组`z`的每个元素,将`x`和`y`对应位置的元素相加。
通过循环打印了数组`z`的前10个元素。
请注意,实际的并行计算程序可能需要更复杂的逻辑和更多的并行化指令,具体取决于问题的性质和计算的需求。
上述示例只是一个简单的示例,用于说明Fortran中的并行计算的基本概念。
C语言直接操作FORTRAN数据文件的方法
摘要:FORTRAN数据文件的结构及用C语言直接对FORTRAN数据文件进行数据读取和处理的方法,并结合实例,给出了完成操作的C语言源程序。
关键词:C语言FORTRAN数据文件数据直接读写FORTRAN语言适用于数值计算,在科学和工程计算方面发挥了重要作用。
C语言具有很强的通用程序设计功能,而且很适于处理图形图像、系统程序方面的问题,但它的数值计算能力不如FORTRAN语言。
如果能在C语言程序中直接调用FORTRAN程序的计算结果,则可充分利用这2种语言的优势。
为此,有必要建立用C语言对FORTRAN数据文件进行直接读取和处理的方法。
1 FORTRAN数据文件的结构在C语言程序中调用FORTRAN程序的计算结果,可通过FORTRAN数据文件来实现,而要用C语言直接存取FORTRAN数据文件,必须首先清楚FORTRAN数据文件的结构。
FORTRAN数据文件按存取方式的不同可分为顺序文件和直接文件。
而不论是顺序文件还是直接文件,按数据在文件中的存放方式的不同,都有2种存放形式,一种是字符形式(即ASCII码形式),另一种是二进制代码形式。
前者称为有格式存放,后者称为无格式存放。
由于对直接文件存取的基本操作步骤与对顺序文件存取的基本操作步骤相同,二者的不同主要体现在操作时是否应顺序进行。
下面以顺序文件为例进行具体分析。
1.1 有格式文件的结构有格式文件全部由有格式的记录组成,有格式的记录是字符的序列,以ASCII码形式存放。
各记录以回车符(0DH)和换行符(0AH)作为结束标志,各记录之间无分隔符,各记录的长度(字节数)可以不等。
1.2 无格式文件的结构无格式文件全部由无格式记录组成,无格式记录是值的序列,即二进制代码序列。
这种格式的文件,其第1个字节是4BH(即十进制的75),最后1个字节为82H(即十进制的130),各无格式记录的数据信息位于这2个字节之间。
每一个无格式记录都由下面3部分组成:(1)记录的首字节,是该记录所有数据所占的字节数;(2)组成该记录的各数据内容。
fortran语言语法
FORTRAN是世界上最早出现的高级编程语言,是工程界最常用的编程语言,它在科学计算中(如航空航天、地质勘探、天气预报和建筑工程等领域)发挥着极其重要的作用。
经过40多年的发展,伴随着FORTRAN语言多次版本的更新及相应开发系统的出现,其功能不断完善,最新版本的开发系统几乎具备了VC、VB的所有特点,如图形界面编程、数据库等。
目前,工科院校开设的计算机编程语言课首选仍然是FORTRAN :<说实话,从科技发展的趋势来说这不是好事。
您可以设想一下,如果需要用鹅毛笔抄写大量的古籍是什么感受!强烈建议阅读《发掘C#特性赋予科学计算项目以威力》1 FORTRAN77四则运算符+ - * / ** (其中**表示乘方)在表达式中按优先级次序由低到高为:+或-→*或/→**→函数→()2 FORTRAN77变量类型2.1隐含约定:I-N规则凡是以字母I,J,K,L,M,N六个字母开头的,即认为是整型变量,其它为实型变量。
2.2用类型说明语句确定变量类型:可以改变I-N规则2.3用IMPLICIT语句将某一字母开头的全部变量指定为所需类型如IMPLICIT REAL (I,J)三种定义的优先级别由低到高顺序为:I-N规则→IMPLICIT语句→类型说明语句,因此,在程序中IMPLICIT语句应放在类型说明语句之前。
2.4数组的说明与使用使用I-N规则时用DIMENSION说明数组,也可在定义变量类型同时说明数组,说明格式为:数组名(下标下界,下标上界),也可省略下标下界,此时默认为1,例:DIMENSION IA(0:9),ND(80:99),W(3,2),NUM(-1:0),A(0:2,0:1,0:3) REAL IA(10),ND(80:99)使用隐含DO循环进行数组输入输出操作:例如WRITE(*,10) ('I=',I,'A=',A(I),I=1,10,2)10FORMAT(1X,5(A2,I2,1X,A2,I4))2.5使用DATA语句给数组赋初值变量表中可出现变量名,数组名,数组元素名,隐含DO循环,但不许出现任何形式的表达式:例如DATA A,B,C/-1.0,-1.0,-1.0/DATA A/-1.0/,B/-1.0/,C/-1.0/DATA A,B,C/3*-1.0/CHARACTER*6 CHN(10)DATA CHN/10*' '/INTEGER NUM(1000)DATA (NUM(I),I=1,500)/500*0/,(NUM(I),I=501,1000)/500*1/3 FORTRAN77程序书写规则•程序中的变量名,不分大小写;•变量名称是以字母开头再加上1到5位字母或数字构成,即变更名字串中只有前6位有效;•一行只能写一个语句;•程序的第一个语句固定为PROGRAM 程序名称字符串•某行的第1个字符至第5个字符位为标号区,只能书写语句标号或空着或注释内容;•某行的第1个字符为C或*号时,则表示该行为注释行,其后面的内容为注释内容;•某行的第6个字符位为非空格和非0字符时,则该行为上一行的续行,一个语句最多可有19个续行;•某行的第7至72字符位为语句区,语句区内可以任加空格以求美观;•某行的第73至80字符位为注释区,80字符位以后不能有内容。
fortran常见问题解决
为了减少重复回答问题,特编此帖,并不定期添加和更新内容。
错误难免,欢迎讨论,仅供参考。
很多人问哪里可以找到Fortran 编译器,有不少热心学友提供网址,检验过这些链接,但是它们不一定总有效。
Fortran 编译器下载:CVF特汇集在这里。
虽然俺FTN95 (License: Free for personal use)以下操作,如无特别说明,都是以为例。
1. 如何加大Stack size?选Project => Settings => Link => Category: Output Stack allocationsReserve: 这里填新值(默认为1M若需要10M则填)2. 如何用Fortran 批量生成文件?设要生成4000个文件,文件名为AA1-AA4000,如何写循环生成文件命令呢?用内部文件:character(len=80) :: filename,forminteger :: ido i=1,4000select case (i)case (1:9)write(form,'(i1)') icase (10:99)write(form,'(i2)') i=>, 而不用写4000 次writecase (100:999)write(form,'(i3)') icase (1000:9999)write(form,'(i4)') iend selectwrite(filename,*) "AA",trim(form),".TXT"open(10,file=filename)write(10,*) iclose(10)end dostopend3.如何用Fortran 动态生成输出格式?设有一个数组data(100),输出时,希望每行输出num个数,而num由用户输入,如何实现?用内部文件:character(len=80) :: formreal :: data(100)integer :: i,numdata = (/ (i,i=1,100) /)/read(*,*) numwrite(form,*) "(",num,""write(*,form) data stopend4.MS 是不是很垃圾?是垃圾,其中Bug 太多,多到不可用的地步!在这个主题里,换了CVF后问题就没了的人已有相当的数目。
写批处理必备的一些命令参数使用技巧
写批处理必备的一些命令参数使用技巧批处理是一种在Windows操作系统中用来批量处理一系列命令的脚本语言。
使用批处理可以实现自动化执行一系列操作,提高工作效率和减少重复性劳动。
以下是一些批处理中必备的命令参数使用技巧,供参考:1. echo命令echo命令用于在命令行中输出文字或变量的值。
使用echo命令时可以使用“>>”将输出内容追加到文件的末尾,或使用“>”将输出内容覆盖到文件中。
2. set命令set命令用于设置一个变量,也可以用于查看或删除已存在的变量。
例如,可以使用set命令将一个命令的输出结果赋值给一个变量,然后在后面的命令中使用该变量。
3. if命令if命令可以执行条件判断,根据不同的条件执行不同的操作。
常见的用法包括判断文件是否存在、判断变量的值等。
4. for命令for命令用于对一系列对象(如文件、变量列表等)进行循环操作。
常见的用法包括遍历目录中的文件、遍历数组等。
5. goto命令6. call命令call命令用于调用外部的命令或脚本,并在调用完成后返回到当前批处理中。
使用call命令可以将一个脚本文件拆分成多个子脚本,提高代码的复用性。
7. start命令start命令用于启动一个新的窗口来执行指定的命令或程序。
可以使用start命令来实现并行执行多个命令或程序。
8. shift命令shift命令用于移动批处理脚本中的参数位置。
使用shift命令可以在循环中逐个处理命令行参数,而不需要手动指定每个参数。
9. choice命令choice命令用于在命令行中提供多个选项供用户选择。
使用choice 命令可以实现交互式的批处理脚本。
11. setlocal和endlocal命令setlocal和endlocal命令用于创建和销毁一个局部环境变量。
使用setlocal命令可以在批处理脚本中创建一个局部环境,在其中定义的变量在脚本执行完毕后会自动销毁。
12. pushd和popd命令pushd和popd命令用于在命令行中切换当前目录。
fortran 并行计算代码
fortran 并行计算代码Fortran并行计算代码简介:Fortran是一种编程语言,特别适合科学计算和数值分析。
它具有强大的数值计算能力和高效的运算速度,被广泛应用于学术界和工业界。
随着计算机硬件的发展,开发并行计算代码成为提高计算效率的重要手段。
本文将介绍如何使用Fortran编写并行计算代码,以加速计算过程。
并行计算的概念:并行计算是指将一个大的计算任务分解成多个小的子任务,并在多个处理器上同时执行这些子任务,从而提高计算速度。
在Fortran 中,可以使用OpenMP(Open Multi-Processing)库来实现并行计算。
OpenMP是一种支持共享内存并行计算的编程模型,通过在代码中添加指令来控制并行执行。
并行计算代码的编写:在Fortran中,编写并行计算代码需要遵循一些基本的步骤。
首先,需要在代码中引入OpenMP库,并使用编译器选项开启OpenMP支持。
然后,在需要并行执行的代码块前加上特定的指令,指示编译器并行执行该代码块。
最后,使用适当的同步指令来确保数据的一致性和正确性。
并行计算的示例:下面是一个简单的Fortran程序,用于计算数组元素的平均值。
该程序使用OpenMP库实现并行计算,加速平均值的计算过程。
```program parallel_computationuse omp_libimplicit noneinteger, parameter :: n = 1000000integer :: ireal :: sum, averagereal, dimension(n) :: array! 初始化数组do i = 1, narray(i) = iend do! 并行计算数组元素的和sum = 0.0!$omp parallel do reduction(+:sum)do i = 1, nsum = sum + array(i)end do! 计算平均值average = sum / n! 输出结果print *, "数组元素的平均值为:", averageend program parallel_computation```在上面的代码中,通过添加`use omp_lib`语句引入OpenMP库。
fortran知识点总结
fortran知识点总结一、语法结构Fortran语言的语法结构遵循一套严格的规则。
下面是一些常见的语法结构:1. 程序单元:Fortran程序由一个或多个程序单元组成。
每个程序单元由一个或多个声明和执行语句组成。
2. 注释:在Fortran中,注释可以用来提高代码的可读性。
注释以感叹号(!)开头,直到行末为止。
3. 标识符:Fortran中的标识符由字母、数字和下划线组成,且区分大小写。
标识符用于表示变量、函数、子程序等。
4. 变量声明:在Fortran中,变量声明使用关键字“REAL”、“INTEGER”、“LOGICAL”等来指定变量的数据类型。
例如,REAL :: x 表示声明了一个实数类型的变量x。
5. 程序控制结构:Fortran提供了多种控制结构,包括顺序结构、条件结构和循环结构。
这些结构提供了程序的流程控制和逻辑控制。
6. 函数和子程序:Fortran支持函数和子程序的定义和调用。
函数和子程序可以帮助程序员组织和重用代码。
7. 模块和接口:Fortran中的模块和接口提供了一种组织代码的方式。
模块可以包含多个子程序和全局变量,接口可以用来定义子程序的接口。
二、数据类型在Fortran中,数据类型用于表示数据的类型和大小。
Fortran提供了多种数据类型,包括整数、实数、逻辑值、字符、复数等。
下面是一些常见的数据类型:1. 整数:整数类型用于表示整数值。
在Fortran中,整数类型包括“INTEGER”、“LOGICAL” 和“CHARACTER”类型。
2. 实数:实数类型用于表示实数值。
在Fortran中,实数类型包括“REAL”和“COMPLEX”类型。
REAL类型用于表示实数,COMPLEX类型用于表示复数。
3. 字符:字符类型用于表示字符值。
在Fortran中,字符类型使用CHARACTER关键字进行声明。
字符类型可以表示单个字符或者字符数组。
4. 数组:数组类型用于表示多个相同类型的数据。
fortran 90 文件(文件的操作语句)
土木学院
土木学院
13.1有格式顺序存取文件 --顺序文件输入输出的基本规则
Read语句中各输入项在类型上、格式说明上必须 与输出语句的输出项按位置一一对应; Open或Rewind是从文件的第一个记录开始输入, 每执行一次Read语句,总是从一个新的记录开始 读入; 在Read语句读文件记录时,输入项少于记录中的 数据项,则剩余数据被忽略.输入项多于记录中 的数据项,它将接着去读下一个记录,直到所有项 都获得数据或者遇上文件结束标志为止; 在程序设计中对一个顺序文件不可能做到‚重写 前半部分而保留后半部分‛这样的操作。
Next 土木学院
13.2 有格式直接存取文件
直接存取可以任意确定需要读写记录的位 置; 直接存取只适用于磁盘文件; 其基本的操作与顺序存取大致相同,主要不 同的是:Open的说明、Read和Write的控制 项不同。 下面以例说明
土木学院
13.2有格式直接存取文件
主要语句: Open(12,File=‘Datb.Dat’,Status=‘Ne w’, Access=‘Direct’,Form=‘Formatted ’, 记录的长度,以字节为单位。 Recl=16 ?)
土木学院
13.1有格式顺序存取文件 --顺序文件输入输出的基本规则
一个WRITE语句总是开始一个新的记录; 一般来说,对同一个文件在进行写操作之 后要进行读操作时,必须先使用文件定位 语句,重新设置指针位置 (Open语句、 Rewind语句以及Backspace语句等); 也可以使用表控输入输出语句对文件进行 格式输入输出,如:WRITE(3,*) N,M。
土木学院
这是打开数据 文件F2.DAT 的内容
土木学院
13.1有格式顺序存取文件
fortran调试技巧
功能强大的vc6调试器(适用于Compaq Fortran Debug)作者:yy2better要成为一位优秀的软件工程师,调试能力必不可缺。
本文将较详细介绍VC6调试器的主要用法。
windows平台的调试器主要分为两大类:1用户模式(user-mode)调试器:它们都基于win32Debugging API,有使用方便的界面,主要用于调试用户模式下的应用程序。
这类调试器包括Visual C++调试器、WinDBG、BoundChecker、Borland C++Builder调试器、NTSD等。
2内核模式(kernel-mode)调试器:内核调试器位于CPU和操作系统之间,一旦启动,操作系统也会中止运行,主要用于调试驱动程序或用户模式调试器不易调试的程序。
这类调试器包括WDEB386、WinDBG和softice等。
其中WinDBG 和softice也可以调试用户模式代码。
国外一位调试高手曾说,他70%调试时间是在用VC++,其余时间是使用WinDBG和softice。
毕竟,调试用户模式代码,VC6调试器的效率是非常高的。
因此,我将首先在本篇介绍VC6调试器的主要用法,其他调试器的用法及一些调试技能在后续文章中阐述。
一位置断点(Location Breakpoint)大家最常用的断点是普通的位置断点,在源程序的某一行按F9就设置了一个位置断点。
但对于很多问题,这种朴素的断点作用有限。
譬如下面这段代码:void CForDebugDlg::OnOK(){for(int i=0;i<1000;i++)//A{int k=i*10-2;//B SendTo(k);//C int tmp=DoSome(i);//D int j=i/ tmp;//E}}执行此函数,程序崩溃于E行,发现此时tmp为0,假设tmp本不应该为0,怎么这个时候为0呢?所以最好能够跟踪此次循环时DoSome函数是如何运行的,但由于是在循环体内,如果在E行设置断点,可能需要按F5(GO)许多次。
Fortran 批量处理文件
Fortran 批量处理文件程序中需要读取或处理大量文件的时候,在代码中写入大量的open语句就显得很笨重,如果文件很多(比如有1000个文件),这种方法根本不可行。
针对这种情况,介绍两种解决方法。
方法一:考虑如下情形:假设存在100个文件,分别存储了1900-1999年的降雨量,现在需要计算着100年的总降雨量。
文件名为:前缀+年份+后缀,例如:降雨量-1900.dat、降雨量-1901.dat 。
由于文件名是有规律的,仅年份变化,可以用循环来一次读取文件。
program testinteger ireal s, acharacter(20):: filename='降雨量-1234.dat's = 0.0do i=1900, 1999!内部文件读写,将filename第8-11字符换为相应年份write(filename(8:11),'(i4)') iopen(11,file=filename)read(11,*) aclose(11)s = s + aend doend program这种方法优点是可以按顺序读取文件,缺陷也很明显,只能处理有规律的文件名。
方法二:如果文件名没有规律,使用另一种方法。
先用命令行指令将需要处理的文件的文件名写入另外一个文件当中:call system ('dir *.txt /b > 1.dat' )上述代码含义:找出工作目录下所有txt文件,将其文件名存入1.dat当中,注意二者的后缀不应相同(txt, dat)。
为了避免错误,需要事先删除无用的txt文件。
修改命令行指令,可以找出任意符合条件的文件,比如找出上例中存储降雨量的文件:call system ('dir 降雨量-*.dat /b > 1.txt' )完整代码如下:program testinteger ireal s, acharacter(512):: filename!文件1.dat中存储工作目录下所有txt文件列表call system ('dir *.txt /b > 1.dat' )s = 0.0open(10,file='1.dat')do!读取文件名read(10,'(a)',iostat=i) filenameif(i/=0) exitopen(11,file=filename)read(11,*) aclose(11)s = s + aend doclose(10,status='delete') !关闭并删除文件1.datend program方法二优点是不要求文件名称有很强规律性,缺点是处理每个文件的顺序是未知的。
fortran文件知识点
Fortran文件知识点Fortran(Formula Translation)是一种高级编程语言,专门用于科学和工程计算。
它于20世纪50年代初由IBM公司开发,并成为第一种被广泛应用的程序设计语言。
Fortran文件是指使用Fortran语言编写的源代码文件,其中包含了Fortran程序的逻辑和算法。
在本文中,我们将逐步介绍Fortran文件的知识点,帮助读者了解如何编写和使用这种文件。
第一步:文件结构Fortran文件通常由以下几个部分组成:1.程序声明:用于声明程序的名称和目的,以及引入外部模块或库文件。
2.变量声明:用于声明程序中使用的各种变量,包括整数、实数、字符等类型。
3.主程序:包含实际的计算逻辑和算法,用于执行特定的任务或解决问题。
第二步:文件扩展名Fortran文件通常使用.f或.f90作为文件扩展名。
.f扩展名是Fortran 77的标准,而.f90扩展名是Fortran 90及更高版本的标准。
这些扩展名有助于编译器识别文件类型并选择正确的编译方式。
第三步:编写Fortran文件编写Fortran文件可以使用任何文本编辑器,例如记事本、Sublime Text、Visual Studio Code等。
以下是一个简单的Fortran文件示例:program helloimplicit nonecharacter(10):: namewrite(*,*)'请输入您的名字:'read(*,*) namewrite(*,*)'您好,', trim(name), '!'stopend program hello在这个示例中,我们定义了一个名为hello的主程序,其中包含一个字符类型的变量name。
程序首先向用户请求输入姓名,然后输出一个问候语。
最后,程序通过stop语句终止运行。
第四步:编译和运行Fortran文件要编译Fortran文件,我们需要使用特定的编译器。
Fortran编程必备参考
/share/detail/24946126Just as in Basic we use TAB and PRINT USING commands to more precisely control program output, in Fortran we can usewrite commands with format statements. While these can get complicated, the most commonly used options are pretty easy to use. A typical write statement iswrite (*,20) x, y, z .The "*" in the parentheses instructs Fortran to write to the screen, while "20" refers to the label ofthe format statement for thiswrite command. The x, y, and z are the variables to be printed.A format statement for this write command might be20 format (3f10.4) .Inside the parentheses, the "3" indicates that 3 entities will be printed, the "f" denotes that these willbe floating point real numbers (not exponential notation), the "10" stipulates that 10 places will be used for printing (counting the sign, decimal point, and the digits), and ".4" mandates 4 digits after the decimal point. Some printouts formatted this way are12345.6789 , -1234.5678 , 10002.3400 .The letter "f" in this context is a format code letter; here are some of the more commonly used format code letters, with their implications:f real number, floating point formate single precision real number, exponential notationd double precision real number, exponential notationi integera text string (character)x space/vertical space (line feed)t tab indicatorStrings (in quotes) may be placed in format statements, separated by commas. Here are examples of write statements with corresponding format statements; at the right of each is a description of the corresponding output:write (*,10) n, x, y10 format (i4,4x,f10.4,2x,f10.4)integer n printed using 4 places, then 4 spaces, then real numbers x and y printed with 2 spaces between, each using 10 places and 4 decimal placeswrite (*,20) area20 format ("The area is ",f8.5)string in quotes is printed, then the real number area is printed, using 8 places with 5 decimal placeswrite (*,30) "The area is ", area30 format (a,f8.5)same output as immediately abovewrite (*,40) x, y, z 40 format (3d20.14)3 double precision numbers x, y, z printed, each reserving 20 spaces, with 14 decimal placeswrite (*,50) student, score 50 format (a20,4x,i3)student, a text string up to 20 characters, is printed, then 4 spaces, then score, an integer using a maximum of 3 placeswrite (*,60) r, A60 format (t10,f4.2,/,t10,f6.2)tabs to column 10, prints real number r, goes to next line, tabs to column 10, prints real number AYou can use loops with format statements to print arrays; here are examples:do i = 1, 10 write (*,70) a(i) end do an array a of real numbers, indexed from 1 to 10, is printed; each entry occupies 5 places with70 format (f5.2) 2 decimal places, and is printedon a separate linewrite (*,80) (a(i), i = 1, 10)80 format (f5.2)same output as immediately abovewrite (*,90) (a(i), i = 1, 10) 90 format (10f5.2)same output as above, except that all entries are printed on the same linedo i = 1, 5write (*,7) (m(i,j), j = 1, 6) 7 format (6i3)end do prints a 5 x 6 two-dimensional array m of integers, with each integer entry m(i,j) occupying 3 places. Each row of the matrix appears on its own line.Following are examples of stored values, formatting specifications for printing the values, and resulting output. (The "^" symbol indicates a blank).Stored Value Format Specifier Output1.234567f8.2^^^^1.230.00001f5.30.000-12345i5*****-12345i6-1234512345i6^123450.00001234e10.3^0.123E-040.0001234e12.4^^0.1234E-031234567.89e9.2^0.12E+07aloha a8^^^aloha1.23456789123D0d17.10^0.1234567891E+01 Fortran format格式说明2. 字符返回。
fortran中stop的用法
fortran中stop的用法Fortran中stop的用法1. stop语句的基本用法在Fortran中,stop语句用于结束程序的执行,并且可以在运行时显示一条可选的错误信息。
它的基本语法如下:stop [number [, char_expr]]•number:可选参数,指定程序的退出状态代码。
•char_expr:可选参数,指定要显示的错误信息。
2. 使用stop结束程序的执行stop语句通常用于当程序遇到错误或执行到预定的停止点时终止程序。
例如,在以下情况下我们可以使用stop语句: - 当输入数据不符合要求或无法处理时,我们可以使用stop语句终止程序,并显示一条错误信息。
- 当我们想要调试程序并在特定位置检查变量的值时,我们可以在代码中插入stop语句,以便程序在此处停止执行。
以下是一个示例程序,演示如何使用stop语句终止程序的执行:program stop_exampleimplicit noneinteger :: xread(*,*) xif (x < 0) thenstop 1, "Input value must be greater than or equal t o zero."end ifwrite(*,*) "Input value:", xwrite(*,*) "Program completed successfully."stopend program stop_example在上述示例中,用户输入一个整数值,如果该值小于0,则程序通过stop语句终止执行,并显示错误信息”Input value must be greater than or equal to zero.”。
如果输入的值大于等于0,则程序继续执行,并输出输入值及程序完成的消息。
3. 使用stop设置退出状态代码stop语句的可选参数number用于设置程序的退出状态代码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Fortran中批量处理文件的方法总结—循环读取目录下的所有符合条件的文件=====================一、简单的介绍在一年之前,我写过一个程序,主要是对Micaps资料进行批量处理,将逐日资料处理为旬、月的数据,在那个程序中,始终有一个问题困扰我,就是如何自动生成该读取的下一个文件名,这使我真正开始关注fortran中的批处理,时隔一年,决定写下这些文字,将我用到的一些fortran批处理的方法和大家共享,交流。
对于那些只要会用程序,不求其中原理的朋友,请马上跳过这些文字,直接去下载附件吧!程序里有使用说明,但是,如果你不懂原理,估计现成的程序你使用起来也会碰壁哦!这里所说的批处理是指对某一个目录下的指定后缀的文件的批量读取和处理。
我总结的批处理方法大概可以用下面这个示意图来说明:|||将文件目录写入一个文本文件,供fortran循环读取|————手动输入文件名|————运行程序之前命令行工具导出文件名|————程序运行后,未开始计算之前,生成文件名| ————调用CMD命令生成| ————GETFILEINFOQQ方法生成| ————调用WIN32API生成||在程序运行时动态生成文件名||对于第一种方法,我将主要介绍如何将目录写入文件,然后举出一个小的示例来验证。
第二种方法主要是说明其思路。
二、方法的介绍1、将文件目录写入一个文本文件,供fortran循环读取1.1、手动输入文件名这是最基本的方法啦,如果文件个数不多,而且文件名中包含了空格等特殊字符的话,建议使用这种方法,在这里就不多说啦,至于在fortran中的处理,等几个小方法介绍完之后会有一个例子来说明。
1.2、运行程序之前命令行工具导出文件名这是一个既高效又保险的方法,主要思路就是通过强大的CMD命令列出目录下的文件到一个指定的文件中,然后由fortran去循环读取该文件中的文件名信息,从而批量处理。
a、从运行工具打开你的CMD窗口;b、转到要处理的当前目录(可省略):CD /d 路径,如:CD /d e:\test这样可以快速到达e:\test目录c、使用DIR命令列出文件目录信息到指定的文件,通常使用的Dir *.*>新文件名这个命令在这里已经不能满足要求,因为会列出一堆对于我们处理而言无用的信息,现在要使用的命令是:DIR /b filter>newfile注意,其中的filter为文件筛选,必须自己修改为所需的,比如你可以把它改成*.txt,这样,就会列出当前目录下的所有txt结尾的文件了。
Newfile就是你需要存放文件名的那个文件,比如可以是dir.txt,这样就成了 dir/b*.txt>dir.txt,就会把当前目录下的所有文件都列出到dir.txt文件中,当然,由于dir.txt也在当前目录,所以也会被算进去,这在处理的时候是需要注意的,下面几种方法中同样考虑了这个问题。
你可以选择手动删掉,或者把dir.txt这个文件存到其他地方去,或者,不要和你需要的文件具有相同的后缀也行,比如:dir /b *.txt>e:\dir.txt (假设当前目录是e:\test)如果省略了第二步中的转到当前目录的话,就需要在dir命令后输入完整的路径了,而且新生成的文件也要选择有权限建立新文件的地方存放,比如你在c:\users目录下输入:dir /b e:\test\*.txt>e:\dir.txt,这个命令和上面先转到e:\test 目录下的效果是一样的。
现在你是不是比较好奇,/b 是干嘛的,其实就是只列出文件名,不要其他的附件信息,比如创建时间,文件大小等等这些对于我们批处理无关的信息。
如果你想包含某个目录下的子目录,那么,就可以这样写:Dir /b/s filter>newfile/s就表示包含子目录,但是,这样会有一个问题,那就是,批处理的时候必须获得正确的路径才能操作,这样得到的子目录里面的文件不会有任何标志说他是来自子目录的,因此fortran处理的时候就无法判断了,所以,如果包含了子目录,那么请用下面的命令:Dir /a-d/b/s filter>newfile现在去看看新生成的文件吧,怎么样,很惊喜吧!懂了这个方法,下面一部分的第一个方法对你来说就是小菜一碟啦。
如果你使用的win7(或vista)系统,而且无常使用CVF编译器的话,那么第一部分到这里就算结束啦,除非,你会在其他fortran编译器中调用WIN32API。
1.3、程序运行后,未开始计算之前生成文件名1.3.1、在程序中调用CMD命令这个方法其实就是上一个方法的进化版,只不过变成了在程序运行的时候调用命令自动生成,这样整个过程显得少一点,只需要在程序里设置好相关的参数即可。
这个方法的关键在于SYSTEMQQ函数的使用,这是CVF编译器封装的调用CMD命令的一个函数,存在于DFLIB库中,其语法命令为:result = SYSTEMQQ(commandline)commandline:表示需要进行的CMD操作,字符串形式,函数中的实际长度由传入的参数决定,input类型(表示输入为参数);Results:一个逻辑型变量(logical(4)),如果成功为true,失败为false(不解的是程序中要实现的东西都是正常的,比如仅仅传入dir命令,返回的结果仍然为F,请高手赐教)给出一个简单的例子:USE DFLIBLOGICAL(4)resultresult = SYSTEMQQ('copy e:\dir.txt e:\test\dir.txt')这个命令将第一个路径中的文件复制到为第二个路径中的文件。
通过这个例子再结合上面一个方法,就可以很方法便的构造出我们需要用来批处理的子函数,关键语句如下所示:subroutine ListToFile(fPath,outPut)character*(*),InTent(In):: fPath,outPutcharacter*100CMDLOGICAL(4) resCMD="dir/a-d/b/s "//trim(fPath)//" >"//trim(outPut)res=SYSTEMQQ(CMD)endsubroutine其中传入的是文件筛选值和输出的路径,这个方法也是我在第一部分中最为推荐的一个方法了,代码简洁高效,能够输出完整的路径,可以包含子文件夹,唯一的缺点就是输出的文件个数不能直接在程序中调用(方便循环),需要在批处理的时候使用其他方法来判断文件是否读取结束。
1.3.2、使用GETFILEINFOQQ方法生成文件目录该方法是下面一个方法的进化版,是由CVF对WIN32的API进行了封装,这样,我们就可以通过简单的调用函数来实现一些面向对象的功能。
简单的翻译了一下官方给出的GETFILEINFOQQ函数信息:Module: USE DFLIB (存在于DFLIB库中)语法简介:Syntaxresult = GETFILEINFOQQ (files, buffer, handle)files :输入类型的字符型变量,表示你需要查找的路径(也就是我们上面方法中的筛选值),同样可以使用*或者?这样的通配符。
buffer :在函数运行中会获得一个值,可供输出使用,这个值就是所找到的文件的相关信息,属于FILE$INFO类型的变量(该类型定义于:fortran安装路径DF98\INCLUDE路径下),其结构如下:TYPE FILE$INFOINTEGER(4)CREATIONINTEGER(4)LASTWRITEINTEGER(4)LASTACCESSINTEGER(4)LENGTHINTEGER(4)PERMITCHARACTER(255)NAMEEND TYPE FILE$INFOhandle :接受输入和输出整型变量,表示文件控制信息(同样在DFLIB中定义),包含以下容:FILE$FIRST - First matching file found.FILE$LAST - Previous file was the last valid file.FILE$ERROR - No matching file found.Results: 返回值是一个整型变量(integer(4)),表示的不含空格的文件名长度,如果文件未找到,则返回0。
了解了以上信息,我们就可以通过编程进行循环调用这个函数,每找到一个符合条件的文件,就把他输入到指定路径的文件中去,注意,凡是input类型的变量都必须传入数值,否则会出错。
如果你比较有探索精神,就试着用这个介绍和思路来编程一下吧,子程序如下所示(完整的请下载附件)Subroutine GetFileList(cFileName,outPut,iFile)UseDFLib,only:GetFileInfoQQ,GetLastErrorQQ,FILE$INFO,FILE$LAST,FILE$ERROR,FILE $FIRST,ERR$NOMEM,ERR$NOENT,FILE$DIR !引入库函数Implicit None!根据上面的语法介绍来定义变量Character*(*),Intent(In)::cFileName !筛选值character*(*),intent(In)::output !输出路径Integer,Intent(InOut)::iFile !记录已经找到几个文件TYPE (FILE$INFO) info !找到的文件的信息INTEGER(4)::Wildhandle,length !文件控制信息,文件大小,Wildhandle = FILE$FIRSTiFile = 0DOWHILE (.TRUE.) !循环找文件length = GetFileInfoQQ(cFileName,info,Wildhandle) !调用函数找文件!如果遇到错误或者不能再找到不同的文件,则进入选择,准备退出IF ((Wildhandle .EQ. FILE$LAST) .OR.(Wildhandle .EQ. FILE$ERROR)) THENSELECT CASE (GetLastErrorQQ())CASE (ERR$NOMEM) !//存不足iFile = - 1ReturnCASE (ERR$NOENT) !//碰到通配符序列尾,正常退出ReturnCASE DEFAULTiFile = 0ReturnEND SELECTEND IFiFile= iFile + 1Call WriteFileName( Trim() ,outPut, iFile) !调用子函数输出文件名ENDDOEnd Subroutine GetFileList注意,在调用子函数输出文件名时,要做一些处理,主要是判断文件是否存在(不存在则新建,如果是第一次找到,而且文件存在,则覆盖,否则追加),以及找到的是否为我们自己建立的这个dir.txt文件(如果是,则忽略,找到的文件数量-1)这个方法也不错,如果不需要子目录的信息,其优越性不亚于上一种方法,因为该子函数能够直接返回找到的文件数量。