Nieokreślona ilość argumentów funkcji

0

Jestem bardzo początkującym w temacie programowania, uczę się od kilku tygodni. Po kilku krokach do przodu pojawiła się ściana której nie mogę pokonać. Liczę na Waszą pomoc.

Od rana walczę z zadaniem w którym jest funkcja która pobiera dziesięć (lub mniej) elementów z klawiatury i z których znajduje maksimum. Znalezienie maksimum nie jest problemem, problemem jest podawanie różnej liczby argumentów. Na tym etapie nauki jestem w stanie zrobić to zadanie ale tylko dla wprowadzania maksymalnej ilości elementów (w parze liczba + \n). Natomiast nie wiem jak zrobić żeby program pozwolił mi na wpisaniu kolejnego elementu funkcji po kliknięciu klawisza '\n' bez podania liczby.
W tej chwili nie mam kodu który mógłbym wkleić, bo wykasowałem moje wszystkie próby.

Próbowałem rozwiązać problem za pomocą pętli do..while - wyglądało to mniej więcej tak:

    do
    {
        for (i=0;i<9;i++)
    {
        printf("\nPodaj %d liczbe: \n",i+1);

            scanf("%d",&t[i]);
    }
    } while (c=getchar()!='\n');

Próbowałem użyć funkcji gets ale nie bardzo mogłem sobie z tym poradzić, zupełnie nic nie wychodziło. :(

0

A co Ci się złego działo z gets()?
Wczytujesz linię przez fgets(), splitujesz po białych znakach i konwertujesz na liczby.

0

Dzięki za odpowiedź, w międzyczasie założyłem konto - więc odpowiadam pod innym NICK.

Nie pamiętam co złego wyskakiwało z gets, prawdopodobnie jakiś błąd składni. Spróbuje wieczorem z fgets, mam nadzieję że dam radę ze "splitowaniem" i konwertowaniem na liczbę - w razie czego będę zadawał kolejne pytania. Jeszcze raz dzięki.

0

Tutaj masz znacznie ułatwione zadanie. Podpowiem Ci jedną rzecz: splitowanie i konwersję możesz zrobić za jednym zamachem (ale nie w jednym kroku!) dzięki drugiemu argumentowi do strtol(). Happy coding :)

0

A co Ci się złego działo z gets()?

Z gets działo się to złego, że jest evil, zue, niedobre. NIE UŻYWAĆ.
Dlaczego? Bo zgodnie ze standardem, ma prawo wysłać twoje nagie fotki na fejsbóka.

http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1049157810&id=1043284351

0
Kumashiro napisał(a)

Tutaj masz znacznie ułatwione zadanie. Podpowiem Ci jedną rzecz: splitowanie i konwersję możesz zrobić za jednym zamachem (ale nie w jednym kroku!) dzięki drugiemu argumentowi do strtol(). Happy coding :)

Udało mi się zrobić zadanie, nie było łatwo ;) zajęło to trochę czasu ale działa! Byłbym wdzięczny jakby ktoś bardziej doświadczony zerknął czy kod jest w miare poprawny, czy nie można go jakoś udoskonalić. Za wszystkie uwagi i sugestie z góry dziękuję, będą pomocne w kolejnym etapie nauki :)

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

int main()
{
    int max[10],i,pom,mx;
    char c[100],*tmp;


    for (i=0;i<9;i++)
    {
        max[i]=0;
    }

    for (i=0;i<9;i++)
    {
        // wczytywanie liczb
        printf("\nPodaj %d liczbe: \n",i+1);
        fgets(c,100,stdin);


        //przetworzenie stringa na liczbe i wpisanie jej do tablicy
        pom=strtol(c,&tmp,10);
        max[i]=pom;

        if (max[i]==0)
            i=9;
    }

    mx=max[0];
    for(i=0;i<9;i++)
    {
        if (mx<max[i])
            mx=max[i];
    }

    printf("\n\nMaksymalna liczba to: %d",mx);

    fflush(stdout);
    getchar();
    getchar();
    return 0;
}
0
Rumburak napisał(a)
int main()

