
Programiranje u C++-u - pitanja i odgovori


Provjeri još jednom dali si dobro konfigurirao projekt. Najlakše da uzmeš jedan postojeći koji radi i u njega kopiraš kod.
Nisam siguran dali ti treba u ovom kodu using namespace std.

Rješenja ne dajem, al ti mogu sugerirati da sam parsiraš string znak po znak. Npr imaš varijablu početak, kraj, trenutno. I ideš znak po znak dok ne dođeš do kraja oznake tokena. Imaš prvi token. Podesiš novi početak i vrtiš dok ne dođeš do kraja. Imaš drugi token. I tako do kraja stringa.

Napravio sam sa strtokom.
Format je
cmd1,param1,...,paramN;cmd2,...
Radi kak treba, za divno čudo xD

Provjerio sam, sve je u redu, al ne radi. Prvotno sam i izostavio using namespace std, al onda imam problem s korištenjem polja pa mi javlja iste greške plus još ovo:
1>c:\users\mario\documents\visual studio 2015\projects\allegroprojekt39\main.cpp(94): error C2065: 'vector': undeclared identifier
1>c:\users\mario\documents\visual studio 2015\projects\allegroprojekt39\main.cpp(94): error C2275: 'Loptica': illegal use of this type as an expression
1> c:\users\mario\documents\visual studio 2015\projects\allegroprojekt39\main.cpp(13): note: see declaration of 'Loptica'
1>c:\users\mario\documents\visual studio 2015\projects\allegroprojekt39\main.cpp(94): error C3861: 'loptica': identifier not found
1>c:\users\mario\documents\visual studio 2015\projects\allegroprojekt39\main.cpp(99): error C2065: 'loptica': undeclared identifier
1>c:\users\mario\documents\visual studio 2015\projects\allegroprojekt39\main.cpp(106): error C2065: 'loptica': undeclared identifier
1>c:\users\mario\documents\visual studio 2015\projects\allegroprojekt39\main.cpp(107): error C2065: 'loptica': undeclared identifier
1>c:\users\mario\documents\visual studio 2015\projects\allegroprojekt39\main.cpp(109): error C2065: 'loptica': undeclared identifier
1>c:\users\mario\documents\visual studio 2015\projects\allegroprojekt39\main.cpp(109): error C2660: 'NacrtajLopticuSUzicom': function does not take 3 arguments
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Jos jedan zid u nizu.........imam problema sa citanjem š, Š, č, Č, ž, Ž slova. Trenutno radim na dobijem neki json i onda ga pokusavam parsirati ali ima problem jer se radi o rijeci koja u sebi ima slovo č. Ne znam uopce kako i da pitanje postavim.
Pa recimo zasto kad stavim naprimjer ovo
std::cout << "baranovićeva <<std::endl;
ispise baranovi?eva.
Kako ovo popraviti ?

Funkcija radi, no zanima me zašto ne radi sljedeće:
Primjer koji je pastean radi, no ako na liniji 13 umjesto &del stavim &delimiter[type] tada ne radi za index 1, dok za index 0 radi.
Adrese sam provjerio, jedna do druge su.

