Fortran Coder

查看: 16428|回复: 7
打印 上一主题 下一主题

[求助] 如何将浮点型数组转化为字符串型数组

[复制链接]

57

帖子

15

主题

0

精华

熟手

F 币
242 元
贡献
166 点
跳转到指定楼层
楼主
发表于 2020-3-22 09:34:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,需要将一个浮点型数组转化为字符串型数组
知道可以用read或者write直接读,但是具体的格式是啥不太清楚
  read(s(i),'(i)') a(i) 这个是将字符串型数组改为浮点型数组的语句,是不是只需要将'(i)'修改一下就好了

另外,还有一个问题,就是写了一段代码,将这个转化后的数组元素覆盖另外一个内容均为undefined的数组,但要判断转化完成后的字符型数组内的元素是否是74.40000 , 76.60000 , 70.00000 ,如果是的话就不予覆盖
下面是代码
[Fortran] 纯文本查看 复制代码
1do s = 1,14
2    do t = 1,18627
3     if(g(s,t) .eq. 74.40000 .or. g(s,t) .eq. 76.60000 .or. g(s,t) .eq. 70.00000) then
4     cycle
5     end if
6     e(s,t) = g(s,t)
7    end do
8   end do

注:e(s,t)即为另外一个均为undefined的字符串型数组,g(s,t)为由浮点型数组转化成为的字符型数组。
运行时出现了错误
e(s,t) = g(s,t)
                    1
Error: Unexpected STATEMENT FUNCTION statement at (1)

      if(g(s,t) .eq. 74.40000 .or. g(s,t) .eq. 76.60000 .or. g(s,t) .eq. 70.00000) then
                                                           1
Error: Operands of comparison operator '.eq.' at (1) are CHARACTER(1)/REAL(4)

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

57

帖子

15

主题

0

精华

熟手

F 币
242 元
贡献
166 点
沙发
 楼主| 发表于 2020-3-22 14:23:22 | 只看该作者
我把所有的代码放在这里,希望路过的大佬帮我看一下,得不到正确的结果
[Fortran] 纯文本查看 复制代码
001Program main
002use timer_supports
003use shuzu
004implicit none
005 
006  Integer,parameter :: length=1000
007  character(len=10)::g(18627,14)
008  integer i , f , idays , m , n , o , p , q , r , s , t
009  integer d
010  Character(LEN=length) A,B,Filename
011  Integer(kind=4)::Column, Row, K,L
012  real , allocatable :: c( : , : )
013   
014  idays = 0
015  Column=0;Row=0;K=0;L=1;filename="ztzl-1.txt"
016  Open (55,file=Filename)
017  Read(55,'(a1000)') A
018  column=GetDataN(A)!//改成这个函数,具体实现在下面的代码
019  CLOSE(55)
020  Open (55,file=Filename)
021  Do
022    Read(55,*,iostat=k) B
023    If( k /= 0 ) Exit
024    Row = Row + 1
025  End Do
026  Write(*,"(A5,I6,5X,A7,I2)") "Row=",Row,"Column=",Column!读取行数
027  allocate(c(column-1,row))
028  rewind(55)
029  Do i = 1,Row
030    read(55,*) d,c(:,i)!//1改成 i
031  End Do
032  Close(55)!将数据转化为数组
033   
034  do n = 7,10
035   do m = 1,18627
036    c(n,m) = c(n,m) * 0.1
037   end do
038  end do
039   
040      p = 12
041   do o = 1,18627
042      if(c(p,o)>=32000) then
043      c(p,o) = (c(p,o)-32000) * 0.1
044      else if (c(p,o)>=31000) then
045      c(p,o) = (c(p,o)-31000) * 0.1
046      else if (c(p,o)>=30000) then
047      c(p,o) = (c(p,o)-30000) * 0.1
048      else
049      c(p,o) = c(p,o) * 0.1
050      end if
051      write(*,"(F10.5)") c(p,o)
052   end do
053      
054   do q = 13 ,14
055    do r = 1 , 18627
056     c(q,r) = c(q,r) * 0.1
057    end do
058   end do
059    
060   write(g,'(A)') c
061    
062   do s = 1,14
063    do t = 1,18627
064     if(g(s,t) == '74.40000' .or. g(s,t) == '76.60000' .or. g(s,t) == '70.00000') then
065     cycle
066     end if
067     e(s,t) = g(s,t)
068    end do
069   end do
070    
071   
072  call daysfromdate(1957,1,1,2007,12,31,idays)
073  print *, idays
074  call indexit(1)
075  print *, e
076contains
077 
078  Integer Function GetDataN( cStr )
079    Character( Len = * ) , Intent( IN ) :: cStr
080    Integer :: i
081    Logical :: bIsSeparator , bIsQuote
082    GetDataN = 0
083    bIsSeparator = .TRUE.
084    bIsQuote = .FALSE.
085    Do i = 1 , Len_Trim( cStr )
086      Select Case( cStr(i:i) )
087      Case( '"' , "'" ) !// 如果遇到引号
088        If ( .Not.bIsQuote ) GetDataN = GetDataN + 1  !//如果不在引号中,则增加一个数据
089        bIsQuote = .Not.bIsQuote !// 引号结束或开始
090        bIsSeparator = .FALSE.
091      Case( " " , "," , char(9) ) !// 如果遇到分隔符
092        If ( .Not.bIsQuote ) then  !// 分隔符如果不在引号中
093          bIsSeparator = .TRUE.
094        End If
095      Case Default     
096        If ( bIsSeparator ) then
097          GetDataN = GetDataN + 1
098        End If
099        bIsSeparator = .FALSE.
100      End Select
101    End Do
102  End Function GetDataN
103End Program Main

