A kužim ja vas, nego mene zanima razlika između Heap-a i Stack-a .jasan mi je njihov princip.. Koliko sam ja skužio Heap je cijela raspoloživa RAM memorija .. kojoj npr. dinamički pristupamo s new... al me zanima taj Stack, tj. stog gdje je on smjesten jel i on u RAM memoriji??
Programiranje u C++-u - pitanja i odgovori
- poruka: 7.284
- |
- čitano: 1.970.028
- |
- moderatori:
XXX-Man
- +/- sve poruke
- ravni prikaz
- starije poruke gore
A kužim ja vas, nego mene zanima razlika između Heap-a i Stack-a .jasan mi je njihov princip.. Koliko sam ja skužio Heap je cijela raspoloživa RAM memorija .. kojoj npr. dinamički pristupamo s new... al me zanima taj Stack, tj. stog gdje je on smjesten jel i on u RAM memoriji??
Uglavnom isto u RAM-u, da.
Naravno, uvijek postoje iznimke pa neki mikrokontroleri imaju implementiran hardverski stog, npr. PIC. Neki procesori kao SPARC koriste takozvani registarski stog i sl.
Čisto iz znatiželje, može li objašnjenje ovog koncepta? Jer sam do sada mislio da je to jedno te isto. Odnosno za objekt koji je deklariran kao statički se memorija alocira statički, odnosno onako kako sam ja to objasnio (memorija iz data segmenta).
Kako izgleda ta statička alokacija u praksi (jednostavan primjer)?
void f(){
int a;
static int b = 0;
// ...
}
Varijabla 'a' je statički alocirani objekt koji postoji samo dok se izvršava blok u kojemu se nalazi. Kada se ulazi u blok ta varijabla se stavlja na stack, dok kada blok završava tada ju se skida sa stack-a.
Varijabla 'b' je statički objekt čiji životni vijek ne ovisi o bloku u kojemu se nalazi jer nije na stack-u već u data segmentu. Stoga se mogu čuvati vrijednosti u među-pozivima funkcije.
Jel to znači da je u ovome prijmjeru varijabla a vidljiva i živa samo u ovoj funkciji, dok ova statička varijabla b vidljiva samo u funkciji a živa do kraja programa???
Da. S time da je varijabla 'a' živa samo tokom poziva funkcije.
Jel to znači da je u ovome prijmjeru varijabla a vidljiva i živa samo u ovoj funkciji, dok ova statička varijabla b vidljiva samo u funkciji a živa do kraja programa???
Tako je, staticka varijabla zadrzava svoju vrijednost izmedu vise poziva funkcije.
Primjer:
#include <iostream>
void foo()
{
int a = 10;
static int sa = 10;
a += 5;
sa += 5;
std::cout << a << " " << sa << std::endl;
}
int main()
{
for (int i = 0; i < 5; ++i)
{
foo();
}
return 0;
}
Ispis ce biti:
15 15
15 20
15 25
15 30
15 35
Staticka varijabla je zadrzala vrijednost izmedu visestrukih poziva funkcije i zato takav ispis.
Aha! Jasno... Zanimljiv primjer.. evo proguglo sam jos jedan malo kompliciraniji!
#include <iostream>
#include <string>
using namespace::std;
struct point{
int x,y;
};
point const *next_point(){
static int current = 0;
static const point pts[] = {{0,0},{1,0},{1,1},{0,1}};
point const *p = pts + current;
if(++current == _countof(pts))
current = 0;
return p;
}
int main(){
for(int i = 0; i < 8; i++){
point const *k = next_point();
cout<<"( "<<k -> x<<", "<<k -> y<<" )"<<endl;
}
return 0;
}
Da. S time da je varijabla 'a' živa samo tokom poziva funkcije.
aha... znači svaki put kad se poziva ta funkcija varijabla a se ponovo alocira memorija na stacku za tu varijablu i izlaskom iz funkcije se dealocira!!
ako netko zeli nauciti design patterns i cpp:
ako netko zeli nauciti design patterns i cpp:
Takoder, ako netko zeli provjeriti nauceno: http://www.zemris.fer.hr/~ssegvic/ooup/
Pogledati pod laboratorijske vjezbe (i rijesiti ih :D). S obzirom da je stranica javno dostupna mislim da nema problema ako netko zeli rjesavati te zadatke, ali za bilo sto drugo (npr. koristenje tih zadataka u neke druge svrhe) preporucujem da se prvo javite prof. Segvicu.
Sredinom sljedeceg tjedna me ceka treca vjezba, bit ce to zaista zanimljivo iskustvo. 
Zanimljivo. Bar će ljudi ako ništa drugo shvatiti polimorfizam a kamoli još ove varijante
Podsjeća me na vremena kada bi nam na faksu dali rekurzivnu funkciju koju pomoću formalnih pravila treba pretvoriti u ne-rekurzivnu. Stvarno materijal za razmišljanje
.
Zanimljivo. Bar će ljudi ako ništa drugo shvatiti polimorfizam a kamoli još ove varijante
Podsjeća me na vremena kada bi nam na faksu dali rekurzivnu funkciju koju pomoću formalnih pravila treba pretvoriti u ne-rekurzivnu. Stvarno materijal za razmišljanje
.
Misliš iterativnu?
Da se code unutar nje ponavlja ali ne kao rekurzivna funkcija tj. da ne zove sama sebe.
ako netko zeli nauciti design patterns i cpp:
Takoder, ako netko zeli provjeriti nauceno: http://www.zemris.fer.hr/~ssegvic/ooup/
Pogledati pod laboratorijske vjezbe (i rijesiti ih :D). S obzirom da je stranica javno dostupna mislim da nema problema ako netko zeli rjesavati te zadatke, ali za bilo sto drugo (npr. koristenje tih zadataka u neke druge svrhe) preporucujem da se prvo javite prof. Segvicu.
Sredinom sljedeceg tjedna me ceka treca vjezba, bit ce to zaista zanimljivo iskustvo. 
Od nekog tko moze napisati delinosti kao:
" C++ je sve do pojave predložaka i iznimki bio običan preprocesor za C"
ne bi zelio hamburger i pomfri narucit, a kamoli uciti programiranje...
Od nekog tko moze napisati delinosti kao:
" C++ je sve do pojave predložaka i iznimki bio običan preprocesor za C"
ne bi zelio hamburger i pomfri narucit, a kamoli uciti programiranje...
A nego što je bio?
Od nekog tko moze napisati delinosti kao:
" C++ je sve do pojave predložaka i iznimki bio običan preprocesor za C"
ne bi zelio hamburger i pomfri narucit, a kamoli uciti programiranje...
Iz Stroustrupovih biljezaka: "In October of 1979 I had a pre−processor, called Cpre, that added Simula−like classes to C running and in March of 1980 this pre−processor had been refined to the point where it supported one real project and several experiments." - u to vrijeme taj jezik je nazvao C with Classes. U pocetku je nudio klase, strong typing, inlining i defaultne argumente. Kako se kasnije jezik razvijao, razvijen je i pravi kompajler za njega, Cfront (koji je gle cuda, generirao C kod: "The most unusual – for its time – aspect of Cfront was that it generated C code. This has caused no end of confusion. Cfront generated C because I needed extreme portability for an initial implementation and I considered C the most portable assembler around.").
A sto se tice toga bi li zelio da te uci programirati ili ne, dovoljno je pogledati covjekov CV koji je takoder javno dostupan.
Radije se drzi teme.
vidim da tu slijep slijepog uci...
na stranici koja ima 10 recenica posvetiti jednu tome sto je cpp bio tokom developmenta(prije 35 j godina, prvi ISO je 15+ godina star, STL je 20 g star... ) je idiotizam.
kao sto mu je i kod banana(Kako prenosimo složene *izlazne* parametre potprograma ako želimo izbjeći kopiranje objekata, tj. ostvariti call by reference? ), jel lik ocigledno ne zna sto je to RVO, move semantics i slicno...
bolje mu je da ostane u akademiji... a i nije cudno sto se ljudi bune da je cpp banana jezik kad ga ovako uce...
Ne vidim ništa loše u sadržaju dotičnog profesora/asistenta. Štoviše, nije ovdje riječ o učenju C++a već se kroz više programskih jezika gledaju razne specifične implementacije. Npr.: "Proučava se izražavanje dinamičkog polimorfizma u C++-u, Javi i Pythonu, kao i odgovarajuća izvedba u C-u". I sam autor u jednoj vježbi kaže da je baš cilj napisati code niže razine u nekim slučajevima, a kasnije se isto vidi kako je napravljeno i u drugim programskim jezicima što doista može biti od koristi.
Izvadio si stvari iz konteksta i to ti ne daje za pravo da pljuješ po čovjeku i da ga omalovažavaš jer on je svoje kvalifikacije vjerujem dokazao pred puno pametnijim ljudima nego što je to forumska rulja.
vidim da tu slijep slijepog uci...
na stranici koja ima 10 recenica posvetiti jednu tome sto je cpp bio tokom developmenta(prije 35 j godina, prvi ISO je 15+ godina star, STL je 20 g star... ) je idiotizam.
kao sto mu je i kod banana(Kako prenosimo složene *izlazne* parametre potprograma ako želimo izbjeći kopiranje objekata, tj. ostvariti call by reference? ), jel lik ocigledno ne zna sto je to RVO, move semantics i slicno...
bolje mu je da ostane u akademiji... a i nije cudno sto se ljudi bune da je cpp banana jezik kad ga ovako uce...
Kao sto je vec receno, nije rijec o ucenju C++-a, vec je rijec o oblikovnim obrascima, svidalo se to tebi ili ne. Labosi se vrlo efektno mogu napraviti i u Pythonu ili Javi (osim ovih za koje je eksplicitno receno da se rade u C-u).
Druga stvar, jedini jezik koji se na faksu eksplicitno uci je C i to na prvoj godini. Za bilo sto drugo si sam svoj majstor. Tako da vecina ljudi koji slusaju predmet ili imaju podlogu samo u C-u (vjerujem i nadam se manjina) ili znaju nesto u nekom visem jeziku (Python, Java...). No to je vec neka druga prica i tice se uprave faksa i politike i ostalih slicnih gluposti.
Ako te zanimaju design patterni i zelis to nauciti, na ovom predmetu ces ih definitivno nauciti. I to je jedino bitno.
Kaze se "jer".
Ne vidim ništa loše u sadržaju dotičnog profesora/asistenta. Štoviše, nije ovdje riječ o učenju C++a već se kroz više programskih jezika gledaju razne specifične implementacije. Npr.: "Proučava se izražavanje dinamičkog polimorfizma u C++-u, Javi i Pythonu, kao i odgovarajuća izvedba u C-u". I sam autor u jednoj vježbi kaže da je baš cilj napisati code niže razine u nekim slučajevima, a kasnije se isto vidi kako je napravljeno i u drugim programskim jezicima što doista može biti od koristi.
Izvadio si stvari iz konteksta i to ti ne daje za pravo da pljuješ po čovjeku i da ga omalovažavaš jer on je svoje kvalifikacije vjerujem dokazao pred puno pametnijim ljudima nego što je to forumska rulja.
Nisam se isprdavao iz njegovog znanja patterna nego iz pisanja gluposti o cpp... jer se svodi na ne znam cpp, ali sam cuo da je bla bla, pa cu to napisati...
naravno to na stranu vidi cuda na predmetu se radi nesto korisno IRL(design patterns), sto ga cini boljim od 75% predmeta na FERu, tako da ako ga imate prilike slusati vjerojatno je to dobra ideja..., osim ako je prolaznost mala :D
uglavnom kao sto sam napisao Schimdtovi materijali su bolji(iako naravno uvijek moze bolje :) ), npr ovo je uvod u CPP dosta dobar:
Moram napraviti jedan kalkulator trokuta koji kad se unesu poznati parametri, izbaci ostale nepoznate vrijednosti. Zeza me kada u pravokutnom trokutu imam dvije katete i treba izracunati hipotenuzu, a ne znam kako napisat pitagorin zakon. Pa eto ako ko ima volje pomoc, ja san probao ovako: c=a^2+b^2.
Ali kako sam stavio da su mi i a i b double varijable, on mi izbaciva errore...
#include<math.h>
...
c =sqrt( pow(a,2) + pow(b,2) );
...
coder : "xxxxxxxxxxxxx"
probaj ovako:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
/*******************************/
/* pravokutni trokut */
/* c^2 = a^2 + b^2 <- pitagora */
/* dakle c = sqrt(a*a + b*b) */
/*******************************/
float kateta_a , kateta_b , hipotenuza;
cout<< "unesi katetu a: ";
cin>> kateta_a;
cout<< "\nunesi katetu b: ";
cin>> kateta_b;
hipotenuza = sqrt( (kateta_a*kateta_a) + (kateta_b*kateta_b));
cout<< "\nhipotenuza iznosi : " << hipotenuza << "\n\n";
return 0;
}
Moram napraviti jedan kalkulator trokuta koji kad se unesu poznati parametri, izbaci ostale nepoznate vrijednosti. Zeza me kada u pravokutnom trokutu imam dvije katete i treba izracunati hipotenuzu, a ne znam kako napisat pitagorin zakon. Pa eto ako ko ima volje pomoc, ja san probao ovako: c=a^2+b^2.
Ali kako sam stavio da su mi i a i b double varijable, on mi izbaciva errore...
kao prvo u formuli ti fali kvadrad kod c ili korjen na desnoj strani,
kao drugo u c/c++ ^ ti je bitwise operator a ne power, prouci to malo... :D
coder : "xxxxxxxxxxxxx"
probaj ovako:
E fala ti nisam ni sjetio toga... Sta matematika ucini od covjeka hahahaha xd
Moram napraviti jedan kalkulator trokuta koji kad se unesu poznati parametri, izbaci ostale nepoznate vrijednosti. Zeza me kada u pravokutnom trokutu imam dvije katete i treba izracunati hipotenuzu, a ne znam kako napisat pitagorin zakon. Pa eto ako ko ima volje pomoc, ja san probao ovako: c=a^2+b^2.
Ali kako sam stavio da su mi i a i b double varijable, on mi izbaciva errore...
kao prvo u formuli ti fali kvadrad kod c ili korjen na desnoj strani,
kao drugo u c/c++ ^ ti je bitwise operator a ne power, prouci to malo... :D
Znan kako ide poucak ali eto brzina pa nisam isao za tim...
Ovo ^ je vise bio pokusaj na slijepo, ali eto vrijedilo je pokusat :)
...The South Will Rise Again... White -h- boys
#include<stdio.h>
int broj(char *pa,int y){
int brb=0,brs=0;
for(i=0;i<y;i++){
if(*(pa+i)>='a' && *(pa+i)>='z')
brs++;
if(*(pa+i)>='0' && *(pa+i)<='9')
brb++;
}
}
main(){
char a[50],*pa;
pa=*a[0];
int f,i,br=0,d;
printf("\n Ucitaj recenicu:");
gets(pa);
d=strlen(pa);
f=broj(pa,d);
printf("\n Rijeci ima %d.",f+1);
}
Znači, zadatak je da se učita 50 znakova i ispitati ima li više malih slova ili brojeva. Trebamo koristiti pokazivače kao argumente funkcije. Mislim da rješenje treba biti u gl.programu?
Unaprijed hvala,
LP
Znači, zadatak je da se učita 50 znakova i ispitati ima li više malih slova ili brojeva. Trebamo koristiti pokazivače kao argumente funkcije. Mislim da rješenje treba biti u gl.programu?
Unaprijed hvala,
LP
Prebaciš varijable u funkciju po referenci, a zatim ih u main funkciji usporediš i ispišeš.
#include <iostream>
using namespace std;
void brojZnakova(int* brBroj, int* brSlovo, char* niz, int n)
{
for (int i = 0; i < n; i++)
{
if (*(niz + i) >= 97 && *(niz + i) <= 122)
{
*brSlovo += 1;
}
else
{
if (*(niz + i) >= 48 && *(niz + i) <= 57)
{
*brBroj += 1;
}
}
}
}
int main(){
int brBroj = 0, brSlovo = 0, duljinaNiza;
char* niz = new char[50];
gets_s(niz, 50);
duljinaNiza = strlen(niz);
brojZnakova(&brBroj, &brSlovo, niz, duljinaNiza);
if (brBroj > brSlovo)
cout << "Vise brojeva" << endl;
else if (brBroj < brSlovo)
cout << "Vise malih slova" << endl;
else
cout << "Jednako" << endl;
cout << "Malih slova: " << brSlovo << endl;
cout << "Brojeva: " << brBroj << endl;
delete[] niz;
return 0;
}
...
Uzmi zadnji C++ Builder (XE5) i bez problema i s lakoćom ćeš raditi mobilne aplikacije (Android, IOS). A po potrebi ih direktno compiliraš i za Win i OSX bez ikakve promjene koda.
Ima li igdje cijela verzija koja radi na win8?
Ovdje je trial XE6 verzije koja radi mjesec dana:
http://www.embarcadero.com/products/cbuilder
Baš sam ovih dana malo testirao izradu mobilnih aplikacije i super radi. Možeš instalirati android simulator ili jednostavno spojiti mobitel na pc i odmah vidjeti kako aplikacija radi na mobitelu (uključujući i debugiranje).
Kratki demo:
Pozdrav ljudi!
Nov sam na forumu i zamolio bih vas za pomoc
Pokusavam shvatiti zasto mi privatne varijable u klasi ne poprimaju vrijednost koje sam im zadao preko funkcije koja je deklarirana unutar klase
Evo kod pa ako mozete pomoc uvijek mi izbacuje istu vrijednost koju dobije automatski prilikom pokretanja programa
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
class Klasa
{
private:
int a, b;
public:
void upisiAB(int prvi, int drugi);
int ispisiA();
int ispisiB();
void RandAB();
void ispisiBroj();
};
void Klasa::upisiAB(int prvi, int drugi)
{
a = prvi;
b = drugi;
}
int Klasa::ispisiA()
{
return a;
}
int Klasa::ispisiB()
{
return b;
}
void Klasa::RandAB()
{
int A, B;
srand(time(0));
A = rand();
B = rand();
upisiAB(A, B);
}
void Klasa::ispisiBroj()
{
cout << "A = " << a << endl << "B = " << b << endl;
}
int main()
{
Klasa obj;
obj.ispisiBroj();
system("pause");
return 0;
}
Zahvaljujem unaprijed! :D
Pozdrav ljudi!
Nov sam na forumu i zamolio bih vas za pomoc
Pokusavam shvatiti zasto mi privatne varijable u klasi ne poprimaju vrijednost koje sam im zadao preko funkcije koja je deklarirana unutar klase
Evo kod pa ako mozete pomoc uvijek mi izbacuje istu vrijednost koju dobije automatski prilikom pokretanja programa
Zahvaljujem unaprijed! :D
Okkk, a gdje ti tocno pozivas metodu upisiAB(), tj. RandAB() koja onda poziva upisiAB()?
Ja vidim da pozivas samo ispisiBroj().

