Programiranje u C++-u - pitanja i odgovori izdvojena tema

poruka: 7.283
|
čitano: 1.506.209
|
moderatori: Lazarus Long, XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
15 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
cale kaže...

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


}

}

 

Poruka je uređivana zadnji put ned 12.4.2020 23:19 (cale).
7 godina
neaktivan
offline
Re: 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. 

https://www.youtube.com/channel/UCgos5WloYoxCvCeUIi47ZxQ
7 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

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.

https://www.youtube.com/channel/UCgos5WloYoxCvCeUIi47ZxQ
12 godina
odjavljen
offline
Re: Programiranje u C++-u - pitanja i odgovori

Napravio sam sa strtokom.

Format je
cmd1,param1,...,paramN;cmd2,...

Radi kak treba, za divno čudo xD

4 godine
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

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 ==========

15 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

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 ?

 
2 0 hvala 0
12 godina
odjavljen
offline
Re: Programiranje u C++-u - pitanja i odgovori

Funkcija radi, no zanima me zašto ne radi sljedeće:

 

https://pastebin.com/Y9NmNddX

 

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.

6 godina
offline
Programiranje u C++-u - pitanja i odgovori

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;
}

Poruka je uređivana zadnji put čet 16.4.2020 10:10 (Equi).
 
0 0 hvala 0
7 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

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.

https://www.youtube.com/channel/UCgos5WloYoxCvCeUIi47ZxQ
11 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
cale kaže...

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()

11 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
Equi kaže...

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

11 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
safin kaže...

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>

4 godine
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

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

Poruka je uređivana zadnji put sub 18.4.2020 2:33 (safin).
6 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
Djuro von Prekoplotovich kaže...
Equi kaže...

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

7 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

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.

 
0 0 hvala 0
12 godina
odjavljen
offline
Re: Programiranje u C++-u - pitanja i odgovori

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..

 

http://www.cplusplus.com/doc/tutorial/classes2/

11 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
general_šu kaže...

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++.

Poruka je uređivana zadnji put pet 24.4.2020 2:46 (CyberK).
14 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori

@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.

12 godina
odjavljen
offline
Re: Programiranje u C++-u - pitanja i odgovori
Može li mi netko objasniti unije? Ne razumijem koja je svrha imati sve istance unije na istoj memoriji.
 
0 0 hvala 0
3 godine
protjeran
offline
Programiranje u C++-u - pitanja i odgovori

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!

 
0 0 hvala 0
3 godine
protjeran
offline
Re: Programiranje u C++-u - pitanja i odgovori

Plati  Dex

Poruka je uređivana zadnji put ned 3.5.2020 15:31 (Koko56).
14 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
Dex.pwn kaže...
Može li mi netko objasniti unije? Ne razumijem koja je svrha imati sve istance unije na istoj memoriji.

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).

 

 

Poruka je uređivana zadnji put ned 3.5.2020 15:42 (neutrino).
3 godine
protjeran
offline
Re: Programiranje u C++-u - pitanja i odgovori

Oćeš meni pomoć? Neutrino

Poruka je uređivana zadnji put ned 3.5.2020 15:56 (Koko56).
14 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
Koko56 kaže...

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.

3 godine
protjeran
offline
Programiranje u C++-u - pitanja i odgovori

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?

 
0 0 hvala 0
14 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori

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

3 godine
protjeran
offline
Re: Programiranje u C++-u - pitanja i odgovori

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

12 godina
odjavljen
offline
Re: Programiranje u C++-u - pitanja i odgovori
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?
3 godine
protjeran
offline
Re: Programiranje u C++-u - pitanja i odgovori

nije dobro kad ti netko ne pomogne , jel tako?

Poruka je uređivana zadnji put ned 3.5.2020 17:01 (Koko56).
14 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
Dex.pwn kaže...
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?

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.

E-mail:
Lozinka:
 
vrh stranice