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

مره اخرى: المصفوفات+المؤشرات والمخرجات الغريبة!

بدأه مجلـد جديـد في 11 نوفمبر 2008 · 6 رد · 576 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

الان انا حائراً تماما امام لغة java :wacko:

ببساطه ، انا اريد ارسال المصفوفة a كمؤشر الى الدالة foo ، ثم التعديل على المصفوفة a (مثلا قمت باسناد مصفوفة جديدة على المصفوفة a )

المشكلة: عند الرجوع الى دالة main كأن لم يحدث شيئا داخل دالة foo ! وكأني عملت call by value !

  1.  
  2. public class test
  3. {
  4. public static void main( String argsv[] )
  5. {
  6. int a[][] = new int[2][2];
  7. a[0][0]=1;
  8. a[0][1]=2;
  9. a[1][0]=3;
  10. a[1][1]=4;
  11.  
  12. printArray( a);
  13.  
  14. foo( a );
  15.  
  16. printArray( a);
  17. }
  18.  
  19. public static void foo( int a[][] )
  20. {
  21. a = null;
  22. int b[][] = new int [2][2];
  23. b[0][0]=10;
  24. b[0][1]=10;
  25. b[1][0]=10;
  26. b[1][1]=10;
  27.  
  28. a = b;
  29. }
  30.  
  31. public static void printArray( int array[][] )
  32. {
  33. for ( int i=0 ; i < array.length ; i++ )
  34. {
  35. for ( int j=0 ;j <array[i].length; j++ )
  36. System.out.print( "[" +array[i][j]+ "]");
  37.  
  38. System.out.println();
  39. }
  40. }
  41. }
  42.  
  43.  

عندما يكون السؤال غير واضح، تخيل ان البرنامج مكتوب بلغة c/c++

لانه عندما يكون كذلك، فسوف يتغير عنوان المصفوفة a للابد والسبب هو call by reference

#2

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

جافا لا يوجد بها call by reference .. يوجد بها Reference Call By Value ..

أي أنك سترسل المؤشر للمصفوفه عن طريقه القيمه ، وبالتالي لن يمكنك من تغيير المصفوفه وجعلها تؤشر الى منطقه أخرى ، فقط من تغيير القيمه التي يؤشر لها المؤشر(المصفوفه)...

أي تصبح الداله :

public static void foo( int a[][] )
	{
		a[0][0]=10;
		a[0][1]=10;
		a[1][0]=10;
		a[1][1]=10;
	}

وهكذا ستتغير محتويات المصفوفه ..

بالتوفيق ،،

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#3

مالفائدة من الحركة هذه؟!

انا اريد التعديل على المصفوفة a في الدالة foo ، والتعديل عبارة عن تحويل المصفوفة من 32 خانة الى 48 خانة ، بحيث اضع قيم معينة من عندي انا او من المستخدم في الخانات الزائدة وهي 16 خانة ( باقي الخانات وهي 32 خانة تحتوي على البيانات السابقة الاصلية).

فكيف اقوم بالتعديل على الحجم واضافة البيانات ثم حفظ هذه التغيرات حتى استخدمها في دالة main ؟

#4

عندما ترسل مؤشر لمصفوفه ، فلن يمكنك تغييرها وجعلها تؤشر لمنطقه ما ، لأن ارسال المؤشر بالقيمه .. فقط تستطيع تغيير البيانات في تلك المنطقه التي كانت تؤشر اليها من البدايه ..

لذلك في حالتك هذه ، أعلن عن المصفوفه في الداله main من 48 ، وارسل المؤشر ، وقم بالتغيير في الخانات الأخيره التي تريدها .

بالتوفيق ،،

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#5

السلام عليكم

لا أزيد على كلام أخي وسيم

وإنما أحاول أن أعيد الصياغة فقط لا غير

جافا تقوم بنسخ نسخة من المؤشرات المرسلة إلى الدوال

وتمريرها للدالة

فلو قمت بعملية تغيير على المؤشر

فأنت فعلياً لا تقوم بتعديل على المؤشر الأصلي

وإنما على المؤشر النسخة

لماذا جافا تقوم بذلك؟

جافا ترى أن هذه الطريقة مربكة للمبرمج

تخيل معي أنك أرسلت المؤشر إلى دالة ما

ثم قمت بتغيير الكائن هناك أوووووووووف

ستحاول وتحاول أن تحل المشكلة

لكن هيهات

تصور معي كمية الوقت والجهد الضائع في هذه العملية

لهذا ترى جافا أن المنع هو المفضل

لكي تقوم بالعملية نفسها

اجعل الدالة foo ترجع كائن من النوع مصفوفة

واستبدل الكائن الأصلي به

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#6

شكرا لكم الان وضحت الصورة ان شاء الله

#7

برجاء استخدام زر الشكر لعملية الشكر

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

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

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

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

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

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