我們一直在研究一些結構體,并決定我們想讓它們動態化,這樣我們就可以運行一個函式,該函式基本上可以使 AREASIZE 數量的結構體區域并將它們存盤在我們的區域 *array 中,而不是我們必須手動創建一個具有例如 10、100 或 1000 個結構區域以及隨后的 *Narea 子區域數量的代碼塊。
我們已經被困了幾個小時,并認為詢問我們的邏輯在哪里會更有效,因為我們似乎找不到它。代碼只是在我們創建區域函式的嵌套 for 回圈中崩潰。
我們的邏輯:
- 我們有一個稱為area的struct *array,它在稱為subareas的內部有一個struct *array。
- 我們將 struct *array area 傳遞給我們的函式 create_areas
- create_areas 使用箭頭運算子來決議我們的 struct *array area[i] 和我們的 struct *array subareas[j]。然后填充我們子區域的值。
- 在退出之前,我們還在 struct *array 區域中分配另一個值,這是它的平均值
在我們的腦海中會導致我們的 struct *array 區域被 5x 區域填充。
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define MARGIN 70
#define MARGIN2 30
#define SIZE 5
#define NAREA 4
#define AREASIZE 5
typedef struct subarea
{
int co2_cost, time;
double average, sensorData[SIZE];
} subarea;
typedef struct area
{
subarea *subarea_array[NAREA];
double average;
} area;
void create_areas(area *area_array[NAREA]);
void sensor_data_start(area *area, double start_var);
int main(void)
{
int co2_counter = 0, time_counter = 0;
int day_counter = 0;
int area_number;
srand(time(NULL));
area *area_array[AREASIZE] = {};
create_areas(area_array);
printf("Hello");
return 0;
}
void create_areas(area *area_array[NAREA])
{
printf("create areas\n");
for (int i = 0; i < AREASIZE; i )
{
printf("First for loop\n");
for (int j = 0; j < NAREA; j )
{
printf("Second for loop\n");
area_array[i]->subarea_array[j]->co2_cost = 0;
printf("Second for loop\n");
area_array[i]->subarea_array[j]->time = 0;
printf("Second for loop\n");
area_array[i]->subarea_array[j]->average = 0;
printf("Second for loop\n");
sensor_data_start(area_array[i], 0);
}
area_array[i]->average = 0;
}
}
void sensor_data_start(area *area, double start_var)
{
for (int i = 0; i < NAREA; i )
{
for (int j = 0; j < SIZE; j )
{
area->subarea_array[i]->sensorData[j] = start_var;
}
}
}
uj5u.com熱心網友回復:
這:
area *area_array[AREASIZE] = {};
創建指向區域 ( area *)的指標陣列。您還沒有創建任何areas!。
因此,當您嘗試訪問時,area_array[i]->subarea_array您會訪問未分配的記憶體,從而導致崩潰。如果您不明白為什么,請查看C 中的指標。
查看malloc 和 free函式以實際實體化您的區域。您還需要sizeof運算子。
注意:您必須對子區域執行相同的操作。
最后,您正在尋找這樣的東西:
void create_areas(area *area_array[NAREA])
{
printf("create areas\n");
for (int i = 0; i < AREASIZE; i )
{
area_array[i] = malloc(sizeof(area)); //or malloc(sizeof(*area_array[i]))
if (area_array[i] == NULL) //always check malloc return value!!
exit(-1);
printf("First for loop\n");
for (int j = 0; j < NAREA; j )
{
area_array[i]->subarea_array[j] = malloc(sizeof(subarea));
if (area_array[i]->subarea_array[j] == NULL) //always check malloc return value!!
exit(-1);
printf("Second for loop\n");
area_array[i]->subarea_array[j]->co2_cost = 0;
printf("Second for loop\n");
area_array[i]->subarea_array[j]->time = 0;
printf("Second for loop\n");
area_array[i]->subarea_array[j]->average = 0;
printf("Second for loop\n");
sensor_data_start(area_array[i], 0);
}
area_array[i]->average = 0;
}
}
快樂學習!
uj5u.com熱心網友回復:
使用指向將充當陣列的結構的指標:
typedef struct subarea
{
int co2_cost, time;
double average, sensorData[SIZE];
// note that you can also define sensorSata as pointer and allocate dynamically
} subarea;
typedef struct area
{
subarea *subarea_array; // will be allocated dynamically
double average;
} area;
int main(void)
{
…
/*allocate soace for the area array */
area *area_array = calloc(AREASIZE, sizeof(area));
create_areas(area_array);
printf("Hello");
return 0;
}
void create_areas(area *area_array)
{
printf("create areas\n");
for (int i = 0; i < AREASIZE; i )
{
/* allocate space for subarea */
area_array[i].subarea_array = malloc(sizeof(subarea)*NAREA);
printf("First for loop\n");
for (int j = 0; j < NAREA; j )
{
printf("Second for loop\n");
area_array[i].subarea_array[j].co2_cost = 0;
printf("Second for loop\n");
area_array[i].subarea_array[j].time = 0;
printf("Second for loop\n");
area_array[i].subarea_array[j].average = 0;
printf("Sensor dafa start\n");
sensor_data_start(&area_array[i], 0);
}
area_array[i].average = 0;
}
}
void sensor_data_start(area *area, double start_var)
{
for (int i = 0; i < NAREA; i )
{
// you can allocate sensorSata here if it was a pointer
for (int j = 0; j < SIZE; j )
{
area->subarea_array[i].sensorData[j] = start_var;
}
}
}
其他可以做的更動態的事情是在區域結構中添加子區域的數量,如果它不是恒定的。如果您使其動態,則sensorSata 也是如此。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/385168.html
上一篇:將實體傳遞給庫函式時出錯
