Dynamicke pole – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Dynamicke pole – C / C++ – Fórum – Programujte.comDynamicke pole – C / C++ – Fórum – Programujte.com

 

Earl Cash0
Věrný člen
16. 11. 2007   #1
-
0
-

mam dotaz ohledne tvorby dynamickeho pole sam jsem si napsal takovy maly priklad ktery vytvori matici o NxN jenomze predpokladam ze existuje i jina moznost jak takovy to priklad resit. jde mi hlavne o to pouzit nejrychlejsi, nejlepsi reseni.



#include <stdio.h>
#include <stdlib.h>

void zmen(int *p_x, int *p_y) {

scanf("%d %d", p_x, p_y);

}


int main() {

int x = 0, y = 0;
int pole[x][y];
int *p_x, *p_y;
int i, j;

printf("Zadejte rozmery pole (x, y): ");
zmen(&x, &y); // nacti hodnoty

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

for(j=0; j<=y; j++) {

pole[i][j] = 100;
printf("Prvek [%d] [%d] hodnota %d\n", i, j, pole [i][j]);

}

}

system("pause");
return 0;
}


omlouvam se pokud jiz existuje podobny/stejny topic.

Nahlásit jako SPAM
IP: 217.197.150.–
Oh my goodness, shut me down! Machines making machines. How perverse. (C-3PO)
sn3d0
Věrný člen
16. 11. 2007   #2
-
0
-

To Earl Cash :Priznam sa ze takto vytvarat dynamicke polia na zasobniku som este nevydel a teda neviem povedat ci je to spravne alebo nie ale pride mi to minimalne zvlastne ale funguje to :) co je pre teba dobra sprava.

Nahlásit jako SPAM
IP: 213.151.208.–
shutdown -h now
croniak0
Newbie
16. 11. 2007   #3
-
0
-

1) me to teda nefunguje, pro ruzne velikosti pole to segfaultuje
2) ani to podle nema fungovat - na stacku to podle me vytvori pole[0][0] a pak se to snazi zapisovat do pameti, ktera tomu nepatri

Nahlásit jako SPAM
IP: 62.84.145.–
Earl Cash0
Věrný člen
16. 11. 2007   #4
-
0
-

me tento priklad funguje pro jakoukoliv velikost pole, ale jak rikam zda se mi to prilis zdlouhave. napadlo me prvni alokovat pamet napr. velikosti integeru a pote nacist samotne hodnoty. ovsem zajimalo by me jak to resite vy :)

Nahlásit jako SPAM
IP: 217.197.150.–
Oh my goodness, shut me down! Machines making machines. How perverse. (C-3PO)
yaqwsx+9
Posthunter
16. 11. 2007   #5
-
0
-

Nejsem si uplne presne jisty,ceho chces docilit.Pokud chces, aby jsi nemusel znat velikost pole pri prekladu, tak neco takoveho umi trida allocator v hlavicce <memory>

Nahlásit jako SPAM
IP: 85.160.80.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
croniak0
Newbie
16. 11. 2007   #6
-
0
-

To Earl Cash : Ale ono jestli ti to zrovna nahodou funguje, rozhodne neznamena ze je to spravne a ze pokud nahodou treba v kompilatoru nezapnes nejaky optimalizacni switch, tak se to nerozbije. Priklad jak to napriklad u me pada - spusteno z GDB:

(gdb) run
Starting program: /home/vlada/yyy
Zadejte rozmery pole (x, y): 10 10
Prvek [0] [0] hodnota 100
Prvek [0] [1] hodnota 100
Prvek [0] [2] hodnota 100
Prvek [0] [3] hodnota 100
Prvek [0] [4] hodnota 100
Prvek [0] [5] hodnota 100
Prvek [0] [6] hodnota 100
Prvek [0] [7] hodnota 100
Prvek [0] [8] hodnota 100
Prvek [0] [9] hodnota 100

Program received signal SIGSEGV, Segmentation fault.
0x08048523 in main () at yyy.c:27
27 printf("Prvek [%d] [%d] hodnota %d\n", i, j, pole [i][j]);

Nahlásit jako SPAM
IP: 62.84.145.–
croniak0
Newbie
16. 11. 2007   #7
-
0
-

To yaqwsx : nebo si to proste jednoduse naalocovat pres malloc/new

Nahlásit jako SPAM
IP: 62.84.145.–
_k_
Duch
16. 11. 2007   #8
-
0
-

To Earl Cash : Funfuje ti to uplne nahodou lebo to pole mas vytvorene na stacku a ten stack nie je dlhy 1*sizeof(int) (a ty mas vytvorene pole[0][0]) ale o dost viac (napr. mne to segfaultlo pri [0][9]), kazdopadne, robit to takto neni dobry napad.

To pole musis normalne alokovat, napr. takto



int **pole;
...
pole = malloc(sizeof(int)*x);
for(i=0;i<x;i++)
pole[i] = malloc(sizeof(int)*y);
...
for(i=0;i<x;i++)
free(pole[i]);
free(pole);


A este v tom for cykle ma byt ostra nerovnost, lebo ty mas pole o dlzke x ale pristupujes k prvku x+1 (indexovanie zacina od 0)

Nahlásit jako SPAM
IP: 195.91.54.–
croniak0
Newbie
16. 11. 2007   #9
-
0
-

nebo pokud nepotrebujes ruznou delku radek:

int **pole;

...
pole = malloc(sizeof(int) * x * y);
...
//pristup
for(i = 0; i < x; i++)
for(j = 0; j < y; j++)
printf("%d", pole[i * x + j]);
...
free(pole);

Nahlásit jako SPAM
IP: 62.84.145.–
croniak0
Newbie
16. 11. 2007   #10
-
0
-

To croniak : pardon pak je tam na zacatku samozrejme jen int *pole;

Nahlásit jako SPAM
IP: 62.84.145.–
dargorar
~ Anonymní uživatel
19 příspěvků
16. 11. 2007   #11
-
0
-

To Earl Cash :

No ja na pole pouzivam z STL kontejner vector, ale jedna se jiz o C++ a ne o ciste C.

#include <vector>

using namespace std;

vector< vector<int> > pole;

Nahlásit jako SPAM
IP: 88.100.24.–
tmi0
Věrný člen
16. 11. 2007   #12
-
0
-

vector je sice jednoduchej co se tyce uziti v praxi, ale preci jen mi prijde ze neni tolik efektivni... nekdy staci napsat si jednoduchy pole. a kdyz by si chtel vicerozmerny pole, moc si vektorem nepomuzes (aspon myslim ze na ne zadna sablona neni, musel bys udelat pole vektrou/ukazatelu)...

Nahlásit jako SPAM
IP: 89.185.230.–
ksp.mff.cuni.cz -- doporučuje 5 z 0 přetečených bufferů!
Earl Cash0
Věrný člen
16. 11. 2007   #13
-
0
-

diky vsem za nazor. co se tyce dotazu yaqwsx ceho chci dosahnout: je to jednoduchy prikladek, ve kterem stoji abych vytvoril pole (matici) o NxN prvcich. rozmer matice zadava uzivatel !!!

Nahlásit jako SPAM
IP: 193.85.184.–
Oh my goodness, shut me down! Machines making machines. How perverse. (C-3PO)
tmi0
Věrný člen
16. 11. 2007   #14
-
0
-

ten tvuj priklad by fungoval kdyz bys dal prvne nacteni rozmeru pole a pak az alokaci pole pomoci int pole[x][y].
nejsem si ale jist kde se to pole alokuje. vzhledem ke zpusobu deklarace bych predpokladal ze to bude staticke pole, ovsem na druhou stranu x a y nejsou konstanty takze by to pole staticke byt nemelo! jenze nikde pro nej nealokujeme manualne pamet ani ji neuvolnuje... tak nejak intuitivne tusim ze to pole je dynamicke, a prekladac to volani sam optimalizuje s pouzitim alokovacich/dealokovacich funkci.

