Aha
Znac i trebao sam jos pozvati i RandAB() u main-u za sto sam mislio da ce se sama izvesti 
Zahvaljujem na pomoci :D
Aha
Znac i trebao sam jos pozvati i RandAB() u main-u za sto sam mislio da ce se sama izvesti 
Zahvaljujem na pomoci :D
Aha
Znac i trebao sam jos pozvati i RandAB() u main-u za sto sam mislio da ce se sama izvesti 
Zahvaljujem na pomoci :D
Naravno da se nece sama izvesti, kao sto se niti funkcija koju napises van klase ne izvede osim ako ju ne pozoves. Unutar klase jedina "metoda" koja se izvodi automatski (prilikom stvaranja objekta) je konstruktor. Njegova zadaca je pripremanje objekta za upotrebu.
Dakle, mogao si napraviti nesto ovako:
class Klasa
{
// ...
public:
Klasa(); // konstruktor
//...
}
// konstruktor poziva RandAB();
Klasa::Klasa()
{
RandAB();
}
Inace, cisto informacije radi, po nekakvoj konvenciji metode koje postavljaju podatkovne clanove na neku vrijednost (kod tebe upisiAB()) se nazivaju setterima i obicno se imenuju kao "setNesto()", npr. setAB(). Metode koje vracaju odredene (privatne) podatkovne clanove (kod tebe ispisiA() i ispisiB()) nazivaju se getteri i obicno se imenuju kao "getNesto()", npr. getA(), getB().
Hvala na savjetima za imena funkcija i lekciji iz konstruktora sada sam ih pohvatao ucio sam ih nekidan, no nije mi padalo na pamet da ih upotrijebim za automatsko izvodenje ovdje da mi odradi cijelu operaciju umjesto funkcije da je trebam pozivati 
Hvala puno!
Hvala na savjetima za imena funkcija i lekciji iz konstruktora sada sam ih pohvatao ucio sam ih nekidan, no nije mi padalo na pamet da ih upotrijebim za automatsko izvodenje ovdje da mi odradi cijelu operaciju umjesto funkcije da je trebam pozivati 
Hvala puno!
Samo pazi prilikom poziva virtualnih funkcija unutar konstruktora, izbjegavaj jer sigurno nece raditi ono sto ocekujes. Jedino ako bas stvarno znas sto se dogada ispod haube i kako ce se stvar ponasati u sto sumnjam s obzirom da si pocetnik.
Ne znam dali je ovo prava tema za ovo moje, uglavnom danas sam počeo raditi u C++u, kada idem compileat program uvijek mi izbaci error..
Pa ako mi je voljan netko pomoci?
Kod:
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
cout<<"Ovo je moj prvi c++ program"<<endl;
system("PAUSE");
return 0;
}
Slike: 1. http://zaslike.com/files/jdx2ymq9rjij2eiwkv8a.png
2. http://zaslike.com/files/5xqlcc4tcs2df3ktmagm.png ( sto se dogodi kada stisnem ctrl i f5 )
Molim za pomoć.
Slika 1. ne vidi se dovoljno poruke s greškom, kopiraj sve i zalijepi ovdje.
Nije mi jasno što je u pitanju, na prvi pogled sve je ok, čak sam si i kopirao i kompajlirao u slučaju da mi je nešto promaklo. Očigledno kompajliralo se bez greške (Code::Blocks + GCC)...
I da, postavio si pitanje na pravom mjestu.
Mislim da su mu ukljuceni precompiled headers. Trebao bi stavit da ih se ne koristi u Properties - C/C++ negdje. Ili stavit #include "stdafx.h" u svoj program.
Ne znam dali je ovo prava tema za ovo moje, uglavnom danas sam počeo raditi u C++u, kada idem compileat program uvijek mi izbaci error..
Pa ako mi je voljan netko pomoci?
Kod:
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
cout<<"Ovo je moj prvi c++ program"<<endl;
system("PAUSE");
return 0;
}
Slike: 1. http://zaslike.com/files/jdx2ymq9rjij2eiwkv8a.png
2. http://zaslike.com/files/5xqlcc4tcs2df3ktmagm.png ( sto se dogodi kada stisnem ctrl i f5 )
Molim za pomoć.
Prilikom kreiranje projekta oznaci onaj checkbox gdje pise empty project.
Gledam malo implementaciju stoga pomoću polja i nije mi jasno što znači strelica stog->vrh.Hvala.
code?
code?
int dodaj(int stavka, Stog *stog){
if (stog->vrh >= MAXSTOG-1) return 0; /* dosegnut kapacitet stoga */
stog->vrh++;
stog->polje[stog->vrh] = stavka;
return 1;
}
Očito je u ovom slučaju 'stog' struktura/klasa tipa 'Stog'. Obično se članovima strukture/klase pristupa pomoću točke. Npr.
stog.vrh ...
ali pošto je 'stog' pokazivač onda mu se pristupa kao
(*stog).vrh ili stog->vrh
Strelica je skraceno od ovog prvog oblika koji ti je TracerCPP napisao (dereferenciranje pokazivaca na strukturu, pa pristup s tockom):
(*stog).vrh
A i lakse je citati.
Nema smisla inače ovako dostavljati kod na "lijepe oči", ali pretpostavljam da se ne misliš ovime baviti te da ti je hitno, a ja sam istu stvar morao raditi prije nekih pola godine u Javi pa evo:
package src;
public class CommandLineCalculator
{
public static void main(String[] args)
{
String[] operands_str = args[0].split("[*+/-]+");
Long operands[] = new Long[operands_str.length];
for (int i = 0; i < operands.length; ++i)
operands[i] = Long.parseLong(operands_str[i]);
String[] operators = args[0].replaceFirst("[0-9]+", "").split("[0-9]+"); // or "[^*+/-]+"
System.out.println(args[0] + "=" + CommandLineCalculator.calculate(operands, operators));
}
static Long calculate(Long operands[], String operators[])
{
Long result = null;
// multiplication & division
for (int i = 0; i < operators.length; ++i)
{
int current = i;
while (operators[i].equals("*") || operators[i].equals("/"))
{
if (operators[i].equals("*"))
{
operands[current] *= operands[i + 1];
}
else if (operators[i].equals("/"))
{
operands[current] /= operands[i + 1];
}
if (++i >= operators.length)
break;
}
}
// addition & subtraction
result = operands[0];
for (int i = 0; i < operators.length; ++i)
{
if (operators[i].equals("+"))
result += operands[i + 1];
else if (operators[i].equals("-"))
result -= operands[i + 1];
}
return result;
}
}
Ne bi trebao biti veliki problem ovaj kod modificirati u C++ uspomoć Boosta (splitanje command-line argumenta). Eto, bar da se malo pomučiš.
Vjerojatno bi iskusniji posjetioci teme ovo daleko bolje riješili, ali radi!
Googlao sam, dakle ako ima netko ovakav problem, ide u Project - Properties - Configuration Properties - Linker - Enable Incremental Linking treba biti na NO.
Zbog toga mi nije htio compile napraviti.
Imam jos jedno pitanje, mislim da je to više savjet, dakle kada da pocnem na neke ozbiljnije stvari ici ? Napravio sam par programa u konzoli, dosta toga naucio, sto dalje ?
Kada god poželiš. Učiš kroz rad, kada naletiš na nešto što ti treba, a što još ne znaš, to naučiš i ideš dalje. Bitno je znati naći po internetu nekakav suvisli tekst o onome s čime imaš problema. Ukratko, da bi učio moraš se stalno tjerati u područja o kojima nemaš pojma :P
Ne možeš nove stvari naučiti ako uvijek drviš po jedno te istoj stvari.
Može jedno objašnjenje... Ovako zadatak glasi... Napravi program koji unosi 2 stringa, a zatim ispisuje koliko se puta kraći string ponavlja u duljem stringu (npr. za stringove st i stostrukost ispisuje se rezultat 3, a za informatika i mate rezultat 0 .... Nikako nisam mogao da rijesim sve dok nisam napravio jos jednu pomocnu varijablu pom tipa char* i njoj pridodao vrijednos str1, tj. postavio pointer da pokazuje na pocetak veceg stringa, jer kad bi koristio str1 ispisao bi mi krivi broj!! Nez sto je razlog tomu, a to me muči ;) !!!
#include <iostream>
#include <cstdio>
using namespace::std;
int broj(char *str1, char *str2);
int main(){
char str1 [31] = "stostrukost";
char str2 [11] = "st";
cout << broj(str1,str2);
}
int broj(char *str1, char *str2){
char *pom = str1;
int br = 0;
while(true){
if((pom = strstr(pom, str2)) != NULL){
br++;
pom += strlen(str2);
}
else
break;
}
return br;
}
Može jedno objašnjenje... Ovako zadatak glasi... Napravi program koji unosi 2 stringa, a zatim ispisuje koliko se puta kraći string ponavlja u duljem stringu (npr. za stringove st i stostrukost ispisuje se rezultat 3, a za informatika i mate rezultat 0 .... Nikako nisam mogao da rijesim sve dok nisam napravio jos jednu pomocnu varijablu pom tipa char* i njoj pridodao vrijednos str1, tj. postavio pointer da pokazuje na pocetak veceg stringa, jer kad bi koristio str1 ispisao bi mi krivi broj!! Nez sto je razlog tomu, a to me muči ;) !!!
Meni kod ispisuje 3 i kad pomocnu varijablu zamjenim sa str1.
Btw probaj ovo, str1 = "ababa" str2 = "aba"
Može jedno objašnjenje... Ovako zadatak glasi... Napravi program koji unosi 2 stringa, a zatim ispisuje koliko se puta kraći string ponavlja u duljem stringu (npr. za stringove st i stostrukost ispisuje se rezultat 3, a za informatika i mate rezultat 0 .... Nikako nisam mogao da rijesim sve dok nisam napravio jos jednu pomocnu varijablu pom tipa char* i njoj pridodao vrijednos str1, tj. postavio pointer da pokazuje na pocetak veceg stringa, jer kad bi koristio str1 ispisao bi mi krivi broj!! Nez sto je razlog tomu, a to me muči ;) !!!
Radi i sa str1, a kod moraš malo preurediti, strlen je prevelik korak. Pomoćnu varijablu koristiš iz drugog razloga, ako želiš sačuvati originalnu varijablu.
#include <iostream>
#include <cstdio>
using namespace::std;
int broj(char *str1, char *str2);
int main(){
char str1[31] = "stostrukost";
char str2[11] = "st";
cout << broj(str1, str2);
}
int broj(char *str1, char *str2){
int br = 0;
while (str1 = strstr(str1, str2))
{
br++;
str1 += 1;
}
return br;
}
To sam ja- sigurno JA
haha :D
Za shvaćanje pointera imaš dobrih tutoriala na netu,ili možeš pogledati na FER-ovu stranicu,imaš svima dostupne materijale iz kolegija Programiranje i programsko inženjerstvo pa tamo pogledaj predavanje vezano uz to.
Hvala, čudna jd konstrukcija rečenice :D
Ozbiljno im ne vidim svrhu, osim možda u igrama.
To sam ja- sigurno JA
Ozbiljno im ne vidim svrhu, osim možda u igrama.
Liste, grafovi/stabla, polja (stringovi, bitmape, kojekakve druge tabele), stogovi...
Sve to leži na pokazivačima.
Ideja pokazivača je jako jednostavna: to su varijable čiji je sadržaj memorijska adresa nekog podatka u memoriji. Memorijske adrese su pozitivne, cjelobrojne vrijednosti. Što znači da su pokazivači u biti integeri odgovarajuće širine (na 32 bitnim računalima su 32 bita, na 64 bitnim 64 bita). To također znači i da sa njima možeš vršiti računske operacije, baš kao i sa svim drugim brojevima, iako treba napomenuti da se aritmetika sa pokazivačima ponaša malo drugačije od klasične aritmetike.
Kada u izraz ubaciš pokazivač, to je kao da si ubacio memorijsku adresu (dakle cijeli broj) u izraz. A kada ispred imena tog pokazivača dodaš zvjezdicu, tada kažemo da si dereferencirao pokazivač, što znači da se u izrazu neće koristiti memorijska adresa nego ono što se nalazi na toj memorijskoj adresi.
Evo primjer:
// deklariramo cjelobrojnu varijablu 'a' i dodijelimo joj vrijendost 5
int a = 5;
// deklariramo pokazivač na cijeli broj 'b'
int *b;
// pokazivač 'b' sada sadržava adresu varijable 'a'
// (odnosno memorijsku adresu na kojoj se nalazi broj 5)
b = &a;
// ispišemo vrijednost pokazivača pri čemu se na ekranu prikaže adresa
// varijable 'a'
printf("%d\n", b);
// ispišemo dereferencirani pokazivač 'b' pri čemu se na ekran ispiše ono na
// što pokazivač 'b' pokazuje, to jest broj 5
printf("%d\n", *b);
Ili to možeš ovako objasniti:
printf("Na adresi %d nalazi se vrijednost %d\n", b, *b);
Pokazivače uopće nije teško za shvatiti kada jednom shvatiš da se radna memorija sastoji od niza bajtova od kojih svaki ima svoju jedinstvenu adresu. Bajt je najmanji komad memorije koji možeš direktno adresirati (da bi pristupio bitovima koji sačinjavaju jedan bajt, moraš koristiti bitovne operacije). Memorijske adrese počinju od nule pa sve do 232 (4 294 967 296) na 32 bitnim računalima, odnosno sve do 264 (18 446 744 073 709 551 616) na 64 bitnim računalima. Zahvaljujući konceptu virtualne memorije, adrese s kojima ćeš imati posla će u 99.999% slučajeva biti virtualne adrese, a ne fizičke adrese, i upravo zbog toga možeš imati situacije da se nešto nalazi na adresi od 2 gigabajta, iako imaš samo 512 MB radne memorije.
Iako su pokazivači sami po sebi jednostavan koncept, kada imaš posla sa višestrukom indirekcijom (slučajevi kada imaš pokazivač na pokazivač na pokazivač...) stvari mogu postati nezgodno zamršene.
Ozbiljno im ne vidim svrhu, osim možda u igrama.
U pravilu memorijske adrese su predstavljene heksadecimalnim vrijednostima koje se sastoje od dva dijela: segment i offset. No da bi ih nama bilo lakše pojmiti možemo ih interpretirati kao cjelobrojne vrijednosti.
Npr. memorijska adresa 0x9FFF:000F (0x9FFF segment adresa, 000F - offset adresa). Kada se to dvoje zbroji dobije se 0x9FFFF, a to pretvoreno u dekadski sustav iznosi 655359 što bi bio integer ekvivalent adrese.
Nadovezujem se na priču oko pokazivača.
Ova dva ranija posta puna su informacija, ali gotovo ništa od toga ne pokazuju nekome tko je početnik zašto su pokazivači dobri i gdje se koriste, pa onda i dolaze postovi tipa 'pokazivači su bezveze' itd.
Na primjer, ove fore sa inkrementiranjem pokazivača i računanjem nikad nisam koristio u životu.
Ali nisam vidio da je itko spomenuo da se pokazivači redovito koriste kod kreiranja objekata na heapu, te da operator new vraća pokazivač na kreirani objekt. Po meni, ovo je najčešći način upotrebe pokazivača:
Primjer: Imamo program gdje se koriste neki veliki objekti, neka klasa koja ima dosta toga u sebi, puno podataka. Kreiranje objekata se radi pomoću operatora new, i ti objekti se nalaze na heapu:
CBigObject *pMojObjekt = new CBigObject();
Kasnije se taj objekt koristi na način da funkcije prenose samo pokazivač na taj objekt, čime se dobiva na brzini, jer se ne radi kopija velikog objekta (ista stvar se postiže referencama na objekt, al to je druga tema).
Drugo - nasljedjivanje, polimorfizam, virtualne funkcije, sve se temelji na pokazivačima, i to se koristi u stalno, u bilo kojem ozbiljnijem projektu.
Tako da bi tu bio puno bolji neki real-life primjer, nego školski primjeri poput adresa na integer varijablu, koju onda mijenjamo preko pokazivača.
I to je beskorisno, bezveze itd samo zato jer to tebi nikada do sada nije trebalo?
Primjer: Imamo program gdje se koriste neki veliki objekti, neka klasa koja ima dosta toga u sebi, puno podataka. Kreiranje objekata se radi pomoću operatora new, i ti objekti se nalaze na heapu:
CBigObject *pMojObjekt = new CBigObject();
Kasnije se taj objekt koristi na način da funkcije prenose samo pokazivač na taj objekt, čime se dobiva na brzini, jer se ne radi kopija velikog objekta (ista stvar se postiže referencama na objekt, al to je druga tema).
1. Dinamička alokacija memorije je jedan od primjera korištenja pokazivača (zaboravio si delete). Međutim, kada se objekt prenosi funkciji preko pokazivača ne mora značiti da se dobiva pri brzini jer taj BigObject može biti tek 1 byte velik, dok pokazivač je 4 ili 8 bajtova. Ako se cilja na brzinu onda se ona postiže korištenjem referenci koje izbjegavaju kopiranje u potpunosti. Za to pokazivač nema smisla koristiti kad referenci nema ravne po tom pitanju.
2. Ja bih prije rekao da je najčešći primjer upotrebe pokazivača zapravo komunikacija među funkcijama a ne operator new. Funkcije u pravilu koriste lokalne varijable i da bi se one mogle koristiti u drugim funkcijama to se može riješiti pomoću pokazivača.
void zamjeni(int* a, int* b){
int pom = *a;
*a = *b;
*b = pom;
}
ili ako se već cilja na brzinu:
void zamjeni(int& a, int& b){
int pom = a;
a = b;
b = pom;
}
Tako da bi tu bio puno bolji neki real-life primjer, nego školski primjeri poput adresa na integer varijablu, koju onda mijenjamo preko pokazivača.
1. Nasljeđivanje nema veze s pokazivačima niti pokazivači moraju biti prisutni pri nasljeđivanju.
2. Polimorfizam je napredni koncept i nije dobar "real-life" primjer za nekoga tko je početnik niti uopće razumije pokazivače.
3. Primjer pokazivača na integer je sasvim dobar i objašnjava ono osnovno što se o pokazivačima treba znati - kako ga inicijalizirati i dereferencirati. Bez toga niti gornji primjer koji sam stavio (funkcija zamjeni) nije jasan.
U pravilu memorijske adrese su predstavljene heksadecimalnim vrijednostima koje se sastoje od dva dijela: segment i offset. No da bi ih nama bilo lakše pojmiti možemo ih interpretirati kao cjelobrojne vrijednosti.
Npr. memorijska adresa 0x9FFF:000F (0x9FFF segment adresa, 000F - offset adresa). Kada se to dvoje zbroji dobije se 0x9FFFF, a to pretvoreno u dekadski sustav iznosi 655359 što bi bio integer ekvivalent adrese.
To je samo za real mode. Protected mode koristi selektore koji su indeksi u GDT i LDT tabele, u kojima se danas koristi tek nekoliko descriptora od kojih gotovo svi imaju bazu nula i limit koji pokriva cijeli adresni prostor. Time se postiže flat memory model u kojem sa strane programera samo offset igra neku ulogu budući da se code segment, data segment i stack segment svi odnose na identičan segment memorije.
Long mode je još i više raskrstio sa segmentacijom pri čemu se CS, DS, SS, i ES postavljaju na defaultni descriptor sa bazom 0 i limitom od 264
Iako su segmenti i dalje prisutni (previše su ukorijenjeni u x86 da bi ih se samo tako izbacilo), u praksi možemo zaboraviti da uopće postoje. Sa stajališta modernog C kompajlera adresa se odnosi samo na "offset" dio adrese, budući da je "segment" dio adrese postao statičan, tj. efektivno postoji samo jedan segment.
Ova dva ranija posta puna su informacija, ali gotovo ništa od toga ne pokazuju nekome tko je početnik zašto su pokazivači dobri i gdje se koriste
Promakao ti je prvi ulomak u mom postu. Nadalje, ja sam se više bavio samom problematikom što to pokazivač zapravo jest, nego onime za što je sve on koristan. To sam nabrojao već u prvoj rečenici...
Varijabli se može pristupiti na dva načina:
1. imenom - prevoditelj zna adresu
2. adresom - odnosno posebnom varijablom zvanom pokazivač koja sadrži adresu varijable tipa pokazivača
Što se tiče korisnosti pokazivača, dovoljno je vidjeti moj primjer odozgo, nizove kao argumente funkcije proslijeđujemo pokazivačem, a uz to koristimo u funkciji aritmetiku pokazivača. Uz to, mnoge funkcije u C/C++ vraćaju pokazivač, pa ih hoćeš nećeš, moraš znati, a primjer je i ova funkcija strstr(), uz to, alociranje dinamičkih objekata vraća pokazivač na taj objekt.
#include <iostream>
#include <cstdio>
using namespace::std;
int broj(char *str1, char *str2);
int main(){
char str1[31] = "stostrukost";
char str2[11] = "st";
cout << broj(str1, str2);
}
int broj(char *str1, char *str2){
int br = 0;
while (str1 = strstr(str1, str2))
{
br++;
str1 += 1;
}
return br;
}