Въпрос за оператора new в C++

10 отговора 531 прегледа
#1

Въпрос за оператора new в C++

Може ли някой да ми каже как да заделям динамично многомерни (тримерни) масиви с оператор new в C++, като и трите размерности се заделят динамично? Нещо от сорта на:
double *p = new mas [x][y][z] - така не може.
Обикновено първите две са константи, а динамично се заделя само третата.
Например:
double *p = new mas [2][3][x]
Май трябва да се предефинира [] или new.

Отговор
в отговор на Larkin #2

Re: Въпрос за оператора new в C++

ne mozesh li da napravish

p = (typecast) new whatever_array_element_type_is [x*y*z];

no typa na masiva kam koito kastvash, vse pak triabva da e s fiksirani parvi razmernosti, ako iskash vsichko da e dinamichno prosto shte triabva da rabotish s ednomeren masiv

Пламен

Редактирано от Плaмeн на

Отговор
в отговор на Плaмeн #3

Re: Въпрос за оператора new в C++

[линк]

tam sum napisal kak stava :-)

Отговор
в отговор на Larkin #4

Re: Въпрос за оператора new в C++

Teoretichno nevyzmojno e. V C++ masivite ne sa obekti => ne si pomnyat razmernostta => ako imash poveche ot 1 nefiksirana razmernost, kompilatoryt nyama da moje da generira mashinen kod, koyto da izchislyava adresa na dadena kletka.
Izpolzvay predlojenieto na Plamen (sam da si (de)linealizirash masiva).

Отговор
в отговор на Larkin #5

Re: Въпрос за оператора new в C++

Ето така става, но не знам дали ще успееш да го разбереш...

int ***Alloc_3DArray(int x, int y, int z)
{
int ***ppp3DArray;
int n, n1;

ppp3DArray = new int**[x];
for(n=0; n<x; n++)
{
ppp3DArray[n] = new int*[y];
for(n1=0; n1<y; n1++)
{
ppp3DArray[n][n1] = new int[z];
}
}

return ppp3DArray;

}


void Free_3DArray(int ***pppArr, int x, int y, int z)
{
int n, n1;

for (n=0; n<x; n++)
{
for(n1=0; n1<y; n1++)
{
delete [] pppArr[n][n1];
}
delete [] pppArr[n];
}

delete [] pppArr;
}


int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
int ***ppp3DArray = Alloc_3DArray(10, 1, 2);

ppp3DArray[9][0][1] = 42;

Free_3DArray(ppp3DArray, 10, 1, 2);

return 0;
}


Я вышел им наперерез...
Отговор
в отговор на MиГ #6

Re: Въпрос за оператора new в C++

Между другото, тая хуйня що ми разкарва табулациите?
Много е грозно така и ме дразни....


Я вышел им наперерез...
Отговор
в отговор на Larkin #7

Re: Въпрос за оператора new в C++

Ами така както го искаш не става (или поне според мене не става).
Най-добре ще е да си направиш твой си клас (или още по-добре template), който да приема 3-те размерности в конструктора си и после - както ти писаха останалите - има много начини да си заделиш паметта.

Отговор
в отговор на Larkin #8

Re: Въпрос за оператора new в C++

Ako *naistina* si siguren, che dve ot razmernostite sa fiksirani - zaebi klasovete. S tjah samo shte imash masa izlishen C++ overhead.

Ako ne si siguren, shte trjabva da polzvash post-natite po-rano reshenija - te shte rabotjat vinagi.


typedef int DVE_NA_TRI[2][3];

int main()
{
int n = 7;
DVE_NA_TRI* p = new DVE_NA_TRI[n];

for(int i = 0; i < n; i ++)
for(int j = 0; j < 2; j ++)
for(int k = 0; k < 3; k ++)
p[ i ][ j ][ k ] = i + j*10 + k*100;

Отговор
в отговор на manski #9

Re: Въпрос за оператора new в C++

int dim_a, dim_b, dim_c; //размерност на масива
int ind_a, ind_b, ind_c; //променливи за индекс в масива

type v, *p = new type[dim_a * dim_b * dim_c]

v = *(p + (dim_a * dim_b * ind_c) + (dim_a * ind_b) + (ind_a));

Отговор
в отговор на manski #10

Опа, отиде по-надясно

Предишният пост беше за Larkin

Отговор
в отговор на - #11

Re: Въпрос за оператора new в C++

Ако за горното използваш и препроцесора, става така:

#define ARRAY(a,b,c) *(p + (dim_a * dim_b * (c)) + (dim_a * (b)) + (a))


v = ARRAY (3,5,7);
И това става най-чисто с един клас, няма никакъв овърхеад, всичко е inline.

Отговор