Как изменить структуру в функции и вернуться к main?

#c

#c

Вопрос:

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


struct time{int hours, mins, secs;};

int main(int argc, char *argv[])
{
struct time one;
struct time two; 

printf("nplease enter the time in 24 hr format, nenter the hours, return,nenter minutes, return, enter seconds, and return.n");

scanf("%dn%dn%d", amp;one.hours, amp;one.mins, amp;one.secs); 
int yn; 

yn = validateTime(one, yn); 
while(!yn){ 


      if (!yn){
         puts("Invalid inputnPlease try again"); 
         printf("nplease enter the time in 24 hr format, nenter the hours, return,nenter minutes, return, enter seconds, and return.n");
         scanf("%dn%dn%d", amp;one.hours, amp;one.mins, amp;one.secs);  
         yn = validateTime(one);
      }
      else{ 
         printf ("Time entered was; %d:%d:%d", one.hours, one.mins, one.secs);  
      }
      }
         printf ("the time entered ws; %d:%d:%d", one.hours, one.mins, one.secs);
char input[4]; 
puts("would you like to update the time"); 
scanf("%s", input); 
if(strcmp(input,"yes")== 0){ 
      puts("please enter update for time"); 
      scanf("%dn%dn%d", amp;two.hours, amp;two.mins, amp;two.secs); 
      if (two.hours > 0|| two.mins > 0 || two.secs > 0){
          struct time updateTime(one, two);   
      printf ("%d", one.hours);
      }
      }
  getch();
  return 0;  
} 


int validateTime(struct time tme, int yn)
{

if (tme.hours < 0 || tme.hours > 23 || tme.mins > 59 || tme.mins < 0 || tme.secs < 0 || tme.secs > 59)
{
              printf("retfal4");
     yn = 0;
     return yn;
     }
else {
     printf("rettru");
     yn = 1;
     return yn; 

     }
}
struct time updateTime(struct time one, struct time two){
       puts("flag1");

        struct one;
        struct two;  

                 puts("flag");
                one.hours = one.hours   two.hours;

                one.mins = one.mins   two.mins; 


               one.secs = one.secs   two.secs; 

                  while (two.hours > 23) {
                    one.hours = one.hours - 24;}

                    while (two.mins > 59){
                    one.mins = one.mins - 60;
                    one.hours   ;}

                    while (two.secs > 59){
                    one.secs = one.secs - 60;
                    one.mins   ;}  

                return one; 

                }  
  

программа принимает структуру времени, проверяет ее как 24-часовое время и запрашивает у пользователя обновление, принимает обновление в HH: MM: SS, т.Е. если время было 23: 45:00, а введенное время обновления было 01: 30:00, тогда исходное время стало бы 01: 15:00.

Я хочу изменить struct one в function UpdateTime, похоже, что функция вообще не выполняется. как я могу заставить это работать? в настоящее время он будет выполняться по полной программе без ошибок, НО он не изменит время и не передаст его обратно в основную функцию, в настоящее время просто тестируется с часами.

Ответ №1:

Вы передаете структуры функциям подобным образом, не делайте этого никаким другим способом:

 typedef struct    // use typedef for convenience, no need to type "struct" all over the place
{
  int x;
  int y;
} Data_t;


void function (Data_t* data); // function declaration

int main()
{
  Data_t something = {1, 1};  // declare a struct variable and initialize it
  printf("%d %dn", something.x, something.y);

  function (amp;something); // pass address of "something" to the function

  /* since it was passed through a pointer (by reference), 
     the original "something" struct is now modified */

  printf("%d %dn", something.x, something.y);
}

void function (Data_t* data)  // function definition
{
  data->x = 2; // access a struct member through a pointer using the -> operator
  data->y = 2;
}
  

Редактировать: Кстати, data->x это точно то же самое, что и (*data).x , просто немного легче читать первое.

Ответ №2:

Вы вызываете функцию как:

 struct time updateTime(one, two);   
  

что неверно. На самом деле это объявление функции, а не вызов.

Комментарии:

1. Я думаю, что OP понимает, что он делает это неправильно, иначе он бы вообще не спрашивал…

2. @Ludin спасибо кому-нибудь еще, кто понимает, что если вы задаете вопрос, на который обычно хотите получить ответ!