jinak manulane to lze alokovat formou tzv. pristupoveho vektoru, kdy ukazateli na ukazatel na typ (tedy napr. int**) priradis
n ukazatelu na typ (tedy napr. int **a = new int*[n];) a kazdemu prvku priradis m prvku (tedy a[i]=new int[m]), k poli lze pote pristupovat jak pomoci operatoru *: *(*(a+i)+j), tak pomoci operatoru []: a[i][j].
nebo je-li jeden z rozmeru matice konstantni lze napsat proste: int (*matice)[n] = new int[m][n], kde n je konstanta.

Nahlásit jako SPAM
IP: 89.185.230.–
ksp.mff.cuni.cz -- doporučuje 5 z 0 přetečených bufferů!
_k_
Duch
16. 11. 2007   #15
-
0
-

To tmi : Tak ako hovoris(najprv nacitat potom deklarovat) to fungovat moze, no nemalo by. Typujem, ze si kompiloval s gcc (g++), skus si pridat flag -pedantic a povie ti ze : error: ISO C++ forbids variable-size array ‘pole’. Takze by to ziadna rozumne uvazujuca bytost pouzivat nemala ;).
A kompiler (v mojom pripade g++) nic nealokoje len robi sialenstva na stacku, ktore som z disassemblu nepochopil ;). Avsak jedine call ktore tam bolo bolo zmen() a printf() (a ani ziadny syscall - sysenter/int 0x80). Nehovorim, ze sa to inde(iny prekaldac) nerobi inak, ale taketo veci to mozu len pokazit imho.

Nahlásit jako SPAM
IP: 195.91.54.–
croniak0
Newbie
16. 11. 2007   #16
-
0
-

Proste se smirte s tim ze kdyz chcete v C dynamicky pole, tak ho proste musite nekde alokovat, nebude vam fungovat jen tak samo od sebe :)

Kdyz uz byl zminen vector, tak kdyby to bylo v C++ a ne v C, tak treba takhle:

#include <iostream>

#include <vector>

using namespace std;

int main(void)
{
int x = 0, y = 0;
vector< vector<int> > pole;

cout << "Zadejte rozmery pole(x y): ";
cin >> x >> y;

pole.resize(x);
for(int i = 0; i < x; i++)
pole[i].resize(y);

for(int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
pole[i][j] = 100;
cout << "Prvek [" << i << "] [" << j << "] hodnota " << pole[i][j] << endl;
}
}
}

Nahlásit jako SPAM
IP: 195.47.114.–
dargorar
~ Anonymní uživatel
19 příspěvků
16. 11. 2007   #17
-
0
-

tmi napsal:
vector je sice jednoduchej co se tyce uziti v praxi, ale preci jen mi prijde ze neni tolik efektivni... nekdy staci napsat si jednoduchy pole. a kdyz by si chtel vicerozmerny pole, moc si vektorem nepomuzes (aspon myslim ze na ne zadna sablona neni, musel bys udelat pole vektrou/ukazatelu)...



nemusis delat pole ukazatelu na vektor, ale presne tak jak to pise croniak( i ja jsem to pred tim psal v mem prispecku) vector< vector<int> > pole;

Nahlásit jako SPAM
IP: 88.100.24.–
tmi0
Věrný člen
18. 11. 2007   #18
-
0
-

To dargorar : tak vektor vektoru no... furt je to vektor).

To _k_ : jo komiluju to v g++... prave proto sem rikal ze to je jakesi divne pac to je v rozporu se standardem, ale zkoumat to v assu se mi fakt nechtelo...

Nahlásit jako SPAM
IP: 89.185.230.–
ksp.mff.cuni.cz -- doporučuje 5 z 0 přetečených bufferů!
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 19 hostů

Podobná vlákna

Dynamicke pole — založil george6565

Ne/dynamicke pole — založil cecilconrad

Dynamicke 2rozmerne pole — založil light_c_programator

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý