2016-04-08 11 views
1

FORTRAN'da bir program yazdım, basit bir çarpım programı. Bir bilgisayarda iyi çalışıyor gibi görünüyor (uyarılar ve çıktılar olmadan doğru derler), ancak klasörü başka bir bilgisayara aldığımda, uyarı olmadan iyi derler, ancak çıktı neden rastgele bir sayıya dönüşür, neden bu olduğundan emin değil misiniz? İki çıktı var, biri özyinelemede algoritma, diğeri iteratif olarak yapıldı. Özyineleme iyi çalışıyor ancak yinelemeli hata veriyor. Temiz çalışıyorum ve aynı zamanda klasörü yeni bir temiz klasöre değiştirmeye çalıştım.Kod bir bilgisayarda çalışıyor ve başka bir makinede (uyarı ve derleyici hataları olmaksızın) derler ancak çalışma zamanı hatası var

o üzerinde çalışıyor birinin Versiyon: GNU Fortran (Debian 4.9.2-10) yanlış çıkışı ile birinin 4.9.2

Version: GNU Fortran (Debian 4.4.5-8) 4.4. üzerinde yaramıyor o 5

program multiplication 

    integer(kind = 8) :: multiplier, multiplicand, rcursvmultply, itratvmultply 

    write(*,*) "multiplier?" 
    read(*,*) multiplier 

    write(*,*) "multiplicand?" 
    read(*,*) multiplicand 

    write(*,*) rcursvmultply(multiplier, multiplicand) 

    write(*,*) itratvmultply(multiplier, multiplicand) 
end program 

recursive function rcursvmultply(multiplier, multiplicand) result(answer) 

    integer(kind = 8), intent(in) :: multiplier, multiplicand 
    integer(kind = 8) :: answer 

    if (multiplier == 0) then 
     answer = 0 
    else if (multiplier == 1) then 
     answer = multiplicand 
    else if ((multiplier > 1) .and. (mod(multiplier, 2) == 0)) then 
     answer = rcursvmultply((multiplier/2), (multiplicand*2)) 
    else if ((multiplier > 1) .and. (mod(multiplier, 2) == 1)) then 
     answer = (multiplicand + (rcursvmultply((multiplier/2), (multiplicand*2)))) 
    end if 
end function rcursvmultply 

integer(kind = 8) function itratvmultply(multiplier, multiplicand) 

    integer(kind = 8) :: multiplier, multiplicand 

    do while (multiplier > 0) 
     if ((mod(multiplier, 2)) == 1) then 
      itratvmultply = (multiplicand + itratvmultply) 
     end if 
     multiplier = multiplier/2 
     multiplicand = multiplicand*2 
    end do 
end function itratvmultply 

Ben de bilgisayarda aşağıdaki uyarıyı alıyorum:

make: Warning: File `Makefile' has modification time 4.6 s in the future 
make: warning: Clock skew detected. Your build may be incomplete. 

Ondan sonra orijinal bilgisayar ve scp temiz hale ettik yukarıdaki uyarı için, o değil görünmüyor ondan kurtulmak. Ancak, temizlediğimde, o bilgisayarda yeniden uyarı üretmiyor. Bunun neden olduğundan emin değilim. itratvmultply

itratvmultply = (multiplicand + itratvmultply) 

bu satırı değişken sonucu çalıştırılan ilk edilir

+0

Neden bu kadar uzun ve çirkin bir tamsayı (tür = 8) '' li 'bir yerde tanımlandığında, tamsayı (li) 'yi çok daha iyi (ve daha kısa)? (İstediğiniz her şeye yeniden adlandırabilirsiniz ...) –

+0

Gfortran 4.9'da '-fsanitize = adres, undefined' ve derleyici şikâyet etmelidir. Valgrind da şikayet etmeli. –

+1

Bir uyarı alıyorsunuz çünkü orijinal makinedeki sistem saati ikinci makinenin önündedir.Yapımlar önbelleğe alındığından, ikinci makinede bir 'make make' yapmak zorundasınız, böylece 'make' oluşturan dosyalar ikinci makinenin saati ile zaman damgalı olur. Tüm bunları söyledikten sonra, yaşadığınız sorun değil. – TriskalJM

cevap

2

(yani itratvmultply) herhangi bir değere sahip olduğu garanti değildir; Açıkça tayin edilmemiştir. Bu, atamanın rhs etkin bir şekilde önemsiz olduğu anlamına gelir.

Bildirdiğiniz belirtiler, bir bilgisayarda (derleyicinin bir sürümü ve bilinmeyen bir (derleme) derleme seçenekleri kullanılarak) bilgisayarla tümüyle açıksa, derleyici 0 değerini başka bir bilgisayarda (farklı derleyici sürümü) ayarlar. Muhtemelen farklı seçenekler) böyle bir değer sağlanmaz ve değişken bitlerin ve baytların ne olduğu olursa olsun alır.

Programın başladığında derleyicinin değişkenleri 0 olarak ayarladığını düşünebilirsiniz. Bu, Fortran dil standardı tarafından garanti edilmez. Ve düşük seviyedeki optimizasyon seviyesindeki derleyicilerin program başlangıcında 0 değişkenlerini ayarladıkları ancak daha yüksek seviyelerde olmadıkları yaygındır.

bu önceki değişken rhs'sine bir atamanın görünen ilk kez için kodunuzda hattı

itratvmultply = 0 

dahil düzeltmek için. Ve başlatılmamış değişkenlerin kullanımı hakkında sizi uyarmak için nasıl elde edeceğinizi öğrenmek için derleyicinizin belgelerine bakın.

Ve @ TriskalJM'nin yorumu, make sürecinde komik fütürizm hakkındaki sorunuzu yanıtlıyor.

İlgili konular