代码之家  ›  专栏  ›  技术社区  ›  Antwoord

如何使用修复中的参数,修复是指针?

  •  0
  • Antwoord  · 技术社区  · 6 年前

    我想生成一个16x16的字符矩阵,其中包含大写字母“o”,然后将其保存在文本文件中

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<conio.h>
    
    char generate_matrix(){
        int colum=16,j;
        int rows=16,i;
        for (i=0;i<rows;i++){
            for(j=0;j<colum;j++){
                matrix[i][j]='O';
    
    
            }
        }
        return matrix;    
    }
    void save(char matrix[16][16]){
        FILE*archivo;
        int i,j;
        char address[]="C:\\Users\\Usuario\\Desktop\\mat.txt";
    
        archivo=fopen(addres,"w");
        if(archivo==NULL){
            printf("does not exist");
        }
        else{
            printf("exist");
        }
        for(i=0;i<16;i++){
            for(j=0;j<16;j++){
            fprintf(archivo,"%c\t",matrix[i][j]);   
            }
            fprintf(archivo,"\n");
        }
    
        fclose(archivo);
    
    }
    
    int main(void){
        generate_matrix();
        save(matrix);
    
        return 0;
    }
    

    错误

    在函数“generate\u matrix”中:错误:“matriz”未声明(首次用于 此功能)
    矩阵[i][j]='O';
    ^~~~~~
    注意:对于矩阵中出现的每个函数,每个未声明的标识符只报告一次。c: 在函数“main”中:
    错误:“matriz”未声明(首次在此函数中使用)
    保存(矩阵);
    ^~~~~~

    请帮帮我,我刚从c开始 我不知道错误是否是因为我必须通过指针传递矩阵? 或者如何将其作为参数传递

    1 回复  |  直到 6 年前
        1
  •  2
  •   Amelia Hartman    6 年前

    首先,您从未在任何地方声明过“矩阵”。因此,编译器当然不知道“矩阵”是什么,因为您从未告诉它它是什么。

    就像您将“i”和“j”声明为“int i,j”,将address声明为“char address[][]”。这些行告诉编译器这些变量应该是什么。您从未声明“matrix”应该是什么,因此编译器会抛出一个“matrix”undeclared”错误。

    您还需要了解范围。

    当您声明变量时,它仅在声明它的范围内有效。变量可以具有非常窄的范围,也可以具有非常宽的全局范围。您可以用花括号(这些东西:{})来考虑范围。大括号内声明的变量仅在其声明的大括号内有效。一旦离开这些花括号,变量就会丢失。

    您可以做的一个解决方案是使用全局范围声明“矩阵”变量。也就是说,将声明放在代码顶部任何花括号之外。这将使矩阵能够被代码中的任何内容使用。

    尽管如此,这样做通常被认为是不好的做法,因为使用大量全局变量可能会很快变得非常混乱,并且在将此代码合并到大型项目中时可能会导致冲突。

    相反,您可以在“generate\u matrix()”函数和“main()”函数中声明“matrix”。还可以将表示“main()”函数中定义的矩阵的数组传入“generate\u matrix()”函数。然后,“generate\u matrix()”函数可以修改该矩阵。这将使“main()”中声明的矩阵与“generate\u matrix()”正在修改的矩阵相同。

    我注意到你说“我必须用指针传递矩阵”。您使用数组来表示矩阵,数组是指针。当你说“char-matrix[16][16]”时,关键字“matrix”只是一个内存地址,指向存储此数组数据的位置。说“矩阵[i][j]”之类的话,就是简单地延迟指针使用“i”和“j”来计算偏移量。

    由于数组只是指针,所以在将矩阵值传递给函数时,不会复制矩阵值。您正在复制指针的值,指针指向数组在内存中的位置。因此,如果您将一个矩阵传递给一个函数,然后修改该矩阵,那么您将修改传递给它的同一个矩阵,而不是它的副本。

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    //Returns nothing because it modifies the matrix passed into it
    void generate_matrix(char matrix[16][16]) {
        int colum=16,j;
        int rows=16,i;
        for (i=0;i<rows;i++) {
            for(j=0;j<colum;j++) {
                matrix[i][j]='O';
            }
        }   
    }
    void save(char matrix[16][16]) {
        FILE*archivo;
        int i,j;
        char address[]="mat.txt";
    
        archivo=fopen(address,"w");
        if(archivo==NULL) {
            printf("does not exist");
        }
        else {
            printf("exist");
        }
        for(i=0;i<16;i++) {
            for(j=0;j<16;j++) {
            fprintf(archivo,"%c\t",matrix[i][j]);   
            }
            fprintf(archivo,"\n");
        }
    
        fclose(archivo);
    
    }
    
    int main(void) {
        char matrix[16][16]; //matrix initially declared here
        generate_matrix(matrix); //modify that matrix
        save(matrix); //save it
    
        return 0;
    }
    

    你可以看到我所做的更改。我使“generate\u matrix()”不再返回任何内容。相反,您将一个数组传递给它,它会修改该数组。因此,我们可以在“main()”下面声明数组,将其传递到“generate\u matrix()”中进行修改,然后再次将其传递到“save()”。

    我还删除了“conio.h”。这不是C标准的一部分,您的程序从未使用过。包含不必要的特定于平台的库不是一种好的做法,因为这样会使代码不必要地不可移植。

    最后,我修复了您将“address”称为“addres”的拼写错误。我还更改了您保存文件的路径,因为我不在Windows上,所以无法使用该路径测试程序。