ďťż

Ładny brzuch

Nie wiem dlaczego, ale gdy podaję obsługę liczb ułamkowych do tej funkcji to zaczyna głupieć.
double getdigit(const char* string, unsigned int& offset) //offset to informacja, na którym znaku ciągu skończyło się przetwarzanie { unsigned int j = offset; for(;; j++) //zliczenie długości tablicy if(isdigit(string[j]) || //po odkomentowaniu działa źle (strcmp(&string[j], "-") && !isdigit(string[j-1]))) //|| //(strcmp(&string[j], ".") && isdigit(string[j+1]))); else break; char liczba[j-offset]; for(unsigned l = 0; l < (j-offset); l++) //wypełnianie tablicy liczbą liczba[l] = string[offset+l]; offset = j; return atof(liczba); }
Ogólnie funkcja działa, ale mam problem z odczytaniem ułamków. Z góry dzięki za pomoc



strcmp(&string[j], "-") strcmp(&string[j], ".")
Czy chodzi Ci o:
string[j] == '-' string[j] == '.'
?
Bo nie wiem na ile tamten wcześniejszy zapis ma sens ;). Co jest trzymane w tablicy? Co ta funkcja docelowo ma zrobić? I co oznacza "podaję obsługę liczb ułamkowych"?
Pytam bo nie lubię się domyślać co funkcja ma robić jak szukam w niej błędu ;).

strcmp ma sens, ponieważ jak napisze string[i] == cośtam to wyskakuje błąd "ISO C++ forbids comparison between pointer and integer". Musiałbym podać liczbę, a na etapie pisania to mi utrudni znajdowanie błędu.

Apropos tego co ona ma robić - ma wyodrębniać cyfry z podanego wyrażenia. Normalnie użyłbym samego atof(), ale jest mi potrzebny moment skończenia pracy (numer znaczku, który nie pasuje do liczby).

Celem tego całego postu jest poprawienie, a przynajmniej podpowiedź, w jaki sposób to napisać, aby zadziałało z ułamkami na wejściu.

Używam G++ pod linuxem.


strcmp ma sens, ponieważ jak napisze string[i] == cośtam to wyskakuje błąd "ISO C++ forbids comparison between pointer and integer". Musiałbym podać liczbę, a na etapie pisania to mi utrudni znajdowanie błędu.
"x" - zwraca wskaźnik na napis
'x' - zwraca znak x
Jest to ogromna różnica ;). Jak widać użyłem '' a nie "" :).


Używam G++ pod linuxem.
Dla C jest gcc.

char liczba[j-offset];Nie powinno tak się robić.

Program ma zmienić liczbę w postaci tekstowej na liczbę double, tak? Bo wyodrębniania cyfr to ja tu nie widzę za bardzo.
Użytkownik Ali240 edytował ten post 22 listopad 2007, 18:05


Dzięki za wskazówkę. Moje niedopatrzenie. Jednak nadal to jedynie kosmetyczna poprawka. G++ używam, bo programuję w C++, ale sama funkcja nie używa żadnych mechanizmów z C++,

Jak nie wyodrębnia? Najpierw zlicza ilość znaków, aż do napotkania pierwszego "niepoprawnego". Potem wypełnia nowoutworzoną tablice, tym co jest przypuszczalnie liczbą, a potem używa atof() do zamiany na doubla.
Użytkownik Andriej edytował ten post 22 listopad 2007, 18:09

Dzięki za wskazówkę. Moje niedopatrzenie. Jednak nadal to jedynie kosmetyczna poprawka. G++ używam, bo programuję w C++, ale sama funkcja nie używa żadnych mechanizmów z C++,

Jak nie wyodrębnia? Najpierw zlicza ilość znaków, aż do napotkania pierwszego "niepoprawnego". Potem wypełnia nowoutworzoną tablice, tym co jest przypuszczalnie liczbą, a potem używa atof() do zamiany na doubla.

Tak, ale docelowym działaniem funkcji jest zamiana tablicy znaków -> double, tak?
Co oznacza, że zaczyna głupieć? Sprawdź co wywala coś takiego:
double getdigit(const char* string, unsigned int& offset) //offset to informacja, na którym znaku ciągu skończyło się przetwarzanie { unsigned int j = offset; for(;; j++) //zliczenie długości tablicy if(isdigit(string[j]) || //po odkomentowaniu działa źle (strcmp(&string[j], "-") && !isdigit(string[j-1]))) //|| //(strcmp(&string[j], ".") && isdigit(string[j+1]))); else break; char liczba[j-offset]; for(unsigned l = 0; l < (j-offset); l++) //wypełnianie tablicy liczbą liczba[l] = string[offset+l]; liczba[l+1] = ''; <- zdaje się że nie zerowałeś ostatniego miejsca... offset = j; printf(":: %d\n", liczba); <- sprawdź co się pojawi na ekranie return atof(liczba); }

Nie za bardzo wiesz o co mi chodzi. Funkcja działa,ale nie jestem z jej działania zadowolony, bo nie mogę dodać obsługi odczytu liczb z przecinkiem.
Przypatrz sie temu fragmentowi (chodzi o część wykomentowaną)
if(isdigit(string[j]) || //po odkomentowaniu działa źle (string[j] == '-') && !isdigit(string[j-1]))); //|| //(string[j] == '.') && isdigit(string[j+1])));
Oczywiście trzeba poprawić nawiasy po odkomentowaniu.
Użytkownik Andriej edytował ten post 22 listopad 2007, 18:25

Nie za bardzo wiesz o co mi chodzi. Funkcja działa,ale nie jestem z jej działania zadowolony, bo nie mogę dodać obsługi odczytu liczb z przecinkiem.
Przypatrz sie temu fragmentowi (chodzi o część wykomentowaną)
if(isdigit(string[j]) || //po odkomentowaniu działa źle (string[j] == '-') && !isdigit(string[j-1]))); //|| //(string[j] == '.') && isdigit(string[j+1])));
Oczywiście trzeba poprawić nawiasy po odkomentowaniu.

Nie za bardzo wiem z czym masz problem. Skoro działa źle (czyli w ogóle działa, a patrząc na ten kod nie za bardzo powinno się skompilować...) to zobacz co wywala na ekran printf to będziesz wiedział co jest nie tak. Mam Ci napisać poprawny warunek czy jak? oO

Dobrze by było :P Ale właśnie podanie tego warunku (jak dla mnie OK) psuje kod. To jest mój moment krytyczny. Nie wiem co z tym zrobić. Jakaś myśl?


Dobrze by było :P Ale właśnie podanie tego warunku (jak dla mnie OK) psuje kod. To jest mój moment krytyczny. Nie wiem co z tym zrobić. Jakaś myśl?
No pewnie że jakaś myśl - zapisz słownie warunek, popatrz czy ma sens, przerób na postać C - najlepsza metoda ;). Mogę podać gotowy warunek, ale chyba nie o to codzi żebym ja wiedział jak to zrobić ;).

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •