لا يوجد نوع بيانات "قائمة" مدمج في لغة البرمجة سي ، وهي مجموعة ديناميكية من العناصر. ومع ذلك ، يمكنك تنفيذ هذه الوظيفة عن طريق إنشاء بنية البيانات الخاصة بك وطرق العمل معها.
أسهل طريقة لإرجاع قائمة من طريقة في ج هي استخدام مؤشر إلى مجموعة من العناصر. في الوقت نفسه ، تجدر الإشارة إلى أن حجم القائمة قد يختلف ، لذلك يجب تمريره بواسطة المؤشر.
قائمة الإرجاع;
- }
- في هذا المثال ، ونحن إنشاء مجموعة من 5 عناصر كثافة العمليات وملئه مع البيانات. ثم نعود مؤشر إلى هذه المصفوفة. يرجى ملاحظة أننا نستخدم وظيفة مالوك لتخصيص الذاكرة للقائمة. عند استخدام مؤشر إلى قائمة ، من الضروري مراعاة إصدار هذه الذاكرة بعد الاستخدام.
- إذا كنت بحاجة إلى إرجاع قائمة متغيرة الطول ، فمن الأنسب استخدام بنية بيانات تنفذ مصفوفة ديناميكية. على سبيل المثال ، يمكنك إنشاء بنية تحتوي على مؤشر لمجموعة من العناصر وطولها الحالي. لتهيئة العناصر وإضافتها إلى القائمة ، يمكنك كتابة الطرق المناسبة.
- وصف المشكلة
- أخطاء عند إرجاع قائمة
- لماذا عودة قائمة غير صحيحة يمكن أن يؤدي إلى مشاكل
- 1. بيانات غير صحيحة
- 2. تسرب الذاكرة
- 3. انتهاك حقوق الوصول
- 4. واجهة غير مفهومة من الطريقة
- 5. تعقيد التصحيح
- طرق إرجاع القائمة
- 1. إرجاع المؤشر إلى القائمة
- 2. إرجاع قائمة باستخدام صفيف
- باستخدام نوع البيانات إينوميرابل
- باستخدام المعلمة خارج
- باستخدام صفيف
توصيات لاختيار طريقة قائمة العودة
1. إرجاع المؤشر إلى القائمة
2. إرجاع القيمة إلى المؤشر إلى القائمة
3. أعد البنية التي تحتوي على المؤشر إلى القائمة وحجمها
4. باستخدام متغير عمومي
سؤال وجواب
هل من الممكن إرجاع قائمة من طريقة في ج دون استخدام المؤشرات?
وصف المشكلة
- إحدى المهام الشائعة في ج البرمجة هو إرجاع قائمة من طريقة. لا تحتوي لغة سي على دعم أصلي للقوائم ، مما قد يتسبب في صعوبات في تنفيذ هذه الوظيفة.
- المشكلة هي أن لغة ج لا تحتوي على هياكل بيانات مدمجة للعمل مع القوائم. بدلا من ذلك ، تحتاج إلى إنشاء الهياكل والخوارزميات الخاصة بك لتخزين القوائم ومعالجتها.
يمكن استخدام طرق مختلفة لحل هذه المشكلة. واحد منهم هو استخدام المصفوفات والمؤشرات. في هذه الحالة ، من الضروري تخصيص ذاكرة كبيرة بما فيه الكفاية للمصفوفة التي ستمثل القائمة. سيكون كل عنصر قائمة عبارة عن بنية تحتوي على بيانات ومؤشر لعنصر القائمة التالي.
نهج آخر هو إنشاء بنية البيانات الخاصة بك للقائمة. للقيام بذلك ، يمكنك استخدام بنية مع مؤشرات مرتبطة بالعناصر السابقة والتالية.
بعد إنشاء بنية القائمة وتنفيذ الوظائف لملئها والزحف وإضافة عناصر ، يمكنك إرجاع قيمة القائمة من الطريقة. للقيام بذلك ، استخدم مؤشر إلى العنصر الأول في القائمة.
المشكلة في إرجاع قائمة من طريقة هي أنه في ج من المستحيل ببساطة إرجاع مؤشر إلى مصفوفة أو بنية ، لأنها محلية للطريقة وسيتم تدميرها بعد اكتمالها.
لحل هذه المشكلة ، يمكنك استخدام نهجين:
- أعد المؤشر إلى القائمة من خلال معلمة الطريقة.
- تخصيص الذاكرة للقائمة ديناميكيا وإرجاع مؤشر إلى الذاكرة المخصصة.
- يفترض النهج الأول أنه قبل استدعاء الطريقة ، سيتم تمرير مؤشر إلى المؤشر إلى الوظيفة ، حيث سيتم كتابة المؤشر إلى القائمة التي تم إنشاؤها. بهذه الطريقة ، سيتم الوصول إلى القائمة من الخارج.
- يستخدم النهج الثاني وظيفة مالوك لتخصيص الذاكرة لقائمة. بعد إنشاء قائمة وملئها بالقيم ، يمكن إرجاع مؤشر إلى القائمة التي تم إنشاؤها من الطريقة.
يرجى ملاحظة أنه بعد استخدام الذاكرة المخصصة للقائمة ، يجب تحريرها باستخدام الوظيفة المجانية لتجنب تسرب الذاكرة.
- أخطاء عند إرجاع قائمة
- يمكن أن يؤدي إرجاع قيمة نوع القائمة إلى بعض الأخطاء في لغة البرمجة سي. بعض الأسباب الرئيسية للأخطاء عند إرجاع القائمة هي:
- انتهاك قواعد العمل مع المكدس: عند إنشاء قائمة داخل طريقة دون استخدام الذاكرة الديناميكية ، سيحدث خطأ عند محاولة إعادتها من الطريقة إلى الكود الخارجي. في هذه الحالة ، سيتم تحرير ذاكرة الوصول العشوائي المخصصة لكومة الطريقة بعد اكتمالها ، مما سيؤدي إلى تشغيل غير صحيح للكائن الذي تم إرجاعه.
- تجزئة الذاكرة: إذا تم تحرير الذاكرة بشكل غير صحيح بعد استخدام كائن القائمة ، فقد يحدث خطأ في تجزئة الذاكرة ، مما يؤدي إلى تعطل البرنامج.
تسرب الذاكرة: عند استخدام الذاكرة الديناميكية لإنشاء قائمة ، يجب توخي الحذر لتجنب تسرب الذاكرة. إذا لم يتم مسح الذاكرة ، فسيحدث تسرب للذاكرة ، مما قد يؤدي إلى استنفاد سريع للذاكرة المتاحة.
عدم توافق نوع البيانات: عند إرجاع قائمة ، يجب أن تتأكد من توافق أنواع البيانات. عندما لا يتطابق النوع الذي تم إرجاعه مع النوع المحدد في العملية اللاحقة ، قد يحدث تفسير خاطئ للبيانات.
لتجنب الأخطاء عند إرجاع قائمة في ج ، يوصى بما يلي:
استخدم الذاكرة الديناميكية عند إنشاء قائمة وإعادتها من طريقة.
حافظ دائما على التوازن بين الذاكرة المخصصة والمحررة.
تحقق من توافق نوع البيانات قبل إرجاع القائمة.
استخدام الشيكات خطأ أو حالات استثنائية عند العمل مع القائمة.
باتباع هذه التوصيات ، يمكنك تجنب الأخطاء والتأكد من إرجاع القائمة بشكل صحيح من الطريقة في لغة البرمجة سي.
لماذا عودة قائمة غير صحيحة يمكن أن يؤدي إلى مشاكل
يعد إرجاع قائمة من طريقة ممارسة شائعة في لغة سي. ومع ذلك ، يمكن أن يؤدي إرجاع القائمة غير الصحيح إلى مشاكل خطيرة.
1. بيانات غير صحيحة
إذا تم إرجاع القائمة بشكل غير صحيح من الطريقة ، فقد يتم إرجاع بيانات غير متوقعة أو غير صحيحة. هذا يمكن أن يؤدي إلى أخطاء غير متوقعة في أجزاء أخرى من البرنامج ويفسد نتيجة البرنامج ككل.
2. تسرب الذاكرة
إذا كانت القائمة التي تم إرجاعها من الطريقة لا تحتوي على ذاكرة كافية لتخزين البيانات ، فسيحدث تسرب للذاكرة. يحدث هذا ، على سبيل المثال ، عندما يتم تخصيص قائمة ديناميكيا داخل طريقة ولا يتم تحريرها بعد الاستخدام.
3. انتهاك حقوق الوصول
قد تؤدي العودة غير الصحيحة للقائمة إلى انتهاك حقوق الوصول إلى البيانات أو إمكانية تعديلها. إذا كانت القائمة التي تم إرجاعها هي مرجع لمتغير محلي داخل الطريقة ، بعد اكتمال تنفيذ الطريقة ، سيتم تدمير هذا المتغير وستصبح الإشارة إليه غير صالحة.
4. واجهة غير مفهومة من الطريقة
قد تؤدي العودة غير الصحيحة للقائمة من الطريقة إلى صعوبة فهم واجهتها. إذا كانت الطريقة لا تشير صراحة إلى عودة القائمة أو لا توفر المعلومات اللازمة حول بنية القائمة ، فقد تكون قراءة واستخدام النتيجة الناتجة صعبة وغير موثوقة.
5. تعقيد التصحيح
تؤدي العودة غير الصحيحة للقائمة إلى تعقيد عملية تصحيح أخطاء البرنامج. قد يكون من الصعب تحديد مكان ولأي سبب تحدث أخطاء تتعلق بإرجاع القائمة.
لذلك ، من المهم جدا إرجاع القوائم بدقة وبشكل صحيح من الأساليب في اللغة ج. من الضروري الانتباه إلى التخصيص الصحيح للذاكرة والحفاظ على مراجع البيانات ، وكذلك توثيق واجهة الطريقة وتوثيق بنية القائمة المرتجعة.
طرق إرجاع القائمة
القائمة هي واحدة من هياكل البيانات الأكثر شيوعا في اللغة ج. إنها مجموعة مرتبة من العناصر التي يمكن أن تكون من أنواع مختلفة. غالبا ما يكون من الضروري إرجاع قائمة من وظيفة أو طريقة. في هذا القسم ، وسوف ننظر في عدة طرق لتنفيذ قائمة العودة في اللغة ج.
1. إرجاع المؤشر إلى القائمة
طريقة واحدة لإرجاع قائمة من طريقة في ج هي إرجاع مؤشر إلى تلك القائمة. للقيام بذلك ، يمكنك إنشاء قائمة داخل الطريقة وتمرير عنوانها. وبالتالي ، تقوم الطريقة بإرجاع مؤشر إلى قائمة.
# تشمل
# تشمل
إنت * جيتليست () {
كثافة العمليات * قائمة = مالوك (5 * حجم (كثافة العمليات)) ؛ / / تخصيص الذاكرة للقائمة
// قائمة التهيئة
قائمة [0] = 1;
قائمة [1] = 2;
قائمة [2] = 3;
قائمة [3] = 4;
قائمة [4] = 5;
قائمة الإرجاع; // إرجاع مؤشر إلى القائمة
}
كثافة العمليات الرئيسية () {
الباحث * قائمة = جيتليست () ؛ / / الحصول على مؤشر إلى قائمة
// طباعة عناصر القائمة
إلى عن على (كثافة العمليات أنا = 0; أنا < 5; أنا i) {
}
في هذا المثال ، نقوم بإنشاء قائمة داخل الوظيفة
جيتليست()
استخدام تخصيص الذاكرة الديناميكية. ثم نقوم بتهيئة القائمة وإرجاع عنوانها باستخدام
بيان العودة
. في الوظيفة
الرئيسية()
نحصل على مؤشر إلى القائمة وإخراج عناصرها.
2. إرجاع قائمة باستخدام صفيف
هناك طريقة أخرى لإرجاع قائمة من طريقة في ج وهي استخدام مصفوفة بدلا من تخصيص الذاكرة ديناميكيا. في هذه الحالة ، نحدد القائمة كمصفوفة ذات حجم ثابت ونعيدها من الطريقة.
# تشمل
باطلة جيتليست (إنت قائمة[]) {
// قائمة التهيئة
قائمة [0] = 1;
قائمة [1] = 2;
قائمة [2] = 3;
قائمة [3] = 4;
قائمة [4] = 5;
}
كثافة العمليات الرئيسية () {
قائمة كثافة العمليات[5] ؛ / / تحديد القائمة كمصفوفة ذات حجم ثابت
الحصول على قائمة (قائمة) ؛ / / الحصول على قائمة
// طباعة عناصر القائمة
");
العودة 0;
}
في هذا المثال ، نحدد قائمة كمصفوفة ذات حجم ثابت في دالة
الرئيسية()
. ثم نقوم بتمرير مصفوفة القائمة إلى الوظيفة
- }
}
في طريقة جيتينوميراتور () ، إنشاء وإرجاع مثيل جديد من الفئة التي تنفذ واجهة إينوميراتور ويوفر الوصول إلى عناصر المجموعة:
فئة ميكولكتيون: إينوميرابل
{
العامة إينوميراتور جيتنوميراتور()
{
عودة مينوميراتور جديد () ؛ / / مينوميراتور هو فئة التي تنفذ واجهة إينوميراتور
}
}
بعد ذلك ، يمكنك استخدام نوع البيانات إينوميرابل للتكرار من خلال عناصر المجموعة باستخدام حلقة فوريش:
ميكولكتيون جمع = جديد ميكولكتيون ();
فوريش (البند فار في جمع)
{
// منطق العمل مع عنصر المجموعة
}
باستخدام نوع البيانات إينوميرابل يبسط إلى حد كبير العمل مع مجموعات ويزيد من قراءة التعليمات البرمجية. يسمح لك بإخفاء تفاصيل تنفيذ المجموعة والتركيز على العمليات على عناصر المجموعة.
باستخدام المعلمة خارج
باستخدام المعلمة خارج في ج ، يمكنك إرجاع قائمة من طريقة. تسمح لك المعلمة الخارجية بإرجاع قيم متعددة من الطريقة. يمكن تغيير القيمة التي تم تمريرها عبر المعلمة الخارجية داخل الطريقة وستكون متاحة بعد اكتمال الطريقة.
هنا مثال على استخدام المعلمة خارج لإرجاع قائمة من طريقة:
# تشمل
باطلة جيتليست (إنت* قائمة ، إنت طول ، إنت* أوتليست ، إنت* أوتلينغث) {
ل (إنت أنا = 0 ؛ أنا < طول ؛ أنا i) {
خارج القائمة [أنا] = قائمة [أنا] * 2;
}
كثافة العمليات خارج الطول;
}
برينتف("
");
برينتف ("قائمة الإخراج:");
}
برينتف("
");
العودة 0;
}
В данном примере функция
احصل على قائمة
принимает القائمة ، его длину, а также два بها параметра:
خارج القائمة
и
الطول الخارجي
. داخل الوظيفة ، تقوم بضرب كل عنصر قائمة في 2 وتضع النتائج في القائمة الخارجية. كما أنه يحدد قيمة الطول الخارجي لطول القائمة.
في الوظيفة
الرئيسية
ينشئ قائمة ، تسمى الوظيفة
احصل على قائمة
مع تمرير قائمة ، طوله وخارج المعلمات. ثم يتم إخراج القائمة الأصلية والقائمة الخارجية الناتجة.
إخراج البرنامج:
قائمة المدخلات: 1 2 3 4 5
قائمة الإخراج: 2 4 6 8 10
كما يمكن أن يرى من الإخراج ، وظيفة
احصل على قائمة
عاد بنجاح قائمة جديدة من الأسلوب.
باستخدام صفيف
الصفيف هو أحد هياكل البيانات الرئيسية في لغة البرمجة سي. إنها مجموعة من العناصر من نفس النوع ، مرتبة بالتتابع في الذاكرة.
إعلان صفيف في ج يتم على النحو التالي:
نوع العنصر_اسم المصفوفة [الحجم];
عندما يكون نوع العنصر هو نوع البيانات التي سيتم ملء عناصر المصفوفة بها ، يكون اسم المصفوفة هو معرف المصفوفة ، والحجم هو عدد العناصر التي يمكن أن تحتوي عليها المصفوفة.
مثال على إعلان صفيف:
أرقام كثافة العمليات [5];
يمكن أن تحتوي هذه المصفوفة المعلنة المسماة "الأرقام" على 5 عناصر من نوع بيانات صحيح.
يتم الوصول إلى عناصر المصفوفة بواسطة فهارسها. تبدأ فهارس العناصر من 0 وتنتهي بـ (الحجم-1).
مثال على الوصول إلى عناصر المصفوفة:
أرقام كثافة العمليات[5] = {1, 2, 3, 4, 5};
إنت فيرستنومبر = أرقام [0] ؛ / / الحصول على العنصر الأول من المصفوفة
إنت لاست نومبر = أرقام [4] ؛ / / الحصول على العنصر الأخير من المصفوفة
يمكن أيضا استخدام المصفوفات لإرجاع قائمة القيم من الوظائف في لغة ج.
مثال على وظيفة تقوم بإرجاع مصفوفة:
إنت [] جيتاراي () {
أرقام كثافة العمليات[5] = {1, 2, 3, 4, 5};
أرقام الإرجاع;
}
ومع ذلك ، في ج ، لا يمكن إرجاع المصفوفات مباشرة من الوظائف. يمكنك استخدام المؤشرات بدلا من ذلك.
مثال على وظيفة تقوم بإرجاع مؤشر إلى صفيف:
إنت * جيتاراي () {
أرقام كثافة العمليات[5] = {1, 2, 3, 4, 5};
أرقام الإرجاع;
}
عند استخدام مؤشر ، يجب أن تكون حريصا على عدم الوصول إلى البيانات التي تم تخصيصها في مكدس الوظائف وتم حذفها بعد إنهاء الوظيفة.
إذا تم تخصيص المصفوفة ديناميكيا في الكومة ، فيمكنك إرجاع مؤشر إلى المصفوفة ، وستتوفر البيانات بعد الانتهاء من الوظيفة.
يمكنك أيضا إنشاء صفائف متعددة الأبعاد في ج ، صفائف مع أكثر من بعد واحد.
مثال على إعلان مصفوفة ثنائية الأبعاد:
مصفوفة كثافة العمليات[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
تحتوي هذه المصفوفة ثنائية الأبعاد المعلنة المسماة "ماتريكس" على 3 صفوف و 3 أعمدة. يتم الوصول إلى العناصر بواسطة فهرسين-فهرس الصف وفهرس العمود.
تسمح لك المصفوفات في اللغة ج بتخزين ومعالجة العديد من القيم من نفس النوع بكفاءة. تستخدم على نطاق واسع في البرمجة وهي جزء مهم من العمل مع البيانات.
توصيات لاختيار طريقة قائمة العودة
عند تطوير برامج ج ، قد يكون من الضروري إرجاع قيم القائمة من الأساليب. فيما يلي توصيات لاختيار طريقة إرجاع القائمة:
1. إرجاع المؤشر إلى القائمة
واحدة من أكثر الطرق شيوعا لإرجاع قائمة في ج هي إرجاع مؤشر إلى قائمة. في هذه الحالة ، يجب أن تخصص الطريقة ذاكرة للقائمة ديناميكيا باستخدام وظيفة مالوك (). يجب على مستخدم الطريقة تحرير الذاكرة عندما لا تكون هناك حاجة إلى القائمة ، باستخدام الوظيفة المجانية (). يمكن تنفيذ إرجاع مؤشر إلى قائمة على النحو التالي:
# تشمل
كثافة العمليات * كريتيليست (حجم كثافة العمليات) {
كثافة العمليات * قائمة = (كثافة العمليات*)مالوك (حجم * حجم (كثافة العمليات));
// ملء
قائمة مع بيانات قائمة الإرجاع;
}
الفراغ فريليست (كثافة العمليات* قائمة) {
مجانا (قائمة);
}
2. إرجاع القيمة إلى المؤشر إلى القائمة
خيار شائع آخر هو إرجاع قيمة إلى مؤشر إلى قائمة تم تمريرها إلى دالة كوسيطة. في هذه الحالة ، تحتاج الطريقة إلى تمرير مؤشر إلى القائمة وطول القائمة. يمكن تنفيذ إرجاع القيمة على النحو التالي:
باطلة فيلليست (إنت* قائمة ، إنت الحجم) {
// ملء القائمة بالبيانات
}
كثافة العمليات الرئيسية () {
كثافة العمليات الحجم = 10;
كثافة العمليات * قائمة = (كثافة العمليات*)مالوك (حجم * حجم (كثافة العمليات));
قائمة التعبئة (القائمة والحجم);
// باستخدام القائمة
مجانا (قائمة);
العودة 0;
}
3. أعد البنية التي تحتوي على المؤشر إلى القائمة وحجمها
قد يكون خيار آخر هو إرجاع بنية تحتوي على مؤشر إلى قائمة وحجمها. هذه الطريقة ملائمة لإرسال العديد من المعلمات المتعلقة بالقائمة وتجنب الأخطاء المرتبطة بنقل حجم قائمة غير صحيح. مثال على التنفيذ:
# تشمل
اكتببنية الدفاع {
كثافة العمليات * قائمة;
حجم كثافة العمليات;
} القائمةالبيانات;
قائمة البيانات كريتيليست (حجم إنت) {
القائمةبيانات البيانات;
البيانات.قائمة = (كثافة العمليات*)مالوك (حجم * حجم (كثافة العمليات));
البيانات.الحجم = الحجم;
// ملء القائمة
مع عودة البيانات;
}
فرايد فريليست (ليستداتا داتا داتا) {
مجانا (البيانات.قائمة);
}
4. باستخدام متغير عمومي