問題の説明から、i 回廊 * j 棚 * k 個の製品を表したいとします。ここで、各製品には数量とタイプがあります。
あなたの質問では、ポインターの 2D 配列を使用したいと言っていましたが、関数list_all
は最初の引数として 3D 配列を取ります (t
タイプは ですobject***
)。さらに、構造体object
はメンバーを持っているため、リンクされたリストノードになることを意図してnext
いますが、たとえば で配列のように使用するとt[i][j]->quantity
、機能せず、割り当てられていないメモリにアクセスしようとします。
この種の混乱を減らすために、変数の名前をより明示的に指定し、ループ反復子を除いて 1 文字の変数名 (問題では n、m、t) を避けます。プログラムが読みやすくなり、これらの問題がより簡単に表示されます。
これは、3D 配列を使用した問題に対する有効な解決策です。
#include <stdio.h>
#include <stdlib.h>
typedef struct object prod;
struct object {
int type;
int quantity;
};
void list_all(prod ***shop, int nb_corridors , int nb_shelfs, int nb_prods)
{
int i,j,k;
for (i = 0; i < nb_corridors; i++) {
printf ("--- Corridor ---: %d\n", i);
for (j = 0; j < nb_shelfs; j++) {
printf ("--- Shelf ---: %d\n", j);
for (k = 0; k < nb_prods; k++) {
printf ("--- Product ---: %d\n", k);
printf ("type:%d quantity:%d\n",
shop[i][j][k].type, shop[i][j][k].quantity);
}
}
}
}
int main(void)
{
int nb_corridors = 4;
int nb_shelfs = 5;
int nb_prods = 3;
prod ***shop;
// array of n pointers (corridor)
shop = malloc(nb_corridors * sizeof(*shop));
printf("sizeof(*shop)=%ld\n", sizeof(*shop));
int i, j;
for (i = 0; i < nb_corridors; i++) {
// nb_shelfs shelfs per corridor)
shop[i] = malloc(nb_shelfs * sizeof(*shop[i]));
printf("sizeof(*shop[i])=%ld\n", sizeof(*shop[i]));
for(j = 0; j < nb_shelfs; j++) {
shop[i][j] = malloc(nb_prods * sizeof(*shop[i][j]));
printf("sizeof(*shop[i][j])=%ld\n", sizeof(*shop[i][j]));
}
}
//initialize with dummy values
int k;
for(i = 0; i < nb_corridors; i++) {
for(j = 0; j < nb_shelfs; j++) {
for(k = 0; k < nb_prods; k++) {
shop[i][j][k].type = k;
shop[i][j][k].quantity;
}
}
}
list_all(shop, nb_corridors, nb_shelfs, nb_prods);
return 0;
}