Avatar billede the_nest Nybegynder
16. december 2009 - 22:06 Der er 11 kommentarer og
1 løsning

Function kalder sigselv.. Eller er der en nemmer måde?

Jeg er ved at lave en string hex til dec converter i c.

    int hexdec(char hex[]) {
        int i, dec;
        char t[1];
        dec = 0;
        dec += (int)(hex[strlen(hex) - 1]);
        if(dec <= 57)
        {
            dec -= 48;
        } else {
            dec -= 55;
        }
        for(i = 0; i <= (strlen(hex) - 2); ++i)
        {
            t[0] = hex[i];
            t[1] = '\0';
            dec += hexdec(t) * power(16, (strlen(hex) - i - 1));
        }
        return dec;
    }

Jeg kunne ikke få pow i math.h til at virke med en var?!? så det er min egen og den virker.

Spørgsmål: hvorfor kan jeg ikke kalde hexdec inde fra hexdec? Det giver en "Segmentation fault (core dumped)"

OS: FreeBSD
Compiler: cc
Lang: c
Avatar billede arne_v Ekspert
16. december 2009 - 22:48 #1
char t[1];

og

t[0] = hex[i];
t[1] = '\0';

er ihvertfald en fejl.
Avatar billede arne_v Ekspert
16. december 2009 - 22:49 #2
men derudover forstaar jeg ikke algoritmen
Avatar billede the_nest Nybegynder
16. december 2009 - 23:22 #3
char t[1] difinere en sterng på 2 chr.

t[0] = hex[i] sætter første chr i streng.
t[1] = '\0' sætter enden på streng \0 = null.

Det skulle ifølge c syntax være ok og har jeg også bruget før.
Men dog er dette mit andet prog i c.....

Er der en nemmer måde at hånter char til string så lytter jeg gerne.

  int hexdec(char hex[]) { // hexdec modtager en string med eks "FFFF"
        int i, dec;
        char t[1];
        dec = 0;
        dec += (int)(hex[strlen(hex) - 1]); //konveter sidste chr i string til ASCII num.
        if(dec <= 57) //Er denne chr et tal eller bokstav
        {
            dec -= 48; // Hvis tal omregn til verdi.
        } else {
            dec -= 55; // Hvis bokstav omregn til verdi.
        }
        for(i = 0; i <= (strlen(hex) - 2); ++i) // Hvis hex string er længer en 1 chr læg disse til.
        {
            t[0] = hex[i];
            t[1] = '\0';
            dec += hexdec(t) * power(16, (strlen(hex) - i - 1)); // kald hexdec for at regne neste chr.
        }
        return dec; // Retuner verdi.
    }

Giver dette et billede af algoritmen?
Avatar billede the_nest Nybegynder
16. december 2009 - 23:34 #4
LOL Tror jeg har svaret :) Var nok lige for træt der.
Kigger om det virker imorgen.

    int hexdec(char hex[]) {
        int i, dec, t;
        dec = 0;
        dec += (int)(hex[strlen(hex) - 1]);
        if(dec <= 57)
        {
            dec -= 48;
        } else {
            dec -= 55;
        }
        for(i = 0; i <= (strlen(hex) - 2); ++i)
        {
            t += (int)(hex[strlen(hex) - 1 -  i]);
            if(t <= 57)
            {
                t -= 48;
            } else {
                t -= 55;
            }
            dec += t * power(16, (strlen(hex) - i - 1));

        }
        return dec;
    }
Avatar billede the_nest Nybegynder
16. december 2009 - 23:37 #5
Doh mangler en t = 0 i start af for loop.

Nu må jeg vis heller smutte i seng før jeg fejler mere :)... Godnat...
Avatar billede arne_v Ekspert
17. december 2009 - 04:27 #6
"char t[1] difinere en sterng på 2 chr." er ikke korrekt. t er har kun 1 element!

Men jeg kan se at du også er sluppet af med den rekursion.

Nu mangler du bare at få den indbyggede pow funktion til at virke. Eller nok bedre - bruge shift !
Avatar billede the_nest Nybegynder
17. december 2009 - 08:22 #7
Ja du har da ret har rodet rundt i antal elementer og id nr...

Jeg skulle vist have gået i seng igår. Havde jeg ændret det antal til 2 havde det måske virket :)
Avatar billede arne_v Ekspert
17. december 2009 - 15:05 #8
Din sidste kode er den rigtige, saa ...

PS: Jeg antager at dette er en oevelse, fordi C har indbyggede funktioner til den slags konvertering.
Avatar billede the_nest Nybegynder
17. december 2009 - 18:32 #9
Jeg er lige started med c. Jeg mangler en god ref database til c.

Nej det var ikke en øvelse, jeg er bare ret nub i c, har skrevet en del PHP og der er php.net guld vær findes der en tilsavrende for c?
Avatar billede arne_v Ekspert
17. december 2009 - 18:48 #10
Standard C librray er ret lille.

Du kan finde oversigter paaa nettet f.eks.:
  http://www.utas.edu.au/infosys/info/documentation/C/CStdLib.html

Derudover kommer de fleste compilere/platform med udvidelser.

Den slags konverteringer som du har brug for er i strtod og sprintf funktionerne.
Avatar billede the_nest Nybegynder
17. december 2009 - 19:18 #11
Mange tak, jeg vil gerne give en stak point for din hjælp. Men kan ikke finde et sted til at sende extra points på denne side...
Avatar billede arne_v Ekspert
18. december 2009 - 01:52 #12
Det kan du ikke da du allerede har lukket spørgsmålet.
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