Piszesz w C, zatem:

int main(void)
Rumburak napisał(a)
    for (i=0;i<9;i++)
    {
        max[i]=0;
    }

Użyj memset() do wyzerowania całego bloku pamięci:

memset(max, 0, sizeof(max));

lub zainicjuj od razu tablicę zerami:

int max[10] = { 0, };

Masz dziesięcioelementową tablicę, a zerujesz tylko 9 elementów.

Rumburak napisał(a)
for (i=0;i<9;i++)
    {
        // wczytywanie liczb
        printf("\nPodaj %d liczbe: \n",i+1);
        fgets(c,100,stdin);

To samo tutaj. Wczytujesz tylko 9 liczb, a miałeś wczytać 10. Masz zły warunek.
W przypadku stdin błędy odczytu są mało prawdopodobne, ale warto pamiętać o sprawdzeniu czy fgets() nie zwrócił NULL.

Rumburak napisał(a)
        //przetworzenie stringa na liczbe i wpisanie jej do tablicy
        pom=strtol(c,&tmp,10);
        max[i]=pom;

Nie sprawdzasz błędów!
Nie potrzebujesz też zmiennej pom.

Rumburak napisał(a)
        if (max[i]==0)
            i=9;
    }

A cóż to?

Rumburak napisał(a)
    mx=max[0];
    for(i=0;i<9;i++)
    {
        if (mx<max[i])
            mx=max[i];
    }

Mało wydajne. Test możesz przeprowadzić w pętli wczytującej i przechowywać tylko wartość maksymalną skoro do niczego innego nie używasz tablicy max. Jest ona zbyteczna.

Rumburak napisał(a)
    fflush(stdout);

To jest zbędne.

Ogólnie dobrze, ale jeszcze nad tym popracuj :)

0
Kumashiro napisał(a)
Rumburak napisał(a)
int main()

W przypadku stdin błędy odczytu są mało prawdopodobne, ale warto pamiętać o sprawdzeniu czy fgets() nie zwrócił NULL.

Rumburak napisał(a)
        //przetworzenie stringa na liczbe i wpisanie jej do tablicy
        pom=strtol(c,&tmp,10);
        max[i]=pom;

Nie sprawdzasz błędów!

To prawda, muszę pomyśleć w jaki sposób sprawdzić czy nie została wpisana litera lub "czy fgets() nie zwrócił NULL", może jakieś wskazówki? :)

Ogólnie dobrze, ale jeszcze nad tym popracuj :)

Poprawione wg wskazówek, teraz trochę lepiej (a na pewno krócej) Dzięki!

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

int main(void)
{
    int i,pom,mx=0;
    char c[100],*tmp;


    for (i=0;i<10;i++)
    {
        // wczytywanie liczb
        printf("\nPodaj %d liczbe: \n",i+1);
        fgets(c,100,stdin);


        //przetworzenie stringa na liczbe
        pom=strtol(c,&tmp,10);

        if (mx<pom)
            mx=pom;

        if (pom==0)
            i=10;
    }

    printf("\n\nMaksymalna liczba to: %d",mx);

    getchar();
    getchar();
    return 0;
}
0

<quote=Rumburak>

        if (pom==0)
            i=10;
    }
<quote> Fuj. Co to jest? Po pierwsze, jeśli chcesz zakończyć pętlę, użyj instrukcji `break`. Po drugie, ten kod uniemożliwia podanie wartości `0` jako pełnoprawnej danej, gdyż powoduje ona zaprzestanie wczytywania.

OK, poniżej masz to zadanie z pełną obsługą błędów.

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

int  main(void)
{
    long int    value, max = 0;
    char        *endptr, input[128];
    int         i;


    errno = 0;
    endptr = input;
    for ( i = 0; i < 10; i++ ) {
        if ( fgets(input, sizeof(input) - 1, stdin) == NULL ) {
            break; /* Ctrl-D przerywa wprowadzanie danych wcześniej */
        };

        value = strtol(input, &endptr, 10);

        if ( input == endptr || ((*endptr != '\n') && (*endptr != '\0')) ) {
            fprintf(stderr, "Invalid input: %s\n", input);
            return 2;
        } else if ( errno != 0 ) {
            fprintf(stderr, "Value error: %s\n", strerror(errno));
            return 3;
        };

        if ( value > max )
            max = value;
    };

    fprintf(stdout, "Max: %li\n", max);
    return 0;
}
0

