2011-05-25 61 views
5

Bazı Fortran kodlarını okuyorum ve her zaman bir önceki programcı "n = n" ifadesinde yer alıyor. Bunun amacı ne? Bazı örnek kod: Böyle'n = n' nin amacı nedir?

if (cmult.lt.5.) then 
    kx = 0 
    do k=ipd(ii),lpd(ii) 
     kx = kx + 1 
     p1(kx) = epp_rfc(ipp,k) 
     epp_rfc(ipp,k) = cmult*epp_rfc(ipp,k) + x 
     zero(ix) 
     p2(kx) = epp_rfc(ipp,k) 
     n = n 
    enddo 

if (cmult.gt.0.) then 
    n = n 
endif 

else 
    nk = lpd(ii) - ipd(ii) + 1 
    do k=ipd(ii),lpd(ii) 
     kx = kx + 1 
     p1(kx) = epp_rfc(ipp,k) 
     epp_rfc(ipp,k) = pp(imem) + zero(ix) 
     p2(kx) = epp_rfc(ipp,k) 
     n = n 
    enddo 
endif 

cevap

14

Kod sık programcı koşullu kesme noktaları desteklemeyen debugger'lar bir kesme noktası ayarlamak için izin vermek için kullanılır.

o boşlukta bir kesme noktası ayarlayarak, sadece zarar görecek cmult.gt.0.

+0

Bunu nasıl biliyorsunuz? Bu çok ilginç. – tofutim

+1

+1, @tofutim çoğu FORTRAN hata ayıklayıcılar kadar iyi değil. Net olanlar, bu kadar çok "hack" yaygındır. Bu yapıları, 'write' /' printf' hata ayıklamanın yaygın olduğu birçok dilde gördüm. – user7116

1

n = ncmult.gt.0. değerini kontrol etmek için kullanılır ve 'koşulu kırılma noktası' olarak kullanılıyor olması o olduğunu bir anlamda tesadüfi ise Yukarıdaki kod snippet'inde n = n'nin görünmesinin nedeni değil.

Bu durumda n = n'nin kullanılmasının asıl nedeni, kaynak koddaki kapsamın, en popüler derleyiciler tarafından hiçbir zaman derleme diline çevrilmemesi gerçeğidir (bilgisayar, "kapsam" ın ne olduğunu anlayabilecek kadar akıllı değildir. Programcı tarafından açık bir şekilde programlanmadığı sürece ve programların 100'üncü zamanını daha yavaş çalıştırması durumunda ... kapsamı genişletmek için mantık için gönderilen ekstra talimatlar nedeniyle). Programlayıcıyı kaynak kodunda kısıtlamak ve kodun bir yapısını tanıtmak için sadece & derleyicisinin işlerini yapabilmeleri ya da kapsam belirleme kurallarını ihlal etmesi durumunda sorun çıkartabilmeleri için var.

Kapsam olmadığından, comipler'ın bazı yönerge (nop gibi) eklemesi ve hata ayıklayıcısının sihirli olarak enddo durmasına izin vermesi için hata ayıklama sembolleri ilgilenmediği sürece enddo duraklatılamıyor. N = n olmadan bu satırın sonucu p2(kx) = epp_rfc(ipp,k), döngünün üst kısmında sıfırlanan değerler olarak kontrol edilemez. Bu nedenle n = n, p2(kx) = epp_rfc(ipp,k)'dan sonra durmak için kullanılır ve her bir yinelemede son sonucu kontrol edin. Bu kod geldiğinde onu sonra:

if (cmult.gt.0.) then 
    n = n 
endif 

kolaylık için kullanılan amaçlar (tekrar endif ya da başka durdurmak olamaz) ve evet bu koşullu kesme noktası tür olduğunu. Ama n = nif (cmult.gt.0.) kontrol ettikten sonra duramazsın çünkü tekrar kullanılır - bunu de durdurabilirsiniz ancak değil sonra - bir sonraki talimat eğer başka dış sonra olacaktır. Umarım bu mantıklı gelir.

Düzenleme: hala çok fazla bir anlam ifade etmiyorsa burada ek bir bilgi: p2(kx) = epp_rfc(ipp,k) sonra p2(kx) değerini kontrol etmek için ayıklayıcı kontrol için talimatları göndermek zorundadır yürüttü/getir - dolayısıyla öyle Bilmesi gereken) a) p2(kx)'un boyutu nedir b) konumu - son talimatları hatırla! ve c) p2(kx) değerini almak için uygun talimatları verin. Hata ayıklayıcı için tüm bu aslında mantık olduğundan karmaşıktır - hata ayıklayıcının 'akıllı' olması gerekir (AI alanına düşer), eğer bir hata ayıklayıcının bunu yapabilmesi için şimdi bu Terminatör var olurdu.

İlgili konular