首页 > 解决方案 > malloc 自定义类型和其他一些 C 问题

问题描述

我目前正在制作一个游戏,其中我需要一个有一堆“细胞”的棋盘。

存储在这些单元格中的数据是从一个文件中读取的,该文件在整个程序中只能读取一次,因此我需要将这些单元格存储在内存中。

我的问题是,我该怎么做?让我解释一下我有什么。

细胞.h

typedef struct{
    unsigned int row;
    unsigned int column;
    char value;
    bool initialCell;
    bool followsRules;
}Cell;

我正在阅读的文件是一块大小为 nxn 的板,如下所示:

9 7 8 5
0 9 6 4
9 7 5 6
0 2 1 6

因此,作为示例,第一个的值Cell struct如下

row = 1
column = 1
value = '9'
initialCell = true
followsRules = true

我知道 malloc 返回一个指向已分配内存的指针,但是作为 C 初学者,我不太明白如何将 Cell “放入”该内存。

以我制作游戏的方式,例如,我有一个行数组,该数组的每个位置都包含另一个数组,其中每个位置都指向一个单元格(基本上是 的矩阵Cell*),我的目标是做这样的事情.

row[0][0]->value

这给了我在第一行的第一个单元格内的价值。

那么,如何Cell*指出为该单元分配的内存,以及将其Cell放入该内存的最佳方法是什么。

很抱歉这篇长文,我一直使用 Java 或 Python 等语言,所以内存分配和管理对我来说是新事物。

标签: cmalloc

解决方案


读取和打印 4x4 文件的示例代码

将其保存为 cell.c 并使用 gcc 或您自己的编译器进行编译,
将示例单元格数据保存在名为“Cell”的文件中

gcc cell.c
./a.out

我使用大小为 n*n 的“一维”数组进行编码,
因为一维数组更易于迭代,并且您始终可以访问单元格cellArr[cellPerRow*rowNumber+ columnNumber].value
而不是row[rowNumber][columnNumber].value

您需要更改 fscanf 部分以处理不同的 n*n 单元,
我将这项工作留给您。请记住根据您的游戏规则 分配
initialCellfollowsRules

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

typedef struct{
    unsigned int row;
    unsigned int column;
    char value;
    bool initialCell;
    bool followsRules;
}Cell;
const int cellPerRow = 4;

int main() {
    Cell *cellArr = (Cell *)malloc(cellPerRow * cellPerRow* sizeof(Cell));
    char fmt[1024];
    char cellRow[cellPerRow];
    int cellIndex = 0;
    int i;
    FILE *fp;
    fp = fopen ("Cell", "r");
    if(NULL == fp) {
        printf("The file was not opened\n");
        exit(1);
    }


    fmt[0] = '\0';
    for ( i=0;i<cellPerRow;i++)
        strcat(fmt,"%c ");
    fmt[strlen(fmt)-1] = '\n';
    while (EOF != fscanf(fp,fmt,
                     &cellRow[0],
                     &cellRow[1],
                     &cellRow[2],
                     &cellRow[3])
    ) {
        for ( i=0;i<cellPerRow;i++) {
            cellArr[cellIndex].row = cellIndex / cellPerRow;
            cellArr[cellIndex].column = i;
            cellArr[cellIndex].value = cellRow[i];
            cellIndex++;
        }
    }


    for (i=0;i<cellIndex;i++) {
       printf("%c ", cellArr[i].value);
       if (0 == (i+1) % cellPerRow) {
            printf("\n");
       }
    }
    free(cellArr);
}

推荐阅读