请使用 C 中的函数识别并解决此二维数组加法中的错误

问题描述 投票:0回答:1

这是我添加二维数组的代码:

#include <stdio.h>

void getArray(int array[][], int n, int m) {
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      printf("Enter value for array[%d][%d]: ", i, j);
      scanf("%d", &array[i][j]);
    }
  }
}

void addArray(int array1[][], int array2[][], int result[][],
              int n, int m) {
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      result[i][j] = array1[i][j] + array2[i][j];
    }
  }
}

void displayArray(int array[][], int n, int m) {
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      printf("%d ", array[i][j]);
    }
    printf("\n");
  }
}

int main() {
  int array1[10][10], array2[10][10], result[10][10], n, m;
  printf("Enter num of rows and columns: ");
  scanf("%d %d", &n, &m);
  printf("Enter the values for array1:\n");
  getArray(array1, n, m);
  printf("\nEnter the values for array2:\n");
  getArray(array2, n, m);
  addArray(array1, array2, result, n, m);
  printf("\nThe sum of the two arrays is:\n");
  displayArray(result, n, m);

  return 0;
}

我的问题有不同的解决方案,但我需要知道哪里出错了。这些是编译器显示的错误:

error: type of formal parameter 1 is incomplete
error: array type has incomplete element type 'int[]'
c pointers multidimensional-array addition operation
1个回答
1
投票

函数定义中的数组参数必须至少将除第一个维度之外的所有维度指定为常量(例如:

int array[][10]
)或作为在它们之前传递的另一个函数参数的值:

void getArray(int n, int m, int array[n][m]) {

但是请注意,这些维度必须与实际的数组定义相匹配。所以在你的情况下你应该使用

int array[][10]
int array[10][10]
.

这里是修改版:

#include <stdio.h>

void getArray(int array[][10], int n, int m) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            printf("Enter value for array[%d][%d]: ", i, j);
            if (scanf("%d", &array[i][j]) != 1) {
                fprintf(stderr, "invalid input\n");
                return 1;
            }
        }
    }
}

void addArray(int array1[][10], int array2[][10], int result[][10],
              int n, int m) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            result[i][j] = array1[i][j] + array2[i][j];
        }
    }
}

void displayArray(int array[][10], int n, int m) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            printf("%d ", array[i][j]);
        }
        printf("\n");
    }
}

int main() {
    int array1[10][10], array2[10][10], result[10][10], n, m;

    printf("Enter num of rows and columns: ");
    if (scanf("%d %d", &n, &m) != 2) {
        fprintf(stderr, "invalid input\n");
        return 1;
    }
    if (n <= 0 || n > 10 || m <= 0 || m > 10) {
        fprintf(stderr, "invalid sizes\n");
        return 1;
    }
    printf("Enter the values for array1:\n");
    getArray(array1, n, m);
    printf("\nEnter the values for array2:\n");
    getArray(array2, n, m);
    addArray(array1, array2, result, n, m);
    printf("\nThe sum of the two arrays is:\n");
    displayArray(result, n, m);
    return 0;
}

要处理更大的尺寸,您可以分配数组并在数组指针之前传递维度:

#include <stdio.h>
#include <stdlib.h>

void getArray(int n, int m, int array[n][m]) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            printf("Enter value for array[%d][%d]: ", i, j);
            if (scanf("%d", &array[i][j]) != 1) {
                fprintf(stderr, "invalid input\n");
                return 1;
            }
        }
    }
}

void addArray(int n, int m, int array1[n][m], int array2[n][m],
              int result[n][m]) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            result[i][j] = array1[i][j] + array2[i][j];
        }
    }
}

void displayArray(int n, int m, int array[n][m]) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            printf("%d ", array[i][j]);
        }
        printf("\n");
    }
}

int main() {
    int n, m;

    printf("Enter num of rows and columns: ");
    if (scanf("%d %d", &n, &m) != 2) {
        fprintf(stderr, "invalid input\n");
        return 1;
    }
    if (n <= 0 || m <= 0) {
        fprintf(stderr, "invalid sizes\n");
        return 1;
    }
    int (*array1)[m] = malloc(sizeof(*array1) * n);
    int (*array2)[m] = malloc(sizeof(*array2) * n);
    int (*array3)[m] = malloc(sizeof(*array3) * n);
    if (!array1 || !array2 || !array3) {
        fprintf(stderr, "cannot allocate arrays\n");
        return 1;
    }
    printf("Enter the values for array1:\n");
    getArray(n, m, array1);
    printf("\nEnter the values for array2:\n");
    getArray(n, m, array2);
    addArray(n, m, array1, array2, result);
    printf("\nThe sum of the two arrays is:\n");
    displayArray(n, m, result);
    free(array1);
    free(array2);
    free(array3);
    return 0;
}

语法

int (*array1)[m] = malloc(sizeof(*array1) * n)
可用于分配由
n
(即
array1
)指向的类型的
int[m]
元素数组。写这个可能更具可读性:

int (*array1)[m] = malloc(sizeof(int[n][m]));

但是请注意,编译器不会标记目标类型中的

int
int
表达式中的
sizeof
之间的任何不一致,如果这些类型中的一个被更改而不是另一个。出于这个原因,上述代码中使用的语法更可靠,尽管可读性较差且容易出错。为了避免这些陷阱,您还可以这样写:

    int (*array1)[m] = malloc(sizeof(array1[0][0]) * n * m);
© www.soinside.com 2019 - 2024. All rights reserved.