2016-03-29 19 views
0

Eski bir kodu modernleştirmeye çalışıyorum (veya en azından biraz daha anlaşılır hale getirin) ama ben bir FORMAT bildirimi için garip bir biçimde çalışıyorum.Eski fortran: Biçim bildirimi için Hollerith düzenleme açıklayıcı sözdizimi

Özellikle, içinde Hollerith sabitler ile FORMAT beyanı (n bir numara olduğunu nH) var:

FORMAT(15H ((C(I,J),J=1,I3,12H),(D(J),J=1,I3, 6H),I=1,I3,') te'   
1,'xt' ) 

Bu kapatılmamış parantez vardır göründüğü gibi dizim ile uğraşamaz. Bu biçim deyimiyle olduğu gibi düzgün derler, ancak parantezin kapatılması bir derleme hatasına neden olur (intel veya gfortran derleyicisini kullanarak).

Anladığım kadarıyla, Hollerith sabitler Fortran 66 bir yaratık vardı ve bir karakteri gibi bir şey olarak kullanıldığında genellikle onları anlamak Fortranda 77. yılında CHARACTER gelişi ile değiştirildi, ancak bir FORMAT kafamı karıştırıyor olarak kullanmak.

Ayrıca, 15H ((... değerini 15H ((... olarak değiştirirsem (yani bir boşluk kaldırırım), derleme yapmaz. Aslında, bu kodu değiştirseniz bile derlemek olmaz:

FORMAT(15H ((C(I,J),J=1,I3,12H),(D(J),J=1,I3, 6H),I=1,I3,') text' ) 

Bunun yerine daha normal (F77 +) biçiminde olmak istiyorum. Herhangi bir yardım takdir edilir. Onlar aynı sözdizimini kullanmak rağmen, 'Ne

cevap

5

, aslında (bir VERİ veya ÇAĞRI açıklamada oluşacak) Hollerith düzenleme tanımlayıcıları değil sabitleri vardır. F77, Hollerith sabitlerini tamamen değiştirdi; char-literal düzenleme tanımlayıcısını (çok!) daha iyi bir alternatif olarak ekledi, fakat H düzenleme tanımlayıcısı F95'e kadar standartta kaldı (ve hatta bazı derleyiciler hala bir uyumluluk özelliği olarak kabul ettiler).

Her durumda, H'dan önceki numara, H'dan sonraki herhangi bir başka sınırlayıcı olmadan bu karakter sayısını alır; Bu yüzden H'dan sonra bir karakteri silip (veya ekleyerek) vidalayın. Formatınızı Ayrıştırma (netlik için opsiyonel boşluklu) bu parçaları böylece

15H ((C(I,J),J=1, 
I3, 
12H),(D(J),J=1, 
I3, 
6H),I=1, 
I3, 
') te' 
'xt' 

ve modern eşdeğer içine kırılır Eğer devamında sonra bu metni koyabilirsiniz tercih ederseniz (Pars dahil

nn FORMAT(' ((C(I,J),J=1,', I3, '),(D(J),J=1,', I3, '),I=1,', I3 
    1,') text') 

veya) bir FORMAT etiketi yerine G/Ç deyiminde kullanılan bir CHARACTER değeri, değişken veya parametre içinde, ancak daha az uygun olan bir CHARACTER değerinde bunları almak için tüm alıntı karakterlerini ikiye katlamanız gerekir.

Hepsi bir arada sürümünüz, büyük olasılıkla, sabit biçimli, belki de varsayılan olarak kullandığınız ve her bir kaynak hattının yalnızca ilk 72 karakterinin sabit biçiminde kabul edildiği için derlenmemiştir. İlk 6, açıklama numarası ve devam göstergesi için ayrıldı, sadece 66 kaldı ve bu rakam benim sayım 71 oldu. Pratik olarak bugün bulacağınız herhangi bir derleyici, uzun kodlara izin veren ve yeni kodlar için başka avantajlara da sahip olan serbest biçimini de kabul eder, ancak varolan kodda, bazen kapsamlı değişikliklerde değişiklikler yapılmasını gerektirebilir.