[C++] Brak funkcji _M_fill_initialize

shreder221
Użytkownik
Użytkownik
Posty: 181
Rejestracja: 5 cze 2015, o 21:45
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 50 razy
Pomógł: 2 razy

[C++] Brak funkcji _M_fill_initialize

Post autor: shreder221 »

Dobry wieczór przy kompilacji otwiera się wyżej wspomniany plik i wskazuje że nie może skompilować bo
Ukryta treść:    

kod programu
Ukryta treść:    
Moglibyście powiedzieć w czym problem?
Ostatnio zmieniony 7 cze 2017, o 22:23 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
dvrx47
Użytkownik
Użytkownik
Posty: 34
Rejestracja: 7 mar 2017, o 22:30
Płeć: Mężczyzna
Lokalizacja: Poland
Podziękował: 7 razy
Pomógł: 2 razy

[C++] Brak funkcji _M_fill_initialize

Post autor: dvrx47 »

problem jest w deklaracji wektora (niezgodność typów). Jeśli używasz konstruktora to przykładowa deklaracja w Twoim przypadku powinna wyglądać:

Kod: Zaznacz cały

 vector< vector<int> > szachy(k, vector<int>(l) );
Edit:
Druga sprawa, że Twoje wypisywanie też zawiera błąd ( [5][5] ).
zamień to na:

Kod: Zaznacz cały

   for(int i=0;i<k;i++){
      for(int j=0;j<l;j++){
           cout<<szachy[i][j];
      }
      cout << endl;
   }   
Edit2: a poza tym nie widzę potrzeby korzystania z vectora w tym przypadku (wystarczy zwykła tablica).

Pozdrawiam,
dvrx47
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10217
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2361 razy

Re: [C++] Brak funkcji _M_fill_initialize

Post autor: Dasio11 »

k i l są wpisywane z wejścia, więc nie wystarczy tablica.
dvrx47
Użytkownik
Użytkownik
Posty: 34
Rejestracja: 7 mar 2017, o 22:30
Płeć: Mężczyzna
Lokalizacja: Poland
Podziękował: 7 razy
Pomógł: 2 razy

Re: [C++] Brak funkcji _M_fill_initialize

Post autor: dvrx47 »

Dasio11 pisze:k i l są wpisywane z wejścia, więc nie wystarczy tablica.
Nie do końca rozumiem to wynikanie - vector jest zadeklarowany lokalnie. Tablice deklarowane lokalnie też mogą być deklarowane przy pomocy zmiennych (które się zmieniają ). Jeśli tablica ma być globalna, której rozmiar ma być wczytany z wejścia to zawsze można użyć wskaźników (funkcja new w c++, malloc w c. Zawsze też można zadeklarować tablicę dostatecznie dużą - i nie wykorzysywać całości (często stosowane rozwiązanie przy zadaniach algorytmicznych) ).

poniższy kod jest poprawny:

Kod: Zaznacz cały

#include <bits/stdc++.h>

int main(){
        int a, b;
        std:: cin >> a;
        std:: cin >> b;
        int tab[a][b]; //deklaruję tablice w funkcji
        for(int i=0; i<a; ++i)
                for(int j=0; j<b; ++j)
                        tab[i][j] = i*a + j;
        for(int i=0; i<a; ++i){
                for(int j=0; j<b; ++j)
                        std:: cout << tab[i][j] << std:: endl;
                std::cout << std:: endl;
        }
        return 0;
}

edit: zrozumiałbym, gdyby autor wątku korzystał z jakichś udogodnień vectora - z czego tam nie korzysta (sam vector o ile pamięć mnie nie myli zajmuje więcej miejsca niż tablica- a jednocześnie może zajmować 2 razy więcej miejsca niż jest używanych elementów (powiększanie pojemności odbywa się na zasadzie podwajania wielkości tablicy) (dlatego czasami nie używa się go w zadaniach algorytmicznych gdzie pamięć jest mocno ograniczona)
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10217
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2361 razy

Re: [C++] Brak funkcji _M_fill_initialize

Post autor: Dasio11 »

dvrx47 pisze:Tablice deklarowane lokalnie też mogą być deklarowane przy pomocy zmiennych (które się zmieniają ;) ).
W C++ nie mogą.
dvrx47 pisze:Jeśli tablica ma być globalna, której rozmiar ma być wczytany z wejścia to zawsze można użyć wskaźników (funkcja new w c++, malloc w c.
Tablica dynamiczna jest w porządku.
Zawsze też można zadeklarować tablicę dostatecznie dużą - i nie wykorzysywać całości (często stosowane rozwiązanie przy zadaniach algorytmicznych) ).
Tylko jeśli znamy sensowne ograniczenie na liczby, które może wpisać użytkownik. Poza tym jeśli zakres jest duży, to niedobrze jest deklarować dużą tablicę na stosie - do tego służy sterta.
poniższy kod jest poprawny:
Nie.
dvrx47
Użytkownik
Użytkownik
Posty: 34
Rejestracja: 7 mar 2017, o 22:30
Płeć: Mężczyzna
Lokalizacja: Poland
Podziękował: 7 razy
Pomógł: 2 razy

Re: [C++] Brak funkcji _M_fill_initialize

Post autor: dvrx47 »

Muszę doprecyzować - dla kompilatora g++ ten kod jest poprawny (rozumiem, że to nie standard języka, ale kompilator g++ jest szeroko stosowany - dlaczego więc miałbym nie korzystać w takich zadankach. W c niby też nie można deklarować funkcji w funkcji, ale gcc na to pozwala więc czemu miałbym z tego nie korzystać przy amatorskich projektach). Mimo wszystko
Dasio11 pisze:k i l są wpisywane z wejścia, więc nie wystarczy tablica.
zawsze można użyć tej tablicy dynamicznej.
Nie napisałem koledze, że nie może użyć vectora. Napisałem jedynie, że nie widzę potrzeby (nie zakazuję) użycia vectora (co podtrzymuję). Uznaję swój błąd i przepraszam, że powiedziałem, że w/w kod jest poprawny - w momencie gdy pisałem tamten post zapomniałem o tym, że korzystam z dogodności g++.

pozdrawiam,
dvrx47
ODPOWIEDZ