मैं चाहता हूं कि पास्कल में लिखे गए दो अलग-अलग प्रोग्राम अतिरिक्त टेक्स्ट फ़ाइल का उपयोग करके आपस में संवाद करें। यह पहले 2-3 संदेशों के लिए ठीक काम करता है लेकिन फिर यह प्रेषक.पास या रिसीवर में रन-टाइम त्रुटि देता है। क्या आप जानते हैं कि मेरी गलती कहां है या क्या आपके पास कोई सुझाव है?

पहला प्रोग्राम रिसीवर.पास

var
 f : text;
 s : string;
begin
 {I-}
 Assign(f,'main.in');
 while true do
  begin

   reset(f);
   while IOResult<>0 do      //
    begin                    // Wait until the file
     close(f);               //       is closed by sender
     reset(f);               //
    end;                     //

   if eof(f) then
    close(f)
   else
    begin
     readln(f,s);
     close(f);
     rewrite(f);
     close(f);
     writeln(s);
    end;
  end;
 {I+}
end.

दूसरा कार्यक्रम प्रेषक.पास

var
 f : text;
 s : string;
begin
 {I-}
 Assign(f,'main.in');
 while true do
  begin
   readln(s);

   rewrite(f);                //
   while IOResult<>0 do       //
    begin                     // Wait until the file
     close(f);                //        is closed by receiver
     rewrite(f);              //
    end;                      //

   writeln(f,s);
   close(f);
  end;
 {I+}
end.
1
Azad Salahli 6 मई 2011, 19:59

2 जवाब

सबसे बढ़िया उत्तर

कुछ चीजें जो मैंने देखीं:

  1. यदि पुनर्लेखन विफल हो जाता है, तो क्या फ़ाइल खोली नहीं गई थी और आपको इसे बंद करने की आवश्यकता नहीं है? एक बंद फ़ाइल को बंद करने से रनटाइम त्रुटियाँ हो सकती हैं (हालाँकि मुझे लगता है कि असाइन इसे सुरक्षित रूप से निष्क्रिय कर देगा)
  2. आप इनका उपयोग कैसे करते हैं, इसके आधार पर तर्क में हो सकता है। अर्थात् किसी फ़ाइल को बंद करने के बाद अन्य ऐप्स द्वारा खोलने के लिए सीधे तैयार है। सामान्य रूप से बंद फाइलहैंडल्स कई सेकंड तक कई 100ms तक रहता है (फाइल सिस्टम बिजनेस के आधार पर)। इससे ऐसी योजनाओं में भुखमरी की समस्या उत्पन्न हो सकती है। (जबकि यह सादे डॉस में काम करेगा, जो कम नहीं था, कम से कम इतना नहीं)
  3. यदि फ़ाइल मौजूद नहीं है तो पाठक क्रैश हो जाएगा।
  4. मुझे लगता है कि {I-}/{I+} एक टाइपो है और आपका स्रोत कोड वास्तव में {$I-} और {$I+} पढ़ता है (डॉलर नोट करें?)
  5. विंडोज पास्कल संस्करणों में, केवल पढ़ने के लिए एक्सेस हमेशा लॉक नहीं होता है। सब कुछ में पहली पंक्ति के रूप में filemode:=2 रखें।

यह कौन सा कंपाइलर है? डेल्फी, फ्री पास्कल? कौन सा संस्करण?

मेरा नया (फ्री पास्कल) रिसीवर कोड बन जाता है:

uses sysutils;
var
 f : text;
 s : string;
begin
 filemode := 2; // read-only
 {$I-}
 Assign(f,'main.in');
 while true do
  begin
   reset(f);
   while IOResult<>0 do      //
    begin                    // Wait until the file
     close(f);               //       is closed by sender
     sleep(1000);
     reset(f);
    end;
   if eof(f) then
    begin
      close(f);
      sleep(1000);
    end
   else
    begin
     readln(f,s);
     close(f);
     rewrite(f);
     close(f);
     writeln(s);
    end;
  end;
 {$I+}
end.

नया प्रेषक कोड है:

uses sysutils;
var
 f : text;
 s : string;
begin
 filemode := 2; // read-only
 {$I-}
 Assign(f,'main.in');
 while true do
  begin
   reset(f);
   while IOResult<>0 do      //
    begin                    // Wait until the file
     close(f);               //       is closed by sender
     sleep(1000);
     reset(f);
    end;
   if eof(f) then
    begin
      close(f);
      sleep(1000);
    end
   else
    begin
     readln(f,s);
     close(f);
     rewrite(f);
     close(f);
     writeln(s);
    end;
  end;
 {$I+}
end.
2
Marco van de Voort 8 मई 2011, 20:32
आउच! मैंने क्या बेवकूफी भरी गलती की है। मेरा मतलब डॉलर के संकेत हैं। :D +1 filemode:=2 के लिए संपादित करें यह मुफ़्त पास्कल 2.2.4 है
 – 
Azad Salahli
13 मई 2011, 11:26
उपरोक्त एफपीसी/ट्रंक (2.5.1) था। मैंने वास्तव में उन निर्देशों को भी लगभग 10 मिनट तक देखा।
 – 
Marco van de Voort
13 मई 2011, 14:09

कुछ चीजें: सुनिश्चित करें कि आप प्रत्येक फ़ाइल ऑपरेशन के बाद IOResult की जांच करते हैं, न कि केवल फिर से लिखना/रीसेट करना - यदि आपका रीसेट/रीराइट विफल हो गया है तो बंद न करें - और आप शायद उन रिट्री लूप में स्लीप (250) जैसा कुछ चाहते हैं।

1
500 - Internal Server Error 6 मई 2011, 22:15
मुझे प्रत्येक ऑपरेशन के बाद IOResult की जांच क्यों करनी है। यदि मैं फ़ाइल को खोलने में सफल हो जाता हूँ, तो प्रत्येक ऑपरेशन तब तक सफल होगा जब तक कि मैं फ़ाइल को दोबारा बंद नहीं कर देता। क्या मै गलत हु?
 – 
Azad Salahli
7 मई 2011, 17:10
मेरा सिद्धांत है कि आपको प्रत्येक I/O ऑपरेशन की जांच करनी होगी। उदा. राइटलाइन लिखने में सक्षम नहीं हो सकता है क्योंकि डिस्क भरी हुई है। कम से कम अब डिबगिंग उद्देश्यों के लिए ऐसा करना बुद्धिमानी हो सकती है।
 – 
Marco van de Voort
8 मई 2011, 20:12
उदाहरण के लिए, यदि आपने बंद करने के बाद IOResult की जाँच की थी तो आपने देखा होगा कि यह विफल हो गया है।
 – 
500 - Internal Server Error
9 मई 2011, 20:22