for(int i=0;*_trenutno;i++){
temp.AddElement(_elementi1[i],_elementi2[i]);
}
for(int i=0;i<*obj._trenutno;i++){
temp.AddElement(obj._elementi1[i],obj._elementi2[i]);
}
Da nisi fulao uvjet u prvoj petlji kod operatora +?
for(int i=0;*_trenutno;i++){
temp.AddElement(_elementi1[i],_elementi2[i]);
}
for(int i=0;i<*obj._trenutno;i++){
temp.AddElement(obj._elementi1[i],obj._elementi2[i]);
}
Da nisi fulao uvjet u prvoj petlji kod operatora +?
Izgleda da jesam, ali evo opet istu gresku javlja kod AddElement funkcije.
Ovo sam sve sinoc radio, razne kombinacije, pa zato ima malo i gresaka ovih suvisnih :)
Očito ti trebaš taj cijeli svoj program pregledati. Debugiraj korak po korak pa ispravljaj .
Evo presao sam kod ponovo i sada imam opet neku gresku.
Sada zadatak moze da se kompajlira i ne prikazuje runtime greske (jer sam stavio kod pod komentar).
U operator+ funkciji stavio sam pod komentar kopiranje elemenata iz drugog objekta "obj" kojeg sam prosljedio preko reference.
Znaci prva i druga for petlja rade isto.
Ovo je greska koju prikaze:
http://i44.tinypic.com/505qas.jpg
"heap corruption". Znači, provjeri izjave gdje koristiš operatore new i delete..
Hvala jos jednom evo ispravljeno, stavio sam pod komentar prve dvije linije koda nakon temp-a (katastrofa greska) kod operator+ funkcije i sada sve radi kako treba - odnosno skoro sve :P
Sada opet imam jednu gresku, izgleda neku istu kao proslu.
Standardni zadatak mi je da u konstruktoru "*_max" bude "3" a ne "10".
Znaci broj 3 bi stavio zato da se prosiruje niz kada mu nestane prostora.
E sada, kada vratim "*_max=3" u konstruktoru, opet mi sve normalno radi kod k1 i k2 (prosiruje niz i dodaje nove elemente), ali kod operatora k1+k2 opet mi javi slicnu poruku, kao slika ispod:
http://imageupload.org/en/file/208978/error1.jpg.html
Iako radi kako treba sa k1 i k2, ne radi sa "temp" u "operator++" funkciji.
Sada mozda nesto nije uredu sa konstruktorom kopije, kao da ne podrzavao ovaj temp sto sam kreirao ili je mozda do AddElement funkcije, uglavnom i jeste opet do neke adrese, kao da se destruktor pozvao a konstruktor kopije nije dobro kopirao elemente (pokazivaj na istu adresu kao taj sto je dealociran).
Sta sad?
Trebao bih kod koji izračunava complementary error function u c++.. Da li netko zna kako se to radi.. Pronašao sam online calculator koji izračunava to na sljedećoj stranici:
http://graphpad.com/quickcalcs/PValue1.cfm
Znači u ovom se prvom obrascu unese z vrijednost i on izbaci P-value.. E sada tako bi mi nešto trebalo u c++..
Trebalo bi biti da se radi ovako ali mi javlja" 'erfc': identifier not found":
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double theErfc = erfc(4.6);
cout << "theErfc = " << theErfc << endl;
return 0;
}
Može li se putem C++-a dodjeljivati koja nit da se na kojem procesoru (jezgri) izvodi (ako se koriste Windowsi kao OS)?
Dakle ako imam (isprogramiram) višenitnu aplikaciju da odvijanje niti raspoređujem ja a ne sam OS. Može li se to?
Recimo 7 niti, procesor s 3 jezgre, da ja kažem nit 1 pa 3 na prvoj jezgri, niti 2, 4, 7 na drugoj i npr niti 6 pa 5 na trećoj.
Može li se putem C++-a dodjeljivati koja nit da se na kojem procesoru (jezgri) izvodi (ako se koriste Windowsi kao OS)?
Moze se, putem API funkcije SetThreadAffinityMask
Može li se putem C++-a dodjeljivati koja nit da se na kojem procesoru (jezgri) izvodi (ako se koriste Windowsi kao OS)?
Moze se, putem API funkcije SetThreadAffinityMask
Hvala.
Zna li možda netko još koji način (ili nešto slično)?
Zasto, zar ti ovo ne odgovara? Imas jos i SetThreadIdealProcessor koja je u biti blaza verzija gornje funkcije.
Zasto, zar ti ovo ne odgovara? Imas jos i SetThreadIdealProcessor koja je u biti blaza verzija gornje funkcije.
SetThreadAffinityMask koliko sam razumio ovisi o OS-u, ako postavim da se neka nit odvije na npr jezgri 2 ona se može odviti i na nekoj drugoj.
Pronašao sam i SetThreadIdealProcessor (tu koju si naveo) maloprije, također djeluje obečavajuće.
Meni je "problem" vezan uz raspodjelu niti po procesorima (jezgrama) po različitim kriterijima (multicriteria scheduling na multicore CPU).
SetThreadAffinityMask koliko sam razumio ovisi o OS-u, ako postavim da se neka nit odvije na npr jezgri 2 ona se može odviti i na nekoj drugoj.
Ne, SetThreadAffinityMask tocno odreduje nekoj niti na kojim se sve jezgrama smije izvoditi a na kojima ne:
"Setting an affinity mask for a process or thread can result in threads receiving less processor time, as the system is restricted from running the threads on certain processors. In most cases, it is better to let the system select an available processor."
SetThreadIdealProcessor radi ono sto si ti mislio za gornju funkciju. On pokusava izvrsiti neku nit na odredenoj jezgri, a ako ne uspije zadovoljit ce se sa bilo kojom drugom jezgrom.
To bi ti onda, ako se ne varam, ovako nekako izgledalo:
#define JEZGRA_TRI 1L<<2
#define JEZGRA_CETIRI 1L<<3
HANDLE thread=(HANDLE)_beginthreadex(NULL, 0, NekaFunkcija, NULL, CREATE_SUSPENDED, NULL);
SetThreadAffinityMask(thread, JEZGRA_TRI|JEZGRA_CETIRI);
ResumeThread(thread);
Gornji primjer bi trebao stvoriti novu nit od funkcije "NekaFunkcija" u pauziranom stanju, potom joj dozvoliti izvrsavanje samo na trecoj i cetvrtoj jezgri, te pokrenuti izvrsavanje niti pozivom na ResumeThread. Valjda nisam nesto fulao...
Imam mali problem.
Evo code:
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
char name[11];
printf ("Enter your name, sir: " );
gets(name);
(name=="B F") ? (cout<< ":D \n") : (cout<< ":O \n");
system("PAUSE");
return 0;
}
I kad napisem B F output mi je :O umjesto :D....
Zasto ???
Zato što koristiš char niz i ne možeš provesti testiranje logičkog uvjeta.
Pošto se radi o C++ uzmi string klasu i stvar će raditi.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string name;
printf ("Enter your name, sir: " );
getline(cin, name);
(name=="B F") ? (cout<< ":D \n") : (cout<< ":O \n");
system("PAUSE");
return 0;
}
Imam mali problem.
Evo code:
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
char name[11];
printf ("Enter your name, sir: " );
gets(name);
(name=="B F") ? (cout<< ":D \n") : (cout<< ":O \n");
system("PAUSE");
return 0;
}
I kad napisem B F output mi je :O umjesto :D....
Zasto ???
To je zato sto ne mozes tako jednostavno usporedivati dva cstringa. Znakovni niz je obicno polje, kojemu zadnji clan ima /0 vrijednost cime se oznacava kraj niza. A niz je ustvari samo simbolicki pokazivac na prvi clan polja. Tako da u tvome slucaju uspredujes pokazivac char* sa const char* tj. usporedujes njihove adrese tako da je to uvijek logicka laz.
Ovdje trebas koristiti funkci strcmp koja se nalazi u biblioteci cstring. Ili koristiti klasu string koja vec ima preopterecen operator "==" pa ce tvoj program tocno raditi.
Hvala
EDIT: Pitanje: kako povecati velicinu output slova u console app ?
EDIT2: Pitanje2: zastorad s naredbom goto nije preporučljiv ?
Hvala
EDIT: Pitanje: kako povecati velicinu output slova u console app ?
EDIT2: Pitanje2: zastorad s naredbom goto nije preporučljiv ?
@ EDIT: pokreni program, desni klik na gornji bar konzole -> properties -> font
@ EDIT2: http://stackoverflow.com/questions/379172/to-use-goto-or-not
Da se još nadovežem na cpt. McTavisha i Flokija, niz u if naredbi možeš uspoređivati i tako da uspoređuješ pojedini član polja, u tvom slučaju:
if(name[0] == 'B' && name[1] == ' ' && name[2] == 'F' && name[3] == '\0')
@ EDIT: pokreni program, desni klik na gornji bar konzole -> properties -> font
Da, ali to ce si korisnik morati sam napraviti..
Kak to napraviti u C++ ?
Da, ali to ce si korisnik morati sam napraviti..
Kak to napraviti u C++ ?
Mislim da bi trebao pomocu win api-a kreirati svoju konzolu i onda to namjestiti:
Mogao si to preko system funkcije. "mode" argument, mode colone, linije. Ali ovo je za resize konzole.
Moraš rješiti to pomoću nekog API-a, jer "nativni" C++ ne podržava takve stvari. C# već jeste, ali to je druga priča.
A šta ćeš ako taj program pokreneš preko Linuxa?, ima tu problema...
Ovo mi baš i nije jasno:
#include <iostream>
#define RED 2
#define STUP 2
using namespace std;
int main()
{
int polja[RED][STUP] = {{5, 2},{3, 4}};
for (int i = 0; i < RED; i++)
{
for (int j = 0; j < STUP; j++)
{
cout << polja[i][j] << "\t";
}
cout << endl;
}
system("PAUSE");
return 0;
}
Nije mi jasno jer sintaksa za petlju for je:
for(pocetno stanje; uvjetni nastavak; inkrement).
E sad tu ide ovako:
for (int i = 0; i < RED; i++)
{
for (int j = 0; j < STUP; j++)
{
cout << polja[i][j] << "\t";
}
cout << endl;
}
I kod uvjetnog nastavka u prvoj for petlji pise:
i < RED ...
To znaci da to treba biti TRUE da bi se nastavilo dalje.
E pa ako je i= 0, a RED = {5, 2}, koji ce se broj gledati da se napravi i++, 5 ili 2 ?
Nisi dobro skužio matrice :D
Imaš na vrhu programa definirane konstante RED i STUP i obje su = 2. Dakle tvoja matrica (ili dvodimenzionalno polje) imena polje imati će 2 retka i jedan stupac. Elemente te matrice zadao si sa
int polja[RED][STUP] = {{5, 2},{3, 4}};
dakle ta matrica će izgledat:
| 5 2 |
| 3 4 |
Način na koji se vade elementi iz matrice je tako da se specificiraju redak i stupac, pa će za i=0 i j=0 polje[0][0] biti gornji lijevi kut matrice, pa čitamo da je
polje[0][0] = 5
Kada se žele pročitati svi elementi matrice koristi se dupla for petlja jer želimo pregledati sve retke i sve stupce. Ono što želimopregledati su polje[0][0], polje[0][1], polje[1][0] i polje[1][1] i to se radi u ovom tvom dijelu koda koji ti je nejasan. i će prolaziti vrijednostima od 0 do RED (=2), j će prolaziti vrijednostima od 0 do STUP (=2), a ispisuješ vrijednosti polje[i][j]. Time dobivaš ispis cijele matrice.
Hmmm... A kako se izvrsava petlja ako je odmah vrijednost true i zasto se pregledava sve do polja[1][1] ako sam zadao RED 2 i STUP 2 ???
Ne bi li trebalo do polja[2][2] ?
Hmmm... A kako se izvrsava petlja ako je odmah vrijednost true i zasto se pregledava sve do polja[1][1] ako sam zadao RED 2 i STUP 2 ???
Ne bi li trebalo do polja[2][2] ?
To je zato sto su polja u c/c++ 0-indeksirana tj. prvi clan se oznacava sa 0, a ne sa 1. Dakle imas polje od 3 clana onda su njegovi clanovi:
polje[0],polje[1],polje[2].
Clanovi polja su u memoriji poredani jedan iza drugoga, a polje je ustvari samo sinonim za pokazivac na prvi clan. I onda kada ti hoces pristupiti nekome clanu, polja onda se pokazivac samo pomakne odreden broj mjesta unaprijed.
A da, znaci polja[RED][STUP] = polja [1][1] (RED 2 STUP 2). Dobro, ali jos ne kuzim u vezi same petlje:
for(int i = 0; i < RED; i++)
Eh, a sad kako se i++ inkremetira tu?
jer bi onda drugi put trebalo i biti 1 (i = 1), a to nema smisla za polje jer RED ima dva broja u sebi.
A tako i tako nakon 1. izvrsavanje petlje bi se trebala petlja prekinuti zato jer kod uvjetnog nastavka
i < RED
vec je istina
Nisam bas shvatio sto pitas no. No ono i<RED je uvjet i petlja se izvrsava dok je i<RED. Mi imamo dva reda pa je RED=2, dok je posljednji clan polja 1. Krecemo sa i=0, pristupamo prvome clanu, onda se i poveca na 1 i pristupamo drugom clanu. I na kraju se i poveca na 2 i petlja se prekine jer vise nije zadovoljen uvjet i<2.
Nisam bas shvatio sto pitas no. No ono i<RED je uvjet i petlja se izvrsava dok je i<RED. Mi imamo dva reda pa je RED=2, dok je posljednji clan polja 1. Krecemo sa i=0, pristupamo prvome clanu, onda se i poveca na 1 i pristupamo drugom clanu. I na kraju se i poveca na 2 i petlja se prekine jer vise nije zadovoljen uvjet i<2.
Aha, znaci u ovom slucaju u petlji for uvjetni nastavak treba biti false ???
Nisam bas shvatio sto pitas no. No ono i<RED je uvjet i petlja se izvrsava dok je i<RED. Mi imamo dva reda pa je RED=2, dok je posljednji clan polja 1. Krecemo sa i=0, pristupamo prvome clanu, onda se i poveca na 1 i pristupamo drugom clanu. I na kraju se i poveca na 2 i petlja se prekine jer vise nije zadovoljen uvjet i<2.
Aha, znaci u ovom slucaju u petlji for uvjetni nastavak treba biti false ???
Dok je god uvjet logicki istinit, petlja se vrti, kad uvjet postane logicki neistinit petlja se prestaje vrtiti.
Vidiš G4L, ti bi radio asambly, a nisi znao matrice, je li ti sada jasno zašto smo te odgovarali od asambly-a?