Programiranje u C++-u - pitanja i odgovori izdvojena tema

poruka: 7.285
|
čitano: 1.713.619
|
moderatori: Lazarus Long, XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
16 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
rustweaver kaže...

Prvo pogledaj prototip metode write.

 

Dakle možemo vidjeti da write ima dva parametra, prvi je deklariran kao pokazivač na char, a drugi kao int.

 

Prvi argument koji ćeš proslijediti metodi write govori gdje se u memoriji nalaze charovi koje želiš zapisati u stream (memorijska adresa), dok drugi argument govori funkciji koliko tih charova želiš zapisati (odnosno koliko je niz dug) u stream.

 

Ako pogledaš spornu liniju koda vidjet ćeš da se prvo uzima adresa prvog elementa polja 'p' i potom se ta memorijska adresa casta u char pointer baš kao što metoda write i zahtjeva. Drugi argument je sizeof operator primijenjen na polje 'p'. Budući da sizeof operator vraća veličinu u bajtovima neke varijable (u ovom slučaju polja), dobit ćeš količinu bajtova koje to polje zauzima u memoriji. A kako je 1 char = 1 bajt tako si automatski dobio duljinu u charovima.

 

U C-u i C++-u char tip se koristi za pristup memoriji na razini bajtova, stoga ćeš često vidjeti da se char koristi i za stvari koje nemaju veze sa tekstom, ponekad je to prikriveno iza nekakvog typedefa ali sve je to isti drek.

 

Btw. jesi li siguran da doista želiš vršiti append na datoteku?

Hvala ti, malo je jasnije sada..zasto je koristeno ovo binary, a ne recimo da se spremi u neku datoteku.txt? Kako ja mogu otvorit .bin datoteku uopce da mogu vidjet sta je zapisano? Pokusao sam otvoriti u notepadu ali sve sto sam dobio su neki kvadratici..

Što sam ja na kraju dobio uopce sa tim programom? o.O

A sto se tice ovo append na datoteku, to nije toliko bitno valjda, to je samo da se nadodaje u datoteku a ne da se sve brise svaki put.

 

 

Bi znao neko ovo rijesit:

 

Zad:

 Napišite program koji će sve zapise iz formatirane (tekstualne) datoteke "stara.txt" prepisati u novu neformatiranu datoteku "nova.dat". Datoteka stara.txt sadrži sljedeće: 

 

Ivo Ivic 1980.5

Ana Anic 2000.80

Pero Peric 4504.07

Windows Phone FTW
Poruka je uređivana zadnji put pon 17.3.2014 0:57 (DommY).
14 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Ovaj kod treba da sortira niz rastuci i da onda izbaci iste clanove,i to radi kad ispisem cijeli niz,ali kad pokusam ispisati samo drugi clan tog novog niza ne radi..

 

#include <iostream>

using namespace std;

int main()
{
    int n;
    cin>>n;
    int a[n];
    for (int i = 0; i < n;++i)
    {
        cin>>a[i];
    }
    for (int i = 0; i < n;++i)
    {
        for (int j = 0; j < i;++j)
        {
            if (a[i]<a[j]) swap(a[i],a[j]);
        }
    }
    for (int i = 0; i < n;++i)
    {
        bool isti = false;
        for (int j = i+1; j < n;++j)
        {
            if (a[i]==a[j]) isti = true;
        }
        if (!isti)
        {
            cout<<a[i]<<endl;
        }
    }
    return 0;
}

 
0 0 hvala 0
15 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
DommY kaže...

Hvala ti, malo je jasnije sada..zasto je koristeno ovo binary, a ne recimo da se spremi u neku datoteku.txt?

Zato što je binarne formate jako jednostavno čitati i zapisivati, a i kompaktniji su. A i vjerojatno je to namjerno napravljeno kako bi se vas naučilo raditi i sa tako strukturiranim podatcima.

 

Naravno, nedostatci binarnih formata nas dovode do:

DommY kaže...

