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

poruka: 7.285
|
čitano: 1.726.725
|
moderatori: XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
14 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

malloc u pravilu vraća pointer neodređenog tipa (void*) pa ga je zato potrebno castati u onaj potrebni (char*):

 

polje[i] = (char*)malloc(sizeof(char) * (strlen(buff)+1));

Moj PC  
0 0 hvala 1
17 godina
moderator
online
Re: Programiranje u C++-u - pitanja i odgovori
emerik kaže...

Može mi netko reći zašto ovaj kod ne radi?Baca mi grešku u liniji gdje koristim malloc.

Što ne valja s operatorom new, kad već koristiš C++?

13 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Da!, koristi new i delete.

 

16 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori

Ma,radim po nekoj knjizi u tako piše.Možda se kasnije i spominje new i delete,al još nisam do toga došao.

AC Milan - IL CLUB PIU' TITOLATO AL MONDO
17 godina
moderator
online
Re: Programiranje u C++-u - pitanja i odgovori
emerik kaže...

Ma,radim po nekoj knjizi u tako piše.Možda se kasnije i spominje new i delete,al još nisam do toga došao.

Po knjizi za C ili C++? Jer ako je to knjiga za C++, onda je vjerojatno to samo loša prerada knjige koja je nekad bila namijenjena za učenje C-a.

