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

时间:2018-04-19 00:17:18

标签: c matrix char

我想生成一个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;
}
  

ERROR

     

在功能&#39; generate_matrix&#39;:错误:&#39; matriz&#39;未申报(首次使用)   这个功能)
               矩阵[i] [j] =&#39; O&#39 ;;
               ^ ~~~~~
  注意:每个未声明的标识符仅针对它出现在matrix.c中的每个函数报告一次:在函数&#39; main&#39;:
  错误:&#39; matriz&#39;未申报(首次使用此功能)
       保存(矩阵);
               ^ ~~~~~

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

1 个答案:

答案 0 :(得分:2)

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

就像你将“i”和“j”声明为“int i,j”并将地址称为“char address [] []”。这些行告诉编译器这些变量应该是什么。你从未声明过应该是什么“矩阵”,因此编译器会抛出一个“'矩阵'未声明的'错误。

您还需要了解范围。

当您声明一个变量时,它只对其声明的范围有效。变量可以具有非常窄的范围,或者它可以具有非常宽的全局范围。你能想到范围的一种方法是花括号(这些东西:{})。在花括号内声明的变量仅在它们声明的花括号内有效。一旦你离开那些花括号,变量就会丢失。

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

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

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

我注意到你说“我必须通过指针传递矩阵”。您正在使用数组来表示矩阵,而数组是指针。当你说“char matrix [16] [16]”之类的东西时,关键字“matrix”就是一个指向存储该数组数据的存储器地址。说“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_matrix()”不再返回任何内容。相反,您将一个数组传递给它,它会修改该数组。这样我们就可以在“main()”下面声明数组,将其传递给“generate_matrix()”进行修改,然后再将它传递给“save()”。

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

最后,我修改了你的错字,你把“地址”称为“地址”。我还改变了保存文件的路径,因为我不在Windows上,因此我无法使用该路径测试程序。