2013-06-01 4 views
2

Я использую 2d-массив указателей, каждый указатель указывает на связанный список продуктов. Я хочу создать функцию, которая перечисляет все продукты во всех списках. Это моя структура:C: Передача двумерного массива указателей в качестве аргумента

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); 
      } 
    } 
} 

У меня проблемы с передачей массива в качестве параметра. Можете ли вы помочь мне найти проблему? Спасибо за помощь.

+0

Что такое 'pprod next', если вы исправили количество? – user35443

+0

опубликовать весь ваш код, если возможно – pinkpanther

+0

Если я правильно его понимаю, вы хотите иметь динамически распределенный массив продуктов, и вы хотите манипулировать ими. Я прав? – user35443

ответ

1

Ну, первое создание массива неправильно. Вы просто назначаете один (единственный) вектор размера 4 в m + 1-й элемент (вектор t, если вы не делаете его в другом месте, указывает на случайную землю).

n=4; 
m=3; 
product **t, *newitem; 

t= (product **)calloc(n, sizeof(product *)); // array of n pointers (corridor) 
for (int i= 0; i<n; i++) { 
    t[i]= (product *)calloc(m, sizeof(product)) // array of m prod structs (m shelfs per corridor) 
} 
// access some array members (t[n][m] max t[0-2][0-3]) 
t[0][0].type= 0; 
t[0][0].quantity= 0; 
t[0][1].type= 1; 
t[0][1].quantity= 11; 
... 
t[1][2].type= 12; 
t[1][2].quantity= 1212; 
.... 
t[2][3].type= 23; 
t[2][3].quantity= 2323; 

// more products could be linked to the existing ones 
newitem= calloc(1, sizeof product); 
newitem->type= 231; 
newitem->quantity= 231231; 
t[2][3].next= newitem; 

// now list them via below function 
list_all(t,n,m); 
.... 


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

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

См. Также мой комментарий в ответе Этьена для получения более подробной информации.

+0

Эта задача находится глубоко в стране чудес pointerland. Создание двумерных вещей динамического размера в родном C всегда является своего рода cludge. (Кстати, то, что вы создаете в своем, не имеет ничего общего с связанный список ... связанные списки - совсем другой тип зверя.) – Nicholaz

+0

Ваш код работает, но только с учетом 1 продукта по полке –

+2

Листинг возвращаемого типа malloc требуется в C++, но не в C. –

0

pprod уже является указателем, я считаю, что проблема заключается в том, как передать параметры функции.

попробуйте изменить этот прототип функции: т уже указатель на указатель, и вы не изменить его в любом случае ..

void list_all(pprod* t , int size_n , int size_m) { 
+0

«Несовместимые типы указателей, проходящих» pprod (*) [m] 'в параметр типа' pprod * '(aka' struct object ** ') Возможно, у меня есть ошибка в инструкции Malloc? Что мне нужно - это 2d -array указателей на struct. –

1

Из описания проблемы вы хотите представить i коридоры * j полки * k продуктов, где каждый продукт имеет количество и тип.

В вашем вопросе вы сказали, что хотите использовать 2D-массив указателей, но ваша функция list_all принимает 3D-массив в качестве первого аргумента (t имеет тип object***). Кроме того, ваша структура object предназначена для узла связанного списка, поскольку у нее есть член next, но вы используете его как массив, например, с t[i][j]->quantity, который не может работать и пытается получить доступ к нераспределенной памяти.

Чтобы уменьшить эту путаницу, укажите свою переменную более явно и избегайте имен переменных одной буквы (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; 
} 
+1

+1 для создания полной рабочей программы (в отличие от меня, который просто попытался исправить ее в окне редактирования). Но, честно говоря, я думаю, что весь этот вопрос не подлежит ремонту (не ваша ошибка), потому что, вполне вероятно, внутренний цикл (продукты) предназначен для связанного списка, как в: for (p = & shop [i] [j ]; p-> next! = NULL; p = p-> next) {printf ("...", p -> ...); } – Nicholaz

+1

Вы правы, представление проблемы не ясно: / –

Смежные вопросы