
We are searching data for your request:
Upon completion, a link will appear to access the found materials.
Cat c6 4 acert motor 4.2 8
3cat c5 4 mack motor 4.2 8
1cat c5 3,9 dfe 11
2cat c5 4 mack motor 4.2 8
2cat c5 3,9 dfe 11
3mačka c6 4,2 8
4mačka c6 4,2 8
3mačka c6 4,2 8
4mačka c6 4,2 8
4mačka c6 4,2 8
Evo što pokušavam učiniti sa svojim kodom:
for(mačka = 0, mačka<,4, mačka++){
za(i=0, i<,5, i++){
cout <,<, mačka <,<, ":" <,<, " | " <,<, i <,<, " : " <,<, " " <,<, (i+1) <,< , " | " <,<, my_array[i] <,<, " | " <,<, my_array[i+1] <,<, endl,
}
}
Ovo je greška koju dobivam:
pogreška: nekonstantna referenca lvalue na tip 'std::array<,unsigned short,
1ul>,' ne može se vezati za privremeni tip 'const unsigned short *'
Pokušao sam deklarirati niz my_array const, ali i dalje dobivam ovu grešku.
Kako mogu svoj niz učiniti konstantnim i ponavljati ga bez promjene svog niza?
O:
Pokušao sam deklarirati niz my_array const, ali i dalje dobivam ovu grešku
Zbog problema koji su identificirali @John Fultz i @Krishna, ne možete uzeti referencu na pokazivač i promijeniti ga bez promjene njegove vrijednosti. Morate kopirati elemente niza prije nego što ga promijenite i vratite kopiju.
Kako mogu svoj niz učiniti konstantnim i ponavljati ga bez promjene svog niza?
Koristite std::array<,...>,::cbegin(), std::array<,...>,::cend(),
std::array<,...>,::data(), std::array<,...>,::at(index), std::array<,...>,::begin(), std ::array<,...>,::end() ili std::array<,...>,::tip_value{}.
predložak<,std::size_t SIZE>,
std::array<,unsigned short, SIZE>, cat_array(unsigned short*&, my_array){
nepotpisani kratki* mačka = moj_niz,
for(int i=0, i<,5, i++){
mačka[i] = 10,
}
return std::array<,unsigned short, SIZE>,{
mačka
},
}
Ako deklariramo pokazivač na niz i pokušamo promijeniti elemente tog niza pomoću aritmetike pokazivača, ponašanje je definirano implementacijom. Nedefinirano je čuvaju li se izvorne vrijednosti objekta ili ne. Sljedeći primjer to ilustrira:
int* p,
int const my_array[] = {0,1,2,3,4},
const int my_const_array[] = {0,1,2,3,4},
p = &,moj_niz,
*p = 5, // Ovo radi.
p = &,my_const_array,
*p = 5, // Ovo nije.
O:
Odgovor na ovo pitanje ovisi o tome kako se pokazivač mijenja.
Ako se pokazivač prosljeđuje funkciji po vrijednosti, vrijednost pokazivača se kopira u argument funkcije, koji se zatim mijenja. Tako se svi pokazivači u nizu mijenjaju. Ova izmjena utječe na pokazivač, koji sada pokazuje na drugi objekt.
Ako se pokazivač prosljeđuje referencom, prosljeđuje se i sam pokazivač. Tako varijabla pokazivača u funkciji može pristupiti izvornoj memoriji. Međutim, ne može mijenjati sadržaj te memorije, jer se samo na memoriju odnosi kao vrijednost argumenta.
O:
Pretpostavimo da imate kod ovako:
int *niz[5],
for(int i = 0, i <, 5, ++i)
niz [i] = i,
Kao što znate, ovaj kod, na primjer, kada se prevede u asembler, prevodilac će napraviti neku optimizaciju kao što je inline funkcija ili odmotavanje petlje. Prevoditelj može promijeniti vrijednost niza na mjestu.
Ako imate const int *array[5],
Ovo se ne odnosi na ovu funkciju:
void foo(const int *a)
{
int *b = a,
b[1] = 9,
}
jer u ovom primjeru prevodilac ne može ugraditi tijelo funkcije i mora napraviti kopiju a. Ali prevodilac može ugraditi prvu for-petlju vašeg koda.
Ako imate const int *array[5], a pokazivač se prosljeđuje po vrijednosti, tada se konstruktor kopiranja ili konstruktor premještanja uvijek poziva kada obavljate poziv funkcije. Prevoditelj također može ugraditi prvu for-petlju.
Ako imate const int *array[5], a pokazivač se prosljeđuje referencom, tada će postojati kopija niza. Možda biste trebali razmotriti prosljeđivanje adrese niza.
Kao što možete vidjeti, prevodilac će koristiti različita pravila ovisno o kontekstu poziva funkcije, zbog čega tip povratka funkcije mora biti u potpunosti definiran kako bi prevodilac mogao napraviti pravi izbor. C standard kaže sljedeće u 6.9.3.2 paragrafu 6:
Kada se pozove funkcija (6.2.2), osim ako je funkcija a
član klase s virtualnim funkcijama, pozvana funkcija
zajamčeno ima namjenski okvir stog.
Dakle, u vašem određenom kodu možete pozvati foo više puta, što će osigurati da ćete imati kopiju niza. Ali to se neće dogoditi u kodu koji ste objavili u pitanju, pa stoga niz neće imati postavljenu vrijednost.
I u drugim slučajevima, pozivatelj može koristiti funkciju za operacije samo za čitanje, a ako prevodilac ugradi vašu funkciju, niz može postati samo za čitanje. Na primjer, ako to učinite
What would you began to do on my place?
Po mom mišljenju, nisu u pravu. Moramo razgovarati. Piši mi na PM, pričaj.
Many thanks for the help in this question. Nisam to znao.
What a phrase ... super, brilliant idea
Ja se pridružujem. I naletio sam na ovo.