Ne razumijem zašto kod ne radi, da li trebam negdje konstantu staviti (koristim vs2019).
Javlja mi grešku - cannot convert argument 1 from 'const char [11]' to 'char *'.
#pragma once
#include <iostream>
#include <cstring>
using namespace std;
class Student
{
private:
char* JMBAG;
public:
Student() {}
Student(char* jmbag) ; // konstruktor (alocira JMBAG duljine 11 znakova)
~Student(); // destruktor (dealocira JMBAG)
char* GetJMBAG() ;
void SetJMBAG(char* noviJMBAG) ;
};
#include "Student.h"
#include <cstring>
Student::Student(char* jmbag)
{
JMBAG = new char[11];
strcpy_s(JMBAG, 11, jmbag);
}
Student::~Student()
{
delete[]JMBAG;
}
char* Student::GetJMBAG() const
{
return &JMBAG[0];
}
void Student::SetJMBAG(char* noviJMBAG)
{
strcpy_s(JMBAG, 11, noviJMBAG);
}
#include <iostream>
#include "Student.h"
using namespace std;
int main() {
Student Ante( "1122334455");
Student Ivica = Ante;
Ante.SetJMBAG( "6677889900") ;
cout << Ante.GetJMBAG() << endl; // 6677889900
cout << Ivica.GetJMBAG() << endl;// 6677889900 ?!?!
Student Marko;
Marko = Ante;
Marko.SetJMBAG("1234567890");
cout << Marko.GetJMBAG() << endl; // 1234567890
cout << Ante.GetJMBAG() << endl; // 1234567890 ?!?!
return 0;
}

Možda da promjeniš codepage command prompta. Ili koristiti UTF8 string (mislim da cpp po defaultu koristi ASCII) za ispis. Pokušaj istu stvar pokrenuti na PowerShellu.

Jos jedan zid u nizu.........imam problema sa citanjem š, Š, č, Č, ž, Ž slova. Trenutno radim na dobijem neki json i onda ga pokusavam parsirati ali ima problem jer se radi o rijeci koja u sebi ima slovo č. Ne znam uopce kako i da pitanje postavim.
Pa recimo zasto kad stavim naprimjer ovo
std::cout << "baranovićeva <<std::endl;
ispise baranovi?eva.
Kako ovo popraviti ?
setlocale()

Ne razumijem zašto kod ne radi, da li trebam negdje konstantu staviti (koristim vs2019).
Javlja mi grešku - cannot convert argument 1 from 'const char [11]' to 'char *'.
0. Ovo se ne može niti kompajlirati:
error C2511: 'char *Student::GetJMBAG(void) const' : overloaded member function not found in 'Student'
1. Jedna od grešaka ovdje je nerazumijevanje C stringa. Postoji li razlog zbog kojeg moraš koristiti C-ovske stringove umjesto std::string?
2. Parametri funkcija koji ne vraćaju rezultat (ne očekuje se promjena sadržaja i povrat rezultata na tah način) trebalo bi deklarirati kao "const".
3. Bilo koji statički analizator koda bi vrištao ovdje. Probaj s "cppcheck", on će ti dati nekoliko dobrih smjernica. Npr. (warning,inconclusive) Member variable 'Student::JMBAG' is not initialized in the constructor. [uninitMemberVar]
4. char* očekuje nul-terminaciju. Ti kopiraš string duljine 11 u array veličine 11. Za C string duljine 11 strcpy_s() će staviti nul-terminaciju na lokaciju 12 u arrayu.
"The destination string must be large enough to hold the source string and its terminating null character"
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strcpy-s-wcscpy-s-mbscpy-s?view=vs-2019

Provjerio sam, sve je u redu, al ne radi. Prvotno sam i izostavio using namespace std, al onda imam problem s korištenjem polja pa mi javlja iste greške plus još ovo:
1>c:\users\mario\documents\visual studio 2015\projects\allegroprojekt39\main.cpp(94): error C2065: 'vector': undeclared identifier
#include <vector>

Tako sam i napisao, al ne radi. Program je na prethodnoj strani.

