Вызов указателя структур из вложенных функций - PullRequest
0 голосов
/ 27 ноября 2011

У меня проблема с вызовом структур, помещением их в качестве аргумента в функцию void, а затем вызовом другой функции void с аргументом, принимающим ту же структуру, поэтому я поставил им оба указателя, и результат не отображается. Если я вызываю их отдельно, это работает, но с вложенными функциями, это не работает.

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

typedef struct date {
        int day;
        int month;
        int year;
} date;

void next_day(date *d,int days)
{
        if(d->day < days) {
                int m = d->day + 1;
                d->day = m;
        }
        else
        {
                int m = d->year + 1;
                d->year = m;
                d->month = 1;
        }
}

void tom(date *d)
{
        switch(d->month)
        {
                case 1: case 3: case 5: case 7: case 8: case 10: case 12:
                        next_day(&d,31);
                        break;
                case 4: case 6: case 9: case 11:
                        next_day(&d,30);
                        break;
                case 2:
                        if(d->year % 4 == 0)
                                next_day(&d,29);
                        else
                                next_day(&d,28);
                        break;
        }
}

int main(void)
{
        //date d = malloc(sizeof(date));
        date d;
        printf("Enter day, month, year: ");
        scanf("%d %d %d",&(d.day),&(d.month),&(d.year));
        tom(&d);
        printf("The next day is: %d %d %d",d.day,d.month,d.year);
        return 0;
}

Заранее спасибо всем, кто потрудится посмотреть код.

Ответы [ 2 ]

1 голос
/ 27 ноября 2011
next_day(&d,31);   // At this point `d` is a pointer to a struct type. 

Вы отправляете адрес указателя, что означает, что на принимающей стороне аргумент функции должен быть указателем на указатель (т. Е. date **).Но в вашем случае это не так.

void next_day(date *d,int days)

Итак, просто сделайте -

next_day(d,31);  // Notice the removal of & 

Теперь d имеет тип date *, а принимающая сторона также является аргументомтипа date *.

1 голос
/ 27 ноября 2011

Я вполне уверен, что ваша проблема с next_day(&d,31); У вас уже есть адрес структуры, вам не нужно снова использовать оператор &.Попробуйте вызвать его с помощью next_day(d,31);.

Это должно появиться в предупреждении компилятора;всегда внимательно читайте эти предупреждения.

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