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

Vrátenie ukazovateľa na pole. – C / C++ – Fórum – Programujte.comVrátenie ukazovateľa na pole. – C / C++ – Fórum – Programujte.com

 

Tayson0
Stálý člen
7. 9. 2012   #1
-
0
-

Mám jeden menší problém a chcel by som požiadať o radu. Mám nejakú metódu ktorá mi vytvorí pole a potom si to pole respektíve ten prvý prvok poľa uložím do ukazovateľa v metóde. Vyzerá to nejako takto :

int *pole;

pole=&nejakepole[0][0];

return *pole;

Ak si vytovím v maine objekt a zavolám metódu v ktorej je naplnenie tohoto pola a vrátenie ukazovateľa tak neviem prijať adresu v maine. Potrebujem to preto lebo to chcem použiť v druhej metóde to pole. Alebo mi skúste poradiť iné riešenie ako predám pole z metódy do metódy. Ďakujem za pomoc.

Nahlásit jako SPAM
IP: 194.88.194.–
ingiraxo+15
Grafoman
7. 9. 2012   #2
-
0
-

teď nevim jestli ti rozumim dobře, ale ty chceš teda předat dvou-rozměrný pole do funkce a ve funkci s ním pracovat? pokud ano, tak normálně jako parametr funkce musíš dát ukazatel na pole ukazatelů, čili... int** pole, a další 2 parametry pro jeho velikosti 

void vypisPole(int** pole, int sirka, int vyska);

vstupy by spíše měli být konstantní, ale to je teď detail... pokud to máš matici tak stačí ofc. jeden rozměr místo dvou

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Tayson0
Stálý člen
7. 9. 2012   #3
-
0
-

#2 ingiraxo
Tak jedna metoda mi vytvori nejake pole a v druhej metode potrebujem menit niektore prvky pola a preto by som potreboval z prvej metody vratit ukazovatel a pouzit v duhej metode aby som mohol menit hodnoty jednotlivych prvkov.

Nahlásit jako SPAM
IP: 194.88.194.–
nvm
~ Anonymní uživatel
3 příspěvky
7. 9. 2012   #4
-
0
-

ak ti ale jedna metoda vytvori nejake pole tak po skonceni tejto metody budes ukazovat len na prazdny blok pamete nie?

Nahlásit jako SPAM
IP: 78.98.151.–
ingiraxo+15
Grafoman
7. 9. 2012   #5
-
0
-

víš pole je podstatě pole ukazatelů, takže když někam předáš pole do nějaký funkce, tak ho můžeš měnit jak je to libo :) zde už jak jsem zmínil můžeš nastavit vstup jako konstantu a nic nezměníš, ale to je mimo téma

jinak příklad: 

#include <iostream>
using namespace std;

void nejakaFunkce(int** pole, int size)
{
	int* prvniPrvek = *pole;

	*prvniPrvek = 1000; // [0][0] // zmenim i v poli
}

int main()
{
	const int rozmer = 5;
	int** pole = new int*[rozmer];

	for (int i = 0; i < rozmer; i++)
		*(pole + i) = new int[rozmer];

	nejakaFunkce(pole, rozmer); // predam matici a jeji rozmer

	return 0;
}
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Tayson0
Stálý člen
7. 9. 2012   #6
-
0
-

#5 ingiraxo
No to mi je jasné. Ale ak dám z metódy vrátit ukazovateľ tak ako ho prijmem a teda ako si ho uložím do nejakej premennej pretože ak zavolám metódu tak mi to pole vypíše ale mám tam aj return ktoré mi vracia ukazovatel a ten ukazovatel ja potrebujem vrátit a nie len zobrazit to pole ak zavolám metodu.

Nahlásit jako SPAM
IP: 194.88.194.–
nvm
~ Anonymní uživatel
3 příspěvky
7. 9. 2012   #7
-
0
-

ale on vravel ze chce pole vytvarat v metode a vracat ukazatel na toto pole

Nahlásit jako SPAM
IP: 78.98.151.–
ingiraxo+15
Grafoman
7. 9. 2012   #8
-
0
-

#6 Tayson
výše jsem ti napsal kód... jinak ty asi myslíš jak vrátit ukazatel na první prvek v poli přes funkci? jen upravim trochu co jsem psal 

// vrati ukazatel na prvni prvek v poli
int* getPtr(int** pole) { return *pole; }

