Inače C# WPF & Expression Studio=Awesome
Ali polako putujemo u .
Inače C# WPF & Expression Studio=Awesome
Ali polako putujemo u .
pozdrav, da li mi netko može obijasnit zašto mi baca bug ovaj program , tocnije "zbrojidjelovepizze" is being used withouth being initialized", ugl ovaj drugi for ima funkciju zbrajanja svih brojeva u vectoru, nasa sam na netu kako se to radi, al mi baca bug,inace ovo je samo dio programa, rješavam jedan zadatak z-trenninga pa sam zapea ovde:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
int brojprijatelja;
double djelovipizze;
double zbrojdjelovapizze;
vector <double> vectordjelovapizze;
cout << " mirko upisi koliko prijatelja ces pozvati" << endl;
cin >> brojprijatelja;
cout << " neka tvoji prijatelji upisu koliko pizze zele pojesti" << endl;
for(int i = 0; i < brojprijatelja; i++)
{
cin >> djelovipizze;
vectordjelovapizze.push_back(djelovipizze);
}
for (int i=0; i<vectordjelovapizze.size();i++)
{
zbrojdjelovapizze += vectordjelovapizze[i]; - Kad upalim debugger ovde stane i baci bug.
}
cout << zbrojdjelovapizze << endl;
}
Varijabli "zbrojdjelovapizze" nisi dodjelio nikakvu pocetnu vrijednost, nego samo zbrajas na ono sto se nalazi u memoriji (smece). Postavi varijablu prvo na 0.0 pa onda zbrajaj.
double zbrojdjelovapizze=0.0;
edit: kôd ti je katastrofalno formatiran, nadam se da je to samo rezultat loseg kopiranja na forum.
Varijabli "zbrojdjelovapizze" nisi dodjelio nikakvu pocetnu vrijednost, nego samo zbrajas na ono sto se nalazi u memoriji (smece). Postavi varijablu prvo na 0.0 pa onda zbrajaj.
double zbrojdjelovapizze=0.0;
edit: kôd ti je katastrofalno formatiran, nadam se da je to samo rezultat loseg kopiranja na forum.
ah ma šta je najgore od svega to mi je i palo napamet pa sam stavia zbrojdjelovapizze = 0, al s obzirom da je double varijabla treba sam stavit 0.0, s obzirom da sam ga kodira u ponoč, ništa čudno :D , btw rekla mi je mater da ću dobit pod bor demistificirani c++ 3. izdanje, pa se bacam na posao za praznike.
btw rekla mi je mater da ću dobit pod bor demistificirani c++ 3. izdanje, pa se bacam na posao za praznike.
Moram priznat da si me ugodno iznenadio sa ovim.
btw rekla mi je mater da ću dobit pod bor demistificirani c++ 3. izdanje, pa se bacam na posao za praznike.
Moram priznat da si me ugodno iznenadio sa ovim.
haha zašto xd :D
btw rekla mi je mater da ću dobit pod bor demistificirani c++ 3. izdanje, pa se bacam na posao za praznike.
Moram priznat da si me ugodno iznenadio sa ovim.
haha zašto xd :D
Jer nisi trazio gamersko ovo|ono.
btw rekla mi je mater da ću dobit pod bor demistificirani c++ 3. izdanje, pa se bacam na posao za praznike.
Moram priznat da si me ugodno iznenadio sa ovim.
haha zašto xd :D
Jer nisi trazio gamersko ovo|ono.
ahahahah, a komponente za pc sam financiram jer mater ionako misli da previše trošim na njega, a ovu knjigu stvarno želim da se mogu kako bog zapovida uvatit posla jer ovo kopanje po netu ne liči na ništa, a ona će mi je drage volje uzet :D
pozdrav, ucio cam se radit u c++ u dev-c++ i onda sam preso na code::blocks u kojem trenutno radim.
Sljedeci program...
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <conio.h>
using namespace std;
int main()
{
char a;
cout<<"Pritisnite 1 za izlazak"<<endl<<endl<<endl;
while (a!='1'){
a=getch();
cout<<a<<endl;
}
system("pause");
return 0;
}
...sam pisao u devu i bez izmjene sam ga kopirao i kompajlirao u code::blocksu.
U devu kad kliknem 1 mi izade iz programa (getch) ali u code::blocksu se nista ne desava... ostat koda pravilno (jednako) se izvodi.
Moje pitanje je gdje je došlo do greške, jesi li kompajleri tako različiti i mogu li očekivat ovakve greške u budućnosti?
Moje pitanje je gdje je došlo do greške, jesi li kompajleri tako različiti i mogu li očekivat ovakve greške u budućnosti?
Nije riječ o nikakvoj greški nego si program pokrenuo na način da se konzola ne zatvara automatski nakon završetka programa. Imaš tipke F8 i F9 čini mi se - ako pokreneš s F8 konzola se automatski zatvara, ako pokreneš s F9 konzola se ne zatvara automatski, nego pritiskom na neku tipku.
pa zašto se to onda ne događa, kada stisnem jedan, kaze mi da opet nesto stisnem da se program zatvori, nakon toga se ne zatvori nego mi da izvjesce trejanja programa i return 0 te opet press any key.. i tek kada stisnem nesto se zatvara. sa f8 opet mi izbaci dijalog press any key i onda se nakon toga zatvara. mene zanima kako zatvorit program cim pritisnem na jedinicu.
EDIT: hvala, maknuo sam system pause i pokrenuo f8, onda se automatski zatvara. ipak, u devu system pause je bio prisutan....
pa zašto se to onda ne događa, kada stisnem jedan, kaze mi da opet nesto stisnem da se program zatvori, nakon toga se ne zatvori nego mi da izvjesce trejanja programa i return 0 te opet press any key.. i tek kada stisnem nesto se zatvara.
Ponovno pogledaj svoj kôd i malo uključi mozak. Ako treba ponovno pročitaj moju poruku.
Prvo, formatiraj taj kod da na nesto lici.
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
int main()
{
char a;
cout<<"Pritisnite 1 za izlazak"<<endl<<endl<<endl;
while (a!='1')
{
a = getchar();
cout << a << endl;
exit(0); // ili ovako, ili stavi umjesto cout << a;
}
return 0;
}
Nadalje, <conio.h> nije standardno zaglavlje, kao niti getch() funkcija koja je definirana u njemu. Umjesto toga koristi <cstdio> zaglavlje i funkciju getchar() ili std::cin objekt, posto je rijec o C++-u.
system("pause") takoder nije standardna f-ja, preporuka je da je ne koristis, a koliko znam u C::B-u ju nije niti potrebno koristiti (na Windowsima).
K tome, ovaj tvoj program je pisan tako da izade iz while petlje, a ne iz programa (iako poslije while petlje nema nicega osim return 0, pa bi trebao izaci, ali nije poanta sad u tome), tako da to sto ti se konzola zatvori nije nikakva greska, vec je to u redu, zato jer je program tako napisan (C::B zadrzi konzolu otvorenu do pritiska tipke Enter). Ako zelis izlazak iz programa iz while petlje, koristi funkciju exit() koja je definirana u <cstdlib> zaglavlju (boldano).
EDIT: Sad sam probao sa exit() u while petlji, iako radi to sto treba raditi, C::B ne gasi konzolu, dakle ista je stvar. Uglavnom, lupi F8, postoje dva nacina pokretanja. F8 je debugger.
hvala, ali...
sa getcharom, dobijem drugaciji efekt... on mi ispisuje u jednom redu i pritiskom na enter ispisuje samo prvo slovo/broj koji je upisan (razmumijem zasto je to tako)...dok sa getchom ide svaki char u sljedeci red, dakle cim ja dodijelim vrjednost charu, ovaj ga ispisuje... ovo sa exit(0) , ovo u zagradi su milisekunde prija zatvaranja, ili?
hvala, ali...
1) sa getcharom, dobijem drugaciji efekt... on mi ispisuje u jednom redu dok sa getchom ide svaki char u sljedeci red... 2)ovo sa exit(0) , ovo u zagradi su milisekunde prija zatvaranja, ili?
1) Ne kuzim sto zelis reci s ovime. getchar() i getch() nista ne ispisuju. EDIT: Tj. getchar() echoa upisani character ako si na to mislio...
2) http://www.cplusplus.com/reference/clibrary/cstdlib/exit/
sa getcharom:
dodijelim vrjednost charu, xyz slova/brojeva, i on mi ispise samo prvo (to razumijem zasto je to tako, ali to nisam htio postic) i onda se program zavrsi
sa getchom:
cim ja dodijelim vrjednost charu, dakle samo klkinem na "i" ovaj ispisuje i, i tako za svako slovo koje ide u novi red.
kada charu dodijelim vrjednost 1, program zavrsava
Zasto bi koristio exit() iz cstdlib kad mozes koristiti najobicniji return ?
Umjesto getchar ili getch koristi cin.get() ili cin.getline().
I opcenito zaboravi na conio.h, nikad nista dobro nije doslo iz conio.h.
Zasto bi koristio exit() iz cstdlib kad mozes koristiti najobicniji return ?
Ne samo to, nego zašto bi koristio ikakav apsolutni izlaz, kad može iz petlje jednostavno izaći naredbom break?
Zasto bi koristio exit() iz cstdlib kad mozes koristiti najobicniji return ?
Ne samo to, nego zašto bi koristio ikakav apsolutni izlaz, kad može iz petlje jednostavno izaći naredbom break?
Neznam, nisam bas pratio, zar pitanje nije kako izaci iz programa a da se ne odvrti do kraja, ali eto:
Ne samo to, moze izaci iz petlje tako da jednostavno koristi do-while kao sto bi trebao tako da postavi
uvjet koji ce biti false pri zeljenoj vrijednosti unosa.
Jeste procitali ovaj dio uopce? Tocnije, ovaj boldani dio.
K tome, ovaj tvoj program je pisan tako da izade iz while petlje, a ne iz programa (iako poslije while petlje nema nicega osim return 0, pa bi trebao izaci, ali nije poanta sad u tome) ...
Ovdje kod njega kod ovakvog jednostavnog programa nema potrebe za tako necim, ali kad je rijec o vecem programu, recimo da ima tri ugnjezdene for petlje ili sto ti ja znam, a nakon nekog uvjeta u trecoj for petlji treba izaci iz programa. break mu nece puno pomoci, osim ako ne strukturira for petlje tako da kad prva breaka da sve izlete van (ovo je jedna od rijetkih situacija gdje je goto okej koristiti - visestruki break). Ili exit(), a moze i return iako osobno bas returnove ne ostavljam po svuda po programu, osim na kraju...
EDIT: Damn, zajeb*al sam se pa editirao onaj post s odgovorom, jel se moze to kako vratiti?
Ne samo to, nego zašto bi koristio ikakav apsolutni izlaz, kad može iz petlje jednostavno izaći naredbom break?
Neznam, nisam bas pratio, zar pitanje nije kako izaci iz programa a da se ne odvrti do kraja, ali eto:
Ne samo to, moze izaci iz petlje tako da jednostavno koristi do-while kao sto bi trebao tako da postavi
uvjet koji ce biti false pri zeljenoj vrijednosti unosa.
Jedno od nepisanih pravila je da ne prekidaš program na silu, osim ako to nije nužno, jer se time ruši hijerarhija programa. U konkretnom programu nije bilo nužno prekinuti program, dakle ni halt ni return na tome mjestu nisu opravdani.
getch i getchar dodjeluju vrijednost charu bez potrebe da se klikne enter, zar ne?
mene zanima zasto cim upisemo jedo slovo/broj u getch cout naredba ga odmah ispisuje, i petlja se izvrsava dok charu ne dodijelim vrjednost 1
problem je kod getchara koji "ne reagira" ja charu mogu upisat bezbroj slova/brojeva i onda ce mi cout naredbom ispisat samo prvu, i to shvacam
mene zanima kako kod getcahara postignut efekt od getcha
eh da, moze mi neko objasnit razliku itmeđu for i while?
Ovdje kod njega kod ovakvog jednostavnog programa nema potrebe za tako necim, ali kad je rijec o vecem programu, recimo da ima tri ugnjezdene for petlje ili sto ti ja znam, a nakon nekog uvjeta u trecoj for petlji treba izaci iz programa. break mu nece puno pomoci, osim ako ne strukturira for petlje tako da kad prva breaka da sve izlete van (ovo je jedna od rijetkih situacija gdje je goto okej koristiti - visestruki break). Ili exit(), a moze i return iako osobno bas returnove ne ostavljam po svuda po programu, osim na kraju...
Što znači to "veći program"? Nebitno je koliko je program velik, jer se program dâ (i trebao bi se) usitniti kroz funkcije i objekte. Jedino što je bitno je koliko je složen trenutni algoritam koji koristi više razina petlji. Dakle, postoje slučajevi kad se nasilni izlazak ne može izbjeći, ali to su rijetki slučajevi. Ako dođe do toga, češće je razlog tome što programer nije adekvatno rascjepkao kôd - što je neku od petlji zapravo mogao ubaciti u funkciju ili nešto slično.
Imaš neke konkretne slučajeve gdje moraš nasilno izlaziti, da ih proanaliziramo?
Pa kako možeš išta programirati ako to ne znaš? For se koristi kad kod ulaska u petlju znaš koliko puta će se petlja odvrtiti, a while i do-while kad ne znaš. While se koristi kad uvjet provjeravaš na početku petlje, do-while kad provjeravaš na kraju.
Ovdje kod njega kod ovakvog jednostavnog programa nema potrebe za tako necim, ali kad je rijec o vecem programu, recimo da ima tri ugnjezdene for petlje ili sto ti ja znam, a nakon nekog uvjeta u trecoj for petlji treba izaci iz programa. break mu nece puno pomoci, osim ako ne strukturira for petlje tako da kad prva breaka da sve izlete van (ovo je jedna od rijetkih situacija gdje je goto okej koristiti - visestruki break). Ili exit(), a moze i return iako osobno bas returnove ne ostavljam po svuda po programu, osim na kraju...
EDIT: Damn, zajeb*al sam se pa editirao onaj post s odgovorom, jel se moze to kako vratiti?
1. Ako gnijezdis vise od dvije petlje a ne radi se o nekom kopliciranom matematickom algoritmu
mozda bi se trebao zapitati da li mozda nesto krivo radis.
2. Ako mislis da je to ipak ono sto zelis ali imas potrebu u 15toj petlji odjednom izaci iz svih petlji
bez da se izvrse do kraja sigurno nesto radis krivo.
3. U svakom slucaju bi bolje bilo deklarirati pomocnu variablu koja je dostpuna svim petljama nego koristiti goto.
4. exit() nema smisla koristiti u c++ kao prvo jer zahtijeva cstdlib a kao druo jer imas nekih problema oko
nepozivanja destruktora koliko vidim.
Imaš neke konkretne slučajeve gdje moraš nasilno izlaziti, da ih proanaliziramo?
...Oprostite mi, ovo je C. Takoder, ispricavam se na velicini koda. Davno sam to radio. Ovdje sam koristio returnove, ne exit.
/*! lab1.c
*
* Kopira sadrzaj jednog direktorija u drugi. Pri tome ce se stare datoteke, ako
* nisu iste novima, preimenovati tako da se na ime doda vrijeme zadnje promjene
* (u obliku YYYY-MM-DD_HH-MM-SS), a nova ce se onda tamo kopirati pod
* orginalnim imenom.
* Pretpostavka je da se u direktoriju nalaze samo datoteke - inace program nece
* raditi ispravno. Takodjer, preskacu se datoteke koje pocinju tockom (a to su
* na *UNIX* sustavima i oznake trenutnog direktorija (.), i onog ispod (..).
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <time.h>
#include <utime.h>
#include <malloc.h>
#include <string.h>
#include <stdio.h>
#define IME 80
#define BLOK 1000
#include "datoteke.h"
int main ( int argc, char *argv[] )
{
/* zadano */
char ime1[IME], ime2[IME], ime3[IME], vrijeme[20];
int n, i;
char **dat;
DIR *test;
if ( argc != 3 )
{
fprintf ( stderr, "Program kopira jedan direktorij u drugi\n" );
fprintf ( stderr, "Uporaba: %s direkt1 direkt2\n", argv[0] );
return 1;
}
dat = dohvati_datoteke ( argv[1], &n );
if ( dat == NULL )
return 2;
if ( ( test = opendir ( argv[2] ) ) == NULL )
{
if ( mkdir ( argv[2], 0755 ) ) /* 0755 == rwx r-x r-x */
{
perror ( "mkdir" );
fprintf ( stderr, "Ne moze se stvoriti direktorij %s\n",
argv[2]);
return 3;
}
}
else {
closedir ( test );
}
printf ( "Kopiram iz %s -> %s:\n", argv[1], argv[2] );
/* Iteriraj po svim datotekama */
for ( i = 0; i < n; i++ )
{
printf ( "%s\n", dat[i] );
strcpy ( ime1, argv[1] );
strcat ( ime1, "/" );
strcat ( ime1, dat[i] );
strcpy ( ime2, argv[2] );
strcat ( ime2, "/" );
strcat ( ime2, dat[i] );
/* pretpostavlja se da je ukupna duljina manja od IME ! Bolje bi
bilo kada bi se to provjerilo i koristilo strncpy i strncat. */
if ( usporedi ( ime1, ime2 ) )
{
if ( !vrijeme_zadnje_promjene ( ime2, vrijeme ) )
{
/* datoteka postoji */
strcpy ( ime3, ime2 );
strcat ( ime3, "." );
strcat ( ime3, vrijeme );
rename ( ime2, ime3 );
}
kopiraj_datoteku ( ime1, ime2 );
}
/* sleep (5); */
}
free ( dat );
return 0;
}
1. Ako gnijezdis vise od dvije petlje a ne radi se o nekom kopliciranom matematickom algoritmu
mozda bi se trebao zapitati da li mozda nesto krivo radis.
2. Ako mislis da je to ipak ono sto zelis ali imas potrebu u 15toj petlji odjednom izaci iz svih petlji
bez da se izvrse do kraja sigurno nesto radis krivo.
3. U svakom slucaju bi bolje bilo deklarirati pomocnu variablu koja je dostpuna svim petljama nego koristiti goto.
4. exit() nema smisla koristiti u c++ kao prvo jer zahtijeva cstdlib a kao druo jer imas nekih problema oko
nepozivanja destruktora koliko vidim.
1. Nisam niti rekao da je kompliciran. Ne razumijem tocno sto hoces reci s ovim, samo sam bubnuo nesto sto mi je prvo palo na pamet.
2. Ne mora biti.
3. Uvijek, rekao sam samo da je to jedan od rijetkih slucajeva gdje bi goto bio opravdan.
4. Naravno, u tom trenutku nisam niti razmisljao o objektima, konstruktorima, destruktorima, vec iz C-olike perspektive.
@Domagoj - Ko da si odrasao na BEJZIKU.
int greska = 0;
if (argc == 3) {
dat = dohvati_datoteke ( argv[1], &n );
if ( dat != NULL ) {
...
};
else greska = 2;
};
else {
fprintf ( stderr, "Program kopira jedan direktorij u drugi\n" );
fprintf ( stderr, "Uporaba: %s direkt1 direkt2\n", argv[0] );
greska = 1;
}
...
return greska;
Ne da mi se sad zezati još s trećim returnom, no za ova dva je jasno da si ih mogao izbjeći jednostavnom oporabom else-a. Logika ti je posve kontra - ti ideš ispitivati je li došlo do neke greške i onda silom izlaziš iz programa umjesto da ideš ispitivati treba li se program nastaviti izvršavati, a ako se ne treba, neka prirodno dođe do kraja. Razmisli malo o tome. Pokušaj sagledati svoj program iz te perspektive. Mislim, situacija je ista kao kad ti bejzikaš da program s hrpom goto-a i tvrdi ti da se taj program ne može napraviti bez svih tih silnih gotoa. A onda mu pokažeš da se može.
ah ma šta je najgore od svega to mi je i palo napamet pa sam stavia zbrojdjelovapizze = 0, al s obzirom da je double varijabla treba sam stavit 0.0
Nisam siguran da kod dodjeljivanja vrijednosti varijabli tipa double ili float ima neke razlike izmedu 0 i 0.0, compiler bi to trebao automatski prilagoditi. Bitno je samo da varijabli dodjelis neku vrijednost.
@Mario - Hah, nije lose :D, zgodno da. Onako mi je prvo palo na pamet, a radi, pa ono, nije me puno bas to brinulo.
ah ma šta je najgore od svega to mi je i palo napamet pa sam stavia zbrojdjelovapizze = 0, al s obzirom da je double varijabla treba sam stavit 0.0
Nisam siguran da kod dodjeljivanja vrijednosti varijabli tipa double ili float ima neke razlike izmedu 0 i 0.0, compiler bi to trebao automatski prilagoditi. Bitno je samo da varijabli dodjelis neku vrijednost.
Tako je. Onda bi mu se eventualno žalio na implicitni cast ili tako nešto.
Hah, nije lose :D, zgodno da. Onako mi je prvo palo na pamet, a radi, pa ono, nije me puno bas to brinulo.
Nije te brinulo jer si pogrešno naučio pisati strukturiran kôd. Možda ti nitko ni nije pokazao da to može drugačije. Uglavnom, nadam se da si sad nešto naučio i da ćeš se sljedeći put dvaput zapitati trebaš li zaista negdje u sredini funkcije puknuti exit ili return. Imaš opet ekstremista koji su protiv bilo kakvog kršenja hijerarhije programa, dakle i protiv brakea, ali eto - to su ekstremisti.