<quote=Kumashiro><quote=Rumburak>

        if (pom==0)
            i=10;
    }

Fuj. Co to jest?
Po pierwsze, jeśli chcesz zakończyć pętlę, użyj instrukcji break.
Po drugie, ten kod uniemożliwia podanie wartości 0 jako pełnoprawnej danej, gdyż powoduje ona zaprzestanie wczytywania.

Nie można się nie zgodzić z uwagami, ale zamieszczony przez Ciebie kod wywala się jak nie wpiszę żadnego znaku i potwierdzę enterem (kompiluje w QT pod windowsem - jeżeli ma to jakieś znaczenie?). :/
Poza tym, to co napisałeś to bardzo czarna magia. Nic nie rozumiem, nawet nie wiem o co dopytywać :)

1
Rumburak napisał(a)

Nie można się nie zgodzić z uwagami, ale zamieszczony przez Ciebie kod wywala się jak nie wpiszę żadnego znaku i potwierdzę enterem

Co rozumiesz przez "wywala się"? U mnie wypisuje komunikat błędu, tak jak powinien.

Rumburak napisał(a)

(kompiluje w QT pod windowsem - jeżeli ma to jakieś znaczenie?). :/

Qt to jest framework, nie kompilator. System operacyjny nie powinien mieć tu znaczenia.

Rumburak napisał(a)

Poza tym, to co napisałeś to bardzo czarna magia. Nic nie rozumiem, nawet nie wiem o co dopytywać :)

OK, to teraz z tłumaczeniem:

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

Includy... najwyraźniej

int  main(void)
{
    long int    value, max = 0;
    char        *endptr, input[128];
    int         i;

Deklaracje. Zmienna value przechowuje skonwertowaną wartość, max - maksymalną wartość, pod endptr funkcja strtol() zapisze wskaźnik do miejsca, na którym kończy się konwersja, input to nasz bufor (można go zmniejszyć, bo 128 bajtów to trochę przydużo), zaś i posłuży nam do iteracji. Zmienną max od razu inicjujemy wartością 0. Jeśli dopuszczamy wartości ujemne, powinniśmy ją zainicjować najmniejszą wartością, jaką na danej platformie jest w stanie przechować typ long int.

    errno = 0;
    endptr = input;

Najpierw zerujemy zmienną globalną errno. Teoretycznie nie jest to wymagane, gdyż nigdzie przed tą linią nie wywołujemy nic co mogłoby ją ustawić, ale nie zaszkodzi. Linia endptr = input jest tu niepotrzebna (sorry, część kodu skopiowałem z mojego innego programu i zostały śmieci).

    for ( i = 0; i < 10; i++ ) {
        if ( fgets(input, sizeof(input) - 1, stdin) == NULL ) {
            break; /* Ctrl-D przerywa wprowadzanie danych wcześniej */
        };

Wchodzimy do pętli for, która zrobi 10 obrotów. Przy każdej iteracji wczytujemy z stdin lnię tekstu, o długości równej maksymalnej objętości naszego bufora (i ponownie został śmieć; - 1 jest tutaj niepotrzebny, ale nie wadzi). Jeśli user nie wpisze nic, lecz wdusi kombinację Ctrl-D (fgets() zwróci NULL), iterowanie zostanie przerwane. Uwaga! Wpisanie pustej linii (wciśnięcie ENTER) nie łapie się do tego warunku, gdyż w danych wejściowych będzie znak nowej linii.

        value = strtol(input, &endptr, 10);

Przeprowadzamy konwersję ze cstringa input, podstawa 10. Wynik ląduje w zmiennej value. Wskaźnik endptr będzie wskazywał pierwszą pozycję z input, na której znajduje się bajt nie należący do wartości liczbowej. Np. jeśli spróbujemy skonwertować "123abc", wartością zwróconą będzie liczba 123, zaś endptr będzie wskazywał na a. Zaraz wykorzystamy to do kontroli błędów.

        if ( input == endptr || ((*endptr != '\n') && (*endptr != '\0')) ) {
            fprintf(stderr, "Invalid input: %s\n", input);
            return 2;

Jeśli wskaźnik endptr wskazuje na pierwszy bajt danych wejściowych (input == endptr), to znaczy że cstring rozpoczyna się od danych, których nie można przekonwertować na liczbę. Jeśli wskaźnik endptr nie wskazuje ani na znak nowej linii, ani na bajt zerowy, to znaczy że w cstringu po liczbie znajdują się jakieś inne znaki. Wszystkie te przypadki traktujemy jako błąd, gdyż nie są to prawidłowe dane wejściowe. Przykłady takich przypadków:

"abcd\n\0"
"123abcd\n\0"
"123 \n\0"
"\n\0"
        } else if ( errno != 0 ) {
            fprintf(stderr, "Value error: %s\n", strerror(errno));
            return 3;
        };

Jeśli konwersja nie może być przeprowadzona z innego powodu (np. przekroczenie zakresu), barfujemy i kończymy pracę.

        if ( value > max )
            max = value;
    };

Sprawdzamy, czy odczytana wartość jest większa od zapamiętanej wartości maksymalnej i jeśli jest to prawda, zapisujemy ją jako największą.

    fprintf(stdout, "Max: %li\n", max);
    return 0;
}

Po wyjściu z pętli printujemy wynik i kończymy pracę bez błędu.

0
Kumashiro napisał(a)
Rumburak napisał(a)

Nie można się nie zgodzić z uwagami, ale zamieszczony przez Ciebie kod wywala się jak nie wpiszę żadnego znaku i potwierdzę enterem

Co rozumiesz przez "wywala się"? U mnie wypisuje komunikat błędu, tak jak powinien.

Dziękuję za czas jaki poświęciłeś na pomoc w rozwiązaniu problemu i gruntownym wyłożeniu tematu tak że stał się do ogarnięcia.
Po analizie kodu linijka po linijce wszystko stało się jasne. Faktycznie program działał tak jak tego chciałeś.

Przerobiłem troszkę na swoje potrzeby, byłbym wdzięczny jakbyś jeszcze mógł zerknąć i ewentualnie ocenić czy wprowadzona zmiana jest dobra z programistycznego punktu widzenia.
(chodziło o to, żeby można było obliczyć max po wprowadzeniu np. 4 zmiennych po kliknięciu pustego \n, bez konieczności klikania 10 zmiennych).

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

int  main(void)
{
    long int    value, max = 0;
    char        *endptr, input[128];
    int         i;


    errno = 0;
    for ( i = 0; i < 10; i++ ) {
        if ( fgets(input, sizeof(input), stdin) == NULL ) {
            break; /* Ctrl-D przerywa wprowadzanie danych wcześniej */
        };

        value = strtol(input, &endptr, 10);

        if ( input == endptr || ((*endptr != '\n') && (*endptr != '\0')) ) {
            fprintf(stderr, "Invalid input: %s\n", input);
            
            //w tym miejscu wywaliłem return 2 i wstawiłem break
            break;
        } else if ( errno != 0 ) {
            fprintf(stderr, "Value error: %s\n", strerror(errno));
            return 3;
        };

        if ( value > max )
            max = value;
    };

    fprintf(stdout, "Max: %li\n", max);

    getchar();
    return 0;
}

offtopic:
Zrozumiałem do czego służą poszczególne linijki kodu. Jeszcze nie bardzo wiem jak sprawdzić jakie wartości przybierają zmienne, w poszczególnych miejscach programu - ale to już materiał na nowy temat "jak debugować" lub do poszukania w archiwum :) Chciałbym zobaczyć jak zachowuje się program/kompilator(?) na poszczególnych linijkach kodu (w powyższym przykładzie najbardziej interesuje mnie mechanizm kontroli błędu).