// pouziti funkce v main()
int* prvniPrvek = getPtr(pole);
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Tayson0
Stálý člen
7. 9. 2012   #9
-
0
-

#7 nvm
Ano presne tak a ten ukazovatel si ulozit do nejakej premennej v Main() a potom tu premennu dat ako parameter do druhej metody kde budem vykonavat nejake ine operacie s polom.

Nahlásit jako SPAM
IP: 194.88.194.–
Tayson0
Stálý člen
7. 9. 2012   #10
-
0
-

#9 Tayson
A bude mi to fungovať aj medzi metodami v nejakej triede ?

Nahlásit jako SPAM
IP: 194.88.194.–
ingiraxo+15
Grafoman
7. 9. 2012   #11
-
0
-

#10 Tayson
aha ty myslíš teda toto? aby funkce vytvořila dvourozměrný pole a vrátila na něj ukazatel? 

int** createArray(int x, int y)
{
	int** pole = new int*[x];

	for (int i = 0; i < x; i++)
		*(pole + i) = new int[y];

	return pole;
}
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Tayson0
Stálý člen
7. 9. 2012   #12
-
0
-

#11 ingiraxo
Ano presne tak tak to myslim....Ale problem je v tom ze mi neberie return pole ale kompilator mi zoberie iba ak napisem return * pole.

Nahlásit jako SPAM
IP: 194.88.194.–
ingiraxo+15
Grafoman
7. 9. 2012   #13
-
0
-

#12 Tayson
no tak to máš spatněj kompilátor :) nebo sem cej celý jak to máš... jinak musí být return pole protože vracíš vícerozměrný pole

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Tayson0
Stálý člen
7. 9. 2012   #14
-
0
-

#13 ingiraxo

toto je prva metoda triedy :


int sachovnica::poc_sach()

{


    for(i=0;i<=5;i++)
    {
        for(j=0;j<=5;j++)
        {
          if((i+j)%2==0 && j<=1){sach[i][j]=1;}
          else if((i+j)%2==0 && j>=4){sach[i][j]=2;}
          else{sach[i][j]=0;}

        }
    }

    cout<<" ___ ___ ___ ___ ___ ___";
    for(i=0;i<=5;i++)
    {
        cout<<"\n|";
        for(j=0;j<=5;j++)
        {
         if(sach[i][j]==1 || sach[i][j]==2)
         {
             if(sach[i][j]==1){cout<<"_a_|";}
             if(sach[i][j]==2){cout<<"_b_|";}

         }
         else
         {cout<<"___|";}
        }
    }
     pole=&sach[0][0];
     return pole;

}

a ja potrebujem pomocou return do druhej metody tejto :

int sachovnica::zostav_sach()
{

}

ale neviem ako to tam dostat

Nahlásit jako SPAM
IP: 194.88.194.–
ingiraxo+15
Grafoman
7. 9. 2012   #15
-
+1
-
Zajímavé

#14 Tayson
ale proč? však píšeš, že to máš ve třídě, tak tam máš instanci toho dvourozměrného pole šach, není potřeba vracet returnem nic... a pokud chceš získat tu matici šach ven ze třídy, tam si do public: přidej funkci 

int** getSachy() const { return sach; }
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Tayson0
Stálý člen
8. 9. 2012   #16
-
0
-

#15 ingiraxo
takze ak si dam sach[m][n] ako private dajme tomu a pouzijem ho v metode jednej tak ak ho tam naplnim tak v druhej metode tej istej triedy mozem menit jeho hodnoty ak som spravne pochopil ? ale ak by som s tym cchcel pracovat v main tak by som mal pouzit to co si mi ty napisal tak ?ak som spravne pochopil 

Nahlásit jako SPAM
IP: 95.102.87.–
Tayson0
Stálý člen
8. 9. 2012   #17
-
0
-

#15 ingiraxo
a to slovicko const ak sa mozem opytat ?

Nahlásit jako SPAM
IP: 95.102.87.–
ingiraxo+15
Grafoman
8. 9. 2012   #18
-
0
-

#16 Tayson
ano přesně tak... a to const je tam proto, protože tato funkce nemůže měnit žádný hodnoty, u "gettrů" je to skoro pravidlo

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Tayson0
Stálý člen
8. 9. 2012   #19
-
0
-

#18 ingiraxo
Mal by som este jednu otazku ze ak by som mal dve triedy :

