gpt4 book ai didi

c - 如何将函数内的二维数组返回到 C 中的 main

转载 作者:太空宇宙 更新时间:2023-11-04 01:52:54 26 4
gpt4 key购买 nike

我读取了一个文本文件并将内容存储在一个函数内名为 H 的二维数组中,我需要以某种方式将此二维数组返回到 main,以便我可以在那里使用它并将其传递给其他函数。我不确定如何恢复工作,也许使用指针。我将 readTxtFile 函数变成了一个 void 函数来测试文件读取是否有效(它确实有效),但我无法在函数外部对二维数组做任何事情。我有两个函数 getRows() 和 getCols() 我没有在这里展示,但如果需要我可以。

到目前为止,这是我的代码:

int main(void){

// int *H;
// H = readTxtFile("H.txt");
readTxtFile("H.txt");
return 0;
}

void readTxtFile(char *filename){
int rows, cols;
FILE *fp = fopen(filename, "r");
if (!fp){
perror("can't open H.txt\n");
//return EXIT_FAILURE;
}
rows = getRows(fp);
cols = getCols(fp);
int (*H)[cols] = malloc(sizeof(int[rows][cols]));
if(!H){
perror("fail malloc\n");
exit(EXIT_FAILURE);
}

for(int r = 0; r < rows; ++r){
for(int c = 0; c < cols; ++c){
if(EOF==fscanf(fp, "%d", &H[r][c])){
fprintf(stderr, "The data is insufficient.\n");
free(H);
exit(EXIT_FAILURE);
}
}
}
fclose(fp);

// printH(rows,cols,H);
// return H;


}

这是文本文件的样子:

1 1 0 1 0 0
0 1 1 0 1 0
1 0 0 0 1 1
0 0 1 1 0 1
2 2 2 2 2 2

任何帮助将不胜感激

最佳答案

我要做的是根据以下内容为二维数组定义一个结构:

  • 列数
  • 行数
  • 指向内存中数组数据的指针

请注意,我将“线性化” 数组,即分配一个大小为 Columns * Rows * sizeof(int) 的内存块,并给定 ij 行和列索引,这两个索引可以通过简单的数学运算转换为一维数组中的单个索引(例如 index = rowIndex * 列 + columnIndex)

然后,我将从您的 ReadTxtFile 函数返回指向此结构的指针:

struct IntArray2D {
int Rows;
int Columns;
int* Elements;
};

/*
* Define a couple of helper functions to allocate
* and free the IntArray2D structure.
*/
struct IntArray2D* IntArray2D_Create(int rows, int columns);
void IntArray2D_Free(struct IntArray2D* array);

/*
* On success, returns a 2D array with data read from file.
* On failure, returns NULL.
* NOTE: callers must call IntArray2D_Free() when done
*/
struct IntArray2D* ReadTxtFile(const char* filename);

编辑 作为替代方案,您可以定义数组结构具有包含行数和列数的标题 block ,立即后跟“线性化”二维数组元素,使用 "flexible array member" :

struct IntArray2D {
int Rows;
int Columns;
int Elements[];
};

然后您可以定义一些方便的函数来操作这个自定义数组结构,例如:

struct IntArray2D* IntArray2D_Create(int rows, int columns)
{
/* Check rows and columns parameters are > 0 */
/* ... */

struct IntArray2D *p = malloc(sizeof(struct IntArray2D)
+ rows * columns * sizeof(int));
if (p == NULL) {
return NULL;
}

p->Rows = rows;
p->Columns = columns;

/* May zero out the array elements or not... */
memset(p->Elements, 0, rows * columns * sizeof(int));

return p;
}

void IntArray2D_Free(struct IntArray2D* array)
{
free(array);
}

int IntArray2D_GetElement(struct IntArray2D* array,
int row, int column)
{
/* Check array is not NULL; check row and column
indexes are in valid ranges ... */

int index = row * (array->Columns) + column;
return array->Elements[index];
}

void IntArray2D_SetElement(struct IntArray2D* array,
int row, int column,
int value)
{
/* Check array is not NULL; check row and column
indexes are in valid ranges ... */

int index = row * (array->Columns) + column;
array->Elements[index] = value;
}

在您的 ReadTxtFile 函数中,您可以调用 IntArray2D_Create 而不是调用 malloc:

struct IntArray2D* ReadTxtFile(const char* filename) 
{
struct IntArray2D* data = NULL;

/* ... */

rows = getRows(fp);
cols = getCols(fp);
data = IntArray2D_Create(rows, cols);
if (data == NULL) {
/* Handle error ... */
return NULL;
}

/* Fill the array ... */

特别是,而不是你的:

if(EOF==fscanf(fp, "%d", &H[r][c])){

你可以这样做:

    /* int valueReadFromFile */
if (EOF == fscanf(fp, "%d", &valueReadFromFile)) {
fprintf(stderr, "The data is insufficient.\n");
}
IntArray2D_SetElement(data, r, c, valueReadFromFile);

然后在函数的末尾,您可以:

    return data;
}

关于c - 如何将函数内的二维数组返回到 C 中的 main,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40090326/

26 4 0
文章推荐: html - 是否可以将背景图像添加到 JSP 页面上的
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com