Implementacja funkcji strtol, Ubuntu

0

Witam programuje na Ubuntu. Musze napisać implementacje funkcji strtol. Mam juz cały kod jednak jest problem w jednym miejscu.

#include <limits.h>
#include <errno.h>
#include <ctype.h>

long int strtol (const char *nptr, char **endptr, int base)
{
    int digit;
    int i=0;
    int znak = 0;
    long int number = 0;

    while (isspace(nptr[i])) i++; //jesli sa biale znaki to je pomija

    //sprawdza jaki jest znak plus albo minus
    if (nptr[i]=='-')
    {
        znak=1;
        i++;
    }

    if (nptr[i]=='+')
    {
        i++;
    }

    //okresla podstawe(baze)
    if (base == 0)
    {
        base =10; //podstawa dziesietna
        if (nptr[i]=='0')
        {
            base=8; //podstawa osemkowa
            if (nptr[i+1]=='x' || nptr[i+1]=='X')
            {
                base=16; //podstawa szesnastkowa
                i++;
            }
            i++;
        }
    }

    if(base <2 || base >36)
    {
        errno = EINVAL;
        return 0;
    }

    while (nptr[i]!='\0')
    {
        digit =-1;
        if (isdigit(nptr[i])!=0) //sprawdza czy dany znak jest liczba dziesietna
        {
            digit = (int)nptr[i]-48; //zamiana na kod ASCII a potem -48 aby od zera zaczasc
        }
        else if (isalpha (nptr[i])!=0) //sprawdza czy dany znak jest litera czy nie
        {
            digit = (int) toupper(nptr[i])-55; //zamiana z malej litery na duza a potem na kod ASCII -55 aby zaczasc od 10
        }

        if (digit >base || digit == -1)
        {
            *endptr = nptr[i];
            return number;
        }

        if (znak == 0)
        {
            if (number <= ((LONG_MAX-digit)/base))
            {
                number=number*base + digit;
            }
            else
            {
                errno = ERANGE;
                endptr= '\0';
                return LONG_MAX;
            }
        }

        if ( znak==1)
        {
            if (number >= ((LONG_MIN+digit)/base))
            {
                number=number*base - digit;
            }
            else
            {
                errno = ERANGE;
                endptr= '\0';
                return LONG_MIN;
            }
        }
        i++;
    }
    endptr= '\0';
    return number;
}

Wywala cos takiego:

boss@boss-laptop:~/strol$ gcc -o testlib testlib.c
testlib.c: W funkcji strtol,: testlib.c:57: ostrzeżenie: przypisanie robi wskaźnik z liczby całkowitej bez rzutowania /usr/lib/gcc/i486-linux-gnu/4.2.3/../../../../lib/crt1.o: In function _start':
(.text+0x18): undefined reference to `main'
collect2: ld returned 1 exit status

Problem jest tutaj:

if (digit >base || digit == -1)
        {
            *endptr = nptr[i];
            return number;
        }

Dziękuje za wszelką pomoc.

//wybacz... musiałem ten kod skondensować, 55% pustych linii w kodzie to przegięcie - R

0

**endptr = nptr[i];

endptr to podwójny wskaźnik, z tego co widzę po parametrach funkcji

EDIT:
jeśli chodzi ci o przypisanie adresu, a nie wartości, to:
*endptr = &nptr[i];
lub
*endptr = nptr+i;

0

Przepraszam wkleiłem zły kod bo próbowałem z tym walczyć. Po dodaniu & jest taki komunikat:

boss@boss-laptop:~/strol$ gcc -o testlib testlib.c
testlib.c: W funkcji strtol,: testlib.c:57: ostrzeżenie: przypisanie odrzuca kwalifikatory z typu docelowego wskaźnika /usr/lib/gcc/i486-linux-gnu/4.2.3/../../../../lib/crt1.o: In function _start':
(.text+0x18): undefined reference to `main'
collect2: ld returned 1 exit status

Drugi sposób tez nie działa.

0

po pierwsze to program sie nie kompiluje bo nie ma main ;)
a ten problem, o którym mówisz, to tylko ostrzeżenie, jakoś dziwnie się po polsku te komunikaty czyta ;) ale wydaje mi się, że debugerowi chodzi o to, że typy są niepoprawne, tzn. czepia się tego const, usuń const z deklaracji i zobaczysz czy to ostrzeżenie tego się czepia, jeśli tak możesz na to nie zwracać uwagi ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1