• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

kwnds

[C] Ajuda - Erro ao devolver valor

6 mensagens neste tópico

Estou a programar um software em C em que o utilizador indica as horas em que deseja encerrar o pc e o software faz.

Neste codigo que eu vou postar, ainda estou so a pedir ao utilizador a que horas deseja encerrar o pc e depois ele devolve-lhe os segundos que faltam.

Ele ainda tem um erro quando a hora inserida é menor que a hora actual e o mesmo acontece com os minutos.

Mas o meu problema é outro: mesmo que eu insira uma hora maior que a actual e minutos tambem, o programa não me devolve o valor correcto. Não tenho a certeza, mas penso que o problema esteja relacionado com as variaveis "h", "m" e "s".

Se alguem me pudesse ajudar a corrigir este erro agradecia, relembro que para o software não dar outro erro temos de inserir uma hora maior que a actual e o mesmo acontece com os minutos (assim que tiver tempo dou a volta a isso).

#include <stdio.h>
#include <dos.h>
#include <time.h>
#include <conio.h>
#include <string.h>
#include <process.h>

int h=0, m=0;
long s=0;

int main (void) {
int tempo();
int converter();

  printf("Programador para desligar PC:\nHoras: ");
   scanf("%d",&h);
  printf("Minutos: ");
   scanf("%d",&m);
   clrscr();
   tempo();
   return 0;
}

int tempo() {
int converter();
struct  time t;
   gettime(&t);
  h=h-t.ti_hour;
  m=m-t.ti_min;
   converter();
   return 0;
}

int converter() {
s=h*3600+m*60;
printf("Faltam: %2d segundos",s);
getch();
return 0;
}

Para compilar estou a usar o TurboC e a função que usei para obter as horas e minutos foi a "gettime".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A função converter devolve sempre zero. Depois tens declaração de funções dentro do main e tem de estar antes.

Mais uma coisa, não precisavas de variàveis globais, podias chamar a função e passar-lhe os argumentros.

Mais uma coisa, na função converter a variável "s" é do tipo long mas estás a fazer as contas com inteiros por isso não são compatíveis. A "s" tem de ser do tipo inteiro ou então as outras variáveis têm de ser do tipo long.

Aquilo de passar por parâmetros tinha de ficar mais ou menos assim:

...

  int h, m;
struct  time t;
   gettime(&t);
  h=h-t.ti_hour;
  m=m-t.ti_min;
   converter(h, m);
   return 0;
}

int converter(h, m) {
int s;
s=h*3600+m*60;
printf("Faltam: %2d segundos",s);
getch();
return s;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já consegui resolver o problema usando a declaração de funções fora da main e mudando todas as variaveis para long (pois o total de segundos é um numero bastante grande).

Apenas não consegui entender uma coisa: nesta ultima explicação, o "converter()" passou para "converter h, m)" e o mudou-se o "return 0" para "return s". Não consegui perceber essas alterações.

Vou agora começar a criar condições caso a hora e minutos inseridos sejam inferiores aos actuais.

Abraços e obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Apenas não consegui entender uma coisa: nesta ultima explicação, o "converter()" passou para "converter h, m)" e o mudou-se o "return 0" para "return s". Não consegui perceber essas alterações.

Tu tinhas declarado as variáveis globalmente.Por isso podias aceder a elas em qualquer função. Está certo.

O que eu disse é que também podias fazer decvlarando as variáveis dentyro da função e passando-lhe os parâmetros quando chamas a função converter.

se quizeres exemplos de como se faz parav chamar funções e passar-lhe parâmetros vê aqui na secção de C que tem muitos exemplos disso,. ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já programei demodo a quando as horas ou minutos actuais forem maiores que os inseridos, o software faça á mesma a contagem mas continuo com um erro:

#include <stdio.h>
#include <dos.h>
#include <time.h>
#include <conio.h>
#include <string.h>
#include <process.h>

long h=0, m=0, s=0;

int tempo();

int converter();

int main (void) {
  printf("Programador para desligar PC:\nHoras: ");
   scanf("%d",&h);
    printf("Minutos: ");
     scanf("%d",&m);
      clrscr();
       tempo();
        return 0;
                }

int tempo() {
  struct  time t;
   gettime(&t);
    int converter();
     h=h-t.ti_hour;
      m=m-t.ti_min;
       converter();
        return 0;
             }

int converter() {
  struct  time t;
   gettime(&t);
    if(h<t.ti_hour) {
     h=24-t.ti_hour+h;
                    }
    if(h<t.ti_min) {
     m=60-t.ti_hour+h;
                   }
                   }
      s=h*3600+m*60;
       printf("Faltam: %2d segundos",s);
        getch();
         return 0;
}

Exemplo para o codigo: "h=24-t.ti_hour+h"

Hora actual: 12

Hora inserida: 10

esperar: 22

Resultado: 24-12+10

O "t.ti.hour" dá-me a hora actual e o "h" armazena a hora inserida, apenas não consigo ver onde está o erro. Será que serão segundos a mais a serem armazenados na variavel long? Se for esse o caso, que variavel devo usar?

"Hipnoted" obrigado pela explicação, agora já percebi o porque das alterações.

Abraços

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora