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
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 ...) –
Gfortran 4.9'da '-fsanitize = adres, undefined' ve derleyici şikâyet etmelidir. Valgrind da şikayet etmeli. –
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