Kako ja mogu otvorit .bin datoteku uopce da mogu vidjet sta je zapisano? Pokusao sam otvoriti u notepadu ali sve sto sam dobio su neki kvadratici..

Što sam ja na kraju dobio uopce sa tim programom? o.O

Teško, ako ne znaš kako su podatci strukturirani. Tim više što notepad nije pravi alat za pregledavanje takvih datoteka.

 

Naime notepad svaku otvorenu datoteku pokušava interpretirati kao čisti tekst, znači kontrolni znakovi se ne prikazuju (to su ti ove kockice koje vidiš, u biti ASCII znakovi 0-31), neki kontrolni znakovi potpuno nedostaju (CR i LF koji se interpretiraju kao kraj linije teksta, TAB se interpretira kao tab), a ostali znakovi se prikazuju kao slova (ASCII ili Unicode). Sve ti to skupa pokazuje da notepad nije pravi alat za pregledavanje takvih datoteka, treba ti nešto što se zove hex editor, koji ti prikazuje sadržaj svake datoteke bajt po bajt.

 

DommY kaže...

Što sam ja na kraju dobio uopce sa tim programom? o.O

Zapisao si polje u datoteku baš onako kako je to polje zapisano u radnoj memoriji. To ti je memory dump u nekom smislu, jer si doslovno komad memorije bacio na hard disk.

 

DommY kaže...
A sto se tice ovo append na datoteku, to nije toliko bitno valjda, to je samo da se nadodaje u datoteku a ne da se sve brise svaki put.

A zašto da se ne briše? Pokušavaš sačuvati ono što je već zapisano u datoteci, pa samo nadodati novi zapis na kraj datoteke?

 

DommY kaže...
Bi znao neko ovo rijesit:

 

Zad:

 Napišite program koji će sve zapise iz formatirane (tekstualne) datoteke "stara.txt" prepisati u novu neformatiranu datoteku "nova.dat". Datoteka stara.txt sadrži sljedeće: 

 

Ivo Ivic 1980.5

Ana Anic 2000.80

Pero Peric 4504.07

Znao bih, ali nešto treba ostaviti i tebi da se pomučiš :D

 

Ako sam dobro shvatio zadatak onda ovo "neformatirana datoteka" nije posve točno jer moraš imati nekakav format kako bi mogao čitati podatke kasnije. Ali ako jest točno onda je stvar još lakša jer trebaš samo nabacati zapise sekvencijalno jedan za drugim bez ikakvog razmišljanja o tome kako ćeš kasnije pročitati sadržaj te datoteke.

To understand what recursion is, you must first understand recursion.
16 godina
offline
Programiranje u C++-u - pitanja i odgovori

Hvala ti, sve je jasnije sada.

 

Evo kako sam to rjesio, da li bi i ti tako tj slicno ili imas neki drugi nacin za to rjesiti?

 

#include <iostream>

#include <fstream>

 

using namespace std;

 

int main()

{

   string zapis;

   ifstream datotekaCitanja("stara.txt");

   ofstream datotekaPisanja("nova.dat");

 

   if(datotekaCitanja.is_open() && datotekaPisanja.is_open())

   {

     while(getline(datotekaCitanja, zapis))

     {

       datotekaPisanja << zapis << endl;

     }

     cout << "All done!\n";

   }

   else

   {

     cout << "Pogreska pri otvaranju datoteke.\n";

   }

   return 0;

}

Windows Phone FTW
Moj PC  
0 0 hvala 0
15 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
DommY kaže...

Hvala ti, sve je jasnije sada.

 

Evo kako sam to rjesio, da li bi i ti tako tj slicno ili imas neki drugi nacin za to rjesiti?

Otvori hex editorom ulaznu i izlaznu datoteku i vidjet ćeš da si efektivno prekopirao sadržaj datoteke :D

Problem je što ulaznu datoteku i dalje tretiraš kao tekstualnu, odnosno najmanji token ti je linija teksta, i onda kada tu liniju pročitaš takvu kakva je i onda ju samo strpaš u drugu datoteku ponovno si dobio istu stvar.

 

