c - 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 等语言,所以内存分配和管理对我来说是新事物。
解决方案
读取和打印 4x4 文件的示例代码
将其保存为 cell.c 并使用 gcc 或您自己的编译器进行编译,
将示例单元格数据保存在名为“Cell”的文件中
gcc cell.c
./a.out
我使用大小为 n*n 的“一维”数组进行编码,
因为一维数组更易于迭代,并且您始终可以访问单元格cellArr[cellPerRow*rowNumber+ columnNumber].value
而不是row[rowNumber][columnNumber].value
您需要更改 fscanf 部分以处理不同的 n*n 单元,
我将这项工作留给您。请记住根据您的游戏规则 分配
值initialCell
followsRules
#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);
}
推荐阅读
- javascript - Ag 网格:数组对象值未正确显示
- javascript - 无法绑定到“useStickyClasses”,因为它不是“div”的已知属性
- javascript - 当我将 'console.log(err.message)' 放入 express 应用程序的错误处理程序中时,它会无休止地记录,但为什么呢?
- javascript - 在函数之外使用变量数据?
- python - 子集 df 来调整时间戳
- r - R - 如何删除具有一定百分比的空单元格的行?
- swift - 如何创建 2 个可以并行/同时运行的 SpeechRecognizer 实例?
- python - 你能用 BatchNormalization 解释神经网络中的 Keras get_weights() 函数吗?
- python - 括号反转的最小数量?
- python - 如何使用冒号分隔符从 csv 创建数据框