Avatar billede dj-sejler Praktikant
16. november 2004 - 00:45 Der er 28 kommentarer og
1 løsning

funktioner og sprintf

Hej folkens...

Jeg har et problem...

jeg har 3 variable
int r1, r2;
double r3;

Disse værdier skal, når de er regnet ud lægges ned i et array...
har så fået at vide at jeg skal bruge "sprintf", men det kan jeg ikke finde ud af.

Formen som arrayets data gerne skulle have er: 12:23:21
altså r1:r2:r3... hvis i forstår...

Her er mit forslag:

/* Funktion: Nytid til Gammeltid */
char Gtid(char Nytid[6])
{
  int t, m, s;
  int r1, r2;
  double tid, r3;
  char Gt[7];

  t = (((int)Nytid[0]-48)*10)+((int)Nytid[1]-48);
  m = (((int)Nytid[3]-48)*10)+((int)Nytid[4]-48);
  s = (((int)Nytid[5]-48)*10)+((int)Nytid[6]-48);
  tid = ((t*10000)+(m*100)+s)/(125./54.);

  r1 = tid/3600;
  r2 = (tid-(r1*3600))/60;
  r3 = (tid-(r1*3600)-(r2*60.));

  /* Gt = sprintf("%02lf",r3); */
  /* sprintf(Gt,":%i",r2); */
  sprintf(Gt, "Kan ikke åbne fil ved navn %d",r1);
 
  return(Gt[7]);
}

Startede med en værdi, bare for at prøve... men det virker ikke...
nogen der kan hjælpe?
Avatar billede kalp Novice
16. november 2004 - 00:50 #1
hvad siger den fejlen er? jeg er ikke inde i c++, men det ser jo ikke helt sort ud for mig.
Avatar billede bertelbrander Novice
16. november 2004 - 00:55 #2
Måske noget i stil med:

#include <stdio.h>

void Whatever(char *Buf, int r1, int r2, double r3)
{
  sprintf(Buf, "%02d:%02d:%f", r1, r2, r3);
}

int main()
{
  char Buffer[32];
  Whatever(Buffer, 1, 2, 3.3);
  printf("%s\n", Buffer);
  return 0;
}

Jeg er dog ikke sikker på hvordan det sidste felt (den der er en double) skal formateres.

Man kan ikke returnere et array fra en funktion. I dette tilfælde er det smarteste at kalderen sender en char * med i funktionskaldet.
Avatar billede ranglen Nybegynder
16. november 2004 - 00:55 #3
returnerer kun én char: return(Gt[7]);

Du vil nok have din funktion til at returnere en pointer til starten af dit char array

