簡體   English   中英

結構處理和結構數組

[英]Struct handling and array of structs

我正在編寫代碼以存儲文本文件中的數據。 代碼可以編譯,但似乎無法在ReadPanelBlock函數的for循環中運行。 它的結構為: CHBStructure包含CHBPanelsCHBOpenings包含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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM