PDA

View Full Version : سوال: اشاره گر به تابع؟؟



...StacK...
شنبه 12 بهمن 1387, 22:31 عصر
سلام دوستان لطفا به کد زیر نگاه کنید:



// stack.cpp : Defines the entry point for the console application.
//
#include"stdafx.h"
#include<iostream>
usingnamespace std;
int sum(int (*)(int),int);
int square(int);
int cube(int);
int _tmain(int argc, _TCHAR* argv[])
{
cout<<sum(square,4)<<endl;
cout<<sum(cube,4)<<endl;
return 0;
}
//start the sum function
int sum(int (*pf)(int k), int n)
{
int s=0;
for(int i=1;i<=n;i++)
s +=(*pf)(i);//به این دستور دقت کنید
return s;
}//end of sum function
//start the square function
int square(int k)
{
return k*k;
}
//end of square function
int cube(int k)
{
return k*k*k;
}


به اون قسمتی که در کد تعیین کردم توجه کنید , وقتی من اون قطعه از کد رو

به این صورت مینویسم هیچ تغییر و مشکلی در خروجی برنامه پیش نمیاد:


s +=(pf)(i);

پس چه نیازی هست من از * استفاده کنم؟؟؟؟

مگه عملگر * ادرس شروع تابع رو مشخص نمیکنه؟؟؟ پس وقتی من از این عملگر استفاده

نکنم بازهم ادرس درون pf مقدار یابی میشه؟؟؟

عملا این دو چه تفاوتی دارن؟؟؟


=====================================

به این قطعه کد نگاه کنید و به سوالی که در قطعه کد در قالب توضیح پرسیدم پاسخ بدید...


int f(int);
int (*pf)(int);
int (*ps)(int);
ps=&f;
pf=f;
if(*ps==pf);//ایا این شرط برقراره؟؟؟



و در اخر هم یه توضیح در مورد نام تابع بدید که یک اشاره گر ثابت هست....

ایا در واقع اشاره گر تابع ادرس اولین بایت از شروع تابع در پشته رو در خودش نگه میداره؟؟؟

من فکر میکنم در این قطعه کد:



s +=(pf)(i);


ما به همون ادرس اشاره میکنیم

ولی در این یکی:



s +=(*pf)(i);


به مقدار اولین بایت از شروع تابع.....ایا درسته؟؟؟؟؟؟؟؟؟؟؟؟؟؟

یا اینکه هر دو فقط به اولین بایت از تابع اشاره میکنند و تابع رو اجرا میکنند؟؟؟؟

شرمنده سوالام زیاد شد ....

Mehdi Asgari
شنبه 12 بهمن 1387, 23:58 عصر
این دو روش در فراخوانی تابع فرق چندانی با هم ندارن
اولی (با ستاره) explicit dereference هست و دومی (بدون ستاره) implicit dereference
هر دو هم تابع رو فراخوانی می کنن.
این مثال شما در صفحۀ 171 کتاب Schaum's outline of
Theory and problems of Programming With C++ (Second Edition) k اومده که متاسفانه توضیح چندانی نداده. در اینجور مواقع باید از Stanley Lippman کمک بگیری. در بخش 9 از فصل 7 کتاب C++ primer ویرایش چهارم اومده:


A pointer to a function can be used to call the function to which it refers. We can use the pointer directlythere is no need to use the dereference operator to call the function

cmpFcn pf = lengthCompare;
lengthCompare("hi", "bye"); // direct call
pf("hi", "bye"); // equivalent call: pf1 implicitly dereferenced
(*pf)("hi", "bye"); // equivalent call: pf1 explicitly dereferenced


و اگه در main کد زیر رو بنویسی ، هر سه فراخوانی یک عدد رو چاپ خواهند کرد در خروجی:


int (*pf)(int k) = square;
cout << pf(9) << endl;
cout << (*pf)(9) << endl;
cout << (pf)(9) << endl;