0
Rumburak napisał(a)

Przerobiłem troszkę na swoje potrzeby, byłbym wdzięczny jakbyś jeszcze mógł zerknąć i ewentualnie ocenić czy wprowadzona zmiana jest dobra z programistycznego punktu widzenia.
(chodziło o to, żeby można było obliczyć max po wprowadzeniu np. 4 zmiennych po kliknięciu pustego \n, bez konieczności klikania 10 zmiennych).

Jak rozumiem, chcesz żeby pusta linia przerywała wczytywanie i przechodziła od razu do wyniku.
BTW, nie używaj słowa "klikać" w kontekście wpisywania danych z klawiatury, gdyż to są dwie różne rzeczy (kliknięcie jest to wciśnięcie jednego lub kilku przycisków "ręcznego manipulatora stołokulotocznego", czyli myszki). O klikaniu w takim kontekście możemy mówić tylko w przypadku stosowania klawiatury wirtualnej lub przeklejania znaków w terminalu uniksowym.

Rumburak napisał(a)
        if ( input == endptr || ((*endptr != '\n') && (*endptr != '\0')) ) {
            fprintf(stderr, "Invalid input: %s\n", input);
            
            //w tym miejscu wywaliłem return 2 i wstawiłem break
            break;

To jest OK pod warunkiem, że nieprawidłową daną wejściową traktujemy jako żądanie zakończenia iteracji. Pusta linia załapie się na warunek input == endptr, zaś nieprawidłowe dane na pozostałe. Na Twoim miejscu sprawdzenie czy podana została pusta linia dałbym wcześniej i wyskakiwałbym z pętli bez komunikatu błędu, natomiast tutaj przywróciłbym return.

Rumburak napisał(a)

Zrozumiałem do czego służą poszczególne linijki kodu. Jeszcze nie bardzo wiem jak sprawdzić jakie wartości przybierają zmienne, w poszczególnych miejscach programu - ale to już materiał na nowy temat "jak debugować" lub do poszukania w archiwum :) Chciałbym zobaczyć jak zachowuje się program/kompilator(?) na poszczególnych linijkach kodu (w powyższym przykładzie najbardziej interesuje mnie mechanizm kontroli błędu).

Program, nie kompilator. Po skompilowaniu programu kompilator nic już nie ma do niego i nie jest uruchamiany.
Jakie wartości przyjmują poszczególne zmienne możesz sprawdzić na dwa sposoby: obserwując w debuggerze co się dzieje (większość ma funkcję podglądania zmiennych), lub wstawiając w odpowiednich miejscach printf().

Chcesz questa?

  1. [ easy level quest ] Zastanów się (ale najpierw na sucho! bez debuggowania!) jakie wartości muszą mieć zmienne input i endptr aby wejście od użytkownika można było sklasyfikować jako pustą linię. (hint: przeanalizuj moje wcześniejsze komentarze do kodu).
  2. [ very easy level quest ] Jak już znajdziesz te wartości, jak będzie wyglądała instrukcja warunkowa przerywająca pętlę?
  3. [ medium level quest ] Zmodyfikuj kod tak, aby linia składająca się z samych spacji (' ') oraz tabulacji ('\t') traktowana była jako pusta linia przerywająca iterację.
  4. [ medium level quest ] Zmodyfikuj kod tak, aby dane wejściowe podawało się w postaci liczb oddzielonych spacjami i/lub tabulacjami, w jednej linii, gdzie jedynym ograniczeniem ich ilości będzie maksymalna długość linii, wynosząca 64kB.

Are you up to the task?

0
Kumashiro napisał(a)

Chcesz questa?

  1. [ easy level quest ] Zastanów się (ale najpierw na sucho! bez debuggowania!) jakie wartości muszą mieć zmienne input i endptr aby wejście od użytkownika można było sklasyfikować jako pustą linię. (hint: przeanalizuj moje wcześniejsze komentarze do kodu).