Trebat će ti drugačiji pristup:

#include <iostream>
#include <fstream>
#include <sstream>
#include <cstring>

using namespace std;

struct PODATCI
{
    char ime[20];
    char prezime[20];
    float broj;
};

int main()
{
    string linija;
    ifstream datotekaCitanja("stara.txt");
    ofstream datotekaPisanja("nova.dat", ios::binary);
    istringstream iss;
    PODATCI podatci;

    if (datotekaCitanja.is_open() && datotekaPisanja.is_open())
    {
        while (getline(datotekaCitanja, linija))
        {
            // ovo nije nuzno, ali datoteka lijepse izgleda kada
            // ju pregledavas hex editorom, a i opcenito je jako dobra
            // ideja inicijalizirati sve podatke koje mislis zapisivati
            // datoteku
            memset(&podatci, 0, sizeof(PODATCI));

            iss.str(linija);

            iss >> podatci.ime;
            iss >> podatci.prezime;
            iss >> podatci.broj;

            iss.clear();

            // formatirano zapisivanje u datoteku. Format
            // datoteke je u biti format strukture PODATCI koja
            // se ponavlja sekvencijalno, kao polje struktura.
            datotekaPisanja.write((char*)&podatci, sizeof(PODATCI));

            // neformatirano zapisivanje u datoteku, sve su
            // vrijednosti zapisane odmah jedna nakon druge,
            // bez razmaka ili ikakvih naznaka gdje koja pocinje
            // a gdje zavrsava
            /*datotekaPisanja.write(podatci.ime, strlen(podatci.ime));
            datotekaPisanja.write(podatci.prezime, strlen(podatci.prezime));
            datotekaPisanja.write((char*)&podatci.broj, sizeof(float));*/
        }
        cout << "All done!\n";
    }
    else
    {
        cout << "Pogreska pri otvaranju datoteke.\n";
    }

    return 0;
}

 

Evo kako bi to otprilike izgledalo u C++-u (trebalo mi je malo dok nisam skužio kako iskoristiti string kao stream), jbg navikao na C.

 

Zadatci:

  1. skinuti neki hex editor i vidjeti kakva datoteka nastane kada pokreneš ovaj program
  2. ukloniti memset pa onda vidjeti kakve to posljedice ima na sadržaj datoteke koju ovaj program zapiše, što misliš zašto se to događa?
  3. staviti onu liniju koja radi formatirano zapisivanje pod komentar i odkomentirati tri linije koje rade neformatirano zapisivanje i pokrenuti program. Primjećuješ razliku? Kako bi mogao znati gdje koji podatak počinje, a gdje završava?

 

P.S.

 

Kad se već bavimo binarnim formatima, evo ti malo primjera nekoliko formata iz stvarnog života:

Targa Truevision (.tga), jako jednostavan a opet dovoljno bogat mogućnostima format slikovnih datoteka

Portable Executable (.exe) ovo ti valjda ne moram objašnjavati što je, evo kako su podatci tu strukturirani.

RIFF wave (.wav) Općepoznati format za (uglavnom) nekompresirani zvuk, koristi microsoftovu vlastitu verziju electronic artsovog IFF formata. IFF, i sve njegove varijante su jedan od najraširenijih formata binarnih podataka.

 

(Ovo ne moraš štrebati napamet, samo primjer da vidiš kako to u stvarnom životu izgleda)

To understand what recursion is, you must first understand recursion.
15 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Intelovac123 kaže...

Ovaj kod treba da sortira niz rastuci i da onda izbaci iste clanove,i to radi kad ispisem cijeli niz,ali kad pokusam ispisati samo drugi clan tog novog niza ne radi..

Objasni, jer te uopće nisam skužio. Pokrenuo program i za a[2] sam dobio pravilno sortirani član. Probaj ovakvim jezikom:

imam podatke Z, kada pokrenem program dobijem X, a želim dobiti Y. Crtaj ako treba :P

