cpp

Despre PHP, MySQL, HTML, C++, VB, JAVA etc.

Moderator: Moderatori

User avatar
andrei
Posts: 7528
Joined: Sun Mar 24, 2002 2:00 am

cpp

Post by andrei »

am o mare problema.. trebuie neaparat sa inteleg in timp util niste notiuni de c++. acestea sunt:
constructor, destructor.
poate cineva sa imi explice concret ce sunt ele? dar nu ma trimiteti spre siteuri va rog pt ca de pe ele tot ma chinui de cateva ore sa inteleg si nu reusesc.
explicati daca se poate prin cuv. voastre. eventual si exemple, care ar fi si mai utile.
multumesc.

work harder
User avatar
arus
Posts: 111
Joined: Sun Jan 26, 2003 10:27 am

Post by arus »

Constructorii si destructorul sunt metode speciale ale unei clase si se apeleaza automat la declararea ( sau iesire din blocul unde este valabila declaratia ) unei variabile din clasa respectiva sau la folosirea operatorilor new si delete .

Constructori nu au valoare de return , pot fi mai multi si se deosebesc dupa parametrii de apel , si au numele clasei unde sunt declarati . Destructorul ( e unul singur ) , nu are valoare de return , nu are parametrii de apel si are numele clasei in care e declarat cu ~ in fata .
Constructorii si destructorul trebuie sa fie "public" .
Nu este obligatoriu ca o clasa sa aiba constructor si/sau destructor.


Ex:

Code: Select all

class MyClass
{
int 	a;
int     b;
............

public :
............

void SetA(int _a_);
void SetB(int _b_);

MyClass(void);			// declaratie constructor
MyClass(int _a_ );		// declaratie constructor
MyClass(int _a_ ,int _b_);	// declaratie constructor
~MyClass(void);			// declaratie destructor 
};

void MyClass::SetA(int _a_ )
{
a = _a_;
}
void MyClass::SetB(int _b_ )
{
b = _b_;
}
MyClass::MyClass(void)		
{
...	// alte operatii de initializare 
}
MyClass::MyClass(int _a_)
{
...	// alte operatii de initializare 
a = _a_;
}

MyClass::MyClass(int _a_,int _b_)
{
...	// alte operatii de initializare 
a = _a_;
a = _b_;
}

MyClass::~MyClass(void)		
{
...	 	// se elibereaza resurse alocate de clasa MyClass
}


// exemplu de apel

Code: Select all

void o_functie_oarecare (void)
{
MyClass		c1;		// se apeleaza automat primul constructor 
MyClass		c2(4);	// se apeleaza automat al doilea constructor 
MyClass		c3(4,7);	// se apeleaza automat al trilea constructor 

static 		MyClass c4;	// se apeleaza automat primul constructor 
					// inainte de orice intructiune a programului 


// se inituializeaza membrii clasei care nu au fost initializati prin constructor
c1.SetA(8);
c1.SetB(9);
c2.SetB(11);






MyClass*		pc5;	// la declararea unui pointer nu apeleaza nici o metoda 
pc5 = new MyClass(2);		// se aloca memorie si se apeleaza automat al doilea constructor 
......

delete pc5;			// se apeleaza destructorul si se elibereaza memoria alocata 



}				// la iesirea din functie , pentru ca variabilele c1,c2,c3
				// isi depasesc zona de validitate ( in engeza scop )
				// se apeleaza automat destructorul 	

				// nu se apeleaza insa si destructorul variabilei c4 pentru ca 
				// variabila e de tip static si are zona validitate de la lansare 				// pana la terminarea programului 
				// destructorul lui c4 e apelat dupa ultima intructiune a programului 

Pentru clasele derivate , trebuie apelat explicit constructorul clasei de baza :

Code: Select all

class MySecondClass: public MyClass
{
.............
public:
.............
MySecondClass(void);
}


void MySecondClass::MySecondClass(void) : MyClass(void)
{
// inainte de executia acestui constructor a fost apelat constructorul clasei de baza 
}
User avatar
bloomfield
Posts: 214
Joined: Sat Sep 13, 2003 2:55 pm

Post by bloomfield »

Am să încerc şi eu o explicaţie poate înţelegi mai bine :)
Ok sa zicem că trebuie sa faci o clasa Beer. Şi când creezi o astfel de clasă trebuie să fie plină (bineînţeles).

Aşa că scrii aşa:

Code: Select all

class Beer
{
public:
   float level;   //asta spune cât de plină e berea; în procente să zicem

   Beer();   //ăsta e constuctorul; se apelează automat când e creat un obiect 

   void Drink(float quantity);   //asta e o metodă oarecare. Va goli ceva din level
}

Beer::Beer()
{
   level = 100;   //când facem berea o facem plină la 100%
}

void Beer::Drink(float quantity)
{
   if( level >= quantity )
      level -= quantity;
}

...

//si aşa se foloseşte:
Beer beer;
//acum beer.level e deja la 100 pentru că a fost apelat constructorul automat
beer.Drink(50);
//acum beer.level e la 50
Ok acum sper că ai înţeles ce e ăla constructor. Desigur mai sunt multe alte lucruri de înţeles...
Uite o carte pe care ţi-o recomand: Thinking in C++ http://www.mindview.net/Books/TICPP/Thi ... CPP2e.html
O barmaniţă virtuală aş putea accepta
...dar o bere virtuală?? Niciodată!
User avatar
Trickster
Radioactiv
Posts: 4394
Joined: Sun Mar 31, 2002 2:00 am

Post by Trickster »

Thinking in C++ mi se pare mult prea stufoasa pentru un incepator si cred ca o sa se cam piarda.

Eu zic ca mai bine ar porni de aici:
http://newdata.box.sk/bx/c/

Si poate ar trebui cineva sa explice cum e cu Constructori multiplii la o Clasa, nu doar cu cel implicit (eu nu ma incumet, nu am talent pedagogic).
Dum zomfies...
User avatar
Wi][iE
Posts: 371
Joined: Sun Dec 01, 2002 5:34 am

Post by Wi][iE »

Thinking in C++ e stufoasa, dar nu are nevoie decat de primele 40 pagini pt a se lamuri pe deplin cum e cu OOP de care are nevoie. (spun asta pt ca de-abia am trecut de pag 80)
Will make polys and splines for food...and clothes...
User avatar
andrei
Posts: 7528
Joined: Sun Mar 24, 2002 2:00 am

Post by andrei »

multumesc tuturor pt explicatii.
dar eu sunt nesimtit si voi abuza de bunavointa voastra:
ce sunt vectorii, in c++, si ce este STL?

work harder
User avatar
andrei
Posts: 7528
Joined: Sun Mar 24, 2002 2:00 am

Post by andrei »

ok, va voi mai stresa cu niste intrebari pt ca sunt la inceput si trb neaparat sa inteleg niste chestii elementare:

despre << si >>
eu stiam din c++ ca acestia sunt operatorii de iesire si intrare.
dar, surprize surprize, aflu ieri din cartea de c /c++ a lui herbert schildt (care apropo e chiar greoaie si destul de haotica, din cate vad) ca acestia sunt si operatori, in C, de deplasare la stanga, respectiv dreapta. Pe asta chiar nu am reusit sa o inteleg, e vb de deplasarea bitilor... chiar nu ma prind cum este cu deplasarea asta.

si inca un lucru:
faza cu signed/unsigned/long/short. efectiv nu stiu cand se declara una, cand se declara alta.

work harder
User avatar
Dr. Voidberg
Moderator
Posts: 2718
Joined: Tue Dec 24, 2002 1:17 pm

Post by Dr. Voidberg »

Vectorii sunt array-urile.
STL inseamna Standard Templates Library si este o colectie de template-uri pentru diverse chestii utile, gen vectori, harti asociative, stive, cozi, etc.
<< si >> inseamna deplasare pe biti la stanga sau dreapta. Daca ai un numar, de exemplu 32, el se scrie in baza doi asa: 000100000.


32 >> 2 inseamna ca din 000100000 rezulta 000001000 (adica 32 / 2*2)
32 << 2 inseamna ca din 000100000 rezulta 010000000 (adica 32 * 2*2)


Deci practic e o impartire/inmultire cu 2 la puterea numarului de biti deplasati.

signed si unsigned specifica daca variabila declarata poate avea si valori negative sau nu. Domeniul de valori e de obicei de la -x la x dar daca e unsigned atunci el devine de la 0 la 2*x.

Ceea ce e cu bold a fost editat, initial le pusesem invers. Multumesc lui idashahabin ca mi-a reportat greseala. :oops:
96 percent of Americans believe that Mr. T still pities the fool.
Radical dreamer
User avatar
bloomfield
Posts: 214
Joined: Sat Sep 13, 2003 2:55 pm

Post by bloomfield »

s|lent wrote:ce sunt vectorii, in c++, si ce este STL?
Dacă îmi amintesc bine minte eu am învăţat STL din Thinking in C++ unde e un capitol despre asta (sper să nu greşesc nu am mai verificat) pe care ti-o mai recomand o dată.
O barmaniţă virtuală aş putea accepta
...dar o bere virtuală?? Niciodată!
User avatar
andrei
Posts: 7528
Joined: Sun Mar 24, 2002 2:00 am

Post by andrei »

va multumesc pt explicatii.
revin daca mai am nelamuriri.

work harder
User avatar
andrei
Posts: 7528
Joined: Sun Mar 24, 2002 2:00 am

Post by andrei »

poate cineva sa imi explice cum e cu supraincarcarea operatorilor?
nu am reusit sa inteleg asta prea bine.
a, si cu exemple daca se poate.
10x

work harder
User avatar
Wi][iE
Posts: 371
Joined: Sun Dec 01, 2002 5:34 am

Post by Wi][iE »

Problema nu e chiar asa dureroasa.
Daca ai avea o clasa Complex (ai nevoie de schema?) atunci cand vei avea Complex a,b; nu vei putea sa faci a+b pt ca, compilatorul nu stie sa adune obiectele pe care le-ai definit tu. Pt asta trebuie sa definesti:

Complex operator + (Complex& a, Complex& b)
{
return Complex(a.re+b.re,a.im+b.im);
//sau daca vrei mai clar
//Complex c;
//c.re=a.re+b.re;
//c.im=a.im+b.im;
//return c;
}

Pana aici nici o problema, si nici nu sunt prea multe, dar atentie la definirea lui ++, pt ca exista var prefixata si cea postfixata. Cea prefixata e simpla pt ca intorci valoarea incrementata, dar la postfixata intorci valoare initiala si apoi o va incrementa. Nu faci decat sa intorci o valoare intermediara c egala cu val ne-incrementata dar incrementezi val data (sper ca ai idee ce inseamna int&)

Daca nu stii (explicam), atunci can folosesti
<tip_ceva> functie(<tip>& var)
atunci nu vei lucra cu o instanta a variabilei ci cu variabila. Deci daca ai:

int f1(int a)
{
a+=4;
return a;
}

int f2(int& a)
{
a+=5;
return a;
}

atunci va afisa (ceea ce e comentat)

void main()
{
//...
cout<<f1(a); //a+4
cout<<a; //a
cout<<f2(a); //a+4
cout<<a; //a+4
//...
}

Sper ca e suficient. Daca nu, zi-mi.
Will make polys and splines for food...and clothes...
mrk
Posts: 5
Joined: Tue Apr 20, 2004 5:11 pm

Post by mrk »

Wi][iE wrote:Problema nu e chiar asa dureroasa.
Daca ai avea o clasa Complex (ai nevoie de schema?) atunci cand vei avea Complex a,b; nu vei putea sa faci a+b pt ca, compilatorul nu stie sa adune obiectele pe care le-ai definit tu. Pt asta trebuie sa definesti:

Complex operator + (Complex& a, Complex& b)
{
return Complex(a.re+b.re,a.im+b.im);
//sau daca vrei mai clar
//Complex c;
//c.re=a.re+b.re;
//c.im=a.im+b.im;
//return c;
}

Pana aici nici o problema, si nici nu sunt prea multe, dar atentie la definirea lui ++, pt ca exista var prefixata si cea postfixata. Cea prefixata e simpla pt ca intorci valoarea incrementata, dar la postfixata intorci valoare initiala si apoi o va incrementa. Nu faci decat sa intorci o valoare intermediara c egala cu val ne-incrementata dar incrementezi val data
as mai aduaga ca in cazul de mai sus functia trebuie declarata friend Complex daca membrii sunt private (si ar cam trebui sa fie) si ca in cazul cu operatorii post si pre e si diferenta de sintaxa la declarare (in ambele cazuri - si cu functii friend si cu functii membru)...

ah si inca o chestie...
Void wrote: signed si unsigned specifica daca variabila declarata poate avea si valori negative sau nu. Domeniul de valori e de obicei de la -x la x dar daca e unsigned atunci el devine de la 0 la 2*x.
wrong. de la -x la x sunt 2x+1 valori => nr. impar. => contradictie
ptr. n biti => signed : [0, 2^n - 1] si unsigned [-2^(n-1), 2^(n-1) - 1] asta folosing cod complement 2^(n-1)
Mr. Garrison: Sorry kids, I just can't trust something that bleeds for five days and doesn't die.
User avatar
Wi][iE
Posts: 371
Joined: Sun Dec 01, 2002 5:34 am

Post by Wi][iE »

Sorry mi-a scapat...vezi ce rau e sa n-ai compilator la browser-ul web? :wink:
Will make polys and splines for food...and clothes...
User avatar
andrei
Posts: 7528
Joined: Sun Mar 24, 2002 2:00 am

Post by andrei »

ok ... multumesc pt explicatii. sincer sa fiu m-am chinuit sa inteleg ce anume vrea sa spuna mrk, despre erorile gasite de el, dar explica mult prea abstract :)
10x a lot 2u all.

work harder
User avatar
andrei
Posts: 7528
Joined: Sun Mar 24, 2002 2:00 am

Post by andrei »

ma chinui de vreo 2 ore la un program la care m-am gandit eu, sa adune elementele a doi vectori. sigur gresesc pe undeva, sau poate nu stiu eu exact cum se realizeaza adunarea a doi vectori... parerea mea este ca se aduna valorile din vectorii respectivi.

iata programul:

Code: Select all

#include <iostream.h>
/*programul trebuie sa afiseze elementele a doi vectori
apoi userul sa bage numarul elementelor dorite de el,
din vectori diferiti, si apoi sa se faca suma acelor elemente*/
void main()
{
  	int  v1[2]={66, 666}, i, j;
    for (i=0; i<2; i++)
    	{
      cout <<"elementul din v1 este: " <<v1[i];
      cin >>v1[i];
      }

   int v2[2]={11, 111};
    for (j=0; j<2; j++)
    	{
      cout <<"elementul din v2 este: " <<v2[j];
      cin >>v2[j];
      }

      cout << "suma elementelor " <<v1[i] <<"al lui v[1], si " <<v2[j] << "al lui v[2] este: " <<( v1[i] + v2[j] );



  int z;
  cin >>z;
}
eu vreau exact ce scrie in comentariu, adica sa spun ce element din vectorul 1 se aduna cu un element din vectorul 2, si apoi sa se faca suma lor. si nu inteleg unde gresesc?!
programul merge dar daca il rulez imi da un rezultat enorm si nu stiu de unde il ia. rulati-l si voi si spuneti-mi unde am gresit plz.

ps stiu ca nu prea ma pricep sa explic dar sper ca m-am facut inteles cat de cat: rezultatul operatiei e prea mare si mi se pare un rezultat stupid.

oh si inca ceva: unde dzeu este optiunea in borland 5 c++ de line numbers pt editor?

work harder
User avatar
AngeloML
Radioactiv
Posts: 165
Joined: Fri Feb 28, 2003 11:56 pm

Post by AngeloML »

Problema programului tau este urmatoarea. Daca vrei sa aduni doi vectori va trebui sa o faci element cu element. Nu inteleg cum vrei sa aduni vectorii.
Iar a doua problema esta ca dupa ce iese din for i si j au valoarea 2 iar v1[2] si v2[2] nu exista. De aceea ai problema asta. Sau poate ma insel eu.
User avatar
andrei
Posts: 7528
Joined: Sun Mar 24, 2002 2:00 am

Post by andrei »

ok,atunci poti cumva sa imi oferi varianta ta la ce voiam eu sa fac?
si cum adica v1[2] si v2[2] nu exista?

deci: ce vreau eu sa fac.. am 2 vectori da? v1 si v2. ambii au cate 2 elemente. eu vreau sa cer userului sa introduca numarul elementului dorit din fiecare vector, si rezultatul sa fie suma lor. dar sincer cred ca nu are mare legatura ce am facut pana acum cu ce vreau sa iasa... deci ..HELP :crazyeyes:

work harder
User avatar
Black Shark
Moderator
Posts: 3096
Joined: Tue Nov 26, 2002 9:51 pm

Post by Black Shark »

cand creezi un vector, sa-i zicem x[3] elementele adresabile sunt x[0], x[1], x[2]
iar cum tu in for-urile ala faci incrementarea dupa folosire(i++/j++), dupa ce va fi folosit fiecare cu valoarea 1 se va incrementa la 2
comenzile nu vor mai fi executate deoarece este incalcata conditia (i<2/j<2) dar valoarea 2 ramane, iar mai apoi cand incerci sa apelezi v2[j] si v2 evident va da eroare din moment ce elementul respectiv nu exista

btw, daca ramane batut in cuie numarul de 2 elemente/vector (care in cazul asta sunt v[0] si v[1]) de ce mai ceri userului numarul de elemente ?
iar suma cum sa fie ? toate elementele vectorilor adunate intr-o singura variabila sau sa rezulte un nou vector care sa aiba ca elemente suma elementelor corespondente din primii vectori (de ex v3[n]=v1[n]+v2[n])
1 out of 3 people who start smoking will eventually die. The other two apparently become immortal.
User avatar
andrei
Posts: 7528
Joined: Sun Mar 24, 2002 2:00 am

Post by andrei »

Black Shark wrote:cand creezi un vector, sa-i zicem x[3] elementele adresabile sunt x[0], x[1], x[2]
iar cum tu in for-urile ala faci incrementarea dupa folosire(i++/j++), dupa ce va fi folosit fiecare cu valoarea 1 se va incrementa la 2
comenzile nu vor mai fi executate deoarece este incalcata conditia (i<2/j<2) dar valoarea 2 ramane, iar mai apoi cand incerci sa apelezi v2[j] si v2 evident va da eroare din moment ce elementul respectiv nu exista

btw, daca ramane batut in cuie numarul de 2 elemente/vector (care in cazul asta sunt v[0] si v[1]) de ce mai ceri userului numarul de elemente ?
iar suma cum sa fie ? toate elementele vectorilor adunate intr-o singura variabila sau sa rezulte un nou vector care sa aiba ca elemente suma elementelor corespondente din primii vectori (de ex v3[n]=v1[n]+v2[n])


nu cer userului numarul de elemente, cer numarul elementului iar userul va pune 0 sau 1. cred ca trebuia un if pe acolo:)

iar suma va fi valoarea stocata in elementul selectat din primul vector, adunata cu valoarea din elementul selectat din al 2lea vector.
:D pe masura ce scriu la cerinta, imi dau seama ca eram mult prea departe de adevar :P
legat de prima ta explicatie, mi-am inteles in sfarsit greseala.

work harder
User avatar
Wi][iE
Posts: 371
Joined: Sun Dec 01, 2002 5:34 am

Post by Wi][iE »

Nu cred ca lipseste un if ci un while (do/for...whatever). Asta daca vrei sa intrebe in continuu ce element doreste afisat pana intalneste un caracter...sau altceva...
Ar trebui sa-ti lamuresti ce inseamna sa incrementezi post-fixat si pre-fixat.
1. Prefixat, inseamna ca incrementarea se face imediat:
int i=10;
cout<<++i; //11
cout<<i; //11

2. Post fixat inseamna ca valoarea folosita este cea initiala, care se va incrementa ulterior (aici chiar ca nu stiu cum gandeste C-ul - cer ajutorul celorlalti :) ). De-asta, atunci cand tu folosesti for(i=0;i<mm;i++) prima valoare cu care lucreaza for-ul este 0 si nu 1.

int i=10;
cout<<i++; //10
cout<<i; //11

//sper ca n-am facut iar greseli de sintaxa
Will make polys and splines for food...and clothes...
User avatar
caraboy
Posts: 1598
Joined: Sun Feb 23, 2003 3:43 pm

Post by caraboy »

s|lent, din cate ai spus tu eu asta am inteles:

Code: Select all

//Programul asta citeste ambii vectori. Nu ii declara de la inceput.
//Poti alege si numarul de elemente.


#include <iostream.h>
int v1[100],v2[100],n1,n2,var1,var2;

void citire1()
{for(int i=1;i<=n1;i++)
 {cout<<"v1["<<i<<"]=";cin>>v1[i];}
}

void citire2()
{for(int i=1;i<=n2;i++)
 {cout<<"v2["<<i<<"]=";cin>>v2[i];}
}


void main()
{cout<<"Nr elementelor primului vector=";cin>>n1;
 cout<<endl<<"Ne elementelor celui de-al doliea vector=";cin>>n2;
 citire1(); //citeste vectorul 1
 citire2(); //citeste vectorul 2
//acum afisezi pe ecran vectorii
cout<<endl<<"Vectorul 1 introdus este: ";
for(int i=1;i<=n1;i++)
{cout<<v1[i]<<' ';}

cout<<endl<<"Vectorul 2 introdus este: ";
for(int j=1;j<=n2;j++)
{cout<<v2[j]<<' ';}

cout<<endl<<"introduceti valoarea din vectorul 1 pt a fi adunata: ";cin>>var1; //citesti pozitia primului element pe care vrei sa-l aduni. ai grija sa nu pui o valoare mai mare decat n1
cout<<endl<<"introduceti valoarea din vectorul 2 pt a fi adunata: ";cin>>var2; // var2<=n2 MI-e lene sa mai pun un if pt testare :)

cout<<endl<<"suma celor 2 pozitii este: "<<v1[var1]+v2[var2];

//Eu asta am inteles din cate ai zis tu. Sper sa fie cum vrei tu. DAca vrei, poti sa scoti citirea si sa decalri direct cu 2 pozitii vectorul.
//Pozitiile mele incep de la 1 pana la n inclusiv. Am sarit peste v1[0] si v2[0]. Adica ai pozitii de la 1 la n inclusiv.

}
Eu asa vad programul. L-am facut repede, sper sa nu am greseli. La mine merge si l-am testat de 2 ori. :wink:
User avatar
andrei
Posts: 7528
Joined: Sun Mar 24, 2002 2:00 am

Post by andrei »

mersi mult. o sa incerc si revin cu pareri.

work harder
User avatar
caraboy
Posts: 1598
Joined: Sun Feb 23, 2003 3:43 pm

Post by caraboy »

Sa-mi spui daca-ti merge si daca e ce vrei tu. DAca nu, sa-mi spui exact ce vrei de la program si o sa incerc sa-l fac. :wink:
User avatar
sssssid the sloth
Posts: 34
Joined: Wed Mar 31, 2004 1:19 pm

Post by sssssid the sloth »

Problema s-a rezolvat ,raspunsul era evident facil(uitasem sa dau l=new nod) si totul s-a sfarsit cu bine. :wink:
INTEL PENTIUM P4 930
MB ASUS I945P
2XDDR2 (240) 512 MB PC5300 667MHZ CL5.0 TWINMOS
Asus NVIDIA GeForce 7900 GT
User avatar
andrei
Posts: 7528
Joined: Sun Mar 24, 2002 2:00 am

Post by andrei »

ca sa nu mai deschid alt topic:
1. stie cineva sa programeze in c#?
2. m-ar interesa niste manuale c#, poate stiti de unde pot downloada.

work harder
User avatar
Dr. Voidberg
Moderator
Posts: 2718
Joined: Tue Dec 24, 2002 1:17 pm

Post by Dr. Voidberg »

Da, eu stiu un pic.
Manuale poti gasi cu diversele metode mai neortodoxe. ;)
96 percent of Americans believe that Mr. T still pities the fool.
Radical dreamer
User avatar
draq
Posts: 333
Joined: Fri May 23, 2003 10:47 am

Post by draq »

m-ar interesa si pe mine acele manuale.daca poti sa dai niste detalii te rog PM.
User avatar
andrei
Posts: 7528
Joined: Sun Mar 24, 2002 2:00 am

Post by andrei »

revin cu întrebări de clasa I, ca de obicei:

ce sens are să scriu

Code: Select all

extern int a;
când pot să scriu

Code: Select all

int a;
şi e acelaşi lucru.

nu înţeleg utilitatea lui extern ăla.

work harder
User avatar
Trickster
Radioactiv
Posts: 4394
Joined: Sun Mar 31, 2002 2:00 am

Post by Trickster »

Extern-ul ala e diferenta de workflow dintre C++ si C#. E mai mult de dragul ordinii si sa fie codul mai usor de citit. S-ar putea sa aduca si o crestere insignifianta de performanta...
User avatar
Trickster
Radioactiv
Posts: 4394
Joined: Sun Mar 31, 2002 2:00 am

Post by Trickster »

Double post. Sorry
User avatar
andrei
Posts: 7528
Joined: Sun Mar 24, 2002 2:00 am

Post by andrei »

nu înţeleg o chestie> am în program linia

Code: Select all

#include <iostream>
şi programul se compilează fără probleme în Borland (softul full). Dar dacă vreau să compilez acelaşi program în compilatorul linie de comandă ( tot Borland), nu merge de nici o culoare, zice că nu găseşte iostream.h şi nu înţeleg de ce pt că fişierele EXISTĂ. Am
încercat să scriu şi calea completă:

Code: Select all

#include <c:\bla bla\iostream.h>
şi mi-a dat şi mai multe erori, cum că nu vede istream.h şi ostream.h. Am încercat apoi să includ în program calea exactă a lui istream şi ostream şi tot nu merge. Ştiţi cumva ce anume îmi scapă la compilatorul ăsta ? E varianta gratuită dar trebuie să meargă.

mă stresează mărunţişurile de genul ăsta care mă fac să pierd timpul. deci, help.

work harder
User avatar
Trickster
Radioactiv
Posts: 4394
Joined: Sun Mar 31, 2002 2:00 am

Post by Trickster »

Nu am incercat compilatorul ala, dar nu are ceva setari de path?

Incearca cu path-ul complet si cu ghilimele in lc de "<>".

Daca tot nu merge, spune-ne eroarea exacta, ca poate imi dau seama de ce.
User avatar
Dr. Voidberg
Moderator
Posts: 2718
Joined: Tue Dec 24, 2002 1:17 pm

Post by Dr. Voidberg »

In mod normal ar trebui sa mearga si din linia de comanda. Incearca sa specifici calea catre fisierele header asa:
bcc -Ic:/foo/bar fisier.cpp
96 percent of Americans believe that Mr. T still pities the fool.
Radical dreamer
User avatar
andrei
Posts: 7528
Joined: Sun Mar 24, 2002 2:00 am

Post by andrei »

am gasit solutia pt compilatorul gratuit, ce chestie, nu e suficient sa il dezarhivezi, trebuie si configurat :P

work harder
User avatar
andrei
Posts: 7528
Joined: Sun Mar 24, 2002 2:00 am

Post by andrei »

:P ca de obicei, iar mi se pare ceva inutil: namespace.
ce sens are sa scriu

Code: Select all

using namespace std
cand oricum librariile sunt incluse cu #include... trebuie neaparat sa specific faptul ca librariile pe care le folosesc fac parte din namespaceul standard, cand se subintelege deja?!

later edit:
avem asa:

Code: Select all

#include <cstdlib>
using namespace std;
void main()
{
system("notepad");
}
ce interesant, chestia asta daca e scrisa fara linia cu using ..etc; si nu inteleg de ce este atat de important. in mod normal ar fi trebuit sa mearga daca nu scriu acea linie dar pun #include <cstdlib.h> in loc de <cstdlib> ... corectati-ma va rog daca gresesc. ma streseaza ca nu inteleg utilitatea reala a acelei linii cu namespace.
Last edited by andrei on Tue Jun 22, 2004 12:43 am, edited 1 time in total.

work harder
User avatar
bloomfield
Posts: 214
Joined: Sat Sep 13, 2003 2:55 pm

Post by bloomfield »

Dacă nu scrii "using namespace std;" trebuie să accesezi tot ce ţine de namesapce-ul respectiv folosind std:: ca prefix
De exemplu în loc de

Code: Select all

cout << "cucu" << endl;
trebuie să scrii

Code: Select all

std::cout << "cucu" << std::endl;
Asta e utilitatea using namespace. Îţi face conţinutul namespace-ului repectiv direct disponibil în codul tău.

Acum nu pare mare lucru dar dacă ai multe namespace-uri şi cu nume lung de genul

Code: Select all

namespace Cucu
{
   namespace Bau
   {
       class Trosc
       {
       public:
          void MakeMeHapy();
       }
   }
}
şi trebuie să scrii chestii de genul:

Code: Select all

Cucu::Bau::Trosc trosc = new Cucu::Bau::Trosc();
trosc.MakeMeHapy();
devine mult mai interesant.

Tu ai dreptate pe undeva include şi using namespace ar trebui să fie cam acelaşi lucru dar este aşa din considerente istorice. Namespace-urile au fost introduse în C++. Include erau folosite în C şi deci şi în C++. Limbajele moderne gen Java sau C# au construcţii similare cu using namespace care însa fac şi treaba include-ului.
O barmaniţă virtuală aş putea accepta
...dar o bere virtuală?? Niciodată!
User avatar
andrei
Posts: 7528
Joined: Sun Mar 24, 2002 2:00 am

Post by andrei »

ce fel de argumente poate primi funcţia system() ? am văzut că primeşte executabile windows, cum ar fi notepad... dar nu pot să scriu, de ex:

Code: Select all

 

system("c:\game.exe");
adică orice alt fişier.
----------
şi încă ceva, când vreau să fac append la un string, cu un alt string
de ex

Code: Select all

string s0, s1="pepene";
s0= s1 + " " + "galben";
appendul merge şi cu operatorul +, şi cu operatorul +=, şi asta mă face să nu pot pricepe diferenţa dintre operatorii ăştia.

work harder
User avatar
Dr. Voidberg
Moderator
Posts: 2718
Joined: Tue Dec 24, 2002 1:17 pm

Post by Dr. Voidberg »

s1 = s1 + s2 este echivalent cu s1 += s2;
96 percent of Americans believe that Mr. T still pities the fool.
Radical dreamer
User avatar
andrei
Posts: 7528
Joined: Sun Mar 24, 2002 2:00 am

Post by andrei »

legat de vectori, nu inteleg diferenta intre a folosi vectorii prin

Code: Select all

#include <vector>
//si crearea de vectori prin:
vector<tip> v;
sau

Code: Select all

tip_vector v[i];
nu reusesc sa inteleg primul mod de utilizare al vectorilor, de ce as folosi headerul <vector> daca oricum pt a crea un vector nu imi trebuie acest header?
sper ca intelegeti ce vreau sa spun. si apropo, folosind prima metoda nici nu pot specifica dimensiunea vectorului, din cate vad.

work harder
Post Reply