Předání dvourozměrného pole funkci – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Předání dvourozměrného pole funkci – C / C++ – Fórum – Programujte.comPředání dvourozměrného pole funkci – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Pavel Synek0
Super člen
5. 7. 2007   #1
-
0
-

Snažím se předat ukazatel na 2d pole funkci, a ta s tím polem něco udělá.



#include <iostream>

using namespace std;

const int x_size=10; //definuju konstanty
const int y_size=10;

void pricti(int**pole,int co){
pole[1][1]+=co; //funkce by měla normálně přičíst k poli co, ale nic nedělá
}

int main(){
int pole[x_size][y_size]; //inicializuju a naplním pole
for(int i=0;i<=x_size;i++){
for(int j=0;j<=y_size;j++){
pole[i][j]=1;
}
}

cout << pole[1][1] << endl; //má vypsat 1
pricti(&pole,2);
cout << pole[1][1]; //má (teoreticky) vypsat 3
cin.get();
cin.get();
return 0;
}


chyba: cannot convert `int (*)[10][10]' to ` int**' for argument `1' to `void pricti(int**, int)'

chápu že je to asi naprosto triviální problém, ale fakt si nevim rady

Nahlásit jako SPAM
IP: ...–
Reklama
Reklama
nj
~ Anonymní uživatel
2 příspěvky
5. 7. 2007   #2
-
0
-

nedavno jsem resil stejny problem, a obesel jsem to tak, ze jsem to pole udelal dynamicke, ale nejsem si jisty jak moc je to ciste..

int **pole;

pole = new int*[x_size];
for (int i=0; i<x_size; i++) {
pole[i] = new int[y_size];
}

Kdyz jsem hledal na netu, jak by se to dalo resit pro staticke pole tak tam vetsinou bylo napsany, ze to nejde bez znalosti poctu sloupcu... jestli si dobre vzpominam tak ten parametr by musel byt int *pole[pocet sloupcu] v hlavicce funkce...

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
634 příspěvků
5. 7. 2007   #3
-
0
-

nj, se skoro trefil. Pravidla, jak se předává vícerozměrné pole funkci se dáj9 shrnout takto:

1. Pokud se jedná o pole statické, předává se jako ukazatel na pole



void p(int (*pole)[5]) // nebo prostě jen void p(pole[5][5])
{
}

int pole[5][5];
p(pole); // volani

2. Pokud je se jedná o pole ukazetelů, tak se předává jako pointer na pointer.


void p(int **pole, size_t rows,size_t cols)// nebo void p(int *pole[],size_t rows,size_t cols)
{
}

int main(int argc, char* argv[]) {
int *pole[5]; // to same kdyby se jednalo o int **pole;
// inicializace(napr. alokace)
p(pole);


Nahlásit jako SPAM
IP: ...–
Pavel Synek0
Super člen
6. 7. 2007   #4
-
0
-

Dík, ale eště sem nepochopil jednu věc. Když chci předávat statické pole o velikosti třeba 800x600, pak ta funkce podle tvého návodu bude vypadat ňák takhle:



void pricti(int pole[800][600],int co){
pole[1][1]+=co;
}

ten zápis int (*pole)[5] asi použít nemůžu, protože tam nedeklaruju tu druhou velikost. Problém je v tom že když pak zavolám normálně
pricti(pole,2);

tak sice kompiler chybu neohlásí, ale program se hned zavře. Když sem tam zkusil napsat int (*pole)[800] + různé obměny tak mi to hlásí chybu v přetypování.

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
634 příspěvků
6. 7. 2007   #5
-
0
-

Mno, asi jsem měl ten ukazetel na pole popsat. Když použiješ ukazetl na pole, tak musí být znám počet soupců už v době překladu. Takže aplikace na tvůj problém:



#include <iostream>

using namespace std;

const int x_size=10; //definuju konstanty
const int y_size=10;

void pricti(int (*pole)[y_size],int co){ // ty závorky tam být musí, stejně tak, jako počet sloupců
pole[1][1]+=co; //funkce by mìla normálnì pøièíst k poli co, ale nic nedìlá
}

int main(){
int pole[x_size][y_size]; //inicializuju a naplním pole
for(int i=0;i<=x_size;i++){
for(int j=0;j<=y_size;j++){
pole[i][j]=1;
}
}

cout << pole[1][1] << endl; //má vypsat 1
pricti(pole,2);
cout << pole[1][1]; //má (teoreticky) vypsat 3
cin.get();
cin.get();
return 0;
}


Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
634 příspěvků
6. 7. 2007   #6
-
0
-

To Phoenix:

Teď jsem si všiml, že šaháš mimo rozsah pole.



for(int i=0;i<=x_size;i++){
for(int j=0;j<=y_size;j++){


Má být jen:


for(int i=0;i<x_size;i++){
for(int j=0;j<y_size;j++){

Nahlásit jako SPAM
IP: ...–
Pavel Synek0
Super člen
6. 7. 2007   #7
-
0
-

Moc dík myslim si že už to chápu. Jo eště dík za tu opravu:D

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

Podobná vlákna

Predani retezce funkci — založil Bananovnik

Obrazce do dvourozměrného pole — založil Zelenáč

Deklarace dvourozměrného pole C# — založil drobeczek

Moderátoři diskuze

 

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