To understand what recursion is, you must first understand recursion.
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
rustweaver kaže...
Intelovac123 kaže...

Ovaj kod treba da sortira niz rastuci i da onda izbaci iste clanove,i to radi kad ispisem cijeli niz,ali kad pokusam ispisati samo drugi clan tog novog niza ne radi..

Objasni, jer te uopće nisam skužio. Pokrenuo program i za a[2] sam dobio pravilno sortirani član. Probaj ovakvim jezikom:

imam podatke Z, kada pokrenem program dobijem X, a želim dobiti Y. Crtaj ako treba :P

Ovako.

Imam niz a[i] i sortiram njegove clanove po rastucem redosljedu, i onda izbacim clanove koji se ponavljaju vise puta.

Kad upisem cout<<a[i]<<endl; na kraju kao sto i pise u kodu,ispise mi niz sortiran i bez onih koji se ponavljaju.

 

npr...

 

 

n=7;

1 1 2 1 6 6 1

 

ispise mi

 

1 2 6

 

kao sto bi i trebalo,ali kad umjesto a[i] na kraju upisem cout<<a[1]<<endl; ne ispisuje drugi clan tj. 2

 

Sta tebi taj moj program ispise kad uneses cout<<a[2]<<endl;

 

16 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Intelovac123 kaže...

Ovaj kod treba da sortira niz rastuci i da onda izbaci iste clanove,i to radi kad ispisem cijeli niz,ali kad pokusam ispisati samo drugi clan tog novog niza ne radi..

 

#include <iostream>

using namespace std;

int main()
{
    int n;
    cin>>n;
    int a[n];
    for (int i = 0; i < n;++i)
    {
        cin>>a[i];
    }
    for (int i = 0; i < n;++i)
    {
        for (int j = 0; j < i;++j)
        {
            if (a[i]<a[j]) swap(a[i],a[j]);
        }
    }
    for (int i = 0; i < n;++i)
    {
        bool isti = false;
        for (int j = i+1; j < n;++j)
        {
            if (a[i]==a[j]) isti = true;
        }
        if (!isti)
        {
            cout<<a[i]<<endl;
        }
    }
    return 0;
}

 

Intelovac123 kaže...
rustweaver kaže...
Intelovac123 kaže...

Ovaj kod treba da sortira niz rastuci i da onda izbaci iste clanove,i to radi kad ispisem cijeli niz,ali kad pokusam ispisati samo drugi clan tog novog niza ne radi..

Objasni, jer te uopće nisam skužio. Pokrenuo program i za a[2] sam dobio pravilno sortirani član. Probaj ovakvim jezikom:

imam podatke Z, kada pokrenem program dobijem X, a želim dobiti Y. Crtaj ako treba :P

Ovako.

Imam niz a[i] i sortiram njegove clanove po rastucem redosljedu, i onda izbacim clanove koji se ponavljaju vise puta.

Kad upisem cout<<a[i]<<endl; na kraju kao sto i pise u kodu,ispise mi niz sortiran i bez onih koji se ponavljaju.

 

npr...

 

 

n=7;

1 1 2 1 6 6 1

 

ispise mi

 

1 2 6

 

kao sto bi i trebalo,ali kad umjesto a[i] na kraju upisem cout<<a[1]<<endl; ne ispisuje drugi clan tj. 2

 

Sta tebi taj moj program ispise kad uneses cout<<a[2]<<endl;

 

 

Došlo je do zabune izgleda kod tebe.

 

znači nakon n=7 imaš rezultat 1 2 6 i to je OK kao rezultat.

daj odvrti u petlji sve članove i imat ćeš redom sljedeće brojeve 1 1 1 1 2 6 6 i to je OK.

 

nije OK to što u zadnjoj petlji imaš samo provjeru članova i cout onih koji odgovaraju uvjetima a

zapravo nikakve modifikacije istih te je niz isti poslije navedenog for-a.

 

 

