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