Ne razumijem zašto kod ne radi, da li trebam negdje konstantu staviti (koristim vs2019).
Javlja mi grešku - cannot convert argument 1 from 'const char [11]' to 'char *'.
0. Ovo se ne može niti kompajlirati:
error C2511: 'char *Student::GetJMBAG(void) const' : overloaded member function not found in 'Student'
1. Jedna od grešaka ovdje je nerazumijevanje C stringa. Postoji li razlog zbog kojeg moraš koristiti C-ovske stringove umjesto std::string?
2. Parametri funkcija koji ne vraćaju rezultat (ne očekuje se promjena sadržaja i povrat rezultata na tah način) trebalo bi deklarirati kao "const".
3. Bilo koji statički analizator koda bi vrištao ovdje. Probaj s "cppcheck", on će ti dati nekoliko dobrih smjernica. Npr. (warning,inconclusive) Member variable 'Student::JMBAG' is not initialized in the constructor. [uninitMemberVar]
4. char* očekuje nul-terminaciju. Ti kopiraš string duljine 11 u array veličine 11. Za C string duljine 11 strcpy_s() će staviti nul-terminaciju na lokaciju 12 u arrayu.
"The destination string must be large enough to hold the source string and its terminating null character"
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strcpy-s-wcscpy-s-mbscpy-s?view=vs-2019
Hvala, stavio sam (char*)"1234456" pa je proradilo. Main je zadan tako da nisam ništa mogao promijeniti

Pozdrav,
Što znači ovo
Borrower(const Borrower&) = delete;
Borrower& operator= (const Borrower&) = delete;
U objašnjenjima piše kao da prva linija onemugućava sljedeću radnju Borrower neki_objekt2 = neki_objekt1;
Za drugu piše da onemogućava neki_objekt2 = neki_objekt1;
Šta znači to? Zašto bi to radili uopće? Radi se o nekom programu koji bi trebao dunkcionirati kao knjižnica. Ovaj tu gore je borrower i imate još knjižnicu kojoj taj borrower uzima knjige iz njezinog niza tipa klase Book i sprema ga u svoj niz kao bookInpossesion i tak.
Kae sad sovim gore čudnim linijama. Najradije bi ih preskočio. Zna li ko ovdje možda nešto malo više o gornjim izrazima. Hvala unaprijed da ne pišem poslije bezveze. Hvala.

https://en.cppreference.com/w/cpp/language/operator_comparison
S tim definiraš kako će se kompajler ponašati kad hoćeš nešto uraditi s objektom.
Recimo kad zbrajaš dva objekta, ili ih uspoređuješ itd..

Pozdrav,
Što znači ovo
Borrower(const Borrower&) = delete;
Borrower& operator= (const Borrower&) = delete;
U objašnjenjima piše kao da prva linija onemugućava sljedeću radnju Borrower neki_objekt2 = neki_objekt1;
Za drugu piše da onemogućava neki_objekt2 = neki_objekt1;
Šta znači to? Zašto bi to radili uopće? Radi se o nekom programu koji bi trebao dunkcionirati kao knjižnica. Ovaj tu gore je borrower i imate još knjižnicu kojoj taj borrower uzima knjige iz njezinog niza tipa klase Book i sprema ga u svoj niz kao bookInpossesion i tak.
Kae sad sovim gore čudnim linijama. Najradije bi ih preskočio. Zna li ko ovdje možda nešto malo više o gornjim izrazima. Hvala unaprijed da ne pišem poslije bezveze. Hvala.
Moram priznat da nisam prije naletio na tu sintaksu, inace kad ne zelis da netko koristi copy i assignment konstruktor, deklariras ih kao private.
No izgleda taj pristup ima nedostataka i u C++11 su uveli ovo: https://docs.microsoft.com/en-us/cpp/cpp/explicitly-defaulted-and-deleted-functions?view=vs-2019
(Btw, zanimalo me pa sam potrazio, trebalo mi je valjda 1 minuta googlanja da bi nasao gornji link - poradi na svojim vjestinama pretrazivanja, jedna od kljucnih sposobnosti u SW :p)
Inace postoje situacije u kojima ne zelis da se objekt moze kopirat, potrazi si npr, "singleton pattern".
@Dex, nisam bas siguran da je on pitao sto su operatori, i ovo nije comparison operator koji je == u c++.

