gpt4 book ai didi

c - 访问作为双指针传递给函数的 Typedef 结构指针。函数内部访问

转载 作者:太空宇宙 更新时间:2023-11-04 03:22:57 25 4
gpt4 key购买 nike

我很难处理对函数内部结构成员的访问,而且结构实例是双指针参数。我正在使用 strcpystrcmp 并且在我看来(我使用调试器)做坏事。

首先,我使用 typedef 创建了结构,实例化了 2 次并为其中一次分配了内存。

其次,我创建了函数 loadVariablesToMemory,我将实例化结构实例作为双指针传递给它(第二行 - 在//Functions 注释之后)。

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

//FUNCTIONS
int loadVariablesToMemory(const char* fileName, const char* fileAccessMode, varData **dynamicData, varData **tmp);



//DECLARATION
typedef unsigned short int UINT16;

typedef struct data {
char varName[10];
UINT16 value;
} varData;



int main(){

//ALLOCATING MEMORY
varData *dynamicData;
dynamicData = (varData*)malloc(sizeof(varData));
varData *tmp;
tmp = NULL;

int numOfVars = loadVariablesToMemory("u02v1_input_03.txt", "r", &dynamicData, &tmp);

return 0;
}

问题:在函数 loadVariablesToMemory 中,我试图访问上面实例化和声明的结构的分配“变量”,使用:

.....
if(strcmp((*(dynamicalData+j-1))->varName, buffer) == 0){
.....etc.
strcpy((*(dynamicalData+numOfVars-1))->varName, buffer);
.....etc.

我运行调试器,一切似乎都正常工作 [如果我将整个函数重写到 Main 之外,它也可以工作(双指针的变化很小,现在是单指针)] 但我卡在了使用 strcpy 的行中();strcmp() 函数,我不知道为什么,我有点绝望,因为这两个 semm 只是阻止我创建工作函数的两件事,我我越来越绝望,因为我处理这个问题将近 10 个小时,但没有任何实际进展。

完整功能loadVariablesToMemory声明:

int loadVariablesToMemory(const char* fileName, const char* fileAccessMode, varData **dynamicalData, varData **tmpal) {


FILE *fSource = fopen(fileName, fileAccessMode);

char oneChar = '\0';
char buffer[10];
memset(buffer,'\0',10); //inicialization of buffer chars to \0

int i = 0;
int varOrNum = 0;
int numOfVars = 0;

bool match = false;

while (!feof(fSource)) {
oneChar = fgetc(fSource); //Load letter in file
if((oneChar == ' ') | (oneChar == '\n')) {
i = 0;
if((strcmp(buffer,"NOT") == 0) || (strcmp(buffer,"AND") == 0) || (strcmp(buffer,"OR") == 0) || (strcmp(buffer,"LSHIFT") == 0) || (strcmp(buffer,"RSHIFT") == 0) || (strcmp(buffer,"->") == 0)) {
memset(buffer,'\0',10);
}
else{
varOrNum = atoi(buffer); //returns (0) if varOrNum is variable (0)
if((varOrNum == 0) & (buffer[0] != '0'))
{ //if varOrNum is a variable (0)

for(int j = 0; j<=numOfVars; j++) { //control in memory for match of variable name
//HERE SEEMS NOT TO WORK - this is just random try if strcpy will work
//strcpy((*(dynamicalData+j-1))->varName, buffer);
//HERE SEEMS NOT TO WORK
if(strcmp((*(dynamicalData+j-1))->varName, buffer) == 0){
memset(buffer,'\0',10);
match = true; //match found
break;
}
else
match = false; //no match found
} //endForCycle

if(match == false){ //no match found
numOfVars++; //number of variables for allocation
tmpal = (varData*)realloc((*dynamicalData), numOfVars * sizeof(varData));
if(!tmpal) { //or equal to NULL
//printf("Could not resize/reallocate memory %i times \n", numOfVars);
}
else{
dynamicalData = tmpal;
strcpy((*(dynamicalData+numOfVars-1))->varName, buffer);
printf("%s \n", (*(dynamicalData+numOfVars-1))->varName);
}
}
}
varOrNum = 0; //if varOrNum is a number (1)
memset(buffer,'\0',10);
}
}
else{
buffer[i] = oneChar;
i++;
}
} //endWhileCycle (!feof(fSource))

fclose (fSource);
return numOfVars;
}

内部输入文件:u02v1_input_03.txt

0 -> c
va OR dq -> v
NOT cx -> dr
kk RSHIFT 3 -> km
NOT cx -> dq
3 AND v -> fx
lf RSHIFT 2 -> lg

有人可以这么好帮我吗?非常感谢。

最佳答案

尝试这样的事情:

if((varOrNum == 0) && (buffer[0] != '0')) {
int j;
for(j = 0; j<numOfVars; j++) {
if(strcmp(dynamicalData[j]->varName, buffer) == 0)
break;
}
if(j>=numOfVars) {
numOfVars++; //number of variables for allocation
tmpal = (varData*)realloc((*dynamicalData), numOfVars * sizeof(varData));
if(!tmpal) { //or equal to NULL
//printf("Could not resize/reallocate memory %i times \n", numOfVars);
}
else{
dynamicalData = tmpal;
strcpy(dynamicalData[numOfVars-1]->varName, buffer);
printf("%s \n", dynamicalData[numOfVars-1]->varName);
}
}
}
varOrNum = 0; //if varOrNum is a number (1)
memset(buffer,'\0',10);

在第一行你错过了 &。在第一个循环 (j==0) 中,您执行 strcmp dynamicalData+j-1 这意味着 dynamicalData[-1]

关于c - 访问作为双指针传递给函数的 Typedef 结构指针。函数内部访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43736444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com