class A

{

public:

int prem;

};

class B

{

A *hocico

};

a dajme tomu ze by som chcel v triede B hodnotu premennej prem, tak dostal by som ju hocico->prem ?

Nahlásit jako SPAM
IP: 194.88.194.–
crazy
~ Moderátor
+10
Grafoman
8. 9. 2012   #20
-
0
-

#19 Tayson
pokud inicializuješ ten pointer, tak ano....

hocico = new A;

Nahlásit jako SPAM
IP: 89.190.90.–
All you need is vision and time.
ingiraxo+15
Grafoman
9. 9. 2012   #21
-
+1
-
Zajímavé

#19 Tayson
pokud by si měl v té třídě B hocico jako public, tak v main() to můžeš jako: 

	A a;
	a.prem = 10;

	B b;
	b.hocico = &a;

	b.hocico->prem = 20; // zmeni "prem" v A

ale pokud to hocico chceš mít private, tak máš smůlu, i když to inicializuješ, tak hodnotu z prem do toho nijak nedostaneš (nemáš tam konstruktor ani žádnou funkci na to)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Tayson0
Stálý člen
9. 9. 2012   #22
-
0
-

#21 ingiraxo
no dobre ale ked mam triedu A 

class A

{

public:

int a,b,c;

int nejakametoda();

};

int A::nejakametoda()

{

c=a+b;

return c;

}

main()

{

A objekt;

objekt.nejakametoda();

}

tak ako dosiahnem aby som v maine vedel pracovat s premennou c napr chcem ju tu inkrementovat alebo nieco take 

Nahlásit jako SPAM
IP: 194.88.194.–
ingiraxo+15
Grafoman
9. 9. 2012   #23
-
0
-

#22 Tayson

A a;
...
a.c = 10;
a.c++; // 11
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Tayson0
Stálý člen
9. 9. 2012   #24
-
0
-

#23 ingiraxo
no ano ale to ulozis cislo 10 do premennej c nie ?....ale ja potrebujem ze ked dam premennu return z metody tak chcem v maine tu premennu ziskať

Nahlásit jako SPAM
IP: 194.88.194.–
ingiraxo+15
Grafoman
9. 9. 2012   #25
-
0
-

#24 Tayson
a co ti brání to udělat stejně jak místo "c" tam dáš název funkce 

A a;
...
int soucet = a.nejakametoda();
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Tayson0
Stálý člen
9. 9. 2012   #26
-
0
-

#24

ak mam napr. premennu c a ta sa rovna 10 a dam return z metody tak ju prijmem :

trieda objekt;

obejkt.c;

a mohol by som dat 

if(objekt.c==10) ?

Nahlásit jako SPAM
IP: 194.88.194.–
ingiraxo+15
Grafoman
9. 9. 2012   #27
-
0
-

#26 Tayson
ke všem proměnným nebo funkcím, který jsou v nějakým objektu (class,struct ...), tak přistupuješ vždy přes instanci toho objektu... jen je důležitý aby byli public... spíš si přečti něco o OOP

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Tayson0
Stálý člen
9. 9. 2012   #28
-
0
-

#27 ingiraxo
no mam to public lebo viem ze cez private by to neslo lebo k private mozem pristupovat len cez metody triedy ...ale tak skusim sa pozriet este do zdrojaku ci nemam niekde inde chybu pretoze ta moja premenna nema hodnity co by mala mat ...ale diki 

Nahlásit jako SPAM
IP: 194.88.194.–
ingiraxo+15
Grafoman
9. 9. 2012   #29
-
+1
-
Zajímavé

#28 Tayson
to bude možná tim, že si je nikde nenastavil :D (aspon z toho co si poslal) 

class A
{
	int a, b;
public:
	int c;
	A() : a(0), b(0), c(0) { }
	A(const int a, const int b) : a(a), b(b), c(0) { }
	const int const secti() const { return a + b; }
};

int main()
{
	A a(2, 6);
	a.c = a.secti(); // 8

	return 0;
}
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Tayson0
Stálý člen
9. 9. 2012   #30
-
0
-

#29 ingiraxo
chybu som mal nakoniec v podmienke if ....som v koncoch z toho ...tak som si overoval ci dobre postupujem :)

Nahlásit jako SPAM
IP: 194.88.194.–
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, 8 hostů

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ý