vi tilføjer * foran funktionen:
char *Gtid(char Nytid[6]){

return(Gt); // returner pointer

OG når funktionen returnerer, vil arrayet ikke længere være gyldigt. Så det skal erklæreres som statisk:

static char Gt[7];
Avatar billede dj-sejler Praktikant
16. november 2004 - 00:55 #4
ja... det er jo så det...
da jeg pt. sidder på en windows computer er jeg forskånet for fejlmeddelelser... :(
så jeg ved det faktisk ikke...

og så lige... det er kun C... ved ikke lige hvad den store forskel er men...
Avatar billede dj-sejler Praktikant
16. november 2004 - 01:00 #5
Har rettet lidt i det...:

/* Funktion: Nytid til Gammeltid */
char *Gtid(char Nytid[6])
{
  int t, m, s;
  int r1, r2;
  double tid, r3;
  static char Gt[7];

  t = (((int)Nytid[0]-48)*10)+((int)Nytid[1]-48);
  m = (((int)Nytid[3]-48)*10)+((int)Nytid[4]-48);
  s = (((int)Nytid[5]-48)*10)+((int)Nytid[6]-48);
  tid = ((t*10000)+(m*100)+s)/(125./54.);

  r1 = tid/3600;
  r2 = (tid-(r1*3600))/60;
  r3 = (tid-(r1*3600)-(r2*60.));

  /* Gt = sprintf("%02lf",r3); */
  /* sprintf(Gt,":%i",r2); */
  sprintf(Gt, "%02d",r1);
 
  return(Gt);
}

nu får jeg så bare at: <null>
Avatar billede bertelbrander Novice
16. november 2004 - 01:00 #6
Hvis du kun vil have heltalsdelen af din double, kan du bruge:

  sprintf(Buf, "%02d:%02d:%02d", r1, r2, (int )r3);

Bemærk at array'et skal have plads til 9 char's

Har du ikke en kompiler på din Windows maskine?
Avatar billede dj-sejler Praktikant
16. november 2004 - 01:03 #7
jo jo... men den spørger om den skal sende en fejlbesked til Microsoft... og så kører timeouter den eller et eller andet...
Avatar billede bertelbrander Novice
16. november 2004 - 01:05 #8
Jeg får 14:34:48, når jeg kører følgende:

char *Gtid(char Nytid[7])
{
  int t, m, s;
  int r1, r2;
  double tid, r3;
  static char Gt[7];

  t = (((int)Nytid[0]-48)*10)+((int)Nytid[1]-48);
  m = (((int)Nytid[3]-48)*10)+((int)Nytid[4]-48);
  s = (((int)Nytid[5]-48)*10)+((int)Nytid[6]-48);
  tid = ((t*10000)+(m*100)+s)/(125./54.);

  r1 = tid/3600;
  r2 = (tid-(r1*3600))/60;
  r3 = (tid-(r1*3600)-(r2*60.));

  sprintf(Gt, "%02d:%02d:%02d",r1, r2, (int )r3);

  return(Gt);
}

int main()
{
  char *p = Gtid("12:14:11");
  printf("%s\n", p);
  return 0;
}
Avatar billede bertelbrander Novice
16. november 2004 - 01:05 #9
Kunne vi få at vide hvad funktionen skal gøre ?
Avatar billede dj-sejler Praktikant
16. november 2004 - 01:09 #10
jep... den skal lave nytid om til alm tid...
og til dem der ikke ved hvad nytid er:
Da man gik over til meter systemet var der en snedig franskmand (tror jeg det var) der lavede et tidsystem der passede til, men det slog aldrig an.
Men det går ud på at der er 20 timer på et døgn og der går 100 minutter på 1 timer, og 100 sekunder på 1 minut...
Avatar billede dj-sejler Praktikant
16. november 2004 - 01:11 #11
fandt fejlen...
i min main havde jeg ikke tilføjet * i: char *Gtid(char Nytid[9])
Avatar billede bertelbrander Novice
16. november 2004 - 01:12 #12
Fik du ikke en lille warning fra din kompiler ?
Avatar billede dj-sejler Praktikant
16. november 2004 - 01:14 #13
nope... bruger cmd..
Avatar billede bertelbrander Novice
16. november 2004 - 01:16 #14
cmd er ikke en kompiler (så vidt jeg ved).
Avatar billede dj-sejler Praktikant
16. november 2004 - 01:17 #15
men da det nu virker skal der smides et svar...
og jeg siger da også lige tak :D
Avatar billede dj-sejler Praktikant
16. november 2004 - 01:17 #16
nej okay... tror det er GNU... men kan ikke huske det ;)
Avatar billede bertelbrander Novice
16. november 2004 - 01:20 #17
Hvis det er gcc så prøv at putte en -W på næste gang du kompilerer.
Avatar billede dj-sejler Praktikant
16. november 2004 - 01:22 #18
hvad skulle det gør?
Avatar billede dj-sejler Praktikant
16. november 2004 - 01:23 #19
jeg har lige prøvet det med -W
efter at have slettet * fra før...
men fik ingen fejl hvis det var det...
Avatar billede bertelbrander Novice
16. november 2004 - 01:24 #20
Så får du en besked fra kompileren hvis den synes at du gør noget mistænkeligt, fx:

char *func()
{
  static char Buf[123];
  return Buf;
}

int main()
{
  char i = func();
}
Avatar billede bertelbrander Novice
16. november 2004 - 01:26 #21
Jeg får denne besked:

ff.c:32: warning: initialization makes integer from pointer without a cast
Avatar billede dj-sejler Praktikant
16. november 2004 - 01:27 #22
nåe... jamen jeg får nogen fejl... bare ikke alle... jeg ved ikke rigtig hvad og hvornår... plejer at bruge et eller andet Unix program så...
men smider du ikke et svar? smutter nemlig snart
Avatar billede bertelbrander Novice
16. november 2004 - 01:29 #23
Jeg samler ikke på point.
På unix bruger du nok også gcc...
Avatar billede dj-sejler Praktikant
16. november 2004 - 01:30 #24
det gør jeg ja... men det er mere pålidligt i fejlmeddelser og sådan...
hvem skal så have pointene?
Avatar billede olennert Nybegynder
16. november 2004 - 12:31 #25
Husk at gøre buf "stor nok". For at være på den sikre side kunne du bruge snprintf i stedet for sprintf (husk at nul-terminere, snprintf og strncpy nul-terminerer ikke når de fylder bufferen helt ud). Eksempel:

int number = 42;
const int bufsize = 32;
char buf[bufsize];
snprintf(buf, bufsize - 1, "Here is the number %d", number);
buf[bufsize - 1] = 0;

(Afhængigt af hvor ny din C er kan du erstatte const int bufsize med en #define).
Avatar billede bertelbrander Novice
16. november 2004 - 19:38 #26
Hvad mener du med "men det er mere pålidligt i fejlmeddelser og sådan" ?

Hvis der er andre der har bidraget til løsning af dit problem kan du bede dem om at lave et svar, ellers laver du selv et svar som du derpå accepterer. ranglen's løsning er så vidt jeg kan se rigtig.
Avatar billede dj-sejler Praktikant
16. november 2004 - 23:43 #27
jamen så smid et svar -->ranglen<--

jeg mener bare at der er fejlmeddelser når der er fejl...
hvor jeg i windows nogen gange for fejlmeddelserne (de fleste), men andre så spørger den om den skal sende et eller andet til microsoft...
Avatar billede dj-sejler Praktikant
05. december 2004 - 17:30 #28
jamen så smid et svar -->ranglen<--
prøver igen ;)
Avatar billede ranglen Nybegynder
14. december 2004 - 19:55 #29
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester