[英]Struct handling and array of structs
我正在編寫代碼以存儲文本文件中的數據。 代碼可以編譯,但似乎無法在ReadPanelBlock
函數的for循環中運行。 它的結構為: CHBStructure
包含CHBPanels
, CHBOpenings
包含CHBOpenings
。 這些功能的創建是為了從輸入的文本文件中讀取內容,我將其整理成數據塊以便於閱讀。
typedef struct _open
{
int id;
double length;
double height;
double origX;
double origY;
int frames;
double thickness;
double E;
double v;
}CHBOpening;
typedef struct _panels
{
int id;
double length;
double height;
double origX;
double origY;
double origZ;
double angle;
int nOpenings;
int nReinforcement;
double *xReinf;
double sx;
double xReinf0;
CHBUnit *chb;
CHBOpening *openings[];
}CHBPanel;
typedef struct _chb
{
int nStories;
int nModes;
int nIter;
int nPanels;
CHBPanel *panels[];
}CHBStructure;
int ReadPanelBlock (FILE *fp, CHBStructure *S)
{
CHBOpening *openings = malloc(sizeof(CHBOpening));
*S->panels = malloc(S->nPanels*sizeof(CHBPanel));
for (i=0; i<S->nPanels; i++)
{
fscanf(fp,"%d",&S->panels[i]->id);
fscanf(fp,"%lf",&S->panels[i]->length);
fscanf(fp,"%lf",&S->panels[i]->height);
fscanf(fp,"%lf",&S->panels[i]->angle);
fscanf(fp,"%lf",&S->panels[i]->origX);
fscanf(fp,"%lf",&S->panels[i]->origY);
fscanf(fp,"%lf",&S->panels[i]->origZ);
fscanf(fp,"%d",&S->panels[i]->nOpenings);
if (S->panels[i]->nOpenings > 0)
{
for (j=0; j<S->panels[i]->nOpenings;j++)
{
openings = S->panels[i]->openings[j];
fscanf(fp,"%d",&openings->id);
fscanf(fp,"%lf",&openings->length);
fscanf(fp,"%lf",&openings->height);
fscanf(fp,"%lf",&openings->origX);
fscanf(fp,"%lf",&openings->origY);
}
}
}
return 1;
}
編輯1:我嘗試通過在每一行中打印文本來跟蹤發生錯誤的位置,並且在ReadPanelBlock函數的第一個fscanf函數中它似乎崩潰了。
訪問S->panels[i]->openings[j]
是UB ,因為您沒有為該數組分配空間。
if (S->panels[i].nOpenings > 0)
{
S->panels[i].openings = malloc(sizeof(CHBPanel)*S->panels[i].nOpenings);
// inner for
}
預先為openings
指針分配空間:
CHBOpening *openings = malloc(sizeof(CHBOpening));
將導致內存泄漏,因為沒有代碼會釋放內存,這是for
帶有代碼的j
內部地址將丟失該地址
openings = S->panels[i]->openings[j];
您可以避免使用指針來寫
for (j=0; j<S->panels[i].nOpenings;j++)
{
fscanf(fp,"%d",&S->panels[i].openings[j].id);
fscanf(fp,"%lf",&S->panels[i].openings[j].length);
fscanf(fp,"%lf",&S->panels[i].openings[j].height);
fscanf(fp,"%lf",&S->panels[i].openings[j].origX);
fscanf(fp,"%lf",&S->panels[i].openings[j].origY);
}
在您的結構中CHBPanel *panels[];
和CHBOpening *openings[];
不得不:
CHBPanel *panels;
CHBOpening *openings;
最后但並非最不重要的一點:您必須學習有關指針和->
和的一些知識.
用法。
您的代碼應類似於:
int ReadPanelBlock (FILE *fp, CHBStructure *S)
{
int i,j;
S->panels = malloc(S->nPanels*sizeof(CHBPanel));
for (i=0; i< S->nPanels; i++)
{
fscanf(fp,"%d",&S->panels[i].id);
fscanf(fp,"%lf",&S->panels[i].length);
fscanf(fp,"%lf",&S->panels[i].height);
fscanf(fp,"%lf",&S->panels[i].angle);
fscanf(fp,"%lf",&S->panels[i].origX);
fscanf(fp,"%lf",&S->panels[i].origY);
fscanf(fp,"%lf",&S->panels[i].origZ);
fscanf(fp,"%d",&S->panels[i].nOpenings);
if (S->panels[i].nOpenings > 0)
{
S->panels[i].openings = malloc(sizeof(CHBOpening)*S->panels[i].nOpenings);
for (j=0; j<S->panels[i].nOpenings;j++)
{
fscanf(fp,"%d",&S->panels[i].openings[j].id);
fscanf(fp,"%lf",&S->panels[i].openings[j].length);
fscanf(fp,"%lf",&S->panels[i].openings[j].height);
fscanf(fp,"%lf",&S->panels[i].openings[j].origX);
fscanf(fp,"%lf",&S->panels[i].openings[j].origY);
}
}
}
return 1;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.