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

标签 c matrix char

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

#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

In function 'generate_matrix': error: 'matriz' undeclared (first use in this function)
matrix[i][j]='O';
^~~~~~
note: each undeclared identifier is reported only once for each function it appears in matrix.c: In function 'main':
error: 'matriz' undeclared (first use in this function)
save(matrix);
^~~~~~

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

最佳答案

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

就像您将“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 上,所以我无法使用该路径测试程序。

关于c - 如何使用修复中的参数,修复是指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49910801/

相关文章:

c - fprintf的整个过程就不写了

c - readline 与子 printf 发生冲突?

c - 带链表的冒泡排序

r - 获取距离矩阵单元格的标签

python - 矩阵乘法 Python 与 Swift 中的不同输出

C++ 读取 char* 中的注册表字符串值

c - 可能基于预处理器生成的 #if 或 #ifdef "thing"

r - 将 "table"类的对象转换为 R 中的矩阵

c++ - 模板变量作为字符串而不是 const char *

c++ - 如何对指向另一个字符数组的指针数组进行冒泡排序