Nejasnost v C++

ennyque

Nejasnost v C++
« kdy: 10. 04. 2013, 18:24:05 »
Dobrý den, chtěl bych Vás poprosit o radu. Když jsem se snažil v cpp vytvořit dynamicky matici, nakonec se mi nepodařilo zkompilovat nic jiného než:

Kód: [Vybrat]
int **prvky;

typedef int* uint;

prvky = new uint[dimx];

for ( int j = 0; j < dimy; j++)
{
   prvky[j] = new int[dimy];
}

Ale co jsem nepochopil, proč to nejde udělat bez typedef nového typu uint.

Nevíte prosím, jaký mechanismus, předpis, zabraňuje použití:  prvky= new (int*)[dimx];

děkuji za případnou radu.
Honza
« Poslední změna: 10. 04. 2013, 20:47:07 od Petr Krčmář »


Jakub Galgonek

Re:nejasnost v C++
« Odpověď #1 kdy: 10. 04. 2013, 18:38:27 »
Nevíte prosím, jaký mechanismus, předpis, zabraňuje použití:  prvky= new (int*)[dimx];

Vadí mu ty závorky, zkus: prvky = new int*[dimx];

Mimochodem, v cyklu máš špatně podmínku.

ennyque

Re:nejasnost v C++
« Odpověď #2 kdy: 10. 04. 2013, 18:45:27 »
Skutečně, děkuji.

Nevíte do hloubky, co Ty závorky způsobily, že to nešlo přeložit?

Honza

Jakub Galgonek

Re:nejasnost v C++
« Odpověď #3 kdy: 10. 04. 2013, 19:08:09 »
Nevíte do hloubky, co Ty závorky způsobily, že to nešlo přeložit?

No, pravidla neumožňují sázet u definic typů závorky jen tak. Ale zase nějak extra hluboko do toho nevidím.

ertwertwertwe

Re:nejasnost v C++
« Odpověď #4 kdy: 10. 04. 2013, 20:49:26 »
#include <stdio.h>
#include <stdlib.h>
#define DIMX 10
#define DIMY 20

int main()
{

//int **prvky = (int**) malloc (DIMX * sizeof (int*)); <-- takto je to v C
int **prvky = (int**) new int*[DIMX];
int i,j;


for (j = 0; j < DIMY; j++)
{
           //prvky[j] = (int*) malloc (DIMY * sizeof (int)); <-- takto je to v C
           prvky [j] = (int*) new int[DIMY];
}

for (i=0;i<DIMX;i++)
 for (j=0;j<DIMY;j++) {

         prvky[j] = i+j;
 }

for (i=0;i<DIMX;i++) {
 for (j=0;j<DIMY;j++)
         printf ("%d ",prvky[j]);
 printf ("\n");
 }

return 0;
}


DK

Re:Nejasnost v C++
« Odpověď #5 kdy: 10. 04. 2013, 21:01:30 »
Citace
prvky [j] = (int*) new int[DIMY];
a ja blbec myslel, ze v c++ je to delane prave tak, aby se predeslo tomu zbytecnemu pretypovani  :-X no asi jsem se spletl :)

mchf

Re:Nejasnost v C++
« Odpověď #6 kdy: 10. 04. 2013, 21:03:32 »
Nevíte do hloubky, co Ty závorky způsobily, že to nešlo přeložit?
Se zavorkama se to interpretuje jako "ukazatel typu int na pole" no a to nedava moc smysl.

xcvcdvsd

Re:Nejasnost v C++
« Odpověď #7 kdy: 10. 04. 2013, 21:18:29 »
Citace
prvky [j] = (int*) new int[DIMY];
a ja blbec myslel, ze v c++ je to delane prave tak, aby se predeslo tomu zbytecnemu pretypovani  :-X no asi jsem se spletl :)

oprator new ma tuto definici:
void* operator new[]

taky vraci void* stejne jako malloc.

Jakub Galgonek

Re:Nejasnost v C++
« Odpověď #8 kdy: 10. 04. 2013, 21:25:40 »
taky vraci void* stejne jako malloc.

Musím tě zklamat, ale nemáš pravdu.

xcvcdvsd

Re:Nejasnost v C++
« Odpověď #9 kdy: 10. 04. 2013, 21:34:15 »
taky vraci void* stejne jako malloc.

Musím tě zklamat, ale nemáš pravdu.

japato???

void *malloc(size_t size);
http://linux.die.net/man/3/malloc

void* operator new (std::size_t size);
http://www.cplusplus.com/reference/new/operator%20new/

Jakub Galgonek

Re:Nejasnost v C++
« Odpověď #10 kdy: 10. 04. 2013, 21:42:50 »
void* operator new (std::size_t size);
http://www.cplusplus.com/reference/new/operator%20new/

Vždyť tam také volají new bez přetypování :D. Ona hlavička operátoru new je jedna věc a hodnota výrazu new je věc druhá. Zkus si třeba přeložit tohle:

Kód: [Vybrat]
struct c {
    int x;
};

int main() {
    (new c)->x = 0;
}

j

Re:Nejasnost v C++
« Odpověď #11 kdy: 10. 04. 2013, 21:47:21 »
Kód: [Vybrat]
int **prvky;

typedef int* uint;

prvky = new uint[dimx];

for ( int j = 0; j < dimy; j++)
{
   prvky[j] = new int[dimy];
}
Vykašli si na tyhle hrůzy s ruční alokací paměti a použij něco praktičtějšího a čitelnějšího, třeba boost matrix:
http://www.boost.org/doc/libs/1_53_0/libs/numeric/ublas/doc/matrix.htm

vyvojar

Re:Nejasnost v C++
« Odpověď #12 kdy: 11. 04. 2013, 07:29:05 »
Co se s tim patlat :)

 
Kód: [Vybrat]
const int rows = 10;
 int ** matrix =  (int **)new char[sizeof(int *) * rows ];

Jakub Galgonek

Re:Nejasnost v C++
« Odpověď #13 kdy: 11. 04. 2013, 07:56:43 »
Co se s tim patlat :)

Kód: [Vybrat]
const int rows = 10;
 int ** matrix =  (int **)new char[sizeof(int *) * rows ];

Nemůže v tomto případě (u některých architektur) nastat problém se zarovnáním? To přetypování by dokonce za jistých okolností, pokud se nepletu, mohlo změnit hodnotu adresy vrácené new.

vyvojar

Re:Nejasnost v C++
« Odpověď #14 kdy: 11. 04. 2013, 08:10:55 »
Co se s tim patlat :)

Kód: [Vybrat]
const int rows = 10;
 int ** matrix =  (int **)new char[sizeof(int *) * rows ];

Nemůže v tomto případě (u některých architektur) nastat problém se zarovnáním? To přetypování by dokonce za jistých okolností, pokud se nepletu, mohlo změnit hodnotu adresy vrácené new.

Tak to nevim, snad by se nějaká optimalizace zarovnání nebo něco takového musela povolit explicitně. Sémanticky ten příklad dává smysl, tak by se to mělo doufám přeložit a taky fungovat očekávaným způsobem.