13 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Nemoj tako i naš Tracer je u svojoj knjizi prvo obradio malloc i realloc, pa je onda prešao na new. {#}

17 godina
moderator
online
Re: Programiranje u C++-u - pitanja i odgovori
royalhero kaže...

Nemoj tako i naš Tracer je u svojoj knjizi prvo obradio malloc i realloc, pa je onda prešao na new. {#}

Nije mi to uopće palo na pamet. Ako netko prelazi s C-a na C++, onda mu takve stvari ima smisla učiti. Ako ne prelazi, onda se s tim samo nepotrebno opterećuje. Možda je dobro znati da postoji tako nešto (malloc), ali...

14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Kako na tehničkim studijima jako puno drilaju C (pogotovo na početnim godinama) malloc i free su jako učestali pa sam i njih spomenuo, no jasno, u C++u definitivno treba koristiti new i delete.

 

Mislim da sam negdje već stavio primjer s konstrukturima i destruktorima gdje se jasno vidi da je malloc i free nedostatno (i pogrešno) koristiti u C++u zbog korisnički definiranih tipova podataka.

16 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori

Možete onda ako nije problem napisati taj kod s new i delete?

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

Umjesto gornjeg malloca napiši:

 

polje[i] = new char[strlen(buff)+1];

16 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori

Kako koristiti binarne operator s iostreamom?S cstdio mi radi ,a s iostream ne.

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

Ne razumijem baš pitanje. Daj primjer.

16 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori

Ipak radi.Prije sam zaboravio staviti zagrade pa mi ja bacao grešku.

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

Pogledaj stare stranice ove teme, raspravljalo se o libovima, zavisi kako u kojem IDE-u/Compileru.

13 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

bok, novi sam ovdje, pa nisam htio otvarat novu temu jer mislim da i ovdje mogu postat. ako sam slucajno fulao nemojte zamjerit :)

 

ugl, imam jedan zadatak koji sam rijesio do "kraja", tj on mi sve radi kako bi i trebao ali mi na kraju kad se program zavrsi dolazi ona poruka "heap corruption detected..."...., pa me zanima ako mi mozete rec kako da to rijesim. kad recimo funkciju "dealokacija" stavim pod komentar to mi se ne pojavljuje, pa mislim da je negdje u njoj problem, tj  da bi ju trebalo malo izmjenit. ugl, ostavljam vam kod, pa ako neko ima vremena da pogleda... zahvaljujem unaprijed.

 

 

 

#include "stdafx.h"

#include <iostream>

 

using namespace std;

 

void stvori(float **FILM, int n)

{

int i, m;

for(i=0;i<n;i++)

{

cout<<"Unesite broj godina odrzavanja za "<<i+1<<". festival: ";

cin>>m;

FILM[i]=new float(m+3);

FILM[i][0]=float(m);

}

}

 

void upisi(float **FILM, int n)

{

int i, j;

for(i=0;i<n;i++)

{

float ukupno=0, ukupno1=0;

cout<<endl;

for(j=1;j<=FILM[i][0];j++)

{

cout<<"Unesite broj prikazanih filmova za "<<j<<". godinu "<<i+1<<". festivala: ";

cin>>FILM[i][j];

ukupno+=FILM[i][j];

if(FILM[i][j]>ukupno1)

{

ukupno1 = FILM[i][j];

}

}

FILM[i][j]=ukupno/FILM[i][0];

FILM[i][j+1]=ukupno1;

}

}

 

void ispis(float **FILM, int n)

{

int i, j;

for(i=0;i<n;i++)

{

for(j=0;j<=FILM[i][0]+2;j++)

{

if(j==FILM[i][0]+1)

cout<<FILM[i][j];

else if(j==FILM[i][0]+2)

cout<<" "<<FILM[i][j]<<endl;

else 

cout<<FILM[i][j]<<" ";

}

}

}

 

void dealokacija(float **FILM, int n)

{

int i;

for(i=0;i<n;i++)

delete FILM[i];

delete []FILM;

FILM=NULL;

}

 

void main()

{

   int n;

 

cout<<"Unesite broj filmskih festivala: ";

cin>>n;

cout<<endl;

 

float **FILM = new float *[n];

 

stvori(FILM, n);

upisi(FILM, n);

ispis(FILM, n);

dealokacija(FILM, n);

}

 

 

Poruka je uređivana zadnji put sub 18.2.2012 14:02 (naughty guy).
 
0 0 hvala 0
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Na prvi pogled (ako izuzmemo void main i sl. greške) cijeli koncept se čini pogrešan. Ne vidim zašto zasebno radiš funkcije stvori, upisi, ispis itd.. Primjerice, iako su argumenti funkcija dvostruki pokazivači ti zapravo radiš call by value a ne call by reference! Tako npr. tvoja funkcija dealokacija zapravo dealocira lokalni FILM umjesto onog iz funkcije main. Drugim riječima, ona bi kao arugment zapravo trebala imati trostruki pokazivač koji prima adresu dvostrukog pokazivača iz funkcije main.

 

S obzirom na višestruke komplikacije na koje ćeš naići tokom prerade svega toga toplo preporučujem da sve to staviš u funkciju main.

13 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

ma da, al to moramo tako na faksu radit.. vjerojatno zvuci malo smijesno, al eto.. da ne ulazim previse u detalje.

14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Na faksu se radi slično, no ne baš ovakvo. Ovo tvoje me podsjeća na pokušaj stvaranje dinamičke alocirane liste. U tom slučaju dvostruki pokazivači su u funkcijama opravdani jer se adresiraju na glavu liste (što je obični pokazivač), dok ti ovdje nemaš glavu liste već direktno radiš s dvostrukim pokazivačem kojeg želiš predati funkciji, a da bi to napravio trebaš predati njegovu adresu (trostruki pokazivač).

13 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

ma nezz sta da ti kazem. tako smo radili na vjezbama, samo sta smo sad dobili dodatno da uz prosjek pronadjemo i najveci upisani broj. 

zato sam ubacio onaj "if" u funkciji "upisi" i to mi sve lijepo napravi, samo sta mi ispise tu poruku, a ne bi htio da mi zbog nje oduzme neke bodove.

al u svakom slucaju hvala ti :)

 
0 0 hvala 0
13 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

@Tracer, sjećaš se one teme gdje ste ti, floki i wifi raspravljali o profesorima?

E ovo je živi primjer.

 
0 0 hvala 0
15 godina
offline
Programiranje u C++-u - pitanja i odgovori

