2014-05-08 11 views
5

Birkaç yıl önce FORTRAN kullandım ve eski bir FORTRAN programını (F77) sürdürmek için görevlendirildim. Aşağıdaki kod tanıdık değildi:Bir fortran örtülü döngüsünün netleştirilmesi

 READ(FILE_LOG_UNIT, IOSTAT=FILE_STATUS) NUM_WORDS, 
    . (BUFFER(BIX), BIX=1, NUM_WORDS) 

bazı on-line forumlar beni kafa karıştırıcı kısmı, devamı hattı, zımni döngü olduğunu ortaya koydu gözden. Programım bana burada sorun yarattığından beri, bunu geleneksel bir DO döngüsüne dönüştürmek istiyorum. Bunu dönüştürmek, bundan 5 yıl sonra bu şeyi soğuyan bir sonraki zavallı sloganı da destekleyebilir! Neyse, DO döngü eşdeğer benim en iyi tahmin

READ(FILE_LOG_UNIT, IOSTAT=FILE_STATUS) NUM_WORDS 
    DO BIX=1, NUM_WORDS 
    READ(FILE_LOG_UNIT, IOSTAT=FILE_STATUS) BUFFER(BIX) 
    ENDDO 

olduğunu ama bir tek bu değişikliği yaptığınızda, çalışıyorlardı test durumları çalışmayı durdurdu. Hala burada olan şeyin iki farklı READ olduğunu hissettim (NUM_WORDS almak için ilk, ve veriler arasında geçiş yapmak için ikinci), bu yüzden daha az sert bir değişiklik yapmayı denedim, onu iki ifadeye dönüştürdüm ancak ima edilen döngüyü koruyorum:

READ(FILE_LOG_UNIT, IOSTAT=FILE_STATUS) NUM_WORDS 
    READ(FILE_LOG_UNIT, IOSTAT=FILE_STATUS) (BUFFER(BIX), BIX=1, NUM_WORDS) 

Ama sadece bu değişiklik aynı zamanda başarısız iyi test durumları neden olur. Değişikliklerimin her ikisinde de, NUM_WORDS değeri beklendiği gibi geliyordu, dolayısıyla döngü başarısız olduğu yerde görünüyor.

Orijinal örtülü döngü için eşdeğer DO döngüsü nedir? Yoksa yanlış yolda mıyım?
Teşekkürler

+0

Cevabınız için teşekkürler, janneb. Dosya açık hakkındaki varsayımınız doğruydu; Biçimlendirilmemiş sıralı kullanıyorum. Ve cevabınızdan daha önemli olan sorunun READ olduğunu görüyorum ve bir kayıt okuduğunu fark ettim. – user3617977

cevap

3

Dosya nasıl açılır? Yani ACCESS = 'ardışık', access = 'direct' veya access = 'stream' (son olarak F2003 ilavesiyle son derece olası değildir). İkincisi, biçimlendirilmiş veya biçimlendirilmemiş mi? Okuma ifadelerinizde REC = belirteci ya da format belirleyici olmadığı için formatlanmamış sıralı olduğunu farz edeceğim.

Başarısız olmaya çalıştığınız şeyin nedeni, her okuma ifadesinin ayrı bir kayıt okumasıdır. F2003'teki access = 'stream' girişinden önce Fortran I/O tamamen kayıt tabanlıdır. Bu, diğer birçok dilde görüldüğü gibi dosya türlerini yayınlamak için kullanılanlara biraz yabancıdır.

Biçimlendirilmemiş sıralı dosyalar için kayıtlar genellikle kaydın her bir ucundaki "kayıt işaretçileri" ile ayrılır, tipik olarak kaydın uzunluğunu belirten 4 bayt. | Yani kaydı (diskteki) muhtemelen

gibi görünür uzunluk (4 bayt) | num_words (4 bayt?) | tampon (1) | tampon (2) | ... | uzunluk | Bir OKU ifadeye NUM_WORDS, diyelim ki, okumaya çalışırsanız

Şimdi, doğru, dosyadan NUM_WORDS okuyacaktır SONRA sonraki kaydın başlangıcına kadar ileri atlar. Ve daha sonra ayrı bir READ deyimiyle arabellek okumaya çalıştığınızda, dosyada zaten çok ileride olduğunuzdur. Eğer bir bit ve kullanım F90 + dizi sözdizimi hile varsa bunu yazılı ediliyor aynı açıklamada NUM_WORDS başvuruda izin eğer emin değilim gerçi

, sen (

READ(FILE_LOG_UNIT, IOSTAT=FILE_STATUS) NUM_WORDS, BUFFER(1:NUM_WORDS) 

kaçabilirsiniz to)