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

دالة تجمع عددين و تعيد مؤشر يشير إلى جمعهما

بدأه khaled_prg في 13 أكتوبر 2010 · 38 رد · 2,466 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

هذا هو الكود :

#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

#2

انت لم تقم بحجز مساحة التي يشير لها ال 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

1

--

Mina Fouad

Computer & Systems Engineering Dpt.

Faculty of Engineering

Alexandria University

#3

@mina ...

1- بما إنك تستخدم C++ ..فلم لا تستخدم المعامل new ...

2- لم لم تقم بتحرير الذاكره خلفك؟ (ياه من مبرمجين الجافا :P )

3
#4

يعني الكود سيكون هكذا :

#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;
}

ما رأيكم في الكود و خصوصا تحرير الذاكرة ! (أنا مبتدأ في المؤشرات !)

#5

إيه ياعم خالد الكلام ده!

return s;
delete s;

إزاي يعني يحصل!!!

#6
 #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;
}
#7
هويدي كتب:

@mina ...

1- بما إنك تستخدم C++ ..فلم لا تستخدم المعامل new ...

2- لم لم تقم بتحرير الذاكره خلفك؟ (ياه من مبرمجين الجافا :P )

مالها الجافا ماهي زي الفل وبعدين انا زهقان من ال new فقلت اخليها malloc تغيير يعني فيها حاجة ديه :)

--

Mina Fouad

Computer & Systems Engineering Dpt.

Faculty of Engineering

Alexandria University

#8
اقتباس
إيه ياعم خالد الكلام ده!

return s;
delete s;

إزاي يعني يحصل!!!

و مالها يا أستاذ هويدي !؟, يعني بعدما تقوم الدالة بإرجاع المؤشر (الذي يشير إلى الجمع) قُمت بتحرير ذاكرة المؤشر و الكود يعمل 100% :)

لماذا تحتج !؟ هل خالفتُ قواعد اللغة !؟ :blush:

اقتباس
int* ret = S(x, y);

طريقتك جميلة و واضحة لي أيضا ولكن ماذا لو لم نُعلن عن مؤشر في الدالة main (مثل ما فعلت أنا تماما !) !؟

اقتباس
وبعدين انا زهقان من ال new فقلت اخليها malloc تغيير يعني فيها حاجة ديه :)

يعني الكود بتاعك متعدد الألوان !!!, شويه من السي و شويه من السي++ :lol:

#9
return s;
delete s;

كيف سيتم تنفيذ السطر المحتوي على delete بعد ان تم الرجوع من الدالة عن طريق return ?? هذا السطر لن يتم تنفيذه اصلا !

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#10
اقتباس
كيف سيتم تنفيذ السطر المحتوي على delete بعد ان تم الرجوع من الدالة عن طريق return ?? هذا السطر لن يتم تنفيذه اصلا !

الغريب في الأمر أن الكود يعمل بشكل جيد !!! :hmm:

سؤالي هو :

ما دمت لا أستطيع التحرير في الدالة S فكيف أحرر المؤشر (في الـ main) مع العلم أنني لا أريد الإعلان عن مؤشر في الدالة الرئيسية بل سأستدعي الدالة S مباشرة هكذا :

cout<<*S(x,y)<<endl;
#11
اقتباس
الغريب في الأمر أن الكود يعمل بشكل جيد !!!

عدم تحرير الذاكرة لا يعني ان الكود لن يعمل .

اقتباس
ما دمت لا أستطيع التحرير في الدالة S فكيف أحرر المؤشر (في الـ main) مع العلم أنني لا أريد الإعلان عن مؤشر في الدالة الرئيسية بل سأستدعي الدالة S مباشرة هكذا

لماذا لا تريد اعلان متغير ؟

1

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#12
اقتباس
عدم تحرير الذاكرة لا يعني ان الكود لن يعمل .

+1

اقتباس
لماذا لا تريد اعلان متغير ؟

فقط أريد أن أعرف الطريقة !, أقصد تحرير المؤشر مع عدم الإعلان عن مؤشر في الـ main :)

#13
khaled_prg كتب:

يعني الكود بتاعك متعدد الألوان !!!, شويه من السي و شويه من السي++ :lol:

ما السي ++ امتداد ل سي مش لغة جديدة ومدام مسمحولي استخدم libraries من ال سي يبقا ايه المشكلة!!!  

--

Mina Fouad

Computer & Systems Engineering Dpt.

Faculty of Engineering

Alexandria University

#14
اقتباس
ما السي ++ امتداد ل سي مش لغة جديدة ومدام مسمحولي استخدم libraries من ال سي يبقا ايه المشكلة!!!

كنت أمزح ! :blush:

أرجو من الإخوة الإجابة عن سؤالي (و أنت منهم).

#15

@خالد:

هل تقصد هذا السؤال؟

اقتباس
فقط أريد أن أعرف الطريقة !, أقصد تحرير المؤشر مع عدم الإعلان عن مؤشر في الـ 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;
}
2
#16

مرحبا بأستاذي الفاضل "هويدي" :)

اقتباس
أنا رأيي الشخصي أنك تعرف مؤشر في ال 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

#17
cout<<*S(x,y)<<endl;

هنا انت قمت بحجز ذاكرة (س) .

Delete(S(x,y));

وهنا قمت بحجز ذاكرة اخرى (ص) .

الذاكرة (س) لم يتم تحريرها ، الذاكرة (ص) التي لم تستخدمها اصلا تم تحريرها .

S تقوم كل مرة بحجز ذاكرة مختلفة وليست واحدة لكل استدعاء لها .

2

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#18
اقتباس
cout<<*S(x,y)<<endl;

هنا انت قمت بحجز ذاكرة (س) .

Delete(S(x,y));

وهنا قمت بحجز ذاكرة اخرى (ص) .

الذاكرة (س) لم يتم تحريرها ، الذاكرة (ص) التي لم تستخدمها اصلا تم تحريرها .

S تقوم كل مرة بحجز ذاكرة مختلفة وليست واحدة لكل استدعاء لها .

+1

ألا توجد طريقة لتحرير المؤشر مع عدم الإعلان عن مؤشر في الـ main !؟

تم تعديل هذه المشاركة بواسطة khaled_prg في 14 أكتوبر 2010 في 19:32

#19

لا أظن في هذه الحالة تنفع .

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#20
اقتباس
لا أظن في هذه الحالة تنفع .

طيب, لدي سؤالان :

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

#21

كود جميل :D

#22

إليك هذا الكود

#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

#23

بقي سؤال أخير :

إذا قمنا بالإعلان عن مؤشر في الـ main ألا يجب أن نحجز له مساحة قبل أن نُسند إليه ما أعادته الدالة S !؟

#24

لأ...

فالمؤشر سيؤشر على العنوان الراجع من الداله...

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

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

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

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

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