كيف يمكنني تعديل مجموعة 2D وتمريرها إلى وظيفة؟

StackOverflow https://stackoverflow.com/questions/1431500

  •  07-07-2019
  •  | 
  •  

سؤال

وماذا التعليمة البرمجية التالية يعطيني خطأ تجزئة؟

#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 ومن ints كمؤشر إلى مجموعة 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 كمؤشر إلى العنصر الأول (مؤشر إلى صف أو مجموعة من MAXCOLSs 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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top