السلام عليكم
هذا هو الكود :
#include<iostream>
using namespace std;
int* S(int a,int b)
{
int* s;
*s = a+b;
return s;
}
int main()
{
int x,y;
cin>>x>>y;
cout<<*S(x,y)<<endl;
system("pause");
}أين يقع الخطأ !؟
السلام عليكم
هذا هو الكود :
#include<iostream>
using namespace std;
int* S(int a,int b)
{
int* s;
*s = a+b;
return s;
}
int main()
{
int x,y;
cin>>x>>y;
cout<<*S(x,y)<<endl;
system("pause");
}أين يقع الخطأ !؟
تم تعديل هذه المشاركة بواسطة khaled_prg في 13 أكتوبر 2010 في 19:23
انت لم تقم بحجز مساحة التي يشير لها ال S
#include<iostream>
#include <malloc.h>
using namespace std;
int* S(int a,int b)
{
int* s;
// must allocate memory for s to pint it
//يجب حجز مساحة حتى يشير لها المتغيرs
s=(int*)malloc(sizeof(int));
*s = a+b;
return s;
}
int main()
{
int x,y;
cin>>x>>y;
cout<<*S(x,y)<<endl;
return 0;
}هذا الكود يعمل
تم تعديل هذه المشاركة بواسطة Mina Fouad في 13 أكتوبر 2010 في 20:12
--
@mina ...
1- بما إنك تستخدم C++ ..فلم لا تستخدم المعامل new ...
2- لم لم تقم بتحرير الذاكره خلفك؟ (ياه من مبرمجين الجافا :P )
يعني الكود سيكون هكذا :
#include<iostream>
using namespace std;
int* S(int a,int b)
{
int* s;
s = new int;
*s = a+b;
return s;
delete s;
}
int main()
{
int x,y;
cin>>x>>y;
cout<<*S(x,y)<<endl;
system("pause");
return 0;
}ما رأيكم في الكود و خصوصا تحرير الذاكرة ! (أنا مبتدأ في المؤشرات !)
إيه ياعم خالد الكلام ده!
return s; delete s;
إزاي يعني يحصل!!!
#include<iostream>
using namespace std;
int* S(int a,int b)
{
int* s;
s = new int;
*s = a+b;
return s;
}
int main()
{
int x,y;
cin >>x>>y;
int* ret = S(x, y);
cout <<*ret<<endl;
delete ret;
return 0;
}هويدي كتب:@mina ...
1- بما إنك تستخدم C++ ..فلم لا تستخدم المعامل new ...
2- لم لم تقم بتحرير الذاكره خلفك؟ (ياه من مبرمجين الجافا :P )
مالها الجافا ماهي زي الفل وبعدين انا زهقان من ال new فقلت اخليها malloc تغيير يعني فيها حاجة ديه :)
--
اقتباسإيه ياعم خالد الكلام ده!return s; delete s;إزاي يعني يحصل!!!
و مالها يا أستاذ هويدي !؟, يعني بعدما تقوم الدالة بإرجاع المؤشر (الذي يشير إلى الجمع) قُمت بتحرير ذاكرة المؤشر و الكود يعمل 100% :)
لماذا تحتج !؟ هل خالفتُ قواعد اللغة !؟ :blush:
اقتباسint* ret = S(x, y);
طريقتك جميلة و واضحة لي أيضا ولكن ماذا لو لم نُعلن عن مؤشر في الدالة main (مثل ما فعلت أنا تماما !) !؟
اقتباسوبعدين انا زهقان من ال new فقلت اخليها malloc تغيير يعني فيها حاجة ديه :)
يعني الكود بتاعك متعدد الألوان !!!, شويه من السي و شويه من السي++ :lol:
return s; delete s;
كيف سيتم تنفيذ السطر المحتوي على delete بعد ان تم الرجوع من الدالة عن طريق return ?? هذا السطر لن يتم تنفيذه اصلا !
mov eax, dword ptr ds:[0xffdf0308]
jmp dword ptr [eax+0xfc]
اقتباسكيف سيتم تنفيذ السطر المحتوي على delete بعد ان تم الرجوع من الدالة عن طريق return ?? هذا السطر لن يتم تنفيذه اصلا !
الغريب في الأمر أن الكود يعمل بشكل جيد !!! :hmm:
سؤالي هو :
ما دمت لا أستطيع التحرير في الدالة S فكيف أحرر المؤشر (في الـ main) مع العلم أنني لا أريد الإعلان عن مؤشر في الدالة الرئيسية بل سأستدعي الدالة S مباشرة هكذا :
cout<<*S(x,y)<<endl;
اقتباسالغريب في الأمر أن الكود يعمل بشكل جيد !!!
عدم تحرير الذاكرة لا يعني ان الكود لن يعمل .
اقتباسما دمت لا أستطيع التحرير في الدالة S فكيف أحرر المؤشر (في الـ main) مع العلم أنني لا أريد الإعلان عن مؤشر في الدالة الرئيسية بل سأستدعي الدالة S مباشرة هكذا
لماذا لا تريد اعلان متغير ؟
mov eax, dword ptr ds:[0xffdf0308]
jmp dword ptr [eax+0xfc]
اقتباسعدم تحرير الذاكرة لا يعني ان الكود لن يعمل .
+1
اقتباسلماذا لا تريد اعلان متغير ؟
فقط أريد أن أعرف الطريقة !, أقصد تحرير المؤشر مع عدم الإعلان عن مؤشر في الـ main :)
khaled_prg كتب:يعني الكود بتاعك متعدد الألوان !!!, شويه من السي و شويه من السي++ :lol:
ما السي ++ امتداد ل سي مش لغة جديدة ومدام مسمحولي استخدم libraries من ال سي يبقا ايه المشكلة!!!
--
اقتباسما السي ++ امتداد ل سي مش لغة جديدة ومدام مسمحولي استخدم libraries من ال سي يبقا ايه المشكلة!!!
كنت أمزح ! :blush:
أرجو من الإخوة الإجابة عن سؤالي (و أنت منهم).
@خالد:
هل تقصد هذا السؤال؟
اقتباسفقط أريد أن أعرف الطريقة !, أقصد تحرير المؤشر مع عدم الإعلان عن مؤشر في الـ main
أنا رأيي الشخصي أنك تعرف مؤشر في ال main و تقوم بإرساله للداله و من ثم تحريره ... أي يكون الحجز و التحرير في نفس الداله..
void add(int x, int y, int* rest)
{
*res = x +y;
}
int main()
{
int *result = new int;
add(10, 20, result);
std::cout << *result << std::endl;
delete result;
}مرحبا بأستاذي الفاضل "هويدي" :)
اقتباسأنا رأيي الشخصي أنك تعرف مؤشر في ال main و تقوم بإرساله للداله و من ثم تحريره ... أي يكون الحجز و التحرير في نفس الداله
و لكن لا تنسى الشرط :
اقتباسمع عدم الإعلان عن مؤشر في الـ main
لا أريد الإعلان عن مؤشر في الـ main نظرا لظروف أمنية ! :lol: (أمزح فقط :) )
قمتُ بكتابة الكود التالي حيث قمت بكتابة دالة تتولى مهمة التحرير :
#include<iostream>
using namespace std;
int* S(int a,int b)
{
int* s = new int;
*s = a+b;
return s;
}
void Delete(int* ptr)
{
delete ptr;
}
int main()
{
int x,y;
cin>>x>>y;
cout<<*S(x,y)<<endl;
Delete(S(x,y));
system("pause");
return 0;
}ما رأيك في الفكرة !؟
هل هناك سلبيات في هذا النوع من التحرير !؟
===================
طلب خاص :
ممكن ترسل لي skype بتاعك على الرسائل الخاصة !؟
تلميذك خالد.
تم تعديل هذه المشاركة بواسطة khaled_prg في 14 أكتوبر 2010 في 19:09
cout<<*S(x,y)<<endl;
هنا انت قمت بحجز ذاكرة (س) .
Delete(S(x,y));
وهنا قمت بحجز ذاكرة اخرى (ص) .
الذاكرة (س) لم يتم تحريرها ، الذاكرة (ص) التي لم تستخدمها اصلا تم تحريرها .
S تقوم كل مرة بحجز ذاكرة مختلفة وليست واحدة لكل استدعاء لها .
mov eax, dword ptr ds:[0xffdf0308]
jmp dword ptr [eax+0xfc]
اقتباسcout<<*S(x,y)<<endl;هنا انت قمت بحجز ذاكرة (س) .
Delete(S(x,y));وهنا قمت بحجز ذاكرة اخرى (ص) .
الذاكرة (س) لم يتم تحريرها ، الذاكرة (ص) التي لم تستخدمها اصلا تم تحريرها .
S تقوم كل مرة بحجز ذاكرة مختلفة وليست واحدة لكل استدعاء لها .
+1
ألا توجد طريقة لتحرير المؤشر مع عدم الإعلان عن مؤشر في الـ main !؟
تم تعديل هذه المشاركة بواسطة khaled_prg في 14 أكتوبر 2010 في 19:32
اقتباسلا أظن في هذه الحالة تنفع .
طيب, لدي سؤالان :
1-إذا قمنا بالإعلان عن مؤشر في الـ main ألا يجب أن نحجز له مساحة قبل أن نُسند إليه ما أعادته الدالة S !؟
2-ما رأيك بهذا الكود :
#include<iostream>
using namespace std;
int* S(int a,int b)
{
int* s = new int;
*s = a+b;
return s;
}
int main()
{
int x,y;
cin>>x>>y;
int *z = S(x,y);
cout<<*z<<endl;
delete z;
system("pause");
return 0;
}تم تعديل هذه المشاركة بواسطة khaled_prg في 14 أكتوبر 2010 في 19:51
كود جميل :D
إليك هذا الكود
#include<iostream>
using namespace std;
template<typename T>
class AutoPtr
{
private:
T *obj;
bool keep;
public:
AutoPtr(T* o,bool stay_alive = false) : obj(o),keep(stay_alive) {}
~AutoPtr()
{
if (!keep)
{
delete obj;
obj=0;
}
}
T& operator*() const
{ return *obj; }
};
typedef AutoPtr<int> AutoIntPtr;
AutoIntPtr S(int a,int b)
{
int* s = new int;
*s = a+b;
return AutoIntPtr(s);
}
int main()
{
{
cout << *S(3, 4) << endl;
}
cout << "out of scope\n";
}داخل الداله main قمت بوضع سطر إستدعاء الداله S داخل Scope منفصل حتى تستطيع تتبع تنفيذ مهدم النوع AutoPtr حيث سيتم تحرير الذاكر الخاصه بالمؤشر الذى تم حجز ذاكرته بمجرد الخروج من الـ Scope الذى تم كتابة الكود به.
راجع الفئه auto_ptr الموجوده بـ STL.
و الله ولي التوفيق
تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 14 أكتوبر 2010 في 22:47
مدونتي: C++ Tips and Tricks
بقي سؤال أخير :
إذا قمنا بالإعلان عن مؤشر في الـ main ألا يجب أن نحجز له مساحة قبل أن نُسند إليه ما أعادته الدالة S !؟
لأ...
فالمؤشر سيؤشر على العنوان الراجع من الداله...
بالنسبة للأستاذ محمد علاء الدين :
لا أعرف شيئا عن OOP ! :blush:
المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية
جارٍ التحقق من المتواجدين…