Может ли указатель указывать на структуру элемента списка заказов - PullRequest
0 голосов
/ 15 октября 2018
typedef struct item
{
    char itemName[32];
    float price;
    int quantity;
}ITEM;
typedef struct list
{
    void* item[5];
    int (*compare)(void*, void*);
    int length;
}LIST;
typedef struct order 
{
    int orderId;
    float orderTotal;
    LIST* orderItems;
    int length;
} ORDER;
int compareItemPrice(void* p1, void* p2){
    ITEM* p = (ITEM*)p1;
    ITEM* q = (ITEM*)p2;
    if(p->price>q->price)
    {
        return 1;
    } else if(p->price<q->price)
    {
        return -1;
    } else {
        return 0;
    }
}

Код выше - мои структуры и функции, написанные на C. Когда я реализовал код ниже, он показал мне ошибки.Все ошибки были из-за ITEM * p, который был неполным определением struct list.

ITEM* getExpensiveItem(ORDER* o){   // Maximum item price
    ITEM* p = o->orderItems->item;
    ITEM* expensiveItem = p;
    for(int i=1; i<o->orderItems->length-1; i++)
    {
        if(compareItemPrice(p, (p+i)) < 0)
        {
            expensiveItem = p+i;
        }
    }
    return expensiveItem;
} 

1 Ответ

0 голосов
/ 15 октября 2018

Код, подобный

struct a
{
    int i;
} A;

, даст переменную A, которую вы можете использовать, например,

A.i = 42;

Однако, похоже, вы действительно пытаетесь создать новый тип.Поэтому попробуйте:

typedef struct a   // Notice the "typedef" in start of line
{
    int i;
} A;

Это даст тип A, который можно использовать как:

A var;
A* pVar;
var.i = 42;
pVar = &var;
....

Также обратите внимание, что ваш struct order использует тип LIST.Так что LIST должно быть объявлено до struct order.Кроме того, тип CUSTOMER также должен быть объявлен, чего на данный момент нет.

Поэтому ваш код, вероятно, должен выглядеть следующим образом:

#define N 42  // Made this up as it isn't in your code

typedef struct customer  // Made this up as it isn't in your code
{
    int x;  
} CUSTOMER;

typedef struct list
{
    void* item[N];
    int (*compare)(void*, void*);
    int length;
}LIST;

typedef struct order
{
    int orderId;
    float orderTotal;
    LIST* orderItems;
    CUSTOMER* customer;
    int length;
} ORDER;

typedef struct item
{
    char itemName[32];
    float price;
    int quantity;
}ITEM;

Также обратите внимание, что в этой строке есть проблема:

ITEM* p = o->orderItems->item;

Тип o->orderItems->item - это массив пустых указателей из-за void* item[N]; в struct list.Другими словами: вы пытаетесь присвоить массив указателей одному указателю.Я не совсем уверен, что вы хотите сделать, но, возможно, как:

ITEM* p = o->orderItems->item[0];
...