C++ ukazatele

Programovacie jazyky, rady, poradňa...
reDo
Star
Star
Používateľov profilový obrázok
Príspevky: 661
Registrovaný: 26 apr 2009, 18:36
Bydlisko: 00100100
Kontaktovať používateľa:

C++ ukazatele

Príspevok od používateľa reDo »

mam tu jeden program na pochopenie ukazatelov a chem vediet ci by fungoval lebo mne nejde spustit chcem sa zdokonalit v pouzivani ukazatelov pri pristupe ku viacrozmernemu polu zabudol som to a teraz to nwm poradte pls

Kód: Vybrať všetko

#include <iostream>


using namespace std;

int main()
{
int * ar[2][2];


for(int i=0;i<2;i++)
for(int m=0;m<2;m++)
*ar[i][m]=1;



for(int c=0;c<2;c++)
for(int x=0;x<2;x++)
cout<<*ar[c][x];


system("pause");
return 0;
}
tuti
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 740
Registrovaný: 01 okt 2006, 19:23
Bydlisko: Prievidza

Príspevok od používateľa tuti »

bez tych hviezdiciek...lebo takto spravis 2x2 maticu ukazatelov na int ale tie ukazatele nemaju kam ukazovat kedze do nich nepriradujes ziadnu pamat.
reDo
Star
Star
Používateľov profilový obrázok
Príspevky: 661
Registrovaný: 26 apr 2009, 18:36
Bydlisko: 00100100
Kontaktovať používateľa:

Príspevok od používateľa reDo »

aha a ako by som spravil teda to ze by som pomocou uzkazatelou v nejakej funkcii pristupoval k polozkam dvojrozmerneho pola?
c-ice
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 475
Registrovaný: 04 mar 2008, 15:18
Kontaktovať používateľa:

Príspevok od používateľa c-ice »

Všetko ohladom tohoto aj ked je to pre C najdeš napr. tu podla mna velmi dobre je to spracovane a neviem podla čoho sa učíš ale tak tu je iste lepšie vysvetlene ...
http://people.tuke.sk/igor.podlubny/C

ukazovat ako ti napisal tam.. nema to kam ukazovat tak keby si to radsej takto nejak podobne spravil (neviem či to nehodi chybu)

Kód: Vybrať všetko

   int ar[2][2];
   int *pointer;
   pointer=ar;
PS: Už ti AudioTrack myslým písal aby si formátoval ten kód čo sem dávaš je to neprehladné
tuti
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 740
Registrovaný: 01 okt 2006, 19:23
Bydlisko: Prievidza

Príspevok od používateľa tuti »

tu mas vytvorenie takeho pola 10x10:

Kód: Vybrať všetko

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

void main(void)
{
int **a;
int i=10;

if ( ( a = (int **)malloc(i*sizeof(int*)) ) == NULL )
    {
    printf("\nError, memory not allocated.\n");
    exit(1);
    }

for (int cnt=0;cnt<i;cnt++)
if ( ( a[cnt] = (int *)malloc(i*sizeof(int)) ) == NULL )
    {
    printf("\nError, memory not allocated.\n");
    exit(1);
    }
...
}
reDo
Star
Star
Používateľov profilový obrázok
Príspevky: 661
Registrovaný: 26 apr 2009, 18:36
Bydlisko: 00100100
Kontaktovať používateľa:

Príspevok od používateľa reDo »

uhm dikes pozriem
feromakovi
Expert
Expert
Príspevky: 165
Registrovaný: 24 okt 2008, 14:16
Bydlisko: Bánovce nad Bebravou

odpoveĎ

Príspevok od používateľa feromakovi »

veď je to dobré až nato že tam nemajú byť tie hviezdičky pretože to statické pole je v skutočnosti pointer, kt ukazuje na miesto v pamäti. takže keď z tade odstrániš hviezdičky a zadeklaruješ tie integer premenné tak ti to pôjde.
alebo tiež sa to dá vytvoriť to pole dynamicky ako písal tuti.

to c-ice:
neviem ale myslím že je celkom zbytočné používať ďalší pointer. Neviem kde by ti to malo pomôcť v takomto jednoduchom zadaní. Akože je to to isté len aby si reda zbytočne nedomýlil :)
johny3212
Star
Star
Používateľov profilový obrázok
Príspevky: 532
Registrovaný: 17 feb 2008, 19:56
Bydlisko: Terchova
Kontaktovať používateľa:

Príspevok od používateľa johny3212 »

feromakovi ukazovatel a pole je to iste...
Redo robis to v C alebo moze byt aj C++ ?, lebo ak dobre vies som ti uz posielal jeden zdrojak :).

redo ak spravis toto
int pole[8][8];
tak ti natvrrdo vytvori pole v pamati, ak pouzijes ukazovatele
int** pole;
, tak tam mas taku vyhodu, ze velkost mozes alokovat a prealokovat pocas behu programu.
takto, ak to je ciste C tak pomocou malloc, ako ti dali hore priklad, ak C++ tak mozes pocou new, nasledovne.

