【发布时间】:2020-08-31 16:28:58
【问题描述】:
无法确定用于在结构中初始化结构的嵌套取消引用。我终于想通了通过对 Inode 结构的函数调用来初始化一个结构,但我似乎无法将其转换为通过对 Inodetable 结构(它是一个 Inode 结构的结构)的函数调用来初始化一个结构结构。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
int POINTERS_PER_INODE = 5;
int Total_Inodes = 64;
struct Inode {
int valid;/* 0 == invalid, 1 == valid*/
int size;
int Blocks [5];
};
struct InodeTable InodeTable;
int InodeToString(char * InodeString, struct Inode iNode){
char * blockBuffer;
sprintf(InodeString, "%d", iNode.valid);
int i;
for (i = 0; i < POINTERS_PER_INODE; i++){
blockBuffer = malloc(8);
sprintf(blockBuffer, "%d", iNode.Blocks[i]); //no valid pointers yet
strcat(InodeString,blockBuffer);
free(blockBuffer);
}
return 0;
}
int initializeInode(struct Inode * iNode){
int i;
for (i = 0; i < POINTERS_PER_INODE; i++){
iNode->Blocks[i] = -1; //no valid pointers yet
}
iNode->valid = 0; //initialized as invalid inode
return 0;
}
int initializeInodeTable(struct InodeTable * ITable){
char * InodeTableString;
char * inodeString;
InodeTableString = malloc(sizeof(struct Inode) * 64);
memset(InodeTableString, 0 , sizeof(struct Inode) * 64);
for (int i = 0; i < Total_Inodes; i++){
inodeString = malloc(sizeof(struct Inode));
memset(inodeString, 0 , sizeof(struct Inode));
initializeInode(&ITable.InodeTable[i]);
InodeToString(inodeString, &ITable.InodeTable[i]);
strcat(InodeTableString,inodeString);
free(inodeString);
}
printf("write: %s"InodeTableString);
free(InodeTableString);
return 0;
}
int main() {
struct InodeTable iNodeTable[64];
initializeInodeTable(&iNodeTable);
return 0;
}
【问题讨论】:
-
“我遇到了麻烦”并没有具体告诉我们您的问题是什么。 “我不得不将它分解并尝试一点一点地重建它”仅供参考,最佳做法是始终这样做。编写大量代码然后在最后进行一次大爆炸测试并不是一个好主意。编写一小段代码,测试它们是否工作(最好使用自动单元测试),然后继续编写下一小段代码。
-
特别是我对嵌套取消引用感到困惑。它似乎不适用于结构中的结构,就像它适用于结构中的数组一样,我尝试了一些变体,在所有地方都取消引用箭头但不起作用,但也许我被 sprintf 绊倒了,只是没有使用正确的组合?
-
我最初确实以尽可能小的块编写尽可能多的代码,但是当将它们从 IDE 移动到引用文件而不只是字符串的实际项目时,我不得不调整许多部分,然后更改了有关实现更大功能(例如导入文件)的设计决策,这改变了我计划使用/引用/读取/写入用户定义结构的方式。
-
我能够通过将 inode 结构传递给初始化函数来初始化它,但是当我尝试将它嵌套在 InodeTable 的初始化函数中时,它是 Inode 结构的结构并尝试传递在我以类似方式进行的任何最佳尝试中指向 InodeTable 的指针,我似乎无法初始化任何东西。
-
原来的项目要大得多,因为我在这个初始化策略上没有取得任何进展,所以我构建了所有东西以避免使用结构体,这帮助我充实了许多其他设计决策,并且是唯一的选择,因为我无法弄清楚这一点,但它是一个我不满意的笨拙的解决方法,特别是对于添加未来的代码并且没有解决我未能实现预期的数据结构的问题。
标签: c function pointers struct initialization