Struktura i wektor

0

Chciałem napisac program który przekształci równanie z postaci infiksowej na ONP. Wymyśliłem, żeby wczytywac znaki po kolei, sprawdzac czy jest to liczba czy operand i w zaleznosci od tego ustawiac pole 'liczba' w strukturze na true lub false a w pole wartosc wpisac odpowiednia liczba lub kod ascii operandu. Wynik chciałbym zapisać w wektorze i tu mam problem.

struct lexem
{
       bool liczba;
       int wartosc;

       lexem (int arg) {wartosc=arg;}
};

void parsuj(string rownanie,vector<lexem> lex())
{
            for (int i=0;i<rownanie.length();i++)
            {
                if ((int)rownanie[i]>47 && (int)rownanie[i]<58)
                {
                   lex[i].liczba=true;
                   lex[i].lexem(atoi(rownanie[i]));
                   n++;
                }
              ... //na razie tylko liczby jednocyfrowe
}

Przy próbie kompilacji (Dev C++) dostaję komunikat:

pointer to a function used in arithmetic request for member liczba' in *(lex + (+((unsigned int)n)))', which is of non-class type `std::vector<lexem, std::allocator<lexem> > ()()'

Dla linijek 14 i 15. Pomijam już fakt, że prawdopodobnie źle użyłem konstruktora :)

1
void parsuj(string rownanie,vector<lexem> lex()) { ... }

A co robią te nawiasy przy parametrze lex?

1

nigdzie nie sprawdzasz, ile lex ma elementów.

0

@ 0x666
Zasugerowałem się analogia do tablic:P

@Azarien
lex jest wektorem, więc liczba elementów zmienia się dynamicznie (z tego co wyczytałem na necie:)), zreszta po co miałbym sprawdzac ilość elementów lex?

0
norbert108 napisał(a)

@Azarien
lex jest wektorem, więc liczba elementów zmienia się dynamicznie (z tego co wyczytałem na necie:)), zreszta po co miałbym sprawdzac ilość elementów lex?

Skąd masz pewność, że lex[i] istnieje?

0

w takim razie wykorzystaj iteratory, skoro nie chce ci się sprawdzać rozmiaru wektora. To, że powiększa się dynamicznie nie oznacza, że nie da się w nim wyjść poza zakres odwołując się do jego elementów, jeśli nie obsłużysz tego odpowiednio program może ci się wysypać. Dlaczego to robić? Aby mieć dobrze napisany program, a nie na "odwal się" i mieć 100% pewności, że nigdy się w tym miejscu nie wysypie.

0
norbert108 napisał(a)

lex jest wektorem, więc liczba elementów zmienia się dynamicznie (z tego co wyczytałem na necie:)), zreszta po co miałbym sprawdzac ilość elementów lex?
W takim razie gdzie dodajesz elementy do wektora? Same się nie dodają.

0

dobra problem rozwiązany, nie robcie offtopu:) moze troche nie do konca zrozumiałem o co chodzi w wektorach ale juz wszystko jasne.

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