سؤال

لدينا بعض رمز دلفي القديم (ربما نشأت حتى كود توربو باسكال) الذي يستخدم {$I-}, ، الملقب ب {$IOCHECKS OFF}, ، مما يجعل الكود استخدام ioresult. بدلا من الاستثناءات لأخطاء I / O القرص.

أريد أن أتخلص من {$I-} وجلب هذا الرمز إلى الأمام في التسعينيات، ولكن للقيام بذلك، أود أن أعرف ما يتأثر كل شيء {$IOCHECKS OFF}. وبعد هل هذا يؤثر فقط على وظائف الإدخال / الإخراج القديمة Crufty مثل تعيين / إعادة تعيين / إعادة كتابة / إلحاق / إشراف؟ أو هل يؤثر على المزيد من الأشياء الحديثة مثل tfilestream كذلك؟ والأهم من ذلك، ماذا قد تتأثر أنني لا أفكر في؟ فيأساسيات دلفي يقترح أنه يؤثر أيضا على mkdir و rmdir. إذا كان يؤثر على تلك، يجب أن يكون هناك المزيد.)

موضوع تعليمات Delphi 2007 موضوع "فحص إخراج الإدخال (Delphi)" (ms-help://borland.bds5/devcommon/compdirsinput_outputchecking_xml.html) يقول أن هذا يؤثر على "إجراء I / O [S]، وأن" إجراءات الإدخال / الإخراج موضحة في دليل لغة دلفي ". هذا لا يساعد الكثير، نظرا لأن CodeGear لم يتم شحن دليل لغات، والمرة الأخيرة التي يتم شحنها Borland واحدة Delphi 5.

والوظائف والفئات تتصرف بشكل مختلف تحت {$I-}?


تعديل: تعطي الإجابة المقبولة بعض الخلفية الرائعة، ولكن إليك الملخص السريع في نموذج القائمة الأبجدي: {$IOCHECKS OFF} فقط يؤثر على الروتين التالي من وحدة النظام.

  • ألحق
  • Blockread.
  • blockwrite.
  • chdir.
  • إغلاق الملف
  • إف
  • Eoln.
  • محو
  • filepos.
  • حجم الملف
  • فلوش
  • mkdir.
  • اقرأ
  • Readln.
  • إعادة تسمية
  • إعادة ضبط
  • اعادة كتابة
  • RMDIR.
  • طلب
  • سيكوف
  • seekeoln.
  • SetlineBreakstyle.
  • اقتطاع
  • يكتب
  • Writeln.
هل كانت مفيدة؟

المحلول

حيث $I هو توجيه مترجم، يمكن أن يؤثر فقط على التعليمات البرمجية التي تم إنشاؤها بالمترجم، ويمكن أن تؤثر فقط على التعليمات البرمجية التي يتم تجميعها في الواقع.

لأولئك اثنين من الأسباب، لا تستطيع تؤثر على أشياء مثل TFileStream. وبعد انها فئة في classes.pas., وهي وحدة لا تجميعها. أي رمز في ذلك لا يتأثر $I التوجيه. علاوة على ذلك، لا يعالج المترجم هذا الفصل بشكل خاص بأي شكل من الأشكال. انها مجرد فئة عادية أخرى.

ال $I يؤثر التوجيه على الوظائف المدمجة باللغة التي ذكرتها. يقوم برنامج التحويل البرمجي بإنشاء مكالمات إلى تلك الوظائف خاصة. كما يؤثر على المكالمات write, writeln, ، و readln. وبعد يجب أن تؤثر أيضا BlockRead و BlockWrite.

يمكنك التحقق من شفرة المصدر. أي شيء يدعو SetInOutRes عرضة ل $I. وبعد يتضمن الوظائف التي تفتح الملفات (Append, Reset, ، و Rewrite)، وكذلك أي شيء آخر يقبل معلمة من النوع file أو TextFile (Flush, BlockRead, BlockWrite, Erase, FilePos, Seek, FileSize, Read, Readln, Write, Writeln, Rename, Eof, SeekEof, Eoln, SeekEol, Truncate, SetLineBreakStyle, ، و CloseFile). أيضا، أي شيء يستدعي InOutError (ChDir, MkDir, ، امد RmDir).

غائبة بشكل ملحوظ عن القائمة AssignFile. وبعد هذه الوظيفة لا تفعل في الواقع أي I / O. انها مجرد إعداد سجل الملف بحيث Append, Reset, ، و Rewrite سوف تعرف ماذا تفعل.


يجب أن أشير إلى أن النظر في التعليمات البرمجية المصدر هو مجرد استنتاج. ال $I عناصر تحكم التوجيه ما إذا كان برنامج التحويل البرمجي سيقوم بإدراج المكالمات إلى __IOTest وظيفة في الرمز الخاص بك بعد استدعاء بعض الوظائف الأخرى. هذه الوظيفة يتحقق من قيمة InOutRes, ، وإذا لم يكن صفر، فإنه يثير خطأ وقت التشغيل (الذي قد يؤدي إلى استثناء إذا sysutils. يتم تضمين في البرنامج الخاص بك). لا يمكننا التحقق من شفرة المصدر مباشرة معرفة الوظائف التي تتأثر $I (نظرا لأنها تسمى فقط في التعليمات البرمجية التي تم إنشاؤها بالمترجم)، لذلك نحن نبحث فقط عن الوظائف تعيين InOutRes, ، مع افتراض أنهم لن يزعجوا القيام بذلك إذا لم يعرفوا أن المترجم سيحقق منه بعد ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top