كيف يمكنني تعديل مجموعة 2D وتمريرها إلى وظيفة؟
سؤال
وماذا التعليمة البرمجية التالية يعطيني خطأ تجزئة؟
#define MAXROWS 10
#define MAXCOLS 10
void getInput (int *data[MAXROWS][MAXCOLS]) {
int rows, cols;
int curRow, curCol;
printf ("How many rows and cols?");
scanf ("%d %d", rows, cols);
for (curRow = 0; curRow < rows; curRow++) {
for (curCol = 0; curCol < cols; curCol++) {
scanf ("%d", data[curRow][curCol]);
printf ("%d\n", *data[curRow][curCol]);
}
}
}
void main () {
int data[MAXROWS][MAXCOLS];
getInput (data);
}
ويبدو أن تلك البيانات scanf
وprintf
لا يحصلون على نوع البيانات الصحيحة مرت في، ولكن لا أستطيع أن أعمل خارج ما <م> يجب م> يكون.
وكيف يمكنني تغييره بحيث أنه يعمل بشكل صحيح؟
المحلول
وهذا يعلن مجموعة من المصفوفات MAXROWS
من المؤشرات إلى int
.
int *data[MAXROWS][MAXCOLS];
ولكن، في تعريف وظيفة، أعلى مستوى صفائف (أي حجم) وتعادل مؤشرات لصفائف تسوس دائما إلى مؤشرات إلى نوع من عضو مجموعة على تمرير إلى وظيفة.
وهكذا تعريف الدالة ما يعادل:
void getInput (int *(*data)[MAXCOLS])
وأي بمعنى. مؤشر إلى مجموعة من المؤشرات MAXCOLS
إلى int
.
وكما يقف التعليمات البرمجية الخاصة بك، يمكنك أبدا تهيئة أي من مؤشرات int
في مجموعة، ويتم تمرير مجموعة 2D ومن int
s كمؤشر إلى مجموعة 2D ومن int *
.
وماذا ربما كنت ترغب في تمرير، هو مؤشر إلى مجموعة من MAXCOLS
int
:
void getInput (int (*data)[MAXCOLS])
وأو مكافئ:
void getInput (int data[][MAXCOLS])
وبعد ذلك القيام بما يلي:
int main(void)
{
int data[MAXROWS][MAXCOLS];
getInput(data);
return 0;
}
وأنت ثم تمرير مجموعة الخاصة بك 2D كمؤشر إلى العنصر الأول (مؤشر إلى صف أو مجموعة من MAXCOLS
s int
).
إذا قمت بإجراء تغيير على يقين تأكد من تغيير:
scanf ("%d", data[curRow][curCol]);
printf ("%d\n", *data[curRow][curCol]);
إلى:
scanf ("%d", &data[curRow][curCol]);
printf ("%d\n", data[curRow][curCol]);
وأيضا، تحقق المعلمات هنا:
scanf ("%d %d", &rows, &cols);
وتحتاج إلى أن تمرير مؤشرات إلى rows
وcols
.
تأكد من إضافة بعض حدود فحص لوظيفة الإدخال بحيث لا تحاول قراءة المزيد من الصفوف والأعمدة من MAXROWS
أو MAXCOLS
.
نصائح أخرى
وscanf يقبل عنوان المتغيرات، وليس مضمون ما يلي:
void getInput (int data[][MAXCOLS]) {
int rows, cols;
int curRow, curCol;
printf ("How many rows and cols?");
scanf ("%d %d", &rows, &cols);
//scanf ("%d %d", &rows, &cols);
for (curRow = 0; curRow < rows; curRow++) {
for (curCol = 0; curCol < cols; curCol++) {
scanf ("%d", &data[curRow][curCol]);
printf ("%d\n", data[curRow][curCol]);
}
}
}
وكانت هناك بعض المشاكل المختلفة.
أولا، عند تمرير صفائف إلى الوظائف التي تحتاج إليها فقط تعريف N-1 الأبعاد. على سبيل المثال إذا كنت تمر مجموعة 3D هل وضع حجم أبعاد الأخيرة (2) في سيج وظيفة وترك أول واحد فارغ.
foo(int threeD[][10][15]);
والثانية، ويأخذ scanf عنوان حجة، والتي لمجموعة الخاص بك يبدو مثل هذا
&data[curRow][curCol]
وثالثا، يجب عليك دائما التحقق من مدى يمكنك إدخال للتأكد من انها صحيحة:
if (rows > MAXROWS || cols > MAXCOLS) {
printf("Bad array dimensions\n");
return;
}
والرابع وتجميع دائما مع كل التحذيرات تشغيل - المترجم سوف يحذرك حول تخصيص هذه الأمور:
gcc -Wall pass_array.c -o pass_array
#include <stdio.h>
#define MAXROWS 10
#define MAXCOLS 10
void getInput (int data[][MAXCOLS]) {
int rows, cols;
int curRow, curCol;
printf ("How many rows and cols?");
scanf ("%d %d", &rows, &cols);
if (rows > MAXROWS || cols > MAXCOLS) {
printf("Bad array dimensions\n");
return;
}
for (curRow = 0; curRow < rows; curRow++) {
for (curCol = 0; curCol < cols; curCol++) {
scanf ("%d", &data[curRow][curCol]);
printf ("%d\n", data[curRow][curCol]);
}
}
}
int main () {
int data[MAXROWS][MAXCOLS];
getInput (data);
return 0;
}