Ali kako da oslobodim polje unutar funkcije?
Programiranje u C++-u - pitanja i odgovori
- poruka: 7.285
- |
- čitano: 1.713.357
- |
- moderatori:
Lazarus Long, XXX-Man, vincimus
- +/- sve poruke
- ravni prikaz
- starije poruke gore
Krivo smo se razumjeli.Alociram memoriju koristeći funkciju malloc.
U C++u malloc svakako treba zamjeniti s new. Malloc se može koristiti kod primitivnih tipova podataka (int, char, float...) ali u C++u može uzrokovati grešku jer malloc ne poziva konstruktor prilikom kreiranja objekta dok free ne poziva destruktor, a operatori new i delete to rade.
Koliko vidim momak rješava problem na C-ovski način, a ti na C++ način. Zbog toga te i ne razumije.
Ovo je C++ topic.
Da,nisam napomenuo da radim u C-u.Može pomoć svejedno?
Izuzevsi par sitnih razlika C++ je superset C.
ako hoces raditi C za vjezbu to je ok, ali osom ako ces biti low lvl developer neces C koristiti...
a sto se tice C++ u modern cpp se ne koriste new i delete, no za vjezbu ti je korisno da se mali igras sa new/delete, malloc/realloc/free da naucis kako stvari rade...
Razumijem,ali prvu godinu na faksu radim u C-u i moram koristiti te funkcije.
prekrasni kanal za one koji zele nauciti cpp:https://www.youtube.com/user/BoQianTheProgrammer
moguce je da su neki videii losi ali sve sto sam pogledao je dobro...
emerik budi sretan sto ces potrositi malo vremena na to, ne znas kako je tuzno vidjeti prof programere koji su krenuli programirati sa Javom ili C# pa nemaju pojma sta je to stack ili heap ili malloc. :D
.
prekrasni kanal za one koji zele nauciti cpp:https://www.youtube.com/user/BoQianTheProgrammer
moguce je da su neki videii losi ali sve sto sam pogledao je dobro...
emerik budi sretan sto ces potrositi malo vremena na to, ne znas kako je tuzno vidjeti prof programere koji su krenuli programirati sa Javom ili C# pa nemaju pojma sta je to stack ili heap ili malloc. :D
OK,da li se onda ta memorija koja je unutar funkcije dinamički alocirana oslobađa nakon završetka poziva funkcije?Alocira se na heapu,a lokalne varijable se spremaju na stacku pa bi prema nekoj logici ta dinamički alocirana memorija trebala ostati očuvana,no pokazivač na taj dio memorije se izbriše nakon završetka funkcije i ne znam kako da ju oslobodim kasnije.
Pa već sam ti dao primjer za to na prošloj stranici. Vratiš alociranu memoriju preko pokazivača i onda ju dealociraš u npr. mainu.
Alocira se na heapu,a lokalne varijable se spremaju na stacku pa bi prema nekoj logici ta dinamički alocirana memorija trebala ostati očuvana,no pokazivač na taj dio memorije se izbriše nakon završetka funkcije i ne znam kako da ju oslobodim kasnije.
Pa to je upravo to. Nemoj izgubiti taj pokazivač jer onda više nećeš moći osloboditi taj komad memorije i imat ćeš memory leak. To ti je sva mudrost oko toga...
Kako uz pomoć for natjerat program da se nakon svakih pet brojeva prebaci u novi red? To bi trebalo izgledati ovako:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
ako je brojac % 5 == 0
prebaci u novi red
Kako uz pomoć for natjerat program da se nakon svakih pet brojeva prebaci u novi red? To bi trebalo izgledati ovako:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
#include <iostream>
using namespace std;
int main()
{
// pretpostavljam da se radi o nizu brojeva
int num_array[] = {1 ,2 ,3 ,4, 5,
6, 7, 8, 9, 10,
11, 12, 13, 14, 15};
int cnt = 0;
for (int i = 0; i < (sizeof(num_array)/sizeof(*num_array)); ++i)
{
cout << num_array[i] << " ";
if(++cnt == 5)
{
cout << endl;
cnt = 0;
}
}
}
Kako uz pomoć for natjerat program da se nakon svakih pet brojeva prebaci u novi red? To bi trebalo izgledati ovako:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
int broj = 0, n = 1;
for (int red = 1; red <= 3; red++)
{
broj += 5;
for ( ; n <= broj; n++)
{
cout << n << " ";
}
cout << endl;
}
for (int n = 1; n <= 15; n++)
{
cout << n << " ";
if (n % 5 == 0)
{
cout << endl;
}
}
for (int red = 1; red <= 3; red++)
{
for (int n = 5 * (red - 1) + 1, broj = 5 * red; n <= broj; n++)
{
cout << n << " ";
}
cout << endl;
}
Čisto da vidiš koliko načina ima (i vjerojatno još par kojih se nisam sjetio)... biraj.
Objasni
Ako upisem da je n=3, onda ću program napisati
1 2 3
4 5 6
7 8 9
a ako napisem da je n=2,onda će pisati
1 2
3 4.
Ovako riješenim zadatkom manipulacijom uvjeta u drugoj for petlji mogu dobiti rješenje zadatka kako sam ga prvo postavio.
Ako upisem da je n=3, onda ću program napisati
1 2 3
4 5 6
7 8 9
a ako napisem da je n=2,onda će pisati
1 2
3 4.
int stupci = 3;
for (int n = 1; n <= stupci * stupci; n++)
{
cout << n << " ";
if (n % stupci == 0)
{
cout << endl;
}
}
Ako upisem da je n=3, onda ću program napisati
1 2 3
4 5 6
7 8 9
a ako napisem da je n=2,onda će pisati
1 2
3 4.
Ovako riješenim zadatkom manipulacijom uvjeta u drugoj for petlji mogu dobiti rješenje zadatka kako sam ga prvo postavio.
Samo omogućiš da broj redova definira korisnik (inače je hardkodiran na 5 u mom primjeru rješenja) i to radi očekivano, nema potrebe za ugnježđivanjem petlji.
#include <iostream>
#include <string>
#include <math.h>
using namespace std;
int main()
{
char * znak = new char();
cout << "Upis: "; cin >> znak;
cout << "Ispis: " << znak << endl;
free(znak);
system("PAUSE");
return 0;
}
Što se točno događa u ovom primjeru? Primjetio sam da mogu upisati više znakova (char je jedan znak inače koliko ja znam).
Da li se u ovom slučaju za svaki znak alocira dodatna memorija? Molio bih nekoga da mi objasni
#include <iostream>
#include <string>
#include <math.h>
using namespace std;
int main()
{
char * znak = new char();
cout << "Upis: "; cin >> znak;
cout << "Ispis: " << znak << endl;
free(znak);
system("PAUSE");
return 0;
}
Što se točno događa u ovom primjeru? Primjetio sam da mogu upisati više znakova (char je jedan znak inače koliko ja znam).
Da li se u ovom slučaju za svaki znak alocira dodatna memorija? Molio bih nekoga da mi objasni
Hvala, kuzim, ovo je bio samo primjer gdje me zanimalo što se događa, ali sad je moje pitanje: kako onda alocirati memoriju za char (nesto tipa string gdje ne definiram velicinu), znaci "neograničeno"
(znam da nije neograničeno, karikiram).
Hvala, kuzim, ovo je bio samo primjer gdje me zanimalo što se događa, ali sad je moje pitanje: kako onda alocirati memoriju za char (nesto tipa string gdje ne definiram velicinu), znaci "neograničeno"
(znam da nije neograničeno, karikiram).
Nikako, memorija se neće sama po sebi alocirati/dealocirati sukladno tvojim potrebama. Svaki puta kada alociraš memoriju moraš odrediti koliko točno memorije želiš. npr:
char *polje = new char[100];
to će ti dati pokazivač na komad memorije velik 100 charova (100 bajta)
char *znak = new char;
ovo će ti dati pokazivač na jedan char
I to je to, koliko si tražio toliko si i dobio (osim ako nisi iscrpio svu memoriju), ako želiš još moraš ponovno zatražiti.
Sve ostalo moraš implementirati sam (ako nećeš koristiti STL containere). Samo zato što ti pokušavaš upisati 200 bajta u polje koje je 100 bajta dugo ne znači da će se tvoj alocirani komad memorije rastegnuti za još 100 bajta. Jednostavno ćeš izletjeti izvan granica polja što može dovesti do page faulta, korupcije stacka, korupcije nekih drugih varijabli, a može i ne izazvati ikakve posljedice ako imaš sreće pa nisi overwriteao nešto esencijalno. Moraš sam implementirati logiku koja pokriva takve slučajeve i upravlja memorijom.
Klasa string za tebe iza kulisa upravlja memorijom, alocira i dealocira memoriju po potrebi tako da se ti ne moraš o tome brinuti. Isto tako vector klasa ti daje generička "rastezljiva" polja.
Odgovor na tvoje pitanje: koristi vector koji će to sve raditi za tebe.
Hvala, kuzim, ovo je bio samo primjer gdje me zanimalo što se događa, ali sad je moje pitanje: kako onda alocirati memoriju za char (nesto tipa string gdje ne definiram velicinu), znaci "neograničeno"
(znam da nije neograničeno, karikiram).
Što fali UnicodeString-u ili običnoj string klasi? Npr. UnicodeString se dinamički interno proširuje i može maksimalno iznositi koliko je RAM memorije dostupno u sustavu.
pointer na char ti dize 8byte mem i tu lupas sto hoces
iza 8bytea riskiras jer pises po nepoznatom
Ovaj dio komentara nije tocan: pointer na char ima 8 bytea, ali tu ne lupas nista - tu je adresa memorije na koju pokazivac pokazuje. Pointer na bilo sto ima velicinu 8 byteova u 64-bitnim aplikacijama, a 4 bytea u 32-bitnim.
U njegovom slucaju rizik je nakon prvog znaka.
Hvala, kuzim, ovo je bio samo primjer gdje me zanimalo što se događa, ali sad je moje pitanje: kako onda alocirati memoriju za char (nesto tipa string gdje ne definiram velicinu), znaci "neograničeno"
(znam da nije neograničeno, karikiram).
Kompajler mora znati čime barata tako da ovo šta veliš ne prolazi.
Koristi kako su ti rekli , vektor , list ... ili sami string.
Time imaš ono što želiš iako i navedene klase polažu račune kompajleru
alokacijom , dealokacijom no ti si kao krajnji korisnik spomenutih oslobođen
u danom trenutku misliti o tome.
imam pitanje.
koliko vam je trebalo da sve to naučite i budete dobri programeri, da znate dobro to radit?? Mislim da me to zanima al kad vidim to sve mi se čini da je užasno teško. I još ću upisati informatiku ove godine a nisam puno programirao, samo nešto malo u 2. razredu uglavnom osnove i neke prejednostavne funcije.
koliko vam je trebalo da sve to naučite i budete dobri programeri, da znate dobro to radit?? Mislim da me to zanima al kad vidim to sve mi se čini da je užasno teško.
Ako misliš da te zanima onda te vjerojatno ne zanima. Stvar je jednostavna, ako kuckaš kod zato jer ti je to zanimljivo a ne zato jer ti je to netko rekao (zadaća?) onda možeš reći da te to zanima.
Jako je nezahvalno davati nekakve vremenske procjene jer je previše faktora upleteno. Recimo samo da se vrijeme potrebno za stjecanje iskustva u programiranju mjeri u godinama a ne u danima ili mjesecima. Sad znaš o kojoj otprilike vremenskoj skali pričamo... ali ako te to doista zanima te će godine brzo proletjeti.
Dobar dan ljudi,
Zanima me da li ima tko kakve zadatke za programiranje u c-u za poslati, i mozda i ako ima kakva podjela od pocetnika do ono naprednog?
Zahvaljujem se!
Lp.