Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
asjameez
Kreisi kasutaja

liitunud: 10.12.2006
|
18.04.2010 00:19:10
c++ massiivi return |
|
|
GLfloat* Controls::GetVars() {
GLfloat Vars[5] = {Pos_X, Pos_Y, Pos_Z, Rot_X, Rot_Y};
return Vars;
} |
Üleval olev koodijupp annab hoiatuse:
tsitaat: |
warning: address of local variable ‘Vars’ returned |
Mis ma valesti teen massiivi returnides?
|
|
Kommentaarid: 63 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
61 |
|
tagasi üles |
|
 |
troglodyte
Kreisi kasutaja

liitunud: 09.08.2002
|
18.04.2010 10:41:58
|
|
|
Sa tagastad aadressi funktsiooni stackis olevale muutjale, mis võidakse ülekirjutada tulevikus ning peale seda omavad su tagastatud massiivis elemendid suvalisi väärtusi.
Sa peaksid Vars muutujale eemaldama mälu new abil ja tagastama viitne eraldatud mälule.
c++:
|
GLfloat *Controls::GetVars() { GLfloat *Vars = new GLfloat[5]; Vars[0] = Pos_X; /* jne ... */ return Vars; }
|
_________________ ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn |
|
Kommentaarid: 34 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
34 |
|
tagasi üles |
|
 |
asjameez
Kreisi kasutaja

liitunud: 10.12.2006
|
|
Kommentaarid: 63 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
61 |
|
tagasi üles |
|
 |
Supiplex
HV veteran

liitunud: 11.12.2002
|
19.04.2010 11:20:40
|
|
|
Ära unusta seda massiivi hiljem delete() abil ära kustutada.
Veidi küll hilinenud nõu, aga mugavam oleks lahendada massiiv STL objektina. Seda saab tagastada nagu suvalist kohalikku muutujat:
#include <array>
stl::array<GLfloat> Controls::GetVars() {
stl::array<GLfloat> Vars;
Vars.push_back(Pos_X);
Vars.push_back(Pos_Y);
Vars.push_back(Pos_Z);
Vars.push_back(Rot_X);
Vars.push_back(Rot_Y);
return Vars;
}
|
_________________ The young lady had an unusual list,
Linked in part to a structural weakness.
She set no preconditions. |
|
Kommentaarid: 38 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
34 |
|
tagasi üles |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
19.04.2010 13:41:28
|
|
|
Supiplex'i idee tehniliselt õige, kuid suts ebaefektiivne kuna toimub kogu vectori kopeerimine returni juures. See, et andmetüübid-namespaced veidi valed on ei ole antud hetkel väga oluline
Ise teeks tõenäoliselt hoopis sedasi, et looks tolle massiivi funktsiooniväliselt ning laseks ainult tollel funkstioonil too massiiv täita. Ehk siis umbes nii:
c++:
|
#include <vector> // Funkstiooni parameetriks on reference massiivile, reference on võrreldav pointeriga void getVars(std::vector<GLfloat>& array) { // tühjendab massiivi ja teeb selle piisava suuruse peale array.resize(5); // sisestab andmed masiivi array[0]=Pos_X; array[1]=Pos_Y; array[2]=Pos_Z; array[3]=Rot_X; array[4]=Rot_X; } int main(int argc, char* argv[]) { std::vector<GLfloat> array; getVars(array); return 1; }
|
vältisin push_back'i kasutust kuna sel pole lihtsalt mõtet. Vektori suurus on ju algusest peale teada.
Üldjuhul tasub manuaalset mäluhaldust new/delete'ga vältida võimalikult palju ning kasutada standardteeke. Sellega minimeerid võimalikke bugide tekkimisi. Hetkel tööl on ~50k rea pikkune kood kus on kokku ~10 new/delete paari ning praktiliselt kõik nood tehakse ühekordselt vastavalt progammi käivitusel/sulgemisel
[edit]
Hm, jäi märkamata tõsiasi et tõenäoliselt on tegu ühe klassifunktsiooniga. Sel juhul teeksin hoopis umbes nii:
c++:
|
class Controls { // hoiab parameetreid std::vector<GLfloat> params; public: // constructor Controls() { // parameetrite massiivi suurus paika, automaatselt täidetakse nullidega params.resize(5); } // määrab parameetrid, vektori suurus on paika pandud juba constructoris void setParams(GLfloat x, GLfloat y, GLfloat z, GLfloat rx, GLfloat ry) { params[0] = x; params[1] = y; params[2] = z; params[3] = rx; params[4] = ry; } // Tagastab reference parameetrite massiivile mida ei lubata muuta. Lõpus olev const on lihtsalt vihje kompilaatorile et selles funktsioonis ei muudeta klassi väärtusi const std::vector<GLfloat>& getParams() const { return params; } }; // Hiljem koodis: Controls c; const vector<GLfloat>& params = c.getParams();
|
_________________ Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity" |
|
Kommentaarid: 106 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
86 |
|
tagasi üles |
|
 |
Supiplex
HV veteran

liitunud: 11.12.2002
|
19.04.2010 16:50:50
|
|
|
Ho Ho kirjutas: |
Supiplex'i idee tehniliselt õige, kuid suts ebaefektiivne kuna toimub kogu vectori kopeerimine returni juures. |
Muide, seda vektorit ei kopeerita tagastamisel. Mõistlik kompilaator (näiteks gcc) jätab kopeerimise ära kui funktsioon tagastab ühe kindla lokaalse muutuja. Lisainfoks googelda näiteks "return value optimization".
Kompilaator on targem kui sa arvad Kuluta oma energiat nii, et endal oleks lihtsam kribada ja teistel lugeda.
tsitaat: |
See, et andmetüübid-namespaced veidi valed on ei ole antud hetkel väga oluline  |
Mu projektis on kasutusel mikro-STL mille namespace on "ustl", mitte "std". Arva ära kui mitu korda ma olen end viimase paari kuu jooksul seaks vihastanud kui kirjutan std::string ja üritan veerand tundi aru saada miks see neetud kompilaator viriseb et ta sellist looma ei leia No pikapeale on tekkinud komme teistpidi kirjutada.
_________________ The young lady had an unusual list,
Linked in part to a structural weakness.
She set no preconditions. |
|
Kommentaarid: 38 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
34 |
|
tagasi üles |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
19.04.2010 16:53:35
|
|
|
Supiplex kirjutas: |
Mõistlik kompilaator (näiteks gcc) jätab kopeerimise ära kui funktsioon tagastab ühe kindla lokaalse muutuja |
Võimalik, ju ma olen siis MSVC'ga ära "hellitatud" kui debugger iga sarnase liigutuse peale läbi copy-constructori käib.
_________________ Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity" |
|
Kommentaarid: 106 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
86 |
|
tagasi üles |
|
 |
Supiplex
HV veteran

liitunud: 11.12.2002
|
19.04.2010 20:05:54
|
|
|
Ei, miks. VC oskab sedasama, aga tavaliselt jooksutad sa ju debuggerit optimeerimata koodi peal.
_________________ The young lady had an unusual list,
Linked in part to a structural weakness.
She set no preconditions. |
|
Kommentaarid: 38 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
34 |
|
tagasi üles |
|
 |
|
lisa lemmikuks |
|
|
sa ei või postitada uusi teemasid siia foorumisse sa ei või vastata selle foorumi teemadele sa ei või muuta oma postitusi selles foorumis sa ei või kustutada oma postitusi selles foorumis sa ei või vastata küsitlustele selles foorumis sa ei saa lisada manuseid selles foorumis sa võid manuseid alla laadida selles foorumis
|
|