» »

[C++] velikost matrike

[C++] velikost matrike

rapvirus ::

Mogoče kdo ve kako veliko matriko je možno narediti s C++? Če napišem več kot M[100][100], mi javi segmentation fault??
  • spremenilo: snow ()

CCfly ::

Matrika je lahko veliko, kolikor pomnilnika lahko za njo nakaže operacijski sistem. Seveda pa jo moraš narediti na kopici(heap) ne na skladu(stack).
"My goodness, we forgot generics!" -- Danny Kalev

rapvirus ::

Kako na kopici? A se ne da bolj simpl?

OwcA ::

Lahko uporabiš kakšno podatkovno strukturo, ki sama skrbi za zaseganje pomnilnika, naprimer std::vector.
Otroška radovednost - gonilo napredka.

rapvirus ::

Ja sam kako pa pol shranjujem podatke ce ni dvodimenzionalen?

sid_dabster ::

Naredis vektor vektorjev cesarkoli.
Fallen beyond all grace deeper and deeper
The sound of her own blood dripping
Like sacred tears from a bleeding rose...( Embraced, Within)

Cofko Cof ::

@rapvirus Segmentation fault ti ponavad jav, če greš prek tabele, al pa če maš kj s pointerji narobe. Probej ugotovit u kateri vrstici je napaka, pa poglej, da nima tam kakšen counter preveliko vrednost al pa kj podobnga.

Dve dimenziji pa pretvorš u eno tkole: npr če hočeš dostopat do i-ega elementa j-ti vrstici, pri čemer ma vsaka vrstica n elementov, potem je indeks tega elementa (n*j)+i.
Ars longa,vita brevis.

rapvirus ::

A tole bi potem šlo: std::vector < std::vector > matrika1; ?

sid_dabster ::

Bi, le se notranjemu vektorju moras dolociti tip elementa.
Fallen beyond all grace deeper and deeper
The sound of her own blood dripping
Like sacred tears from a bleeding rose...( Embraced, Within)

rapvirus ::

Aja točno...sm res idiot:D

rapvirus ::

Ja sam kok pa pol dostopaš do elementov. A se da kok tok, da je podobno dvodimenzionalnemu polju? (A[1][4])

OwcA ::

Ja.
Otroška radovednost - gonilo napredka.

Cofko Cof ::

Jz sm še vedno prepričanja da matrika velikosti 100 x 100 ne bi smela bit noben problem in je verjetno nekje napaka v kodi (ker segmentation fault je dostopanje do pomnilnika, do katerega nimamo pravic,...) . Sam se uporabljal tudi precej večje matrike pa ni bilo problema.
Ars longa,vita brevis.

Zgodovina sprememb…

BigWhale ::

Ce imas veliko stevilo elementov potem se ti splaca uporabiti kaj drugega. Jaz bom spet navijal za Qt. ;)

qList<>, ki je sicer linearen ampak ce iz njega izpeljes en svoj razred, potem lahko do posameznih polj dostopas 'nelinearno'.

Jaz sem to ponucal za moje robotke in dela precej v redu. Cel array je pa 3D velikosti 100x100x100. Sem ga teral tudi do 1000x1000x1000, takrat je pa ze problem s spominom... ;)

rapvirus ::

Ne ne, sej 100×100 dela, sam jst bi rabla mal več:) recimo 1024×1024

rapvirus ::

Če nrdim vector< vector< int > > A; in pol hočm dostopat kot npr. A[0][0] mi javi segmentation fault

Cofko Cof ::

Tud 1024 x 1024 bi mogl delat(no odvisno od tega kaj so tvoji elementi v tabeli).

Evo kle maš naki za sprehod skoz tvojo matriko vektorjev, pišem iz glave tko, da nism 100% ziher:

for(int i=0;i < A.size(); i++)
{
std:: vector B = A.at(i);
for(int j=0;i < B.size(); j++)
{
std::string strd = B.at(j);
}
}

Lohk pa tud uprabš tist kar ti je BigWhale napisov, sj zgoraj sm ti pokazov kako dostopat do stvari, če maš linearno vse skupaj. Lahko si kr napišeš dve funkciji, za lažji dostop):

#DEFINE int dimension = 1024;
int AGet(int i, int j)
{
return A[dimesnion * j + i]
}

int ASet(i,j,value)
{
A[dimension * j + i] = value;
return 0;
}

In maš tkorekoč normalno tabelo, ko hočeš nastavit vrednost samo namesto A[1][1] = 5; narediš ASet(1,1,5), in namesto b = A[1][1]; imaš sedaj b = AGet(1,1).
Ars longa,vita brevis.

Zgodovina sprememb…

rapvirus ::

Ok bom probala tko narest. Sej zdej ko gledam se mi zdi prou simpl vse. Hvala vsem za odgovore. LP :)

BigWhale ::

Ne kompliciraj si zivljenja z vector vector meckanjem. Vse skupaj lahko stlacis v en vector katerega stevilo elementov dolocis kar kot 1024x1024.

Do elementov pa potem dostopas precej podobno kot je Cof napisal.

Zavij si ta vektor v en razred in si napisi metode za branje in pisanje v 2D matriko pa je problem resen.

Jean-Paul ::

Nekateri smo pristaši takega načina dela z matrikami:
#include <iostream>

class matrix
{
public:  
  matrix::matrix(int nrows,int ncols)
    {
      a_=(double**)malloc(nrows*sizeof(double*)+nrows*ncols*sizeof(double));
      a_[0]=(double*)(a_+nrows);
      for(int i=1;i<nrows;i++)
	a_[i]=a_[0]+i*ncols;
    }
  matrix::~matrix()
    {
      free(a_);
    }
  double*& operator[](int row)
    {
      return a_[row];
    }
private:
  double** a_;
};

int main(void)
{
  matrix A(1024,1024);

  for(int i=0;i<1024;i++)
    for(int j=0;j<1024;j++)
      A[i][j]=0.0;

  for(int i=0;i<1024;i++)
    for(int j=0;j<1024;j++)
      std::cout << A[i][j] << "\n";

  return 0;
}


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C++] Ali je mogoče?

Oddelek: Programiranje
161522 (998) Ciklamen
»

programiranje v c++

Oddelek: Programiranje
51786 (1552) Tutankhamun
»

c++ in linux/windows

Oddelek: Programiranje
121633 (1509) rapvirus
»

std containers vs. own custom containers

Oddelek: Programiranje
93563 (3384) Mmm'Aah
»

[c++] Pomoč pri izdelavi std::vector "wrapperja"

Oddelek: Programiranje
81516 (1417) zhigatsey

Več podobnih tem