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));
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));
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++?
Da!, koristi new i delete.
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.
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.
Nemoj tako i naš Tracer je u svojoj knjizi prvo obradio malloc i realloc, pa je onda prešao na new.
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...
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.
Možete onda ako nije problem napisati taj kod s new i delete?
Umjesto gornjeg malloca napiši:
polje[i] = new char[strlen(buff)+1];
Kako koristiti binarne operator s iostreamom?S cstdio mi radi ,a s iostream ne.
Ne razumijem baš pitanje. Daj primjer.
Ipak radi.Prije sam zaboravio staviti zagrade pa mi ja bacao grešku.
Pogledaj stare stranice ove teme, raspravljalo se o libovima, zavisi kako u kojem IDE-u/Compileru.
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);
}
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.
ma da, al to moramo tako na faksu radit.. vjerojatno zvuci malo smijesno, al eto.. da ne ulazim previse u detalje.
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č).
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 :)
@Tracer, sjećaš se one teme gdje ste ti, floki i wifi raspravljali o profesorima?
E ovo je živi primjer.
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?
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.
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;
}
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.
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.
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;
}
Za takve stvari postoje već gotove klase u C++u koje se mogu implementirati:
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
Za takve stvari postoje već gotove klase u C++u koje se mogu implementirati:
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.
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
Za takve stvari postoje već gotove klase u C++u koje se mogu implementirati:
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).