Evo sada idem malo po Demistificarnom c++ i vidim kljucnu rijec register koja se stavlja ispred varijabli. Tada se da uputa compileru da se ta varijabla stavi  registar procesora. Ima li smisla danas stavljati to ispred varijabli? Hoce li to dati nekakvo ubrzanje ako jednoj varijabli pristupan npr. 200k puta?

Twitter- @capttawish Linux/GNU live forever.
 
0 0 hvala 0
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

To ima smisla koristiti samo u specijalnim slučajevima kada je brzina pristupa zaista kritična. Najčešće u velikim projektima. Osobno mi nikad to nije trebalo jer u manjim projektima zahtjevi nisu toliko veliki pa niti sami programi nisu toliko spori.

13 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Može pomoć?Rješavam na spoj.pl  zadatak PRIME1 i baca mi ovu grešku.Vrijeme izvršavanja je 0,14 s,a zauzeće memorije 3.7 MB.

Moj kod:

 

 

#include<cstdio>

#include<cstdlib>

#include<cmath>

 

int main() {

   int n,m,t;

 

   scanf("%d",&t);

 

   for ( int k = 0; k < t ; ++k) {

 

   bool *prosti;

   scanf("%d %d",&n,&m);

   prosti = new bool[sizeof(bool)*(m+1)];

 

   for ( int i = 0; i <=m;++i)

    prosti[i] = 1;

   prosti[0] = prosti[1] = 0;

 

   int granica = round(sqrt(m)); 

 

   for ( int i = 2; i <=m; ++i)

    if(prosti[i])

      for (int  j= i*2; j<=m;j+=i)

       prosti[j] = 0;

 

   for ( int i = n; i <= m ; ++i)

    if (prosti[i])

      printf("%d\n",i);

 

   printf("\n");    

 

   delete(prosti);          

 

}

 

   //system("PAUSE");

   return 0;

   }

 

 

 

Poruka je uređivana zadnji put pon 20.2.2012 17:22 (Ivan_99C++).
16 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori

Kao prvo,dinamička alokacija ti je spora pa bi zato trebal alocirati memoriju izvan najveće for petlje.A i vidim da je najveći mogući upisani broj milijarda,a za alocirat tolko memorije treba dosta vremena tak da trebaš izmisliti neki bolji način.

 

EDIT:Zadatak nije baš tako lagan kako se čini.Nego,zna li netko da li su zadaci na spoj.pl ovdje poredani po težini.Hvala.

AC Milan - IL CLUB PIU' TITOLATO AL MONDO
Poruka je uređivana zadnji put pon 20.2.2012 20:26 (emerik).
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
emerik kaže...

Kao prvo,dinamička alokacija ti je spora pa bi zato trebal alocirati memoriju izvan najveće for petlje.A i vidim da je najveći mogući upisani broj milijarda,a za alocirat tolko memorije treba dosta vremena tak da trebaš izmisliti neki bolji način.

 

EDIT:Zadatak nije baš tako lagan kako se čini.Nego,zna li netko da li su zadaci na spoj.pl ovdje poredani po težini.Hvala.

Nisu poredani po težini, već po datumu kada su stavljeni.

16 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
Postoji onda neka lista u kojoj su posloženi po težini?
AC Milan - IL CLUB PIU' TITOLATO AL MONDO
16 godina
offline
Programiranje u C++-u - pitanja i odgovori

Ovo je kod za zbrajanje 2 velika broja koji sam našao u nekoj knjizi.Prepisao sam potpuno isti kod iz knjige,ali mi ne radi pa ako bi mogli pomoći.Hvala.

 

#include<iostream>

#include<string>

#include<cstdlib>

using namespace std;

 

void okreni( char *A,int a) {

   for ( int i = 0; i < a/2;++i) {

     A[i] ^=A[a-1-i];

     A[a-1-i] ^=A[i];

     A[i] ^= A[i-1-i];

     }

   }

 

