В чем заключается эта проблема «разыменование указателя на неполный тип« struct cashier »»? - PullRequest
0 голосов
/ 16 февраля 2020

Я изучаю структуру данных очереди и создаю структуру кассира следующим образом: 1 В ней есть 2 целых числа, 1 тип с плавающей запятой и 1 тип очереди. 2 Итак, я хотел сделать указатель кассира, чтобы он указывал на структуру кассира.

struct cashier {
    int numberOfCustomersServed; /* This should be initialized to 0 */
    int totalCustomerWaitingTime; /* This should be initialized to 0 */
    float totalAmountReceived; /* This should be initialized to 0 */
    queueADT customerQ; /* This should be initialized to an empty queue */
}cashier;

struct cashier* initCashier(void){
    struct cashier *y;
    y->numberOfCusCustomersServed=0;
    y->totalCustomerWaitingTime=0;
    y->totalAmountReceived=0.0;
    y->customerQ=getEmptyQueue();

    return y;
};

Но тогда я получаю ошибку:

/cygdrive/c/Users/Heta/Desktop/CLionHWQ2/supermarket.c:8:6: error: dereferencing pointer to incomplete type 'struct cashier'
     y->numberOfCusCustomersServed=0;

И ниже в основном функция очереди. 3 Функция main () еще не завершена, в основном она пуста. 4 Буду признателен за любую помощь. :)

1 Ответ

0 голосов
/ 16 февраля 2020

1.

struct cashier *y;

y - это указатель на struct cashier, но он не был установлен для указания на переменную типа struct cashier.

Таким образом,

    y->numberOfCusCustomersServed=0;
    y->totalCustomerWaitingTime=0;
    y->totalAmountReceived=0.0;
    y->customerQ=getEmptyQueue();

    return y;      // discussed further at point 2.

не работает, поскольку y не был инициализирован, чтобы указывать на допустимую переменную типа struct cashier.

Скорее используйте:

    struct cashier x;                  // x is a variable of type `struct cashier`.
    struct cashier *y = &x;            // y is a pointer to x.

    y->numberOfCusCustomersServed = 0;
    y->totalCustomerWaitingTime = 0;
    y->totalAmountReceived = 0.0;
    y->customerQ = getEmptyQueue();

с x в качестве переменной типа struct cashier и y в качестве указателя на нее или, альтернативно:

    struct cashier x;

    x.numberOfCusCustomersServed = 0;
    x.totalCustomerWaitingTime = 0;
    x.totalAmountReceived = 0.0;
    x.customerQ = getEmptyQueue();

, поскольку указатель y является избыточным.


2.

return y;

Невозможно вернуть указатель на переменную внутреннего объема из функции, поскольку переменная, на которую указывает указатель, больше не существует после завершения функции.

Если вы действительно хотите вернуть структуру, вы должны сделать это следующим образом:

struct cashier initCashier(void){

    struct cashier x;                  // x is a variable of type `struct cashier`.
    struct cashier *y = &x;            // y is a pointer to x.

    y->numberOfCusCustomersServed = 0;
    y->totalCustomerWaitingTime = 0;
    y->totalAmountReceived = 0.0;
    y->customerQ = getEmptyQueue();

    return x;                           // returning the complete structure.
};

или альтернативно, поскольку вам не нужно использовать y, указатель на структуру, в противном случае:

struct cashier initCashier(void){

    struct cashier x;                  // only the structure variable x. 

    x.numberOfCusCustomersServed = 0;
    x.totalCustomerWaitingTime = 0;
    x.totalAmountReceived = 0.0;
    x.customerQ = getEmptyQueue();

    return x;                           // returning the complete structure.
};

Обязательно также измените соответствующий тип возвращаемого значения функции initCashier() с struct cashier* на struct cashier.


3. * 10 47 * struct cashier { int numberOfCustomersServed; /* This should be initialized to 0 */ int totalCustomerWaitingTime; /* This should be initialized to 0 */ float totalAmountReceived; /* This should be initialized to 0 */ queueADT customerQ; /* This should be initialized to an empty queue */ }cashier; _______ Второй cashier определяет глобальную переменную типа struct cashier с идентификатором cashier, что допустимо, поскольку тег структуры и глобальные переменные находятся в разных пространствах имен, но вы не используете эта переменная в предоставленном коде, так что вы можете ее пропустить (если она вам не нужна): struct cashier { int numberOfCustomersServed; /* This should be initialized to 0 */ int totalCustomerWaitingTime; /* This should be initialized to 0 */ float totalAmountReceived; /* This should be initialized to 0 */ queueADT customerQ; /* This should be initialized to an empty queue */ }; или использовать эту, которая решит половину проблем, упомянутых выше, если вы только хотите использовать глобальную переменную cashier типа struct cashier для функции initCashier(): struct cashier { int numberOfCustomersServed; /* This should be initialized to 0 */ int totalCustomerWaitingTime; /* This should be initialized to 0 */ float totalAmountReceived; /* This should be initialized to 0 */ queueADT customerQ; /* This should be initialized to an empty queue */ }cashier; // global variable `cashier` of type `struct cashier`. void initCashier(void){ // return type of `void`. cashier.numberOfCusCustomersServed = 0; // the variable `cashier` is used directly. cashier.totalCustomerWaitingTime = 0; cashier.totalAmountReceived = 0.0; cashier.customerQ = getEmptyQueue(); };

...