استدعاء إجراءات البرمجة في الهيكل المناسب …


لدي سؤال قد يضايقك، ولكنه قد يحرجني أيضًا في نفس الوقت، ولكن هنا.

دعونا نحصل على بعض الأمثلة البرمجية التي يجب العمل بها أولاً:

إعلان روتين “C”.
int RetIntDayNum(char * datestrg, int * intdaynum, int * iostat);

الإعلان عن روتين “C” البسيط الفعلي.
int RetIntDayNum(char * datestrg, int * intdaynum, int * iostat) {
////



العودة (1)؛
}

الإعلان عن مكالمة “C”: روتين 1.
iretv = RetIntDayNum(cdatestring, &idaynum, &iostat);

الإعلان عن مكالمة “C”: روتين 2.
iretv = RetIntDayNum(cdatestring, &idaynum);

طيب هنا السؤال…
عند استدعاء روتين “C”، يجب عليك استخدام “روتين 1”. ولكن أثناء تجميع مشروعي البرمجي، اكتشفت لاحقًا و
أدركت أنني كنت أستخدم منهج “الروتين 2″، وفي كل مرة أقوم بتجميع هذا البرنامج؛
تم تجميعه بشكل جيد وتشغيله بشكل جيد.

أستخدم حاليًا بيئة Enterprise MSVC 2019، على نظام التشغيل Windows 10.

أعلم أن استخدام “الروتين 1” هو الطريقة الصحيحة للقيام بالأشياء، ولكن لماذا لا يؤدي استخدام “الروتين 2” إلى جعل البرنامج
ينفجر؟. لماذا. أم أنه انفجار منتظر وجاهز للحدوث؟
حاليًا، يجب أن أعود إلى هذا البرنامج الكبير وأصلح جميع أخطائي في البرنامج. لكنه يزعج
لماذا لا يتسبب نهج “الروتين 2” في تفجير البرنامج (أو ثنيه) الآن.

أم أن هذا الانفجار المنتظر سيحدث بمجرد هذا
البرنامج يعمل على منصة ويندوز مختلفة تماما؟؟

عقلي الفضولي يريد أن يعرف..
ومرة أخرى، شكرا!

ما حاولت:

ما يظهر في منطقة الأسئلة وفي مشروع البرمجة الخاص بي.

الحل 1

يعتمد ذلك على المترجم: سيعطيك معظمه خطأ “عدد قليل جدًا من الوسائط التي لا تعمل” عند محاولة الاتصال به بمعلمتين.

بخلاف ذلك، من المحتمل أن ينفجر الأمر عند محاولة استخدام iostat داخل الوظيفة حيث أن قيمته ستكون غير محددة وقد تكون تقرأ أو تكتب على أي جزء من الذاكرة.

سأتحقق مما تستخدمه – MSVC هو MicroSoft Visual C وكان هذا منتجًا مستقلاً أصبح جزءًا من Visual Studio منذ حوالي 20 عامًا ولم يكن لديه إصدار 2019 مطلقًا.
وأنا متأكد تمامًا من أن VS 2019 سيلقي خطأً على عدد قليل جدًا من المعلمات لبرنامج C (من الممكن تحديد وظائف في لغة C تحتوي على عدد متغير من الوسائط – تسمى دالة متغيرة – ولكن هذا يتطلب بناء جملة خاصًا و تختلف كيفية استخدامها).

الحل 2

بادئ ذي بدء، يجب التمييز بين الإعلان في التنفيذ واستدعاء الوظيفة. السطر التالي ليس إعلانًا ولكنه مهمة:

ج
iretv = RetIntDayNum(cdatestring, &idaynum, &iostat);

عادةً ما يُنشئ VS2019 خطأً دائمًا إذا لم يتمكن من العثور على تطبيق مناسب للمكالمة.

نداء

ج
iretv = RetIntDayNum(cdatestring, &idaynum);

يسبب الخطأ C2198: “RetIntDayNum”: لا توجد وسائط كافية للاتصال.
أو الخطأ C2660: “RetIntDayNum”: لا تقبل الدالة وسيطتين

نظرًا لأن VS2019 هو مترجم C++، فقد تطرح عدة أسئلة.
هل تم تجميع الكود كرمز C أو C++ ومع أي إصدار للمترجم؟ يمكن لـ VS2019 التجميع بشكل أساسي باستخدام المعايير التالية: C++ 14، C++ 17، C++ 20، Legacy MSVC، std:c11، std:c17.

التفسير الوحيد الذي يمكنني التفكير فيه للسلوك الموصوف هو أنه توجد في مكان ما وظيفة أخرى بنفس الاسم ومعلمتين فقط.
لا يمكن الإجابة على سؤال ما إذا كان البرنامج يمكن أن “ينفجر” بعد التجميع (الخالي من الأخطاء) بسبب المعلمة المفقودة، لأنه من غير المعروف ما الذي تفعله الوظائف بالفعل.
على أية حال، يمكنك فقط الوصول إلى المتغيرات المرئية أيضًا للمترجم. إذا كانت هناك متغيرات عامة بنفس الاسم، فقد يكون ذلك أمرًا مزعجًا.

الحل 3

لم أستطع أن أصدق ذلك. لذلك حاولت الجزء التالي من التعليمات البرمجية

ج
#include <stdio.h>
  

int RetIntDayNum(char * datestrg, int * intdaynum, int * iostat);

int main()
{

  char foo[] = "foo";
  int daynum = 42;
  int iostat = 10;

  RetIntDayNum(foo, &daynum, &iostat);
  RetIntDayNum(foo, &daynum);

  return 0;
}


int RetIntDayNum(char * datestrg, int * intdaynum, int * iostat)
{
  printf("datestrg %s, intdaynum %d, iostat  %d\n");
  return 0;
}

على منصتين مختلفتين:

  • لينكس بوكس ​​​​، مجلس التعاون الخليجي 9.4
  • ويندوز 10، VS2022، سي إل 19.34

أعطى كلا المترجمين خطأ:

  • خطأ: عدد قليل جدًا من الوسائط لتشغيل “RetIntDayNum” (دول مجلس التعاون الخليجي)
  • خطأ C2198: ‘RetIntDayNum’: عدد قليل جدًا من الوسائط للاتصال (CL)

コメント

タイトルとURLをコピーしました