dynaaminen muistin varaaminen kaksiulotteiselle taulukolle.
mikä on helpoin tapa varata muistia kaksiulotteiselle double taulukolle,
siten että taulukon alkiohin edelleen voitaisiin viitata samalla tavalla hakasulkujen avulla kuin staattisten taulukoiden kanssa. siis A[a][b]=3.3;
mikä on helpoin tapa varata muistia kaksiulotteiselle double taulukolle,
siten että taulukon alkiohin edelleen voitaisiin viitata samalla tavalla hakasulkujen avulla kuin staattisten taulukoiden kanssa. siis A[a][b]=3.3;
Vastaukset 6
Vanhimmat
niin dynaamisesti, että vaan viittaamalla johonkin taulukon alkioon sille varataan muistia.
Koodia kääntäessä ei tarvitse taulukon koon olla tiedossa, mutta ajon aikana pitää se koko tietää. Sen jälkeen varataan tilaa mallocilla ja sitten voi viitata alkioihin.
muistin varaaminenhan sinänsä on helppoa, malloc calloc,new jne. ongelmana vain on tuo tuossakin mainittu kahdella hakasulkuparilla viittaaminen. näyttää sille että kääntäjä aina vaatiii [][]taulukolle kiinteän koon. jos sitten muisti varataan double *A :lle, tai A[] :lle, se onnistuu, mutta A[a][b] viittaus ei onnistu, yksi riviseen A[a] viittaaminen kuitenkin onnistuu. Ratkaisua en tiedä, mutta muakin kiinnostaa. Ehkä jollakin makrolla? Olen kuullut että extern double viittauksella onnistuisi, mutta siinä ollaan ehkä heikoilla jäillä.
http://www.numis.northwestern.edu/fs98/fftw-1.3/doc/fftw_6.html
ratkaisu vuodelta 1984:
http://groups.google.fi/group/net.lang.c/browse_frm/thread/b1fb6d8ebe561aa9/129a3b38ff55ed18?lnk=st&q=malloc two dimensional table&rnum=11&hl=fi#129a3b38ff55ed18
#include
#include
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
using namespace std;
int main(int argc, char* argv[])
{
double **taulukko;
long rivit,sarakkeet;
long rind,sind;
rivit=3;
sarakkeet=2;
taulukko=new double*[rivit];
//Varataan tila kunkin rivin sarakkeille
for(rind=0;rind < rivit;rind )
{
taulukko[rind]=new double[sarakkeet];
}
//Kaikki taulukon alkiot alustetaan rivinumerolla
for(rind=0;rind < rivit;rind )
for(sind=0 ; sind < sarakkeet ; sind )
{
taulukko[rind][sind]=rind;
}
//Käytetään taulukkoa
//*******************
taulukko[0][1]=100;
cout
tuhannnet kiitokset vinkeistä,
miljoonat kiitokset dyntau.cpp kirjoittajalle.
new,tai kääntäjä, ymmärtää siis ** viittauksen edessä, mutta ei [][]viittausta jäljessä.
muuten, onko staattisten liukulukutaulukoiden nollaksi alustaminen memset(mpP,0,sizeof(mpP)); turvallista ja kelpoa myös tulevaisuudessaja onko se käyttöjärjestelmästä riippuvaista.
Se ** taulukkonimen edessä on ns kaksoisosoitin.
Netistä löytyy tietoa,millä tavoin sitä käytetään.
Ei kaikkea tosin tarvitse niin kovin tarkkaan tie-
tääkään jos osaa käyttää noita "palikoita".
Mainitsin vain siksi,että tälläista taulukkoa olis
i hyvä osata käyttää funktioista käsin ja kumpaankin suuntaan.