الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

لماذا يسمح gcc بتمرير واسائط لدالة معرفة بدون وسائط

بدأه محمد عودة في 5 أكتوبر 2012 · 3 رد · 499 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاتة

اهلا بكم من جديد فى نقاش مفيد

وصلني منشور من القائمة البريدية Status Code خاصة بالمرمجين عن مشكلة ان شاء الله تفيدنا بعنوان:

لماذا يسمح gcc بتمرير واسائط لدالة معرفة بدون وسائط

يقول صاحب الموضوع انا لم افهم لما يتم ترجمة الكود التالي بدون اخطاء؟ و لا يصدر gcc اى خطأ او تحذير لقد مررت الكثير من الوسائط الى الدالة foo() ، هل هذا سلوك استثنائي؟ :



void foo() {
printf("Hello\n");
}

int main() {
const char *str = "bar";
foo(str);
return 0;
}
#include <stdio.h>

برأيكم ما هي المقتراحات والحلول لهذة المشكلة التى وقع فيها المستخدم؟

تم تعديل هذه المشاركة بواسطة محمد عودة في 5 أكتوبر 2012 في 09:05

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#2

ربما أن السبب تمكين الدوال التي تأخذ عدد غير محدد من الوسائط من أن تعمل. فيمكن قراءة تلك المتغيرات بإستخدام الأسمبلي (كتبته لـgcc) :

#include <stdio.h>

int foo();

int main(int argc, char **argv)
{
    foo(1111, 2222, 3333);
    return 0;
}

int foo()
{
    int param1 = 0;
    int param2 = 0;
    int param3 = 0;

    asm("movl 8(%%ebp), %0" : "=r"(param1));
    asm("movl 12(%%ebp), %0" : "=r"(param2));
    asm("movl 16(%%ebp), %0" : "=r"(param3));

    printf("%d\n%d\n%d\n", param1, param2, param3);

    return 0;
}

لكي نجعل المصرف لايقبل أي قيمة تمرر للدالة, فيلزم وضع void في تعريفها :

#include <stdio.h>

int foo(void);

int main(int argc, char **argv)
{
    foo();
    return 0;
}

int foo()
{
    printf("hi\n");
    return 0;
}

الآن لو حاول أحد تمرير معامل للدالة فسيعطيه المصرف خطأ.

2
#3

بصراحة الخلاصة التى وصلت اليها:

عندما تعلن دالة بدون وسائط يجب عليك عليك ان تعلنها على شكل : void foo(void);

وبهذة الطريقة انت تلزم المترجم ان يصدر تحذيرا عندما يجد ممرت وسائط لدلة لها لا تأخذ وسائط void .

اي انت بحاجة الى عمل النموذج المصغر prototype للدالة مثل:

#include <stdio.h>
void foo(void);

int main() {
	const char *str = "bar";
	foo(str);
	return 0;
}
void foo(void) {
	printf("Hello\n");
}

سوف يصدر المترجم الان تحذيرا

والله ولى التوفيق

تم تعديل هذه المشاركة بواسطة محمد عودة في 6 أكتوبر 2012 في 10:48

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#4

لم يعمل معي الكود الذي كتبته أخي Mr.B في الديف - السي++ sad.gif

يظهر لي المترجم هذا الخطأ ، يقول لك أن الدالة فوو لديها الكثير من Arguments :


C:\Documents and Settings\Hamza\Bureau\function.C In function `int main(int, char**)':
3 C:\Documents and Settings\Hamza\Bureau\function.C too many arguments to function `int foo()'
7 C:\Documents and Settings\Hamza\Bureau\function.C at this point in file

rS3eY.png

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…