شيء غريب...
المتوقع من البرنامج المرفق اسفل الموضوع ان يظهر:
السطر الأول: 1 في كلا الحالتين لأن دالة ()setflag سبقت المتغير flag.
السطر الثاني: 0 ثم الرقم 1 لأن ()setflag تتبع flag.
الا ان هذا لا يحدث عندما يتم تصريف البرنامج بإستخدام gcc.
بعد عدة تجارب تبين لي ان البرنامج المصرف يقوم بمعاينة المدخل الأخير للدوال قبل المدخل الأول . وهذا خلاف الترتيب الذي كتبت به المدخلات في المصدر.
اي ان الترتيب الذي يتم به تحديد مدخلات الدالة ليس هو الترتيب الذي تتم به معاينة المدخلات!
لا ادري ان كان هذا الترتيب يرجع للطريقة التي صمم بها gcc او الترتيب القياسي الذي تتبعة جميع المُصرفات. لهذا اطلب من اي شخص لديه مصرف آخر (بورلاند المنقرض او مصرف مايكروسوفت) ان يقوم بتصريف البرنامج والتحقق من ما اذا كانت مخرجات البرنامج مماثلة.
ختاما اردت ان انبهكم عن هذا الأمر حتى تضيع منكم 45 دقيقة تقريبا في البحث عن هذه المشكلة. اردت رأيكم بالأمرايضا.
---
المتوقع من البرنامج المرفق اسفل الموضوع ان يظهر:
السطر الأول: 1 في كلا الحالتين لأن دالة ()setflag سبقت المتغير flag.
السطر الثاني: 0 ثم الرقم 1 لأن ()setflag تتبع flag.
الا ان هذا لا يحدث عندما يتم تصريف البرنامج بإستخدام gcc.
بعد عدة تجارب تبين لي ان البرنامج المصرف يقوم بمعاينة المدخل الأخير للدوال قبل المدخل الأول . وهذا خلاف الترتيب الذي كتبت به المدخلات في المصدر.
اي ان الترتيب الذي يتم به تحديد مدخلات الدالة ليس هو الترتيب الذي تتم به معاينة المدخلات!
لا ادري ان كان هذا الترتيب يرجع للطريقة التي صمم بها gcc او الترتيب القياسي الذي تتبعة جميع المُصرفات. لهذا اطلب من اي شخص لديه مصرف آخر (بورلاند المنقرض او مصرف مايكروسوفت) ان يقوم بتصريف البرنامج والتحقق من ما اذا كانت مخرجات البرنامج مماثلة.
ختاما اردت ان انبهكم عن هذا الأمر حتى تضيع منكم 45 دقيقة تقريبا في البحث عن هذه المشكلة. اردت رأيكم بالأمرايضا.
---
كود PHP:
#include <stdio.h>
int flag = 0;
int setflag(){
flag=1;
return flag;
}
int main(int argc, char **argv){
printf("setflag(), flag:\t%d, %d\n", setflag(), flag); // الترتيب معاينة (تنفيذ الدالة) ليس بنفس الترتيب الكتابي والنتيجة مخالفة لما هو متوقع
flag=0;
printf("flag, setflag():\t%d, %d\n", flag, setflag());
return 0;
}
تعليق