Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Nymik
Člen
Avatar
Nymik:31.8.2014 17:14

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
Tvůrce
Avatar
Odpovídá na Nymik
Artas:31.8.2014 17:51

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
Tvůrce
Avatar
Odpovídá na Nymik
tomisoka:31.8.2014 18:02

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
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na tomisoka
Lukáš Hruda:31.8.2014 18:24

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
Tvůrce
Avatar
Odpovídá na Lukáš Hruda
tomisoka:31.8.2014 18:35

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:1.9.2014 6:37

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.