포트란 코드 C로 변환중에 질문 드립니다.

mastr99의 이미지

포트란은 처음 접하는거라 막히는 부분이 너무 많네요.. 소스파일도 일부분이라 테스트도 못하고 있구요..
포트란은 버전도 많은것 같은데 막상 자료 찾아봐도 변환해야될 포트란 버전은 모르는 상태라 애매하기도 합니다..
머리 싸잡고 구글링중에 어쩌다 여기까지 찾아와서 가입하고 글 남기게 되네요

변환중인 포트란 코드 일부는 아래와 같습니다..

SUBROUTINE CRITICAL(TYP)
CHARACTER TYP*5
WRITE(6,106)
IF(TYP.EQ.'H') THEN
NTYP=0
ELSEIF(TYP.EQ.'V') THEN
NTYP=1
.
.
.

포트란에서 함수는 오로지 call by name이라 본것 같은데요..
이런식의 재정의도 허용이 되는건가요?
재정의가 아니라 날라오기 전부터 5바이트짜리 문자열이었다고 쳐도
아래쪽 if문에서 문자열과 문자를 비교하고 있으니 무슨얘긴지 도통 모르겠습니다..

죄송하지만 하나 더 있습니다.
.
.
IF(BRANCH(I)(1:1).EQ.'D')THEN

BRANCH[I][1:1] // 여기서 1:1이 어떤 의미를 가지는지도 알고 싶습니다..
이건 구글링을 하려고 해도 검색 키워드 넣기가 너무 힘드네요..

면목없게도 마지막으로 또 하나 있습니다..
코드 전체적인 구성이 design.h 라는 파일에 전역변수로 보이는 변수들이 선언된 상태구요
각 서브루틴 첫줄에 design.h를 include시키고 필요한 변수 선언하고 그 이후부터 수식 계산이 있거든요..

헤더----------------------------------------------------------
C** design.h
.
.
.
PARAMETER (NDI=100)
COMMON/BLOCK5/INCID(NDI,NDI),D(NDI,NDI,10),L(NDI,NDI,10),
! PGIVEN(NDI),C(NDI,NDI,10),P(NDI)
.
.
.
-------------------------------------------------------------

코드----------------------------------------------------------
C** cir.for
SUBROUTINE OUTPUT(WORKN,COMPO,TYP,VER,MESH)
INCLUDE 'DESIGN.H'
LOGICAL INCID
.
.
-------------------------------------------------------------
일반적으로 변수 선언시에 자료형 명시하지 않으면 i-n까지는 intger, 그외에는 double인가 real형으로 선언된다 봤었는데요.
INCID라는 변수 자료형이 뭔지도 모르는 상태에서..혹 intger라 치더라도
이런식으로 LOGICAL로 또 선언이 가능한가요?

두서없이 긴 질문글이지만 읽어주셔서 감사합니다. 행복하세요

익명 사용자의 이미지

1. Fortran 은 Call By Reference 또는 Call by Value-result 처럼 동작합니다.
Call by Reference라고 하면 맞습니다.
포트란의 표준에서 "포트란은 call by reference 다!"라고 명시한게 아니라..
포트란은 이러 이렇게 동작해야 한다.만 명시되어 있고.
그 실제가 어떻게 구현되는 가는 processor depends 입니다.
여기서 processor는 구현자 - 즉 개별 컴파일러마다 다르다 입니다.

포트란 표준에선 딱 이 정도 표현만 있습니다.
"포트란의 인수전달은 call by reference 나 call by value-result 와 유사하다." 이는 구현자의 몫이다.

yeonpil_net의 이미지

program alias1
real x
x = 4.0
call sub (x,x)
print *, x
end

subroutine sub (a,b)
real a,b
a = a + 2.0
b = b * 3.0
return
end subroutine sub
------------------------------------------------------
call-by-reference와 call-by-value-result는
위와 같은 코드가 있을 때나 그 차이가 납니다.
caller에서 sub(x,x)로 해서 서브수틴에서 서로 그 값을 바꿔버립니다.

print *, x의 값이 어떻게 될지는 컴파일러의 설정에 따라 다릅니다.
이런 코드는 포트란 표준에 부합하는 코드가 아니라서 사용해서도 안되죠.

그 외에 일반적인 경우는 차이가 나지 않습니다. 그냥 call-by-reference라고 하면 됩니다.

http://en.wikipedia.org/wiki/Evaluation_strategy
를 보시고, call-by-reference 와 call-by-copy-restore를 보시면 됩니다.
몇몇 같은 개념에 대한 다른 용어를 사용할 때가 있지만,

call-by-name과는 다른 개념입니다. algol과 착각한 경우일 겁니다.

다음 메뉴얼 페이지에 인텔 컴파일러(구 cvf도 비슷)의 경우 기본값과, 어떤 선택이 가능한지에 대해 컴파일 옵션이 나와있습니다.

http://software.intel.com/sites/products/documentation/hpc/composerxe/en-us/2011Update/fortran/win/copts/fortran_options/option_iface.htm

!23456---1----+----2----+----3----+----4----+----5----+----6----+----7-2--+----8
"배웠다"는 "할 수 있다"의 동의어가 아니다.

