في ال ج اللغة ، المصفوفات عبارة عن مصفوفات متعددة الأبعاد يمكن تمريرها إلى دالة كوسيطة. ومع ذلك ، فإن تمرير مصفوفة إلى وظيفة يمكن أن يكون قليلا من مهمة مربكة للمبرمجين المبتدئين. في هذه المقالة ، سنلقي نظرة على بعض النصائح والأمثلة المفيدة التي ستساعدك على نقل مصفوفة بشكل أكثر فعالية إلى دالة في لغة سي.
يتطلب تمرير مصفوفة إلى دالة في ج اهتماما دقيقا بأنواع البيانات وأبعاد المصفوفة. عند تمرير مصفوفة إلى دالة ، يجب عليك التأكد من تمرير المؤشر بشكل صحيح إلى المصفوفة وتعيين الأبعاد الصحيحة للمصفوفة.
نصيحة 1: تحديد أبعاد المصفوفة
عند تمرير مصفوفة إلى دالة ، تحتاج إلى تحديد أبعادها بشكل صريح. يمكنك تمرير أبعاد المصفوفة كمعلمات دالة أو استخدام المتغيرات العالمية لتخزين أبعاد المصفوفة. في أي حال ، تحتاج إلى التأكد من أن أبعاد المصفوفة تتطابق مع المصفوفة المرسلة بشكل صحيح.
نصيحة 2: استخدم المؤشرات إلى مصفوفة ثنائية الأبعاد
لتمرير مصفوفة إلى دالة ، يمكنك استخدام المؤشرات إلى مصفوفة ثنائية الأبعاد. يسمح المؤشر إلى مصفوفة ثنائية الأبعاد للدالة بالوصول إلى عناصر المصفوفة وتغيير قيمها. بالإضافة إلى ذلك ، من خلال تمرير مؤشر إلى مصفوفة ثنائية الأبعاد ، يمكنك تمرير عنوان العنصر الأول من المصفوفة بالضبط ، مما يسمح للوظيفة بالعمل مع المصفوفة دون الحاجة إلى نسخها.
- التحضير لنقل المصفوفة إلى الوظيفة
- إعلان الوظيفة مع نقل المصفوفة
- انتقال المصفوفة حسب القيمة
- نقل المصفوفة بالرجوع إليها
- العمل مع مصفوفة داخل وظيفة
- إرجاع مصفوفة من دالة
- أمثلة على تمرير مصفوفة إلى دالة
- مثال 1: تمرير مصفوفة إلى دالة حسب القيمة
- مثال 2: تمرير مصفوفة إلى دالة باستخدام مؤشر
- مثال 3: تمرير مصفوفة إلى دالة باستخدام مؤشر مزدوج
- سؤال وجواب
- كيف يمكنني تمرير مصفوفة إلى وظيفة في ج?
- كيف يمكنني نقل مصفوفة إلى وظيفة باستخدام صفيف ثنائي الأبعاد?
- كيف يمكنني تمرير مصفوفة إلى وظيفة باستخدام مؤشر إلى مؤشر?
- كيف يمكنني نقل مصفوفة إلى وظيفة إذا أبعادها غير معروفة مقدما?
- هل من الممكن تغيير المصفوفة التي تم تمريرها إلى الوظيفة?
التحضير لنقل المصفوفة إلى الوظيفة
يمكن أن يكون تمرير مصفوفة إلى دالة في ج مهمة صعبة يجب إعدادها بشكل صحيح. في هذا القسم ، سنلقي نظرة على بعض النصائح المفيدة التي ستساعدك على نقل المصفوفات إلى وظيفة بكفاءة وخالية من الأخطاء.
- }
// Создание матрицы
int **matrix = malloc(rows * sizeof(int *));
}
// Инициализация структуры
Matrix m;
m.cols = cols;
- من المهم أن تتذكر أنه عند تمرير مصفوفة إلى دالة ، يجب تحديد أبعادها من أجل معالجة البيانات داخل الوظيفة بشكل صحيح. باستخدام مؤشر إلى مصفوفة أو مصفوفة ثنائية الأبعاد ، يمكنك نقل المصفوفة بشكل فعال إلى وظيفة وإجراء عمليات مختلفة عليها.
في ال ج اللغة ، عادة ما يتم نقل المصفوفة إلى دالة بواسطة مؤشر. ومع ذلك ، في بعض الأحيان يكون من الضروري تمرير المصفوفة حسب القيمة لتجنب تغييرها داخل الوظيفة. للقيام بذلك ، يمكنك استخدام الأساليب التالية:
باستخدام الهيكل
تتمثل إحدى طرق نقل المصفوفة حسب القيمة في استخدام بنية. في الهيكل ، يمكنك إعلان مصفوفة ثنائية الأبعاد لتخزين المصفوفة والحقول الأخرى ، على سبيل المثال ، لتخزين حجم المصفوفة. ثم يتم إنشاء وظيفة تأخذ الهيكل كوسيطة وتنفذ عمليات على المصفوفة دون تغيير حالتها الأولية.
اكتببنية الدفاع {
الصفوف كثافة العمليات;
كثافة العمليات كولز;
البيانات الدولية;
} مصفوفة;
برينتف("
}
في هذا المثال ، تم إنشاء بنية مصفوفة تحتوي على حقول الصفوف والأعمدة لتخزين حجم المصفوفة ، بالإضافة إلى مصفوفة بيانات ثنائية الأبعاد لتخزين عناصر المصفوفة. تأخذ وظيفة برينتماتريكس بنية المصفوفة وتعرض محتوياتها على الشاشة.
نسخ المصفوفة
هناك طريقة أخرى لنقل مصفوفة حسب القيمة وهي نسخ المصفوفة بشكل صريح داخل دالة. للقيام بذلك ، يمكنك إنشاء مصفوفة جديدة ونسخ القيم من المصفوفة الأصلية إليها والعمل مع هذه النسخة داخل الوظيفة. قد يتطلب هذا النهج تخصيص الذاكرة للمصفوفة الجديدة:
باطلة مولتيبليماتريكسبيتو (إنت مصفوفة [] [ماكس كولس] ، إنت الصفوف، إنت كولس) {
نتيجة كثافة العمليات [ماكس صفو] [ماكس كولس];
ل (إنت أنا = 0 ؛ أنا < الصفوف ؛ أنا i) {
إلى عن على (الباحث ي = 0 ؛ ي < الأعمدة ؛ ي j) {
النتيجة [أنا] [ي] = مصفوفة [أنا] [ي] * 2;
}
في هذا المثال ، يتم إنشاء مصفوفة نتائج جديدة ، يتم فيها نسخ القيم من المصفوفة الأصلية. ثم يتم ضرب كل عنصر من عناصر المصفوفة الجديدة في اثنين. تعرض وظيفة برينتماتريكس محتويات مصفوفة النتائج الجديدة.
كلا النهجين لهما مزايا وعيوب. يتيح لك استخدام الهيكل إنشاء واجهة سهلة الاستخدام للعمل مع المصفوفات ، ولكن يمكن أن يؤدي إلى زيادة استخدام الذاكرة. يتطلب نسخ المصفوفة تخصيص ذاكرة إضافية ، ولكنه يتجنب تغيير المصفوفة الأصلية.
يعتمد اختيار النهج على المهمة المحددة ومتطلبات البرنامج. ومع ذلك ، في كلتا الحالتين ، من الضروري التعامل مع الذاكرة بعناية ومراعاة حدودها.
نقل المصفوفة بالرجوع إليها
في ال لغة ج ، يتم تمرير المصفوفات ، بما في ذلك المصفوفات ، إلى وظائف بالرجوع إليها. هذا يعني أنه بدلا من نقل المصفوفة بأكملها (أو المصفوفة) حسب القيمة ، يتم إرسال إشارة إليها فقط ، مما يتجنب النسخ غير الضروري ويحفظ الذاكرة ووقت تنفيذ البرنامج.
لتمرير مصفوفة إلى دالة بالرجوع إليها ، يجب أن تعلن معلمة الوظيفة كمؤشر إلى مصفوفة (أو مؤشر إلى مؤشر في حالة مصفوفة ثنائية الأبعاد). هنا مثال:
باطل برينتماتريكس (إنت* مصفوفة ، إنت الصفوف ، إنت كولز) {
ل (إنت أنا = 0 ؛ أنا < الصفوف ؛ أنا i) {
إلى عن على (الباحث ي = 0 ؛ ي < الأعمدة ؛ ي j) {
برينتف ("٪د " ، مصفوفة [أنا * كولز + ي]);
}
برينتف("
");
}
}
كثافة العمليات الرئيسية () {
مصفوفة كثافة العمليات[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
برينتماتريكس (ومصفوفة[0][0], 3, 3);
العودة 0;
}
في هذا المثال ، وظيفة برينتماتريكس
يقبل المعلمات
مصفوفة
,
الصفوف
و
كولز
، أين
مصفوفة
أبعاد المصفوفة. داخل الوظيفة ، يتم استخدام المرجع المعتاد لعناصر المصفوفة من خلال التعبير
مصفوفة [أنا * كولز + ي]
.
عند استدعاء وظيفة برينتماتريكس
من الوظيفة
الرئيسية
يتم تمرير عنوان العنصر الأول من المصفوفة باستخدام
المشغل
. هذا يعني أن
مصفوفة [0] [0]
سيكون مؤشرا للعنصر الأول في الذاكرة ، لذلك يمكن تمرير مؤشر لهذا العنصر إلى وظيفة.
يسمح هذا التصميم للوظيفة بتغيير قيم عناصر المصفوفة ، لأنها تعمل مع مراجعها. يمكنك أيضا استخدام هذا النهج لتمرير أي مجموعة أخرى إلى وظيفة.
عند تمرير مصفوفة إلى دالة ، من المهم تمرير أبعادها أو عدد الصفوف والأعمدة ، لأن لغة ج ليس لديها القدرة على تحديد أبعاد المصفوفة تلقائيا. يمكن القيام بذلك باستخدام معلمات دالة إضافية أو باستخدام المؤشرات.
مثال على استخدام مصفوفة ثنائية الأبعاد في دالة:
# تشمل
إلى عن على (الباحث ي = 0 ؛ ي < الأعمدة ؛ ي j) {
برينتف ("٪د " ، مصفوفة[ط][ي]);
}
برينتف("
");
}
}
كثافة العمليات الرئيسية () {
مصفوفة كثافة العمليات [3] [3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
طباعة مصفوفة (3 ، 3 ، مصفوفة);
العودة 0;
}
في هذا المثال
، وظيفة الطباعة ()
يأخذ البعد من المصفوفة والمصفوفة نفسها. ثم ، باستخدام حلقتين متداخلتين ، يتم اجتياز جميع عناصر المصفوفة وطباعتها. في الوظيفة
الرئيسية()
يخلق مصفوفة ثنائية الأبعاد
مصفوفة
مع البعد من 3 3 3 و
تسمى وظيفة المصفوفة المطبوعة()
لطباعة المصفوفة.
لإجراء عمليات باستخدام مصفوفة داخل دالة ، يمكنك استخدام العمليات المعتادة على المصفوفات. على سبيل المثال ، لإضافة مصفوفتين ، يمكنك إنشاء وظيفة منفصلة:
إلى عن على (الباحث ي = 0 ؛ ي < الأعمدة ؛ ي j) {
النتيجة [أنا] [ي] = مصفوفة1 [أنا] [ي] + مصفوفة2 [أنا] [ي];
}
}
ل (إنت أنا = 0 ؛ أنا < الصفوف ؛ أنا i) {
إلى عن على (الباحث ي = 0 ؛ ي < الأعمدة ؛ ي j) {
برينتف ("٪د " ، النتيجة[ط][ي]);
}
برينتف("
");
}
}
كثافة العمليات الرئيسية () {
مصفوفة كثافة العمليات 1[3] [3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
{3, 2, 1}
};
إضافة المصفوفات (3 ، 3 ، المصفوفات 1 ، المصفوفات 2);
العودة 0;
}
في هذا المثال ، الدالة
إضافة المصاريف()
يأخذ اثنين من المصفوفات من نفس البعد ، ويخلق
مصفوفة نتيجة
لتخزين نتيجة بالإضافة إلى ذلك ، وينفذ العمليات المناسبة. يتم عرض النتيجة على الشاشة.
وهكذا ، في اللغة ج ، يمكنك بسهولة تمرير المصفوفات إلى وظائف كمعلمات وتنفيذ عمليات مختلفة معهم. هذا يسمح لك بإنشاء رمز أكثر وحدات وقابلة للقراءة.
إرجاع مصفوفة من دالة
في ال ج اللغة ، عادة ما يتم تمثيل المصفوفات على أنها صفائف ثنائية الأبعاد. عندما تحتاج إلى تمرير مصفوفة إلى وظيفة وتغييرها داخل الوظيفة ، يمكنك استخدام مؤشر إلى مؤشر. ومع ذلك ، عند إرجاع مصفوفة من دالة ، سيكون من غير المناسب استخدام هذا النهج.
بدلا من ذلك ، يمكنك إرجاع المصفوفة كقيمة من الدالة. للقيام بذلك ، تحتاج إلى إعلان وظيفة مع نوع قيمة الإرجاع الذي يطابق نوع المصفوفة. على سبيل المثال ، لإرجاع مصفوفة كثافة العمليات ثنائية الأبعاد ، يمكن الإعلان عن الوظيفة على النحو التالي:
إنت * * ريتيدماتريكس (إنت الصفوف ، إنت كولز) {
كثافة العمليات * * ماتريكس = مالوك (صفوف * حجم (كثافة العمليات*));
ل (إنت أنا = 0 ؛ أنا < الصفوف ؛ i أنا) {
مصفوفة [أنا] = مالوك(كولز * سيزوف (إنت));
}
// ملء
المصفوفة مع بيانات مصفوفة الإرجاع;
}
هنا ، وظيفة ريتيماتريكس
يأخذ وسيطتين-عدد الصفوف والأعمدة من المصفوفة. فإنه يخصص الذاكرة للمصفوفة ، يملأ مع البيانات ، وأخيرا إرجاع المصفوفة كقيمة.
للحصول على المصفوفة التي تم إرجاعها في البرنامج الرئيسي ، يمكنك استخدام متغير مؤشر وتعيين القيمة التي تم إرجاعها بواسطة الوظيفة:
كثافة العمليات * * مصفوفة = ريتيدماتريكس (3 ، 3);
بعد ذلك ، المتغير
مصفوفة
سيحتوي على عنوان العنصر الأول من المصفوفة. يمكنك الوصول إلى عناصر المصفوفة باستخدام بناء الجملة مع الفهارس:
عنصر كثافة العمليات = مصفوفة [0] [0];
لتجنب تسرب الذاكرة ، من الضروري تحرير الذاكرة المشغولة للمصفوفة بعد الاستخدام. للقيام بذلك ، يمكنك استخدام التعليمات البرمجية التالية:
ل (إنت أنا = 0 ؛ أنا < الصفوف ؛ i أنا) {
مجانا (مصفوفة [أنا]);
}
مثال 1: تمرير مصفوفة إلى دالة حسب القيمة
# تشمل
فواد برينتماتريكس (مصفوفة إنت [3][3]) {
إلى عن على (كثافة العمليات أنا = 0; أنا < 3; أنا i) {
إلى عن على (الباحث ي = 0 ؛ ي < 3 ؛ ي++) {
برينتف ("٪د " ، مصفوفة[ط][ي]);
}
برينتف("
");
}
}
كثافة العمليات الرئيسية () {
مصفوفة كثافة العمليات[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};