Wpis z mikrobloga

Czy może mi ktoś powiedzieć, czy jest jakiś sposób, aby zmusić ten sposób zapisu do tablicy do działania?

int **array;
int *writeElement(int idx) {return array[idx];}
void createArray(void) {array=new int*[20];}
int main()
{
createArray();
writeElement(5)=new int[10]; //<- o taki
return 0;
}

Znalazłem obejście problemu poprzez przekazywanie elementu do zapisania jako argument:
void writeElement(int idx, int *element) {array[idx]=element;}
ale chciałbym dowiedzieć się, czy w ogóle można zapisać to w sposób jak powyżej

#cpp
  • 21
  • Odpowiedz
@ludzik: To co podałeś niżej jest ok. Potem przy wywołaniu WriteElement podajesz bodajże referencję w parametrze. Właściwie to nie musisz się pitolić z referencjami i wskaźnikami przy wstawianiu elementów do tablicy.
  • Odpowiedz
@kamilspl: Jakim sposobem? Jedno to odwołanie do elementu tablicy w który można wstawić wartość a drugie to wywołanie funkcji i nie podstawiasz pod nie. Chyba że to jakaś wydziwiona abstrakcja z tą funkcją, ale chyba nie masz tam dalej jakichś cudów mieszających w operatorach.
  • Odpowiedz
@ludzik: Już zrobiłem co chciałem osiągnąć:
#define writeElement(idx,array) (array[idx])
( ͡ ͜ʖ ͡)
writeElement(5,array)=new int[10]; //<- i to działa

Spróbuję zrobić jeszcze to samo, ale bez define, a w oparciu o constexpr
  • Odpowiedz
W ogóle to masz świadomość jak działają wskaźniki ? Funkcja - int writeElement(int idx) {return array[idx];} zwraca Ci int natomiast array[idx] trzyma w sobie int*.

To samo w createArray, operator new zwraca Ci wskaźnik na podany typ. W tym przypadku przypisanie array = new int[20] to tak jakbyś napisał, że do int** przypisujesz int*.
  • Odpowiedz
@kobosek: faktycznie to wygląda źle - co ciekawe to chyba wykop usuwa to bo w kodzie mam ok. Zabrakło spacji i by przepuścił.

int * * array;
int * writeElement(int idx) {return array[idx];}
void createArray(void) {array=new int * [20];}
  • Odpowiedz
  • 0
@rotflolmaomgeez a ja byłem przekonany że tak jest ok. Warto dodać że w docelowym kodzie odczyt z tablicy jest bardziej skomplikowany i wymaga zabezpieczeń przed wyjściem poza zarezerwowany obszar. Kontenery stl odpadają bo mają zbyt małą wydajność.
  • Odpowiedz
@kamilspl: nawet pod względem wydajnościowym to leży, bo funkcja nie jest zadeklarowana jako inline - dochodzi stos wywołania i masa skoków pomiędzy wskaźnikami.

Dlczego kontenery stl mają zbyt małą wydajność? Co jest nie tak z std::vector?
  • Odpowiedz
@simia: w przypadku metod kontenerów może mieć to sens, bo obiekt będzie istniał po wyjściu z funkcji (a nie zostanie sprzątnięty razem ze stosem wywołania). Ogólnie jest to dość śliski grunt i o ile można zaufać że w stlu takie operacje nie będą gubiły zwracanych obiektów, o tyle gdziekolwiek indziej już bym taki przekonany nie był.
  • Odpowiedz