несовместимый тип при использовании указателей

#include <stdio.h>
#include <stdlib.h>

typedef struct contact
{
    my_string name;
    my_string email;
    int age;
} contact;

typedef struct contact_array
{
    int size;
    contact *data;
} contact_array;

void print_contact(contact *to_print)
{
    printf("%s (%s) age %i\n", to_print->name.str, 
    to_print->email.str, to_print->age);
}

int main()
{
    int i;
    contact_array contacts = { 0, NULL };
    for(i = 0; i < contacts.size; i++)
    {
        print_contact(contacts.data[i]);
    }

    return 0;
}

Я получаю следующие ошибки:

error: incompatible type for argument 1 of 'print_contact'
note: expected 'struct contact *' but argument is of type 'contact'.

Я объявил структуру my_string в другом месте и не думаю, что это проблема. Я просто не уверен, как заставить вызов процедуры печати и объявление процедуры иметь совпадающие типы.


person Lewis    schedule 02.06.2015    source источник
comment
измените void print_contact(контакт *to_print) на void print_contact(контакт to_print). Вы передаете contact.data[i], который является не адресом, а самим блоком данных   -  person Arjun Mathew Dan    schedule 02.06.2015
comment
@Lewis, вам не нужно передавать по ссылке, если вы просто собираетесь печатать значения. Просто измените void print_contact(contact *to_print) на void print_contact(contact to_print)   -  person Spikatrix    schedule 02.06.2015


Ответы (4)


Ваш компилятор говорит вам передать тип указателя в функцию print_contact, например:

print_contact(&contacts.data[i]);
person fouronnes    schedule 02.06.2015
comment
Большое спасибо, это была комбинация этого решения, плюс я попробовал другую библиотеку для пользовательского ввода, которая, кажется, может работать с рекомендованным вами изменением. - person Lewis; 02.06.2015

Изменять

void print_contact(contact *to_print)

to

void print_contact(contact to_print)

или передать как

print_contact(&contacts.data[i]);

Вы передаете contacts.data[i], который является не адресом, а самим блоком данных.

person Arjun Mathew Dan    schedule 02.06.2015

    print_contact(contacts.data[i]);

должно быть

    print_contact(&contacts.data[i]);

Это связано с тем, что contacts.data относится к типу struct contact *, а contacts.data[i] относится к типу struct contact. Следовательно, вы можете передать либо contacts.data + i, либо &contacts.data[i]. Просто разница в обозначениях.

Обратите внимание, что: my_string не определено в коде, и стандартные заголовки не включают его.

person phoxis    schedule 02.06.2015
comment
OP уже упоминал, что my_string определено в другом месте. - person Spikatrix; 02.06.2015
comment
Да, это упоминается, но в коде, который, кажется, не содержит заголовочного файла, поэтому я упомянул об этом. - person phoxis; 02.06.2015

Вам не хватает ссылки:

    print_contact(&contacts.data[i]);
person Da Maex    schedule 02.06.2015