2015-02-25 2 views
1

Хотя в этом вопросе много потоков, я не могу найти тот, который обращается к моему вопросу, извините, если я толстый. Важным отличием является то, что мое решение не может использовать указатели. Я начал главу о структурах и проблема, над которой я работаю над вызовами для функции, которая принимает два аргумента t1 и t2, которые являются двумя разными временами в рамках структуры. ive уменьшил этот код как можно больше, и я обнаружил, что значения моих элементов структуры arent проходят до функции.Трудность передачи struct функции

#include<stdio.h> 

struct time 
{ 
    int hour; 
    int minute; 
    int second; 
}; 

struct time t1 = {3, 45, 15}; 
struct time t2 = {9, 44, 03}; 

int main (void) 
{ 
    struct time elapsedTime(struct time t1,struct time t2); 

    return 0; 
} 

struct time elapsedTime(struct time t1,struct time t2) 
{ 
    printf ("%i:%i:%i\n", t1.hour, t1.minute, t1.second); 
    printf ("%i:%i:%i\n", t2.hour, t2.minute, t2.second); 

    return; 
} 
+3

В 'main' вы хотите' ElapsedTime (t1, t2); ' – wolfPack88

+1

В реальной программе, вы, вероятно, хотите, чтобы пройти структуры через указатель. То, как оно написано в настоящее время, подразумевает копию структуры, создаваемой при ее передаче. –

+0

@ DanielKamilKozar: Для небольшой структуры, состоящей из трех членов 'int', переход по значению не является необоснованным. –

ответ

2

Вы объявляете функцию в основном, но не называя его.

Вместо:

int main (void) 
{ 
    struct time elapsedTime(struct time t1,struct time t2); 

    return 0; 
} 

Понадобится:

struct time elapsedTime(struct time t1,struct time t2); 

int main (void) 
{ 
    struct time mt = elapsedTime(t1, t2); 

    // Do something with mt... 

    return 0; 
} 

Более распространенный способ вернуть пункт "громоздкие" данные будут как указатель:

typedef struct my_time { 
    int hour; 
    int minute; 
    int second; 
} my_time_t; 

void elapsedTime(my_time_t t1, my_time_t t2, my_time_t *t3) 
{ 
    t3->hour = ...; 
    t3->minute = ...; 
    t3->second = ...; 

    ... 
} 

NOTE : Я настоятельно рекомендую избегать общего, общего имени, такого как time для вашего struct, поскольку он имеет потенциал противоречия с определенной системной стоимостью (сейчас или позже). Избегайте называть ваши имена собственные переменные, как, как time, file, string и т.д ...

+0

Могу ли я заставить эту функцию возвращать тип структуры? –

+0

@JerrySingh конечно. Я просто не обрабатывал возвращаемое значение в «main» в моем примере, но вы можете это сделать. См. Мое редактирование ответа. – lurker

+0

К сожалению, пока я не могу использовать указатели. Кроме того, упражнение вызывает функцию, которая принимает два аргумента. Я уверен, что ограничения разочаровывают, если это помогает мне отрывать мои волосы отсюда. –

2

Вы никогда не называли вашу функцию

elapsedTime(t1, t2); 
0

Я нашел решение:

#include<stdio.h> 

struct time 
{ 
    int hour; 
    int minute; 
    int second; 
}; 

void elapsedTime(struct time t1, struct time t2) 
{ 
    printf("%i:%i:%i\n", t1.hour, t1.minute, t1.second); 
    printf("%i:%i:%i\n", t2.hour, t2.minute, t2.second); 
} 

int main() 
{ 
    struct time t1 = { 3, 45, 15 }; 
    struct time t2 = { 9, 44, 03 }; 
    elapsedTime(t1, t2); 
    return 0; 
} 

компилирует к ожидаемому результату для меня.

Как говорили другие, вам нужно вызвать функцию только с elapsedTime(t1, t2);.

EDIT:

Чтобы получить то, что вы сказали в своем комментарии ниже с указателями, вы можете использовать следующую концепцию:

struct time 
{ 
    int hour; 
    int minute; 
    int second; 
}; 

void elapsedTime(struct time t1, struct time t2, struct time *t3) 
{ 
    printf("%i:%i:%i\n", t1.hour, t1.minute, t1.second); 
    printf("%i:%i:%i\n", t2.hour, t2.minute, t2.second); 
    t3->hour = 100; 
    t3->minute = 50; 
    t3->second = 25; 
} 

int main() 
{ 
    struct time t1 = { 3, 45, 15 }; 
    struct time t2 = { 9, 44, 03 }; 
    struct time t3 = { 0, 0, 0 }; 

    elapsedTime(t1, t2, &t3); 
    printf("%i:%i:%i\n", t3.hour, t3.minute, t3.second); 
    return 0; 
} 

Как вы можете видеть, что я прошел третий-структуру функции и изменения значения struct по ссылке в функции. (Значения изменяются вне функции)

Затем я печатаю структуру вне функции, чтобы проверить, сработала ли она.

Надеюсь, это поможет, когда вы сможете использовать указатели.

+0

Я могу заставить функцию возвращать структуру типа? –

+0

@JerrySingh Вы могли бы, но вы ничего не возвращаете в свою функцию, поэтому я изменил его на пустоту. – LoLei

+0

true, id хотел уменьшить код как можно больше. Цель упражнения состоит в том, чтобы передать два типа структуры (в данном случае время суток) и определить функцию, сколько времени прошло. Мое мышление состояло в том, чтобы части вычитали в функции, а затем вернули структуру t3 в main. im, обнаружив, что любой префикс, который я поставил в функцию, получил какую-то ошибку. Как вернуть структуру из функции? –

0

Скорее всего, описанное поведение вызвано спряжением глобальных переменных t1 и t2 с параметрами идентичного имени. (Есть другие проблемы с кодом, написанным, который были рассмотрены другими).

Я хотел бы изменить имена аргументов, например:

struct time t1 = {3, 45, 15}; 
struct time t2 = {9, 44, 03}; 

struct time elapsedTime(struct time time1,struct time time2) 
Смежные вопросы