@CyberK , sintaksa je poprilično stara.
Prije C++11 je bilo dovoljno navesti signature copy constructora ili assignment operatora. Kompajler u tom slučaju NEĆE generirati automatski te funkcije ukoliko su potrebne (rule of 3/rule of 5). Rezultat toga je da ukoliko je napisan kod koji zahtijeva neke od tih funckija linkanje neće uspjeti, jer nema implementacije. Dakle, ne moraju biti ni private, ni protected, ali ako jesu kompajler će prijaviti pokušaj pristupa private/protected metodama.
Sintaksa koja je uvedena u C++11 koja na kraju signaturea ima '= delete' ima isto značenje, ali je razlika u tome da ćeš grešku o korištenju nedostupnih stvari dobiti već od kompajlera čak i ako su te metode public, a ne tek od linkera.

Može li mi netko objasniti unije? Ne razumijem koja je svrha imati sve istance unije na istoj memoriji.

Da li netko od vas zna rišit ova 2 zadatka u pythonu i pseudojeziku :
1.Ivana već dugo želi kupiti novu pernicu koja stoji n kuna. Za rođendan je od bake dobila m kuna (m < n). Nakon što je djedu ispričala priču s pernicom, djed joj je obećao da će joj dati ostatak novca. Kako još ne zna najbolje računati, moli te za pomoć. Napiši program koji će unositi cijenu pernice (n) I iznos koji je dobila od bake (m), a ispisivati iznos koji joj treba dati djed da bi kupila pernicu.
To je isto ka i ovaj zadatak :
Cijena računala iznosi n kuna. Ti imas m kuna (m<n). Napiši program koji će unositi cijenu računala n i iznos m koji ti imaš a ispisivati iznos koji je još potreban za kupnju računala.
2. Prvi je zadatak keramičara na praksi postaviti pločice oko jednog prozora. Najprije treba izračunati koliko mu je najmanje pločica potrebno. Prozor i pločice kvadratnog su oblika. Napiši program koji će unositi duljinu ruba prozora i duljinu ruba pločice, a ispisivati najmanji broj pločica potrebnih za okvir prozora.
Link za sliku je :
http://tina.com.hr/wp-content/uploads/2015/10/slijed.pdf
zadatak broj 16., tamo su brojevi, triba mi rezultat s brojevima.
Molin vas!

Plati Dex

Unija sadrži samo jednu instancu jednog membera!
Memorija koju zauzima unija je jednaka veličini najvećeg membera nevedenog u uniji.
Kada pristupaš memberu unije, uvijek moraš pristupiti istome kojeg si zapisivao.
Btw, reference ne možeš imati u uniji (ne znam je li ti bitno).

Oćeš meni pomoć? Neutrino

Oćeš meni pomoć? Neutrino
Pokaži što do sada imaš. Source kod postaj ovdje, reci gdje je zapelo i nema problema, pomoći ću.
Od nule ti mogu sve napraviti samo za novac.

