2013-11-12 5 views
0

У меня есть массив структур (Training data[10]), который содержит некоторые данные, которые я хочу передать функциям.Преобразование структуры структуры в структуру?

int convertTime(Time time) 
{ 

    minutes = time.seconds * 60; 
    // Takes data from data[0].time.seconds and converts them to minutes. 
    // My only problem is that I am being asked send a struct to this function, but I have to send the array because that's where all my data is stored 

    return minutes; 
} 

typedef struct 
{ 
    int seconds; 
} Time; 

typedef struct 
{ 
    Time time; 
    double distance; 
} Training; 

Training data[10]; 

Training input; 

scanf("%d %lf", input.time.seconds, input.distance); 

data[0].time.seconds = input.time.seconds; 
data[0].distance = input.distance; 

Так что теперь data[0].time.seconds и data[0].distance содержит все данные мне нужно. Мне просто нужно передать data[0].time.seconds функции, но в моем назначении мне предлагается отправить struct Time в функцию, и я не понимаю, что с Time хранится только временные данные? Это сохраненные данные, которые я хочу отправить функции.

Как конвертировать секунды в часы, минуты и секунды?

time.hours = seconds/3600; 
time.minutes = (seconds - time.hours * 3600)/60; 
time.seconds = seconds - 3600 * time.hours - 60 * time.minutes; 

Это, кажется, прямо в моих глазах, но это не удается. часы правильно рассчитаны, но не минуты и sconds :(

+0

Вы всегда можете инициализировать время структуры до полезного значения. – suspectus

+0

Не могли бы вы объяснить? – user2985179

ответ

1

Чтобы передать структуру, имя его в вызове:

some_function(data[0].time); // By value 
other_function(&data[0].time); // By address 

Обе функции получают передается значение Time, содержащийся в data[0] элемент вашего массива Training структур.

+0

Я хочу вернуть int из функции, поэтому я набираю 'int function (data [0] .time) {blablabla}' и получаю ошибку: 'error: не может преобразовать 'Time' в 'int' при инициализации' и 'error: expected ',' or ';' before '{' token' – user2985179

+0

Если вы хотите получить 'int' обратно из функции, вы можете написать:' int x = function (data [0] .time); 'вызвать функцию, но вы бы write 'int function (Time t) {blahblahblah ... return (int_expr); } 'для определения функции. (Обратите внимание, что h в «блахе» очень важны!: -D) –

+0

Wut? Я должен определить функции? Я не понимаю :(blah – user2985179

0

Предположим, у вас есть значение, которое количество секунд, прошедших с полуночи. а что вы определили еще одну структуру с часов/минут/секунд, вы можете установить эту тактовую структуру следующим образом,

typedef struct 
{ 
    int hours; 
    int minutes; 
    int seconds; 
} Clock; 

Вы можете распечатать эту структуру, либо в буфер полукокса, или на стандартный вывод,

char* 
clockPrint(Clock* timep,char *stringbuf) 
{ 
    if(stringbuf) 
     sprintf(stringbuf,"%02d:%02d:%02d",(timep)->seconds,(timep)->minutes,(timep)->seconds); 
    else 
     printf("%02d:%02d:%02d",(timep)->seconds,(timep)->minutes,(timep)->seconds); 
    return stringbuf; 
} 

Экстрагирование часы, минуты и секунды с временем эпохи или количество секунд, прошедших с полуночи может быть сделано,

int //return days... 
TimeSet(Clock* timep, int epoch) 
{ 
    (timep)->seconds = (epoch) % 60; 
    (timep)->minutes = (epoch/60) % 60; 
    (timep)->hours = (epoch/60/60) % 24; 
    int days; 
    return days = (epoch/60/60/24); 
} 

Если вы хотите получить часы, минуты или секунды от этого значения часов,

void 
TimeGet(Clock* timep, int* hoursp, int* minutesp, int* secondsp) 
{ 
    if(hoursp) *hoursp = (timep)->hours; 
    if(minutesp) *minutesp = (timep)->minutes; 
    if(secondsp) *secondsp = (timep)->seconds; 
    return; 
} 

Поскольку вы сохранили время в вашей дате структуру, которая содержит количество секунд (предположительно начиная с полуночи), и у вас есть массив из некоторого числа этого Дейта определены,

Training data[10]; 
Training input; 

Вы можете использовать зсап читать ваших секунд и значений расстояния. И как уже говорилось, вы можете поместить свой вклад в ваши данные [0] элемент,

//scanf wants pointers to int and float data 
float distance; 
printf("enter: seconds distance "); fflush(stdout); 
scanf("%d %lf", &(input.time.seconds), &distance); 
//you can then store the distance into your input struct double 
input.distance = distance; 

data[0].time.seconds = input.time.seconds; 
data[0].distance = input.distance; 

Вы можете также использовать gettimeofday (3) или clock_gettime (2), чтобы захватить текущее время (в секундах с начала эпохи),

struct timeval tv; 
gettimeofday(&tv,NULL); //posix.1-2001 function, seconds 
input.time.seconds = tv.tv_sec; 
//or 
struct timespec ts; 
clock_gettime(CLOCK_REALTIME,&ts); //posix.1-2008 function, seconds 
input.time.seconds = ts.tv_sec; 

Затем вы можете отделить секунды в часы, минуты и секунды,

Clock clk; 
int hours, minutes, seconds; 
TimeSet(&clk, data[0].time.seconds); 
TimeGet(&clk, &hours, &minutes, &seconds); 

или вы можете форматировать строку для печати или печати на стандартный вывод,

char clockbuffer[30]; 
clockPrint(&clk,NULL); 
printf("time (HH:MM:SS): %s\n", clockPrint(&clk,clockbuffer)); 
Смежные вопросы