int main() {

   char A[1001] = {0};

   char B[1001] = {0};

   char C[1002];

 

   int c,prijenos = 0;

 

   cin>>A>>B;

 

   int a = strlen(A);

   int b = strlen(B);

 

   for ( int i = 0; i < a;++i) A[i]-='0';

   for (int i = 0; i < b;++i) B[i]-='0';

 

   okreni(A,a);

   okreni(B,b);

   if ( a> b) c = a;

    else c = b;

 

   for ( int i = 0; i < c;++i) {

     C[i] = A[i]+B[i] + prijenos;

     if ( C[i] > 9) {

       C[i]-=10;

       prijenos = 1;

       } else prijenos = 0;

     }

 

   if ( prijenos) C[c++]=1;

   okreni(C,c);

   for ( int i = 0; i < c;++i) C[i] +='0';

   //C[c]='\0';

   cout<<C;

 

   system("PAUSE");

   return 0;

   }

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

Za takve stvari postoje već gotove klase u C++u koje se mogu implementirati:

 

https://mattmccutchen.net/bigint/

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

Prva ti je greska sto u funkciji okreni imas:

A[i] ^= A[i-1-i];

Tu na pocetku umjesto i treba biti a:

A[i] ^= A[a-1-i];

To je glavni razloga sto dobivas svakave znakove pri ispiu.

Druga greska ti je ovo:

//C[c]='\0';

Tu trebas maknuti ove // koje oznacavju komentar inace naredba nema smisla:

C[c]='\0';

Sa ovim program dobro radi

TracerCPP kaže...

Za takve stvari postoje već gotove klase u C++u koje se mogu implementirati:

 

https://mattmccutchen.net/bigint/

Cilj ovoga zadatka je ucenje algoritama odnosno uvod u osnovne algoritme. Zato u ovome slucaju nema smisla koristiti gotove klase. Stovise na natjecanju u algoritmima smiju se koristiti samo standardne biblioteke tako da te gotove tada ne bi bile previse od pomoci.

Twitter- @capttawish Linux/GNU live forever.
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
captain_soap_McTawish kaže...
emerik kaže...

Prva ti je greska sto u funkciji okreni imas:

A[i] ^= A[i-1-i];

Tu na pocetku umjesto i treba biti a:

A[i] ^= A[a-1-i];

To je glavni razloga sto dobivas svakave znakove pri ispiu.

Druga greska ti je ovo:

//C[c]='\0';

Tu trebas maknuti ove // koje oznacavju komentar inace naredba nema smisla:

C[c]='\0';

Sa ovim program dobro radi

TracerCPP kaže...

Za takve stvari postoje već gotove klase u C++u koje se mogu implementirati:

 

https://mattmccutchen.net/bigint/

Cilj ovoga zadatka je ucenje algoritama odnosno uvod u osnovne algoritme. Zato u ovome slucaju nema smisla koristiti gotove klase. Stovise na natjecanju u algoritmima smiju se koristiti samo standardne biblioteke tako da te gotove tada ne bi bile previse od pomoci.

Tko ovdje govori o natjecanjima? Oni koji žele naučiti programiranje nisu nužno natjecatelji niti si žele ograničiti resurse pravilima nekog natjecanja. A što se tiče tvojih izmjena.. Program radi dobro samo u slučaju ako su oba broja pozitivna (možda je tako i predviđeno, no ne znam)..

 

Također, link koji sam dao daje klasu koja je iznimno korisna jer osim operacije zbrajanja jako velikih brojeva ima podržane i mnoge druge operacije, te se ovo gore nikako ne može usporediti s tom klasom. Jedno je vježba (onaj dio koda gore koji daje tek polovično rješenje), a drugo je ozbiljan rad (klasa koju sam dao u linku).

Poruka je uređivana zadnji put uto 21.2.2012 17:20 (TracerCPP).
E-mail:
Lozinka:
 
vrh stranice