Naprimjer za keramičara python ne znam šta tu tribama jel to ide npr. ovako :
brojPločica = float(input("Unesi broj pločica: "))
duljinarubaprozora=float(input("Koliko je duljina : "))
duljinarubapločica =float ( input ( Kolika je duljina : " ))
I šta sad?
To je python, a kako biti ti to napisa u pseuodjeziku?

Fulo si temu, ova tema se zove "Programiranje u C++-u - pitanja i odgovori".

Ali reka si da ćeš mi pomoć šta je li ne znaš python ili pseudojezik?

Znači ako imam
union test
{
uint8_t attay[3];
uint64_t var;
} ;
Unija zauzima 3+8 bajtova, i sve instance unije test t1, t2, tn; dijele istu memoriju?
Koja je svrha unije?

nije dobro kad ti netko ne pomogne , jel tako?

union test
{
uint8_t attay[3];
uint64_t var;
} ;
Unija zauzima 3+8 bajtova, i sve instance unije test t1, t2, tn; dijele istu memoriju?
Koja je svrha unije?
Ako je sizeof(uint8_t) == 1, a sizeof(uint64_t) == 8, onda attay member zauzima 3 bajta, a var 8 bajtova.
Dakle, instanca unije zauzima 8 bajtova. Pročitaj prethodni odgovor: unija zauzima onoliko mjesta, koliko najveći member zauzima.
Ako bi u uniju test dodao još tisuću membera tipa int (4 bajta), instanca unije će i dalje zauzimati 8 bajtova, jer je var member najveći. To je dovoljno memorije da se pohrani i svaki manji (ali ne svi u ISTOJ instanci).
Sve instance unije NE dijele istu memoriju (to si lako provjeriš sa ispisivanjem adresa od t1, t2, tn).
Zamisli da imaš uniju sa tisuću različitih membera. Recimo da je najveći 8 bajtova. To znači da je unija velika 8 bajtova. Ako bi imao ekvivalentni struct, onda bi veličina tog structa bila barem kilobajt.
Korist je ušteda memorije ako ti treba. Zamisli da ti neka funkcija vraća tisuću različitih rezultata, ali pri svakom pozivu ti može vratiti samo jedan od njih. Struct u tom slučaju samo troši memoriju bezveze, dok je unija zgodnija.
Jedno pitanje u vezi multiprocessinga i shared memory i network programming.
Igram se malo sa socketima u c++ i sad me zanima da li bi mogao recimo kad mi se client spoji i dobijem "client socket" pomocu kojeg mogu odgovarati clientu, da li bi ja mogao taj "client socket" staviti negdje na shared memory i onda pokrenuti drugi proces koji bi s njim komunicirao. Probao sam sa boost-om ali nista, on dohvati taj "client socket" ali kad hocu poslati poruku ili procitati s njega, nula bodova. Dok ako taj isti "client socket" ostavim na istom procesu, onda je sve ok.
U principu sam uspio, ali nije dovoljno. Uspio sam postici da pokrenem drugi process, dohvatim taj clientSocket i s njim onda mogu raditi.
Uglavnom sam to sredio s funkcijom CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, size, memoryName.c_str());
No problem je kod ovoga sto recimo ako imam
class A{
class B* -> neki pointer na drugi neki objekt
}
Ja mogu dohvatiti ovu classu A na drugom processu, ali ne mogu dohvatiti classu B.
Vidio sam svakakve sad pojmove na internetu, serialization,allocation.
Ono sto mi se najlakse cinilo je korsterci boost::interprocess, no s njim sam uspio samo sherati neke jednostavne,primitivne vrijednosti.
Da li mi moze netko pomoci, usmjeriti mi kako da iskoristim boost da sheram neke kompleksne objekte ili bilo koji drugi nacin
EDIT
struct B
{
std::vector<int> lista;
};
if (cArgs == 1) { //Parent process
//Remove shared memory on construction and destruction
struct shm_remove
{
shm_remove() { shared_memory_object::remove("MySharedMemory"); }
~shm_remove() { shared_memory_object::remove("MySharedMemory"); }
} remover;
//Create a shared memory object.
shared_memory_object shm(create_only, "MySharedMemory", read_write);
//Set size
shm.truncate(1000);
//Map the whole shared memory in this process
mapped_region region(shm, read_write);
//Write all the memory to 1
B* ada = new B();
CopyMemory(region.get_address(), ada, sizeof(B));
parentProcess();
std::cout << "zapocelo je " << std::endl;
int index = 1;
while (true)
{
((B*)region.get_address())->lista.push_back(index);
++index;
}
}
else
{
//Open already created shared memory object.
shared_memory_object shm(open_only, "MySharedMemory", read_only);
//Map the whole shared memory in this process
mapped_region region(shm, read_only);
//Check that memory was initialized to 1
HANDLE mem = region.get_address();
while(true)
{
std::cout << ((B*)mem)->lista.at(0) << std::endl; -> ovo ne uspije procitati
}
}