Каков наилучший способ реализовать этот фрагмент Фортрана в C # - PullRequest
2 голосов
/ 07 декабря 2011

У меня есть процедура Fortran, которая читает данные из файла, подобного этому:

10   READ(X,*,ERR=8000,END=9000) ... Read header line of data sequence
C    Some processing of header line data...
     READ(X,*,ERR=8000) ... Read secondary line of data sequence
C    Some processing of secondary line data...
20   READ(X,*,ERR=8000) ... Read data line
     IF data contains 'X' GOTO 10
C    Do some calculations with the data ...
     IF (X.LT.Y)
         GOTO 10
C    Do some more calculations ...
100  CONTINUE
8000 'Output some error to the log'
9000 'Some final stuff'
     RETURN

Оригинальный код намного длиннее, но это суть. Я думаю, что код C #, как показано ниже, должен делать то же самое (кодирование из памяти, поэтому могут быть некоторые ошибки ...), но по некоторым причинам это кажется чрезвычайно сложным для достижения того же результата. Есть ли простой способ повторить поток рутины Фортрана? Это просто случай, когда использование gotos обеспечивает более короткий код, чем использование блоков кода?

private void MyFunction(Stream MyData)
{
    string s = string.Empty;
    bool flag;
    StreamReader sr = new StreamReader(MyData);
    try
    {
        while (!sr.EndOFStream)
        {
            s = sr.ReadLine(); ... Read header line of data sequence
            //Some processing of header line data ...
            s = sr.Readline(); ... Read secondary line of data sequence
            //Some processing of secondary line data ...
            flag = false;
            while (!(s = sr.ReadLine()).Contains("X"))
            {
                //Do some calculations with the data ...
                if (X < Y)
                {
                    flag = true;
                    break;
                }
                //Do some more calculations ...
            }
            if (flag) continue;
        }
        //Some final stuff ...
        return;
    }
    catch
    {
         //Output error to log...
    }
}

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

Конечно, операторов goto можно избежать.

Мне кажется, однако, что ваш образец C # не выполняет то же самое, что и фрагмент Фортрана (по крайней мере, я так думаю).Я не знаю C #, но вот версия на Фортране без gotos.Он должен быть эквивалентен другой версии с одним исключением: я не включил проверки ошибок ввода-вывода.

 readloop : do while(.true.)
    read(X,*,iostat=stat) ! ... Read header line of data sequence
    if (stat /= 0) exit
    ! Some processing of header line data...
    read(X,*)             ! ... Read secondary line of data sequence
    ! Some processing of secondary line data...
    read(X,*)             ! ... Read data line
    if (data contains 'X') cycle readloop
    ! Do some calculations with the data ...
    if (X >= Y) exit readloop
 end do
 ! Some final stuff

Это должно привести к тому, что код на C # -ish будет (Я выведу синтаксис из примера кода):

 while (!sr.EndOfStream) {
   s = sr.ReadLine();
   // process
   s = sr.ReadLine();
   // process
   s = sr.ReadLine();
   if (s.Contains("X")) continue;
   // calculations
   if (X >= Y) break; 
 }
 // final processing

и просто включить сюда проверку ошибок, используя конструкцию try ... catch.

0 голосов
/ 07 декабря 2011

При чтении третьей строки вы можете прочитать строку несколько раз.

Я стараюсь не назначать переменную в тесте. Это делает код трудным для чтения.

...