C: Работа со структурами и указателями, ошибка: неверный аргумент типа унарного '*' - PullRequest
2 голосов
/ 08 октября 2011

Я работаю над программой переменного тока, и вот структура, которую я использую

struct EngineParts{

    int serial_number;
    unsigned int year_of_manufacture;
    unsigned int quantity;
    char *material;

}*Eparts;

И я получаю следующую ошибку

`Automobile.c:79:5: error: invalid type argument of unary ‘*’ (have ‘unsigned int’)` 

`Automobile.c:80:5: error: invalid type argument of unary ‘*’ (have ‘int’)` 

`Automobile.c:81:5: error: invalid type argument of unary ‘*’ (have ‘unsigned int’)`

в этих трех строках

 *new->quantity = quantity;
 *new->serial_number = serial_number;
 *new->year_of_manufacture = year_of_manufacture;

Вот полная реализация

void automobile_add_part(const int serial_number,
        const unsigned int year_of_manufacture,
        const unsigned int quantity , 
        const char *material){
    /*
     * Store the address to the latest part
     */
   struct EngineParts *new ;
   new = (Eparts+available_number_of_parts);

    // Copying a String is a little bit complicated
    // First memory is allocated for the string 
    *new->material = (char *)calloc(strlen(material),sizeof(char));
    //Then the string is copied
    strcpy((char *)*new->material,material);    

    *new->quantity = quantity;
    *new->serial_number = serial_number;
    *new->year_of_manufacture = year_of_manufacture;

    available_number_of_parts++;
}

PS: я проверил следующие вопросы,

ошибка: недопустимый аргумент типа 'унарный *' (иметь 'int')

Недопустимый аргумент типа -> C структурирует

, но, похоже, они мне не помогают.

Есть предложения по решению проблемы?

Ответы [ 4 ]

6 голосов
/ 08 октября 2011

Оператор -> уже разыменовывает указатель для вас.

new->serial_number эквивалентно (*new).serial_number, оба из которых выглядят так, как вы хотите.

4 голосов
/ 08 октября 2011

Сделайте так:

new->quantity = quantity;

Дополнительная разыменование указателя (*new->quantity) является ошибкой: new->quantity - это int, а не указатель любого типа, поэтому компилятор жалуется.

Разыменование указателя new (допустимо ли иметь переменную с таким именем?) Уже выполняется через operator->.

1 голос
/ 08 октября 2011

не нужно * для new->quantity

-> является ярлыком для (*new).quantity

1 голос
/ 08 октября 2011

Оператор -> разыменовывает указатель, поэтому использование дополнительного * не требуется. И приводит к ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...