Kód: Vybrať všetko

//deklaracia dvojroz. pola, alebo ukazovatel na ukazovatel na int.
int ** pole;

//jeho alokovanie v pamati :).
        pole = new char* [8];
	for (int i=0; i<W; i++)
	pole[i] = new char [8];
//alokuje sa pole o velkosti 8x8
ci uz pouzijes int pole[8][8], alebo int** pole;..., v podstate pristup sa nemani a k obidvom prispujes rovnako, cize prva adresa je pole a jeho hodnota pole[0][0]. Dostuduj si operator new.

dalej, iba pre zaujimavost u dynamickej pamate.:
vzdy treba neak zaalokovat iba prvu hodnotu a ked predavas parameter inde alebo do funkcie, tak ostatne deklaracie uz nemusis alokovat
priklad:

Kód: Vybrať všetko

int** pole1; //deklaracia

        pole1 = new char* [8];
	for (int i=0; i<8; i++)
	pole1[i] = new int [8]; //alokacia

int ** pole2; // deklarujes nove pole.
pole2 = pole1; // ak mu predas zaalokavane pole, tak pole 2 nemusis samo alokovat, zaalokuje ho pole1

// nakoniec vymazanie
for (int i=0; i<8; i++) //
	   delete pole2[i];
	delete[] pole2;

for (int i=0; i<8; i++) //
	   delete pole1[i];
	delete[] pole1;
ak nerozumies samotnym ukazovatelom, tak si to nastuduj, je toho vsade vela :).
feromakovi
Expert
Expert
Príspevky: 165
Registrovaný: 24 okt 2008, 14:16
Bydlisko: Bánovce nad Bebravou

Príspevok od používateľa feromakovi »

johny3212 napísal:feromakovi ukazovatel a pole je to iste...
ja som napísal: pole je v skutočnosti pointer... :D takže som rád že sme sa zhodli len nerozumiem prečo ma opakuješ :)
johny3212
Star
Star
Používateľov profilový obrázok
Príspevky: 532
Registrovaný: 17 feb 2008, 19:56
Bydlisko: Terchova
Kontaktovať používateľa:

Príspevok od používateľa johny3212 »

feromakovi napísal:ja som napísal: pole je v skutočnosti pointer... :D takže som rád že sme sa zhodli len nerozumiem prečo ma opakuješ :)
jj sorac, zle som si to precital v rychlosti :).

a redo toto ca si napisal :):

int * ar[2][2];

teoreticky by sa to dalo chapat ako 3-rozmerne pole :D .
reDo
Star
Star
Používateľov profilový obrázok
Príspevky: 661
Registrovaný: 26 apr 2009, 18:36
Bydlisko: 00100100
Kontaktovať používateľa:

Príspevok od používateľa reDo »

no dobre staci to v c++ a teraz keby ste mi tu dali priklad kde je pristup k prvkom pola dvojrozmerneho nejakou funkciou ktora to pole prijma ako parameter a meni hodnoty jednotlivych prvkov typu int napr
feromakovi
Expert
Expert
Príspevky: 165
Registrovaný: 24 okt 2008, 14:16
Bydlisko: Bánovce nad Bebravou

odpoveď

Príspevok od používateľa feromakovi »

takže princíp je jednoduchý...
ako porameter funkcie pošleš smerník na pole a jeho prvý rozmer ten druhý sa myslím dá poslať s poľom....
a nakoniec môžeš pole upraviť a ako return tej funkcie si pošleš pointer na to pole... čie niečo takéto:

Kód: Vybrať všetko

int *funkcia(int ar[][y],int *velkost)
{.
.
.
return ar;
}
proste ten prvý rozmer poľa nemôžeš posielať spolu s poľom a ten druhý rozmer môžeš.
johny3212
Star
Star
Používateľov profilový obrázok
Príspevky: 532
Registrovaný: 17 feb 2008, 19:56
Bydlisko: Terchova
Kontaktovať používateľa:

Príspevok od používateľa johny3212 »

alebo pomocou new takto, redo dobre sleduj ten kod, mas tam aj komentare.

Kód: Vybrať všetko

void ZmenHodnotu(int** pole2, int W, int H) {
//nasa funkcia ktora cez ukazovatele zmani pole,
//ktore mu das ako parameter
	for (int i = 0; i < W; i++) {
		for (int j = 0; j < H; j++) {
			pole2[i][j] = j;
		}
	}
//nemusis pouzivat navratovu hodnotu,
//pole2 ti ameni pole ktore zadas ako parameter
}

int main() {

	int** pole1; //deklaracia pola
	// alokujeme pole ako jednorozmerne pole na ukazovatel
	pole1 = new int*[4];
	for (int i = 0; i < 4; i++)
		pole1[i] = new int[4]; //alokujeme nas ukazovatel, vznikne pole 4x4

	//vypiseme pole po alokacii, bude nastavene na same nuly
	for (int i = 0; i < 4; i++) {
		for (int j = 0; j < 4; j++) {
			cout << pole1[i][j];
		}
		printf("\n");
	}
	printf("\n");
	//pouzijeme funkciu, ktora zmeni prvky pola
	//ako parameter daveme prvu adresu pola
	ZmenHodnotu(pole1, 4, 4);

	for (int i = 0; i < 4; i++) { //vypiseme pole po zmene
			for (int j = 0; j < 4; j++) {
				cout << pole1[i][j];
			}
			printf("\n");
		}
		printf("\n");

		for (int i = 0; i < 4; i++) //vymazeme pole
				delete pole1[i];
			delete[] pole1;

return 0;
}
reDo
Star
Star
Používateľov profilový obrázok
Príspevky: 661
Registrovaný: 26 apr 2009, 18:36
Bydlisko: 00100100
Kontaktovať používateľa:

Príspevok od používateľa reDo »

dikes nieco take som presne chcel
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

johny3212: neskúšal som to v editore, ale ako kukám tak zmenHodnotu nemení hodnotu ale rozsah hodnôt čo je dosť nezmyselná funkcia (a hľavne zavádzajúca vďaka tomu že sa volá inač ako čo skutočne robí) a

Kód: Vybrať všetko

for (int i = 0; i < 4; i++) //vymazeme pole
            delete pole1[i];
         delete[] pole1; 
by malo byť

Kód: Vybrať všetko

for (int i = 0; i < 4; i++) //vymazeme pole
            delete[] pole1[i];  //toto je tiež pole a nie iba jedna hodnota, lebo prechádzaš iba "vonkajším" cyklom
         delete[] pole1; 
aj tak by som radšej prechádzal oboma cyklamy a nespoliehal sa na to že po mne bude upratovať správca pamäte :)

..a máš tam ešte pár drobností ktoré sa ale dajú prehliadnúť
johny3212
Star
Star
Používateľov profilový obrázok
Príspevky: 532
Registrovaný: 17 feb 2008, 19:56
Bydlisko: Terchova
Kontaktovať používateľa:

Príspevok od používateľa johny3212 »

audiotrack funkcia zmenHodnotu pracuje tak ako ma, zmeni hodnoty vsetkych prvkov pola, ktore mu zadas ako parameter funkcie. Ele mozu tam byt chyby, mozno to delete, ale ja uz asi rok nepracujem moc s dynamickou pamatou a klasickymi poliami tiez malo, pouzivam vektory a mapy z STL a alokujem ich inteligentnymi pojtrami smart_ptr z kniznice boots, lepsie sa tak pracuje s prudmi dat, je to podobne principialne ako java. Pamat sa zaolukuje ked sa potrebuje a dealokuje automaticky, ked sa uz nepotrebuje, ked sa vypraznia vsetky sytemove prostriedky, netreba pouzivat delete :). Odporucam si dostudovat.....

Ale ten kusocek kodu robi to co ma, neboj :) a na vysvetlenie staci .....
Mno a dalsia vec, skutocne tu nemienim s niekym depadovat o kravinach, vsak audiotrack :) .
reDo
Star
Star
Používateľov profilový obrázok
Príspevky: 661
Registrovaný: 26 apr 2009, 18:36
Bydlisko: 00100100
Kontaktovať používateľa:

Príspevok od používateľa reDo »

diskusia o piskvorkach z vase vytvory presunuta sem

//autoeditácia príspevku ( 29 Nov 2009, 9:00 )
dorobi lsom farby, osetrenie vstupu porti inym cislam ked sa pokusite porusit poravidla mate druhu moznost ale nwm ako mam spravit osetrenie vstupu proti znakom namiesto cislam poradte pls
Prílohy
piskvorky.rar
v 2.0.0
(105.43 KiB) 15 stiahnutí
johny3212
Star
Star
Používateľov profilový obrázok
Príspevky: 532
Registrovaný: 17 feb 2008, 19:56
Bydlisko: Terchova
Kontaktovať používateľa:

Príspevok od používateľa johny3212 »

tak daj vsup char a nie int. osetri to iba na par znakov cez if a for., aby si nemohol ist mimo pola, lebo to pada potom a adresovanie prvkov pola sprav ako v sachoch, napr. (A1,C3.....)
reDo
Star
Star
Používateľov profilový obrázok
Príspevky: 661
Registrovaný: 26 apr 2009, 18:36
Bydlisko: 00100100
Kontaktovať používateľa:

Príspevok od používateľa reDo »

neda sa to nejake bez zmeny toho int na char pls? :roll:
johny3212
Star
Star
Používateľov profilový obrázok
Príspevky: 532
Registrovaný: 17 feb 2008, 19:56
Bydlisko: Terchova
Kontaktovať používateľa:

Príspevok od používateľa johny3212 »

a preco bez toho, daj dovod? Nechapem ta.Jednoducho tam daj char. to je uplne jedno a je to jednoducha a dobra cesta.
Napísať odpoveď