for (int i = 0; i < n;++i)
    {
        bool isti = false;
        for (int j = i+1; j < n;++j)
        {
            if (a[i]==a[j]) isti = true;
        }
        if (!isti)
        {
            cout<<a[i]<<endl;

            /**/

            * tu radi modifikaciju niza ukoliko želiš drukciji raspored na kraju

            **/
        }
    }

 

 

Pozdrav.

http:/https://play.google.com/store/apps/details?id=org.kde.necessitas.example.SMASHHH
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Intelovac123 kaže...
rustweaver kaže...
Intelovac123 kaže...

Ovaj kod treba da sortira niz rastuci i da onda izbaci iste clanove,i to radi kad ispisem cijeli niz,ali kad pokusam ispisati samo drugi clan tog novog niza ne radi..

Objasni, jer te uopće nisam skužio. Pokrenuo program i za a[2] sam dobio pravilno sortirani član. Probaj ovakvim jezikom:

imam podatke Z, kada pokrenem program dobijem X, a želim dobiti Y. Crtaj ako treba :P

Ovako.

Imam niz a[i] i sortiram njegove clanove po rastucem redosljedu, i onda izbacim clanove koji se ponavljaju vise puta.

Kad upisem cout<<a[i]<<endl; na kraju kao sto i pise u kodu,ispise mi niz sortiran i bez onih koji se ponavljaju.


 

Što točno ovo znači? Izbaciti ih iz ispisa ili baš iz samog niza?

 

Edit: Ako baš treba izbaciti elemente iz samog niza probaj ovako:

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(){
    int i, n, pom;
    vector<int> polje;

    cout << "Unesi broj elemenata: ";
    cin >> n;

    for(i = 0; i < n; i++){
       cout << "Unesi polje[" << i << "]: ";
       cin >> pom;
       polje.push_back(pom);
    }
    sort(polje.begin(), polje.end());
    polje.erase(unique(polje.begin(), polje.end()), polje.end());

    for(i = 0; i < polje.size(); i++)
       cout << "polje[" << i << "] = " << polje[i] << endl;
    return 0;
}

Kada lajavci laju onda završe ovako: http://i471.photobucket.com/albums/rr77/toropreto/2012-07-0813_30_07.gif
Poruka je uređivana zadnji put sri 19.3.2014 22:43 (TracerCPP).
12 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Instalirao sam VS 2010 express i kada pokrenem console window mi stoji upaljen 5 sekundi i onda mi se gasi mogu obavljati unos i ispis tih 5 sekundi ali nije mi jasno zašto se console window gasi nakon tih 5 sekundi probao sam i sa system("PAUSE") u zadnjoj liniji ali ne zaustavlja ga?

Poruka je uređivana zadnji put sri 19.3.2014 23:33 (Xyloto).
 
0 0 hvala 0
12 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Evo napisao sam program koji mi trazi da unesem broj N i da unesem N brojeva ali nakon 5 sekundi mi se program "izvrši" i piše Press any key iako nisam unio svih 20 brojeva do čega bi moglo biti nedavno sam reinstalirao windows da mu ne fali nešto od programa ???

 

 

 
0 1 hvala 0
15 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Xyloto kaže...

Instalirao sam VS 2010 express i kada pokrenem console window mi stoji upaljen 5 sekundi i onda mi se gasi mogu obavljati unos i ispis tih 5 sekundi ali nije mi jasno zašto se console window gasi nakon tih 5 sekundi probao sam i sa system("PAUSE") u zadnjoj liniji ali ne zaustavlja ga?

Imaš li komandu pause?

 

Funkcija system samo izvršava komande iz naredbenog retka. Stoga ti system("pause") neće pomoći ako tvoj operacijski sustav nema tu komandu, upravo se zato ne preporuča pauziranje programa na taj način. Otvori cmd, upiši pause i stisni enter. Što piše?

 

Možeš i pokrenuti program sa ctrl + F5, pa će ti visual studio pauzirati program automatski, bez potrebe za gnjavažom...

To understand what recursion is, you must first understand recursion.
12 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Uspio sam rješiti prije sam stavljao system("PAUSE") pa mi je bilo isto, naime greška mi je bila kod antivirusa avast jer je on nekako prekidao da mi se program izvrši. U avast-u sam pod iznimkama stavio datoteku projekta da je ne skenira sa pokretanjem projekta i sada radi normalno.

14 godina
offline
Programiranje u C++-u - pitanja i odgovori

Zanima me kako da napravim da mogu u adresu ucitati i ulicu i broj, znam da treba ici pomocu getline, ali uvijek mi ili ne ucita broj ili ga prebaci negdje drugdje itd...

 

#include"Garaza.h"

#include<iostream>

#include<string>

#include<vector>

#include"Predmet.h"

 

using namespace std;

 

 

 

int main(){

 

int N,M,i;

 

Garaza *niz;

cout<<"Unesite broj garaza: ";

cin>>N;

niz=new Garaza[N];

for(i=0;i<N;i++){

 

cout<<"Unesite velicinu, lokaciju i podatak o vratima za "<< i+1<<". garazu:";

cin>>niz[i].duljina>>niz[i].sirina;

cin>>niz[i].adresa;

cin>>niz[i].vrata;

}

 

for(i=0;i<N;i++){

 

cout<<"Duljina: "<<niz[i].duljina<<" "<<"Sirina: "<<niz[i].sirina<<" "<<"Lokacija: "<<niz[i].adresa<<" "<<"Vrata: "<<niz[i].vrata<<endl;

}

 

return 0;

}

Inace je sve ovo bilo lijepo uvuceno ali javlja mi gresku kada pokusam tako ovdje to zalijepiti

Poruka je uređivana zadnji put pet 21.3.2014 18:16 (yaga01).
Moj PC  
0 0 hvala 0
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

OOP1 TVZ? Kod mene ili kod Cesara ste u grupi?

 

Pošto se učitava cijela linija teksta treba koristit getline:

 

getline(cin, niz[i].adresa);

 

pod pretpostavkom da je adresa tipa string. Ali isto tako treba paziti da prije getline se ne "proguta" \n, pa ako se to dogodi prije getline funkcije zanemariti zadnji znak tj. pozvati cin.ignore();

Kada lajavci laju onda završe ovako: http://i471.photobucket.com/albums/rr77/toropreto/2012-07-0813_30_07.gif
14 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
Kod vas :)
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

E pa onda se valjda sjećate da smo taj problem posebno pokazali danas ;)

Kada lajavci laju onda završe ovako: http://i471.photobucket.com/albums/rr77/toropreto/2012-07-0813_30_07.gif
15 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
TracerCPP kaže...

OOP1 TVZ? Kod mene ili kod Cesara ste u grupi?

 

Pošto se učitava cijela linija teksta treba koristit getline:

 

getline(cin, niz[i].adresa);

 

pod pretpostavkom da je adresa tipa string. Ali isto tako treba paziti da prije getline se ne "proguta" \n, pa ako se to dogodi prije getline funkcije zanemariti zadnji znak tj. pozvati cin.ignore();

Potpuno offtopic, ali kako si uspio dobiti TD na taj post? {#}

To understand what recursion is, you must first understand recursion.
Poruka je uređivana zadnji put pet 21.3.2014 19:16 (rustweaver).
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
rustweaver kaže...

Potpuno offtopic, ali kako si uspio dobiti TD na taj post? {#}

Ma netko očito liječi frustracije. Nek mu je sa srećom {#}

Kada lajavci laju onda završe ovako: http://i471.photobucket.com/albums/rr77/toropreto/2012-07-0813_30_07.gif
14 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
sjecam se da smo ga obradili ali sam ja cijelo vrijeme pokusavao sa cin.ignore iza getline pa nije radio ono sto je trebao.
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Isto tako, probajte s vektorima to riješiti jer je bolje zbog izbjegavanja dinamičke alokacije i dealokacije. Ili ako već baš želite dinamičkom alokacijom onda to napraviti preko smart pointera:

 

#include <memory>

unique_ptr<Garaza> niz (new Garaza[N]);

 

Sada delete[] niz nije potreban.

Kada lajavci laju onda završe ovako: http://i471.photobucket.com/albums/rr77/toropreto/2012-07-0813_30_07.gif
Poruka je uređivana zadnji put pet 21.3.2014 19:38 (TracerCPP).
17 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
TracerCPP kaže...

Isto tako, probajte s vektorima to riješiti jer je bolje zbog izbjegavanja dinamičke alokacije i dealokacije. Ili ako već baš želite dinamičkom alokacijom onda to napraviti preko smart pointera:

 

#include <memory>

unique_ptr<Garaza> niz (new Garaza[N]);

 

Sada delete[] niz nije potreban.

valjda si htio reci izbjegavanja rucne mem alokacije, i vektor radi dinamicku alokaciju i dealokaciju...

14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Zoidberg kaže...
TracerCPP kaže...

Isto tako, probajte s vektorima to riješiti jer je bolje zbog izbjegavanja dinamičke alokacije i dealokacije. Ili ako već baš želite dinamičkom alokacijom onda to napraviti preko smart pointera:

 

#include <memory>

unique_ptr<Garaza> niz (new Garaza[N]);

 

Sada delete[] niz nije potreban.

valjda si htio reci izbjegavanja rucne mem alokacije, i vektor radi dinamicku alokaciju i dealokaciju...

Naravno. Vector je container koji to sve sam interno odrađuje i zato sam i preporučio da se rješava preko njega. Na vježbama smo i riješili preko vektora ali kolega iz nekog razloga ovdje koristi ručnu alokaciju memorije preko običnog pointera.

Kada lajavci laju onda završe ovako: http://i471.photobucket.com/albums/rr77/toropreto/2012-07-0813_30_07.gif
16 godina
offline
Programiranje u C++-u - pitanja i odgovori

Ako u nekoj funkciji dinamički alociram memoriju i vrijednost polja vratim u glavni program preko pokazivača,da li se ta memorija koja je alocirana sama oslobađa ili ostaje zauzeta?

AC Milan - IL CLUB PIU' TITOLATO AL MONDO
Moj PC  
0 0 hvala 0
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Memorija se nikada neće sama dealocirati. Tvoja funkcija u tom slučaju treba vratiti pointer na alociranu memoriju koju ćeš ti osloboditi u pozivajućoj funkciji.

Kada lajavci laju onda završe ovako: http://i471.photobucket.com/albums/rr77/toropreto/2012-07-0813_30_07.gif
16 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori

Znači da trebam stvoriti pokazivač u glavnom programu i by reference ga predati u funkciju i kasnije osloboditi?

AC Milan - IL CLUB PIU' TITOLATO AL MONDO
Poruka je uređivana zadnji put sub 22.3.2014 9:44 (emerik).
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

To bi bilo najbolje;

 

int *p = new int[10]; // alokacija u mainu
f(&p[0], 10); // funkciji predaješ adresu početka polja
delete[] p; // dealokacija nakon što funkcija završi rad s tim poljem

 

ili ako već baš želiš polje alocirati u nekoj drugoj funkciji onda moraš paziti da ga kasnije dealociraš. Npr;

 

int* alociraj(int n){
    int *p = new int[n];
    return &p[0];
}
// main
int *p = alociraj(10);
delete[] p; // dealokacija

Kada lajavci laju onda završe ovako: http://i471.photobucket.com/albums/rr77/toropreto/2012-07-0813_30_07.gif
16 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori

Krivo smo se razumjeli.Alociram memoriju koristeći funkciju malloc.

AC Milan - IL CLUB PIU' TITOLATO AL MONDO
16 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

manje više ista stvar, kada si gotov pozoveš free() na svoj pointer

14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
emerik kaže...

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.

Kada lajavci laju onda završe ovako: http://i471.photobucket.com/albums/rr77/toropreto/2012-07-0813_30_07.gif
E-mail:
Lozinka:
 
vrh stranice