'\n'

  1. [ very easy level quest ] Jak już znajdziesz te wartości, jak będzie wyglądała instrukcja warunkowa przerywająca pętlę?
if ( input == endptr || (*endptr != '\n')) break;
  1. [ medium level quest ] Zmodyfikuj kod tak, aby linia składająca się z samych spacji (' ') oraz tabulacji ('\t') traktowana była jako pusta linia przerywająca iterację.
  2. [ medium level quest ] Zmodyfikuj kod tak, aby dane wejściowe podawało się w postaci liczb oddzielonych spacjami i/lub tabulacjami, w jednej linii, gdzie jedynym ograniczeniem ich ilości będzie maksymalna długość linii, wynosząca 64kB.

Are you up to the task?

Mam nadzieje, że moje rozwiązania są OK - bo program wydaje się działać. Odpowiedzi na kolejne pytania wkrótce. Niestety z uwagi na godziny pracy na hobby jakim jest nauka programowania mam bardzo ograniczony czas - zwykle są to niedziele. :/

ps. dzięki za questa, dzisiaj nauczyłem się dużo więcej niż przez przerabianie jakichś kursów online :) Dzięki jeszcze raz.

0
Rumburak napisał(a)
Kumashiro napisał(a)

Chcesz questa?

  1. [ easy level quest ] Zastanów się (ale najpierw na sucho! bez debuggowania!) jakie wartości muszą mieć zmienne input i endptr aby wejście od użytkownika można było sklasyfikować jako pustą linię. (hint: przeanalizuj moje wcześniejsze komentarze do kodu).

'\n'
</quote>
Good. +2 do doświadczenia :)

Rumburak napisał(a)
  1. [ very easy level quest ] Jak już znajdziesz te wartości, jak będzie wyglądała instrukcja warunkowa przerywająca pętlę?
if ( input == endptr || (*endptr != '\n')) break;
</quote> No niezupełnie. Ten warunek chwyci Ci np. cstring "foo\n", co nie jest pustą linią. Błąd jest w operacji logicznej. Prawidłowa to `&&` czyli *and* czyli logiczna koniunkcja. Chcemy, aby warunek był prawdziwy dla przypadku, w którym `endptr` wskazuje na początek `input` (konwersja zakończyła się na pierwszym znaku, jako że '\n' nie jest reprezentacją znakową cyfry) **i** `endptr` wskazuje na znak nowej linii. Quest failed, brak punktów doświadczenia ;)
Rumburak napisał(a)

Mam nadzieje, że moje rozwiązania są OK - bo program wydaje się działać. Odpowiedzi na kolejne pytania wkrótce. Niestety z uwagi na godziny pracy na hobby jakim jest nauka programowania mam bardzo ograniczony czas - zwykle są to niedziele. :/

Dwa ostatnie questy będą wymagały trochę pracy i pomyślenia. Bardzo przydatne będą operacje na wskaźnikach. Wykonanie ich jednak pozwoli Ci się oswoić z cstringami i świadomością, że są one niczym innym jak płaskim obszarem pamięci. Jeśli będziesz miał problemy, daj znać to podeślę hinta.

Prośba do kolegów czytających ten wątek: jeśli kogoś najdzie silna ochota na podzielenie się swoim rozwiązaniem, prosiłbym się wstrzymać z publikacją. Dajmy szansę koledze :)

0
Kumashiro napisał(a)
Rumburak napisał(a)
Kumashiro napisał(a)

Chcesz questa?

  1. [ easy level quest ] Zastanów się (ale najpierw na sucho! bez debuggowania!) jakie wartości muszą mieć zmienne input i endptr aby wejście od użytkownika można było sklasyfikować jako pustą linię. (hint: przeanalizuj moje wcześniejsze komentarze do kodu).

'\n'

Good. +2 do doświadczenia :)</quote>
A jednak not so good, ale zaliczymy ;)
W queście stoi "jakie wartości muszą mieć", zatem input i endptr powinny zawierać tę samą wartość wskaźnika, wskazującego na znak nowej linii. Niby nic, ale różnica jest dość spora. Aby zobrazować o co chodzi, eksperyment:

