【问题标题】:How do I pass in a 2d array I made from main into another function in C如何将我从 main 制作的二维数组传递给 C 中的另一个函数
【发布时间】:2021-01-20 19:07:14
【问题描述】:

所以我正在尝试制作一个 2d 二进制矩阵,该矩阵的大小由标准输入提供,并且为 0 和 1 随机分配了索引,但是,它们不能超过 size/2 个零或一个。

例如

输入 2

可以输出

1 0

0 1

现在我原本打算在 init 中使用参数 int arr[][n] 但这个想法失败了,因为传入矩阵只是导致我的程序在我尝试访问矩阵时进入某种无限循环再次在 main 函数内部。我相信这是因为初始化结束时矩阵的寿命到期了?所以我的问题是为什么我现在正在做的事情会产生以下错误,我该如何解决这个问题?

note: expected ‘int * (*)[(sizetype)(n)]’ but argument is of type ‘int (*)[(sizetype)(dim)][(sizetype)(dim)]’
    7 | int init(int n, int* arr[][n]);

我的代码

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



int init(int n, int* arr[][n]);
int main(){
    time_t t;
    srand((unsigned) time(&t));
    int dim;
    printf("Enter a positive even integer: ");
    scanf("%d",&dim);
    if(dim<2||dim>80){
        return 1;
        }
    int matrix[dim][dim];
    init(dim,&matrix);  
    
    
    
    return 0;
    }

int init(int n, int* arr[][n]){
    int numZeroes,numOnes;
    int zero_or_one;
    for(int row=0;row<n;row++){
        numZeroes=0;
        numOnes=0;
        for(int col=0;col<n;col++){
            if(numZeroes<n/2 && numOnes<n/2){
                zero_or_one=rand()%2;
                *arr[row][col]=zero_or_one;
                if(zero_or_one==1){
                    numOnes++;
                    }
                if(zero_or_one==0){
                    numZeroes++;
                    }
                }
            else{
                if(numZeroes==n/2 && numOnes<n/2){
                    *arr[row][col]=1;
                    }
                if(numZeroes<n/2 && numOnes==n/2){
                    *arr[row][col]=0;
                    }
            }
        }
        }
    
    for(int row=0;row<n;row++){
        for(int col=0;col<n;col++){
            printf("%d ",*arr[row][col]);
            
        }
        printf("\n");
    }
    return 0;
    }

【问题讨论】:

    标签: arrays c pointers parameters function-definition


    【解决方案1】:

    函数应该像这样声明

    void init(int n, int arr[][n]);
    

    (函数的返回类型int意义不大。)

    并像这样称呼

    init(dim, matrix);
    

    在函数内而不是像这样的语句

    *arr[row][col]=zero_or_one;
    

    你必须写

    arr[row][col]=zero_or_one;
    

    【讨论】:

    • 为什么在这种情况下 void over int ?为什么 int 会阻止我的函数工作
    • @MattTheWizard 函数返回的值是什么意思?这没有任何意义。所以从函数中删除 return 语句。
    • 这并不意味着什么我只是为了我自己的缘故把它放在那里所以我可以很容易地看到程序什么时候结束
    • 说得对,你是对的,我想我并没有真正考虑太深。谢谢
    • @MattTheWizard 我不明白在这种情况下返回值有什么用。
    猜你喜欢
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 2021-01-11
    • 2014-12-12
    相关资源
    最近更新 更多