Pole jako parametr typu reference – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Pole jako parametr typu reference – C / C++ – Fórum – Programujte.comPole jako parametr typu reference – C / C++ – Fórum – Programujte.com

 

end0
Newbie
10. 7. 2014   #1
-
0
-

Asi pro většinu banální dotaz, nicméně si s tím nevím rady.

Lze použít pole jako parametr při volání funkce a to formou reference (odkaz na pole)? Chci to použít u dll export.

Má to takto: dllmain.h

#ifndef _DLLMAIN_H_
#define _DLLMAIN_H_

extern "C"
{
double __declspec(dllexport) ReBuild(int item, int index, double & ar[][]);
int __declspec(dllexport) Calc(int row, double t_opened, int sorte_dir);
int __declspec(dllexport) CountItem(int item1, int & item2);

}

#endif

dll_utm.cpp

#include <windows.h>
#include <stdio.h>
#include "dllmain.h"

//--------------------------------------------------------------
double ReBuild(int item, int index, double & ar[][])
{
  ...
  ...
}
//--------------------------------------------------------------
int CountItem(int item1, int & item2)
{
  static int i=item1;
  item2=item2+100;
  i++;
  
  return(i);
  
}

Po kompilaci mi to vrací:

9 D:\...\Dev_C\dllmain.h declaration of `ar' as array of references 

8 D:\...\Dev_C\dll_utm.cpp declaration of `ar' as array of references 

A teď nevím jestli to mám jen blbě zapsaný (pokud ano, prosím o radu jak to spravit) anebo to prostě nejde.

Přitom ve fci. CountItem(..., ...) mi referenční předání parametru funguje, tak si myslím, že by mělo jít i rozchodit to pole. Musím deklarovat velikost pole (počet prvků)...? Děkuji.

Nahlásit jako SPAM
IP: 89.102.130.–
KIIV
~ Moderátor
+43
God of flame
10. 7. 2014   #2
-
0
-

no nevim jestli to bude delat to co chces..

mimo to se pole vzdy predava jako pointer, takze ty data muzes menit primo a zmeni se i venku

nicmene u dvojrozmernyho pole bys mel aspon tusit velikost prvniho rozmeru.. jinak se to muze vzit jako double ** ar; a pak ti to pri predani nejakeho double ar[10][10] bude nahle padat na segfaulty

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
end0
Newbie
10. 7. 2014   #3
-
0
-

#2 KIIV
nevím jestli se vyjádřím přesně programátorsky.. :-( chci předat pole (jeho adresu...) s tím, že veškeré operace, které provedu v té funkci tak budou prováděny přímo v datech toho pole, takže se patřičně změní

S pointery neumím, jde to bez nich nebo do nich musím jít? Pokud ano, budu vděčný za easy kode pro názornost jak s tím pracovat

Nahlásit jako SPAM
IP: 89.102.130.–
KIIV
~ Moderátor
+43
God of flame
10. 7. 2014   #4
-
0
-

jde o to, ze kdyz mas pole   x[50] tak  x je vlastne pointer... tj. kdyz x predas funkci, tak to meni data v x

ale takhle to funguje jen pro jednorozmerne pole.. dvourozmerne uz musis mit jeden rozmer definovanej:

double funkce(double ar[50][])  pro    double pole[50][100];   (a samozrejme taky musis vedet kam az muzes smatat)

pokud pouzijes jen funkce(double ar[][])  tak uz se bude ten prvni rozmer brat jako pole pointeru na pole doublu a jelikoz pole nema zadny pointery na pointery, tak se to cely zriti jak domecek z karet

nicmene beztak doporucuju pouzivat treba vector nebo tak.. da se v tom udelat min chyb a da se to predavat referenci vcetne velikosti pole

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
end0
Newbie
10. 7. 2014   #5
-
0
-

První části rozumím. O vektorech vím, že nic nevím. Tedy - pokud upravím kod a definuju jeden rozměr dvourozměrnýho pole:

 double ReBuild(int item, int index, double ar[3][ ])

tak pokud ve fci. ReBuild() provedu nějaké změny s obsahem pole, projeví se to i posléze v hlávní části kodu odkud jsem fci. volal?

Nahlásit jako SPAM
IP: 89.102.130.–
KIIV
~ Moderátor
+43
God of flame
10. 7. 2014   #6
-
0
-

#5 end
ano.. ale kdyby neco, muzes si to klidne otestovat.. nic ti v tom prece nemuze branit

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
end0
Newbie
10. 7. 2014   #7
-
0
-

Samozřejmě to provedu, ale až zítra, teď se musím věnovat jinému. Mě jen zaráží, že u jednotlivé proměnné ve fci. CountItem() jsem musel v deklaraci parametru použít "&" item2, aby se mi změny "item2" ve fci projevili i v hlavním kodu a u pole nemusím... vyzkouším... a děkuju. 

Nahlásit jako SPAM
IP: 89.102.130.–
KIIV
~ Moderátor
+43
God of flame
10. 7. 2014   #8
-
0
-

no je to prave proto, ze pole je proste alias pro pointer.. (jednorozmerne samozrejme)

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
end0
Newbie
11. 7. 2014   #9
-
0
-

Tak jsem to zkusil, funguje. :-) Mám však k tomu nějaké to ALE...

Deklaroval jsem pole 3x3, naplnil hodnotami 1 až 9 v hlavním kodu, v knihovně jsem to změnil na záporné hodnoty -1 až -9 a teď:

Trochu jsem si s tím hrál, když v parametru funkce uvedu ar[] [3] jsou změny v pořádku, následují výstupy pro zápisy parametru pole ve tvaru ar[] [2]ar[] [1] jsou jiné a rád bych pochopil, co se vlastně stalo s prvky pole (hodnotami) že jsem dostal tento výstup.

na začátku   A) pro ar[] [3]     B) pro ar[] [2]   C) pro ar[] [1]  

1; 2; 3;          -1;  -2;  -3;         -1; -2; -4;         -1;  -4;  -7;

4; 5; 6;          -4;  -5;  -6;         -5; -7; -8;         -8;  -9;   6;

7; 8; 9;          -7;  -8;  -9;         -9;  8;  9;           7;   8;   9;

ad B) jak se tam dostala -9?

ad C) jak se tam dostala -8 a -9?

Můžeš mi to vysvětlit? Výchozím stavem bylo vždy deklarované pole hodnot 1 až 9, výstup po jednom zavolání fce. na změnu v poli.

Nahlásit jako SPAM
IP: 89.102.130.–
KIIV
~ Moderátor
+43
God of flame
11. 7. 2014   #10
-
0
-

no tenhle typ pole je alokovan tak jak tak za sebou a prepocitavaji se indexy ve stylu:  pro ar[][3]  -> ar[y][x] = ar[y*3+x]   pak to funguje samozrejme spravne

pro pole 3x3 a definici  ar[2][] je to ale uz jinak.. pri predani indexu  0 1  to jeste funguje ale pro index [0][2] uz vlastne prepisujes prvni polozku dalsiho radku (ale v tom puvodnim poli je to treti prvek prvniho radku)

a kdyz prejdes na dalsi radek, tak ti to tu -3 prepise znova -4 protoze ten index vyjde znova stejnej, jako ten preteklej

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
end0
Newbie
11. 7. 2014   #11
-
0
-

Hmm, asi jsem total ÚB... nejsem schopen se dobrat k tomu ad B) a ad C). Chytrýmu napověz, blbýho kopni...

Nahlásit jako SPAM
IP: 89.102.130.–
KIIV
~ Moderátor
+43
God of flame
11. 7. 2014   #12
-
0
-

   

V pameti je to takto?
[1,2,3,4,5,6,7,8,9]  (indexy jsou: 0,1,2,3,4,5,6,7,8)
C++ predstira ze je to takto:
[[1,2,3],[4,5,6],[7,8,9]]

pro A to normalne funguje a prepocitava se to takto:
[0][0] => [0]  [0][1] => [1]  [0][2] => [2]
[1][0] => [3]  [1][1] => [4]  [1][2] => [5]
[2][0] => [6]  [2][1] => [7]  [2][2] => [8]

pro B to mas spatne, protoze velikost druheho rozmeru je spatne:
[[1,2],[3,4],[5,6],[7,8],9,]
a prepocitava se to takto:
[0][0] => [0]  [0][1] => [1]  [0][2] => [2]
[1][0] => [2]  [1][1] => [3]  [1][2] => [4]
[2][0] => [4]  [2][1] => [5]  [2][2] => [6]

a pro C:
[0][0] => [0]  [0][1] => [1]  [0][2] => [2]
[1][0] => [1]  [1][1] => [2]  [1][2] => [3]
[2][0] => [2]  [2][1] => [3]  [2][2] => [4]
Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
end0
Newbie
11. 7. 2014   #13
-
0
-

....   trvalo to, ale pomohlo to.. 3x HURÁÁÁ! :-) Bylo už mi trapný se ptát, tak jsem vzal list papíru na pomoc a dobral se správného výsledku, teď už je mi to jasný. Takže díky moc!

Ze zvědavosti se zeptám - když jsem v deklaraci parametru typu pole zapsal ar[3][ ] tak se to kompilátoru nelíbilo. Je to proto, že z toho nedokáže určit počet sloupců(položek) v jedné řádce pole?

Zatím si s tím takhle vystačím. Ale asi ne navždy, protože počet sloupců se mi v hl.kodu bude s dalším vývojem s takřka jistotou zvyšovat a pamatovat si pořád, že musím upravit i knihovní parametr rozsahu u pole mne trochu děsí, protože pokud to neudělám (tj. zapomenu), kompilátor to spolkne a výsledek bude typu blbost. Bych potřeboval tohle nějak pořešit výhledově. 

Nahlásit jako SPAM
IP: 89.102.130.–
KIIV
~ Moderátor
+43
God of flame
11. 7. 2014   #14
-
0
-

#13 end
v C++ se to da resit klidne jako objekt, ktery si udrzi rozmery a tak...

mozna by to zvladala i nejaka sablona

nebo pouzit jednorozmerne pole a predat velikost radky

pouzit vector vectoru a tak

a tak dale, a tak dale..

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
end0
Newbie
11. 7. 2014   #15
-
0
-

jak to myslíš použít, když mám pole dvourozměrné?

nebo pouzit jednorozmerne pole a predat velikost radky

Nahlásit jako SPAM
IP: 89.102.130.–
11. 7. 2014   #16
-
0
-

Naskládáš řádky do pole jednorozměrného za sebe a když budeš vědět, jak dlouhý je řádek, dokážeš spočítat, kde se nachází konkrétní prvek z konkrétního řádku a sloupce

hu

Nahlásit jako SPAM
IP: 195.178.67.–
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, 105 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ý