Diskuze: Naplnění 2d dynamického pole hodnotama C

C++ C a C++ Naplnění 2d dynamického pole hodnotama C

Avatar
Nymik
Člen
Avatar
Nymik:

Dobre den,

Rád bych poprosil o radu jak naplnit 2d pole hodnotama.
Bohužel se mi nedaří ho naplnit, tak jak bych potřeboval. Tedy při spuštění zvolím
počet řádků a sloupců např 2 * 3. Z nějakého důvodu mi program nabídne 7 hodnot pro zapsání což je problém, se kterým si nevím rady.Program dál vypisuje 6 hodnot, přesto, že jich bylo zadáno víc. Předem děkuji za odpověď, budu vděčný za jakoukoliv radu :).
Tady je můj kod:

#include <stdio.h>
#include <stdlib.h>
int AlokacePameti(in­t*** pole, int radky, int sloupce);

int main (int argc, char* argv[])
{
int i;
int j;
int ** pole;
int radky;
int sloupce;
int PocetRadku;
int PocetSloupu;

printf("Zadej pocet radku matice A: ");
scanf("%d", &radky);
printf("\nZadej pocet sloupcu matice A: ");
scanf("%d", &sloupce);

PocetRadku = radky;
PocetSloupu = sloupce;

AlokacePameti(&po­le, radky, sloupce);
printf("Zadejte hodnoty v matici: \n");

for (i = 0; i < radky; i++)
{
for (j = 0; j < sloupce; j++)
{
scanf("%d\n", &pole[i][j]);
}
}

printf("Matice A je: %d * %d\n", radky, sloupce);

for(i = 0; i<radky; i++)
{
for(j = 0; j < sloupce; j++)
printf("%d ", pole[i][j]);
printf("\n");
}

free(pole); //every c/malloc need a free
return 0;

}

int AlokacePameti(int *** pole, int radky, int sloupce){
int i;
*pole = (int**)malloc( sizeof(int *) * radky);

if (*pole == NULL){
printf("ERROR: out of memory\n");
return 1;
}

for (i=0;i<radky;i++){

(pole)[i] = (int)malloc( sizeof(int) * sloupce);
if ((*pole)[i] == NULL){
printf("ERROR: out of memory\n");
return 1;
}
}

printf("Alloca­ted!\n");
return 0;
}

 
Odpovědět 31.8.2014 17:14
Avatar
Artas
Redaktor
Avatar
Odpovídá na Nymik
Artas:

Ahoj, mas tam chybu v pretypovani u alokace pameti pro jednotlive sloupce a taky mas chybu v dealokaci pameti - dealokujes pouze pamet pro radky a pro sloupce ne. Takhle by to melo byt spravne:

#include <stdio.h>
#include <stdlib.h>
int AlokacePameti(int*** pole, int radky, int sloupce);

int main ()
{
int i;
int j;
int ** pole;
int radky;
int sloupce;

printf("Zadej pocet radku matice A: ");
scanf("%d", &radky);
printf("\nZadej pocet sloupcu matice A: ");
scanf("%d", &sloupce);

AlokacePameti(&pole, radky, sloupce);
printf("Zadejte hodnoty v matici: \n");

for (i = 0; i < radky; i++)
{
for (j = 0; j < sloupce; j++)
{
scanf("%d", &pole[i][j]);
}
}

printf("Matice A je: %d * %d\n", radky, sloupce);

for(i = 0; i<radky; i++)
{
for(j = 0; j < sloupce; j++)
printf("%d ", pole[i][j]);
printf("\n");
}

for (i = 0; i < radky; i++) {
    free(pole[i]);
}
free(pole); //every c/malloc need a free
return 0;

}

int AlokacePameti(int *** pole, int radky, int sloupce){
int i;
*pole = (int**)malloc( sizeof(int *) * radky);

if (*pole == NULL){
printf("ERROR: out of memory\n");
return 1;
}

for (i=0;i<radky;i++){

(*pole)[i] = (int*)malloc( sizeof(int) * sloupce);
if ((*pole)[i] == NULL){
printf("ERROR: out of memory\n");
return 1;
}
}

printf("Allocated!\n");
return 0;
}
 
Nahoru Odpovědět 31.8.2014 17:51
Avatar
tomisoka
Redaktor
Avatar
Odpovídá na Nymik
tomisoka:

1 ) Používej code (viz obrázek)
2 ) alokace a dealokace (viz Artas)
3 )

AlokacePameti(&pole, radky, sloupce);

Proč posíláš další pointer? Není lepší to poslat přímo?

Editováno 31.8.2014 18:03
 
Nahoru Odpovědět 31.8.2014 18:02
Avatar
Odpovídá na tomisoka
Lukáš Hruda (Luckin):

Když to pošle přímo, tak jakoukoliv paměť přiřadí tomu pointeru v parametru a ten pointer který je deklarován v main se nezmění a bude pořád ukazovat na nějakou "náhodnou" adresu.

 
Nahoru Odpovědět 31.8.2014 18:24
Avatar
tomisoka
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
tomisoka:

Aj :[ , já na vrácení hodnoty používám return, tak nějak jsem si to neuvědomil.

Editováno 31.8.2014 18:36
 
Nahoru Odpovědět 31.8.2014 18:35
Avatar
Nymik
Člen
Avatar
Nymik:

Moc děkuju za pomoc :).

 
Nahoru Odpovědět 1.9.2014 6:37
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.