#include <stdio.h>

int  main(void)
{
    char    *endptr, input[2] = "\n";

    endptr = input;
    printf("Wartość wskaźnika `input': %p\n", input);
    printf("Wartość wskaźnika `endptr': %p\n", endptr);
    printf("Wartość wskazywana przez `input': %c\n", *input);
    printf("Wartość wskazywana przez `endptr': %c\n", *endptr);

    return 0;
}

Wynikiem działania jest:

Wartość wskaźnika `input': 0x7fff175f4f70
Wartość wskaźnika `endptr': 0x7fff175f4f70
Wartość wskazywana przez `input': 

Wartość wskazywana przez `endptr': 

Te puste linie są wynikiem wypisania znaku nowej linii.

0
Kumashiro napisał(a)
        value = strtol(input, &endptr, 10);

Przeprowadzamy konwersję ze cstringa input, podstawa 10. Wynik ląduje w zmiennej value. Wskaźnik endptr będzie wskazywał pierwszą pozycję z input, na której znajduje się bajt nie należący do wartości liczbowej. Np. jeśli spróbujemy skonwertować "123abc", wartością zwróconą będzie liczba 123, zaś endptr będzie wskazywał na a. Zaraz wykorzystamy to do kontroli błędów.

Aby pójść do przodu muszę się cofnąć krok w tył, analizuje po raz enty Twój kod. Kluczowym problemem (tak mi się wydaje) jest wartość jaką przyjmuje *endptr. Próbuje wstawiać kod który wyświetliłby wartość *endptr (tak żeby bardziej zrozumieć co się dzieje w tym miejscu programu). Sprawdzam wartość za pomocą:

printf=("%c",*endptr);
  • próbowałem dla różnych typów danych stringi, integery, double i zawsze (kompilator?) wyrzuca błąd. :/
    Prosiłbym o hinta w jaki sposób używać debuggera, albo innego narzędzia który pozwoliłby mi śledzić wartość zmiennych na kolejnym etapie wykonywania programu... próbowałem ratować się printfem (jak powyżej), ale niestety nie udaje się.

ps. rękawice podjąłem i próbuję rozwiązać pozostałe dwa pytania questa, na razie jestem w lesie, ale rozwiąże je - kwestia czasu. Na dzień dzisiejszy nie proszę o hinta wspomagającego. :)

0
Rumburak napisał(a)

Aby pójść do przodu muszę się cofnąć krok w tył, analizuje po raz enty Twój kod. Kluczowym problemem (tak mi się wydaje) jest wartość jaką przyjmuje *endptr. Próbuje wstawiać kod który wyświetliłby wartość *endptr (tak żeby bardziej zrozumieć co się dzieje w tym miejscu programu). Sprawdzam wartość za pomocą:

printf=("%c",*endptr);
  • próbowałem dla różnych typów danych stringi, integery, double i zawsze (kompilator?) wyrzuca błąd. :/

Hmmm... ale to nie jest prawidłowe użycie funkcji printf().

printf("%c\n", *endptr);
Rumburak napisał(a)

Prosiłbym o hinta w jaki sposób używać debuggera, albo innego narzędzia który pozwoliłby mi śledzić wartość zmiennych na kolejnym etapie wykonywania programu... próbowałem ratować się printfem (jak powyżej), ale niestety nie udaje się.

Użyj prawidłowo printf(). Niestety, nie pomogę z debuggerem pod Windows, gdyż nie używam tego systemu. Może koledzy coś podpowiedzą.

Rumburak napisał(a)

ps. rękawice podjąłem i próbuję rozwiązać pozostałe dwa pytania questa, na razie jestem w lesie, ale rozwiąże je - kwestia czasu. Na dzień dzisiejszy nie proszę o hinta wspomagającego. :)

OK, hint: w queście 3 przy każdej iteracji pętli możesz najpierw stripnąć białe spacje z początku linii. Pamiętaj, że wskaźnik ze środka cstringa jest także wskaźnikiem do cstringa :)

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