数组e来自module shuzu,定义的是字符串型数组

838

帖子

2

主题

0

精华

大宗师

F 币
3937 元
贡献
2339 点
板凳
发表于 2020-3-23 08:41:24 | 只看该作者
为什么将实型数组转为字符串,目的?

57

帖子

15

主题

0

精华

熟手

F 币
242 元
贡献
166 点
地板
 楼主| 发表于 2020-3-23 09:26:43 | 只看该作者
li913 发表于 2020-3-23 08:41
为什么将实型数组转为字符串,目的?

前辈,是这样的,我的老师让我先建一个内容均为undefined的字符串型数组,然后再让我将实型数据逐个填入将undefined替换掉,但是有一些数据是缺报,漏报的,在使用grads画图时时需要保留这些undefined的内容,所以我想到就是先将实型的数组转化为字符串型的,然后再实现数组内容的替换。

178

帖子

15

主题

0

精华

大宗师

F 币
4973 元
贡献
1152 点
5#
发表于 2020-3-23 11:45:52 | 只看该作者
hpa 发表于 2020-3-23 09:26
前辈,是这样的,我的老师让我先建一个内容均为undefined的字符串型数组,然后再让我将实型数据逐个填入 ...

感觉你们这个思路很奇怪
正常的想法应该是先定义一个正常不可能取到的值作为初值
哪怕做个一个同样形状的mask矩阵也比你们这种操作合理……

838

帖子

2

主题

0

精华

大宗师

F 币
3937 元
贡献
2339 点
6#
发表于 2020-3-24 11:55:09 | 只看该作者
比如统计一年365天的降雨数据,现在只有300天的实测数据。1、开辟数组A(365),2、赋初值为一个不可能的降雨值 a=1.0e10,3、读取300个数据到A中相应位置;4、判断数据是否缺失(值很大),如果缺失,输出XXX, 否则输出XXX。

57

帖子

15

主题

0

精华

熟手

F 币
242 元
贡献
166 点
7#
 楼主| 发表于 2020-3-25 09:51:58 | 只看该作者
li913 发表于 2020-3-24 11:55
比如统计一年365天的降雨数据,现在只有300天的实测数据。1、开辟数组A(365),2、赋初值为一个不可能的降雨 ...

前辈,确实是这种思路,我刚开始进行数据的处理,不知道可以赋给他不可能的数值,麻烦您了

57

帖子

15

主题

0

精华

熟手

F 币
242 元
贡献
166 点
8#
 楼主| 发表于 2020-3-25 09:53:12 | 只看该作者
liudy02 发表于 2020-3-23 11:45
感觉你们这个思路很奇怪
正常的想法应该是先定义一个正常不可能取到的值作为初值
哪怕做个一个同样形状的 ...

前辈,确实是这种思路,我刚开始进行数据的处理,不知道可以赋给他不可能的数值,麻烦您了
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2025-5-3 02:49

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

快速回复 返回顶部 返回列表