• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

vector<vector> read() błędny odczyt

Object Storage Arubacloud
0 głosów
129 wizyt
pytanie zadane 27 października 2020 w C i C++ przez TOWaD Mądrala (5,700 p.)
    vector<vector<double>> V(3,vector<double>(5,5.5));

dlaczego nie można tak zrobić ?

       os.write((char*)(*V.data()).data(),V.size()*((*V.data()).size())*sizeof(*(*V.data()).data()));
	// (*V.data()).end() dodaje ?

tak ok

       for(auto & x:V){
            os.write((char*)x.data(),x.size()*sizeof(*x.data()));

 

komentarz 28 października 2020 przez tkz Nałogowiec (42,000 p.)
A co chcesz właściwie osiągnąć?

1 odpowiedź

0 głosów
odpowiedź 27 października 2020 przez tangarr Mędrzec (154,860 p.)

Prawdą jest, że klasa vector gwarantuje ciągłość danych. Jednak te dane znajdują się na stercie i mogą być przenoszone w inne miejsce pamięci podczas rozszerzania wektora.

Wektor wektorów zapewnia, że struktury tych wektorów będą znajdować się w ciągłej pamięci obok siebie, ale wewnętrzne wskaźniki na dane będą wskazywać na inne miejsce w pamięci. Blok danych każdego wewnętrznego wektora może się znajdować w zupełnie innym miejscu w pamięci.

cout << V.data() << endl;
for (auto &v : V) {
   //       początek bloku     koniec bloku
    cout << v.data() << " " << v.data() + v.size()*sizeof(v[0]) << endl;
}

 

komentarz 27 października 2020 przez TOWaD Mądrala (5,700 p.)
edycja 28 października 2020 przez TOWaD
No tak ale wektor ma stały wymiar , i nic nie robiłem z wektorem to data() można użyć chyba. Gręmbosz tak pisał. Chyba że się mylę i jak można jakiś link o alokacji pamięci dla STL na stercie. może po Polsku jak jest.

Z resize() sprawdzę może rzeczywiście tu jest błąd.

edit:: x.resize(5) wywala błąd alokacji
komentarz 28 października 2020 przez tangarr Mędrzec (154,860 p.)

Spójrz na wynik działania programu
 

#include <iostream>
#include <vector> ;

using namespace std;

int main()
{
    vector<int> v;
    cout << v.data() << endl;
    for (int i=1, s=1; i<15; i++, s*=2) {
        v.resize(s);
        cout << v.data() << endl;
    }
    return 0;
}

Z powodu rozszerzania wektora jego wewnętrzne dane muszą zostać realokowane w pamięci (przesuwają się). To znaczy, że ta pamięć nie jest "przyklejona" do wektora.

Struktura wektora w uproszczeniu wygląda tak:
 

template <typename T>
class vector {
private:
    T *buffer; // ten wskaźnik zapewnia ciągłość danych
    int buffer_size;
    int size;
};

Wektor wektorów w swojej wewnętrznej tablicy trzyma ciąg takich struktur, a każda z nich wskazuje na niezależny blok danych.

Pokaż kod, w którym resize wywala błąd.

komentarz 28 października 2020 przez TOWaD Mądrala (5,700 p.)
edycja 28 października 2020 przez TOWaD
vector jak wyżej
  for(auto & x:V) {
        x.resize(5);
    }

ale ok Dzięki , tylko myślałem że błąd to jest stała wartość, ale fakt raz było jednym "zerze" na końcu vectora, innym razem cała linijka. Po próbuję jeszcze za array jak to będzie błąd długości vectora to w array nie powinno być

array<array<double,5>,3> AA;
in.read((*char)AA.data(),sizeof(AA)); //i śmiga jak trzeba

 

Podobne pytania

+1 głos
2 odpowiedzi 4,384 wizyt
pytanie zadane 13 grudnia 2016 w C i C++ przez Dominik Kulis Użytkownik (720 p.)
0 głosów
3 odpowiedzi 1,737 wizyt
0 głosów
1 odpowiedź 342 wizyt
pytanie zadane 17 grudnia 2018 w C i C++ przez tomekrx Nowicjusz (160 p.)

92,567 zapytań

141,420 odpowiedzi

319,615 komentarzy

61,952 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...