2

私はポインターの 2d-Array を使用しています。各ポインターは製品のリンクされたリストを指しています。すべてのリストのすべての製品をリストする関数を構築したいと考えています。これは私の構造です:

typedef struct object product, *pprod;
struct object{
int type;
int quantity;
pprod next;
};

これは私が配列を定義する方法です(動的でなければなりません):

n=4;
m=3;
pprod (*t)[m] = malloc(n * sizeof *t);
list_all(t,n,m);

これは、すべての製品を表示する関数です。

void list_all(pprod** t , int size_n , int size_m) {
int i,j;

    for(i=0;i<size_n;i++){
        printf("--- Corridor ---: %d\n", i);
        for(j=0;j<size_m;j++){
            printf("--- Shelf ---: %d\n",j);
            printf("product:%d quantity:%d",t[i][j]->type,t[i][j]->quantity);
            }
     }
}

配列をパラメーターとして渡すのに問題があります。問題を見つけるのを手伝ってもらえますか? 助けてくれてありがとう。

4

3 に答える 3

1

問題の説明から、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;
}
于 2013-06-01T16:38:49.333 に答える
0

pprod は既にポインターです。問題は、パラメーターを関数に渡す方法だと思います。

この関数プロトタイプに変更してみてください: t は既にポインターへのポインターであり、とにかくそれを変更していません..

void list_all(pprod* t , int size_n , int size_m) {
于 2013-06-01T14:15:32.547 に答える