yeonpil_net의 이미지

2.
SUBROUTINE CRITICAL(TYP)
CHARACTER TYP*5


void critical(char typ[5]) {
}
입니다.
------------------------------------------------------------------
WRITE(6,106)
IF(TYP.EQ.'H') THEN
NTYP=0
ELSEIF(TYP.EQ.'V') THEN
NTYP=1
.
.
-----------------------------------

이 같은 코드는 이상한데

char typ[5]
에 대해서
if ( typ == 'H') {
처럼 하지 않듯이
typ(1) 같은 배열의 첨자가 있을 것으로 생각되네요...
if (typ(1) .EQ. 'H') 같은 형태가 아니었을지..
----------------------------------------

3. WRITE(6,106)
Write문에서 unit= 6 은 STDOUT에 출력을 의미합니다. 106은 106번 라벨의 format문 형태로 출력이죠

4. BRANCH(I)(1:1)
Branch는 문자열의 배열입니다.
(1:1) 같은 표현은 문자열에서의 substring을 의미합니다. 1~1 이니 당연히 첫 번째 문자

BRANCH(I)(1:1)
는 따라서 branch 문자열의 배열에서 i번째 문자열의 첫 번째 문자를 의미합니다.

5. 가능은 할 겁니다. 하지만 뭣 같은 옛날 식이며.. 표준에선 아마 안되어야 할..(하지만 많은 컴파일러에서 가능한..). 뭐 같은 코드입니다.(저라면 일단 욕부터 하고 코드를 봅니다 ㅋㅋ)

컴파일러에 따라 어떤 행동을 할지 장담할 수 없습니다.

일단 가장 먼저 incd에 초기값을 할당하는 코드가 어떻게 되어 있는지 봐야 할 겁니다.

정수값이 양수/음수이면 .FALSE./.TRUE. 일지..
0일때 이외는 전부 .TRUE.일지..
컴파일러가 어떻게 행동하는 지에 따라 다를 것으로 예상됩니다.

비 표준적 행동이고..
정확히는 예전에 사용된 코드라면 그 코드가 컴파일되던 컴파일러의 매뉴얼을 봐야 합니다.

COMMON 블럭은 전부 Module문으로 바꾸고..
형선은 Implicit None으로 해서 전부!! 확실하게 선언하는 것이 정확하게 만드는 길입니다.
저는 일단 포트란에서 코드를 확실하게 한 후에 변환하는 편입니다.

COMMON 문의 사용은 이제 죄악으로 여겨 진지 오랩니다.
어떤 형으로 선언된 변수를 다른 형으로 접근한다던지 (질문자의 예처럼) 하는 행태가 가능해서..

코딩을 잘 못한 경우죠.. 허다하게 그런 코드가 남겨져 있고....
일단 자신의 현실에 대한 욕과, 작성자가 누군지 코멘트가 있다면, 그 분에 대한 욕을 한 10분쯤 하고 나시면 마음이 풀리실 겁니다.

과연 이 코드가 잘 돌아가긴 했을까...
미국은 어떻게 인공위성을 그렇게 수없이 날렸을까.. 하는 명상과 함께..

-------------------------------------------------------------------------------------------------
포트란과 C는 같은 면도 많이 있지만, 정말 다른 면이 많이 있습니다.
많은 사람들이 포트란을 C처럼 생각하면서 오류를 범하는데..

포트란 코드를 C로 바꾸신다면..음
+ 2차이상의 배열에서 C는 row-major order이고, fortran은 column-major 인 것.

+ call by reference <-> call by value 라서 포트란의 서브 프로그램 인수는 일단 C에선 *가 붙은 형태가 된다는 점.
경우에 따라선 판단을 해야 함. 함수/서브루틴 내에서 인수의 값을 바꾸지 않으면 *가 아닌 현태로 하고.. 인수가 되는 변수가 수식의 왼쪽에 온다면 *로 선언해야 하고..

+ 서브프로그램의 인수에 문자열을 넘길 때 포트란은 그 문자열의 크기도 같이 인수와 함께 넘겨집니다.
문자열의 크기가 임의로 (포트란에선 *로 표시)될 때.. 고려해야 합니다.
(위의 예에선 크기5의 문자의 배열이라 배열의 크기가 명시된 경우고.. 그냥 별개의 문제를 말하는 겁니다.)
문자열이 인수가 되는 코드를 C로 변환하려 하면, 고려를 해야합니다.

그리고 포트란엔 NULL문자의 개념은 필요 없습니다. 문제가 되는 부분이죠. 문자열의 크기에서..
C에선 어떤 문자열의 끝을 NULL문자로 보고 판단하죠?
c에선 (char *)를 넘기면 되고, 함수에서 \0 가 나오는 곳까지 판단해서 문자열의 크기를 판단하거나하죠..
포트란은 "문자열의 크기"를 알아서 넘깁니다. 인수에 명시되지 않고..

+ 포트란은 레코드가 I/O의 기본 단위입니다.

!23456---1----+----2----+----3----+----4----+----5----+----6----+----7-2--+----8
"배웠다"는 "할 수 있다"의 동의어가 아니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.