2011-08-03 10 views
11

क्या किसी को फोरट्रान में दिए गए मिलीसेकंड के लिए सोने के तरीके के बारे में पता है? मैं गैर-पोर्टेबल सिस्टम कॉल का उपयोग नहीं करना चाहता, इसलिए फोरट्रान या सी पुस्तकालयों के लिए आंतरिक कुछ भी पसंद किया जाएगा।फोरट्रान में सोएं

+0

एक 'नींद' सबराउटिन है जो तर्क के रूप में कई सेकंड लेती है लेकिन मुझे यकीन नहीं है कि यह कहां से आ रहा है (रैपर से सी फ़ंक्शन?)। ऐसा लगता है कि मैं जो इरादा कर रहा हूं उसके लिए ठीक काम करता है। मैं एक पीसी पर इंटेल फोरट्रान कंपाइलर 12 का उपयोग कर रहा हूं। –

+0

मैं बस एक फोरट्रान कार्यक्रम में भाग गया जो एक (गैर-मानक) कॉल सिस्टम (char_arg) का उपयोग करता है जो बिना किसी सीपीयू ओवरहेड वाले सिस्टम तक पहुंचता है। इसे पीजीएफ 9 0, इफोर्ट और गफ्तर्रान के साथ बाहर निकाला, सब ठीक है। इसलिए, कोई नींद फ़ंक्शन प्राप्त करने के लिए कॉल सिस्टम ('नींद' // number_of_seconds_string) जैसी कुछ कर सकता है। अन्य कंपेलरों के साथ इसका परीक्षण करने का मौका नहीं था। – milancurcic

उत्तर

9

सेकंड की इकाइयों में सोने के लिए सी पुस्तकालय नींद उपयोग करने के लिए बाइंडिंग फोरट्रान आईएसओ सी का उपयोग करना: बाध्यकारी

module Fortran_Sleep 

    use, intrinsic :: iso_c_binding, only: c_int 

    implicit none 

    interface 

     ! should be unsigned int ... not available in Fortran 
     ! OK until highest bit gets set. 
     function FortSleep (seconds) bind (C, name="sleep") 
      import 
      integer (c_int) :: FortSleep 
      integer (c_int), intent (in), VALUE :: seconds 
     end function FortSleep 

    end interface 

end module Fortran_Sleep 


program test_Fortran_Sleep 

    use, intrinsic :: iso_c_binding, only: c_int 

    use Fortran_Sleep 

    implicit none 

    integer (c_int) :: wait_sec, how_long 

    write (*, '("Input sleep time: ")', advance='no') 
    read (*, *) wait_sec 
    how_long = FortSleep (wait_sec) 

    write (*, *) how_long 

    stop 

end program test_Fortran_Sleep 
+0

क्या आपको लगता है कि इंटेल फोरट्रान के अंदर प्रदान किया गया 'नींद' फ़ंक्शन मूल रूप से वही काम कर रहा है जो आपने ऊपर प्रदान किया है? –

+0

हां, कार्यात्मक रूप से शायद वही है। Gfortran में एक समान subroutine उपलब्ध है। यह एक ऐसा एक्सटेंशन है जो शायद कुछ अन्य कंपाइलर का हिस्सा न हो। –

+1

हाय, लिनक्स में मैं इसका उपयोग कर सकता हूं और यह ठीक काम करता है। विंडोज़ में और मिनजीडब्लू का उपयोग करते समय, इसे संकलित करते समय शिकायत होती है कि इसे स्लीप फ़ंक्शन नहीं मिल रहा है। क्या आप जानते हैं कि इसे कैसे ठीक किया जाए? –

4

ऐसा करने के लिए फोरट्रान मानक आंतरिक कार्यों का उपयोग कर सकते हैं सी के बिना:

program sleep 
!=============================================================================== 
implicit none 
character(len=100) :: arg ! input argument character string 
integer,dimension(8) :: t ! arguments for date_and_time 
integer :: s1,s2,ms1,ms2 ! start and end times [ms] 
real :: dt    ! desired sleep interval [ms] 
!=============================================================================== 
! Get start time: 
call date_and_time(values=t) 
ms1=(t(5)*3600+t(6)*60+t(7))*1000+t(8) 

! Get the command argument, e.g. sleep time in milliseconds: 
call get_command_argument(number=1,value=arg) 
read(unit=arg,fmt=*)dt 

do ! check time: 
    call date_and_time(values=t) 
    ms2=(t(5)*3600+t(6)*60+t(7))*1000+t(8) 
    if(ms2-ms1>=dt)exit 
enddo 
!=============================================================================== 
endprogram sleep 

निष्पादन योग्य मान लिया जाये कि एसएलपी है:

~$ time slp 1234 

real  0m1.237s 
user  0m1.233s 
sys   0m0.003s 

इस कार्यक्रम यदि y के एक विशेष मामले के जोड़े कहां चिंतित है कि यह आधी रात के आसपास टूट जाएगा :)

+3

जो मुझे याद दिलाता है। नींद की अवधि के दौरान आपको सीपीयू समय की आवश्यकता होने पर इस दृष्टिकोण का निश्चित रूप से उपयोग नहीं किया जाना चाहिए। मुझे लगता है कि आप रिमोट डेटा के लिए लंबे इंतजार के लिए ऐसा नहीं करते हैं। यदि आप करते हैं, तो आप शैल रैपर का उपयोग करके बहुत बेहतर हैं, क्योंकि ऊपर उदाहरण सीपीयू गहन है। – milancurcic

संबंधित मुद्दे