إعـــــــلان

تقليص
لا يوجد إعلان حتى الآن.

gcc الغريب ام انا؟

تقليص
X
 
  • تصفية - فلترة
  • الوقت
  • عرض
إلغاء تحديد الكل
مشاركات جديدة

  • [نقاش] gcc الغريب ام انا؟

    شيء غريب...

    المتوقع من البرنامج المرفق اسفل الموضوع ان يظهر:
    السطر الأول: 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 argcchar **argv){
        
    printf("setflag(), flag:\t%d, %d\n"setflag(), flag); // الترتيب  معاينة (تنفيذ الدالة) ليس بنفس الترتيب الكتابي والنتيجة مخالفة لما هو متوقع
        
    flag=0;
        
    printf("flag, setflag():\t%d, %d\n"flagsetflag()); 
        return 
    0;

    التعديل الأخير تم بواسطة سًٍ; الساعة 27-12-2010, 08:55 AM.
    استثمر وقتك بما هو مفيد. افد نفسك و غيرك بما تعلم.
    مدونتي (النطاق تغير!) | برمجياتي | سايه

  • #2
    سؤالك هو:
    ما هو ترتيب حساب المعاملات قبل تمريرها لدالة printf ؟

    كما نعلم معاملات الدوال تعامل معاملات local variable
    عند استدعاء دالة فإنه يتم حساب قيمة المعاملات وتمريرها by value

    وأنت جاوبت على نفسك

    بمعاينة المدخل الأخير للدوال قبل المدخل الأول

    وذلك يعود لطريقة ترتيب المعاملات في ال stack

    يعني هو يعمل push لآخر قيمة ثم push للتي قبلها وهكذا ثم يعمل call ثم يعمل pop


    Some programming languages use the stack to store data that is local to a procedure. Space for local data items is allocated from the stack when the procedure is entered, and is deallocated when the procedure exits. The C programming language is typically implemented in this way. Using the same stack for both data and procedure calls has important security implications (see below) of which a programmer must be aware in order to avoid introducing serious security bugs into a program.

    تعليق


    • #3
      اشكرك يا استاذ مؤيد على هذا التفصيل الوافي. كان يجب علي ان الاحظ ان الأمر يتعلق بالـstack
      The C programming language is typically implemented in this way
      افهم من هذا انه لا يوجد ما يجبر المصرف (c99 مثلا) على معاملة مدخلات الدوال بهذه الطريقة؟ اي اني لا استطيع ان اضمن ان جميع المصرفات (gcc او غيره) تصرف البرنامج على هذا النحو؟
      استثمر وقتك بما هو مفيد. افد نفسك و غيرك بما تعلم.
      مدونتي (النطاق تغير!) | برمجياتي | سايه

      تعليق

      يعمل...
      X
      😀
      🥰
      🤢
      😎
      😡
      👍
      👎