referencja-tablice

0

hey
i was learning some new things, and found a problem with reference, google didnt help :/
here is a simple function

void pushtovector(string pushit, vector<string>&vct[],int indx){
    vct[indx].push_back(pushit);
}

and a function call:

pushtovector(s,minxmax,siz(s));

reference error.png

what should i do to make it work? have no idea

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

those version works, so it confused me..
vector<string>vct | without table in it, with reference, works:

void pushtovector(string pushit, vector<string>&vct,int indx){
    vct.push_back(pushit);
}

vector<string>vct[100] | with table in it, but with no reference, also works:

void pushtovector(string pushit, vector<string>vct[],int indx){
    vct[indx].push_back(pushit);
}

but combination both of vector <string>[] and reference end up with compile error..
first post ever so it isnt that transparent :v

0

o shiet, zarejestrowałem się na pierwszym z brzegu otwartym forum informatycznym i nie spojrzałem że jest polskie, to po angielsku z rozpędu napisałem :D

2

http://melpon.org/wandbox/permlink/9jgAQV0DwYoXmzmV
Tak? Chociaż bardziej sugerowałbym użycie

typedef std::array<std::vector<costam>> nazwa_ktora_odzwierciedla_czym_jest_typ;

1

Musisz określić rozmiar tablicy:

void pushtovector(string pushit, vector<string>(&vct)[100], int indx)
{
}
3

C++ nie pozwala na definiowanie tablicy referencji, ani referencji do referencji oraz wskaźnika do referencji.
Nie pokazałeś całości kodu ani nie opisałeś problemu, więc trudno wskazać prawidłowe rozwiązanie, ale na pewno tablica referencji to ślepy zaułek.

@strawberry shake istnieje fundamentalna różnica między Twoim pierwszym kodem a tym pokazanym przez @Pebala

void pushtovector(string pushit, vector<string>(&vct)[100], int indx)

U Ciebie to tablica referencji, a tutaj to referencja do tablicy.

1

@strawberry shake:
8.3.4: There shall be no references to references, no arrays of references, and no pointers to references.
size_t to typ określający wielkość / ilość. http://en.cppreference.com/w/cpp/types/size_t
Rozumiem że celem jest przekazanie tablcy obiektów typu std::vector. W takim razie podtrzymuje moje rozwiązanie.

0

zdecydowanie mi chodziło o referencję do tablicy
jak tylko uniezależnić to od rozmiaru?

1
strawberry shake napisał(a):

zdecydowanie mi chodziło o referencję do tablicy
jak tylko uniezależnić to od rozmiaru?

template<size_t S>
void foo(vector<int>(&arr)[S])

http://melpon.org/wandbox/permlink/4z4VwpwrXybNFok8

Tak możesz to zrobić. Czy to ma sens - to zupełnie inna sprawa. Imho nie ma, a jeśli już musisz użyć tablic (a nie np. wektora wektorów), to zamiast c-tablic, to użyj std::array.

0
pingwindyktator napisał(a):

http://melpon.org/wandbox/permlink/9jgAQV0DwYoXmzmV

czy w takim razie to rozwiązanie tworzy tablicę referencji?

2

Nie, masz tablicę obiektów vector, a funkcja przyjmuje wskaźnik do początku tej tablicy.

1

Po cholerę te wszystkie odpowiedzi.
Przecież widać, że newbie przekombinował jakiś prosty problem i z tego powodu ma kłopoty.
Takiego argumentu nikomu bym na Code Inspection nie przepuścił.

@strawberry shake zadaj pytanie na nowo, ale opisując co chcesz osiągnąć. Nie pytaj nas jak naprawić twój pomysł na coś, tylko opisz co to jest to coś. Jaki problem ma rozwiązywać twoja funkcja?

0
MarekR22 napisał(a):

Po cholerę te wszystkie odpowiedzi.
Przecież widać, że newbie przekombinował jakiś prosty problem i z tego powodu ma kłopoty.
Takiego argumentu nikomu bym na Code Inspection nie przepuścił.

@strawberry shake zadaj pytanie na nowo, ale opisując co chcesz osiągnąć. Nie pytaj nas jak naprawić twój pomysł na coś, tylko opisz co to jest to coś. Jaki problem ma rozwiązywać twoja funkcja?

Na prośbę Marka:
Postanowiłem w trakcie kodzenia wrzucić do praktyki użycie referencji.

efektem miała być funkcja, która za argument przyjmuje referencję do : vector<string>v[], o dowolnym rozmiarze,
chciałem na tej strukturze zrobić za pomocą tej funkcji jakieś działania, ale tych struktur mam kilka, o różnym rozmiarze, więc chciałem żeby funkcja działała na każdej z nich, żeby nie pisać oddzielnie poleceń dla każdej struktury

niestety, mimo, że przy referencji do łatwiejszych celów nie napotkałem problemów, tu kompiler skwitował to errorem, a w google nic nie znalazłem

w skrócie, dopiero zaczynam przygodę z referencją i uczę się jej używać na różne sposoby

2

Tablica o rozmiarze 1 jest innym typem niż tablica o rozmiarze 2 i innym niż tablica o rozmiarze 3 itd. Stąd nie istnieje jedna referencja, która mogłaby wskazywać na tablicę o dowolnym rozmiarze. Do tego celu się używa wskaźnika.

2

Po co referencja do tablicy? Może coś przeoczyłem w rozważaniach, ale tablica i tak jest przekazywana przez coś podobnego do referencji :) więc dodanie referencji nie powinno nic zmienić...?

1
  1. Nawet w C tablice nie są przekazywane przez wartość, ale przez wskaźnik. To jest podstawowa wiedza składni języka. Z tego powodu pchanie na siłę tam ampersand (referencji) po prostu nie ma sensu. Tablice zawsze zachowują się tak, jakby były przekazane przez referencję.
  2. zupełnie nie zrozumiałeś co miałem na myśli pisząc "źle zadane pytanie"
0

Z tego powodu pchanie na siłę tam ampersand (referencji) po prostu nie ma sensu
Ma sens jeśli chcesz wymusić jej wielkość.

0
kq napisał(a):

Z tego powodu pchanie na siłę tam ampersand (referencji) po prostu nie ma sensu
Ma sens jeśli chcesz wymusić jej wielkość.

Tylko jeszcze, jakby mi ktoś napisał, po co? Poważnie pytam... Bo jakoś nie widzę zastosowania takiego wymuszania i to przez referencję... Jak już, to ja bym wolał tak:

struct TabInt100 {
    int t[100];
};

No i wtedy sobie mogę przekazywać TabInt100 jak chcę. I przez wartość (kopiowanie), i przez referencję, i przez stałą -- mam wybór semantyki przekazywania wartości, a rozmiar zawsze pozostaje 100...

1
koszalek-opalek napisał(a):
kq napisał(a):

Z tego powodu pchanie na siłę tam ampersand (referencji) po prostu nie ma sensu
Ma sens jeśli chcesz wymusić jej wielkość.

Tylko jeszcze, jakby mi ktoś napisał, po co? Poważnie pytam... Bo jakoś nie widzę zastosowania takiego wymuszania i to przez referencję... Jak już, to ja bym wolał tak:

struct TabInt100 {
    int t[100];
};

No i wtedy sobie mogę przekazywać TabInt100 jak chcę. I przez wartość (kopiowanie), i przez referencję, i przez stałą -- mam wybór semantyki przekazywania wartości, a rozmiar zawsze pozostaje 100...

Nie. Jak chcesz mieć taki wybór to std::array.

2

@koszalek-opalek
Np. jeśli chcesz przyjmować literały stringowe o odpowiedniej długości

Country isoCodeToCountry(char const(&)[4]);
// isoCodeToCountry("POL") - ok
// isoCodeToCountry("POLSKA") - err
0
MarekR22 napisał(a):

Nawet w C tablice nie są przekazywane przez wartość, ale przez wskaźnik. To jest podstawowa wiedza składni języka. Z tego powodu pchanie na siłę tam ampersand (referencji) po prostu nie ma sensu. Tablice zawsze zachowują się tak, jakby były przekazane przez referencję.

zupełnie nie zrozumiałeś co miałem na myśli pisząc "źle zadane pytanie"

Tablice zawsze zachowują się tak, jakby były przekazane przez referencję
Po co referencja do tablicy? Może coś przeoczyłem w rozważaniach, ale tablica i tak jest przekazywana przez coś podobnego do referencji :) więc dodanie referencji nie powinno nic zmienić...?
dobrze wiedzieć, dzięki :D
to w takim razie rozwiązuje mój problem

#skąd czerpać tą podstawową wiedzę składni języka? czytałem różne poradniki, kursy, ale albo zakładają że już wszystko wiem, przy algorytmice, albo dotyczą kompletnych podstaw... a i w kursach o referencji nie trafiłem kompletnie na tablice, żadnego wytłumaczenia, po prostu nic, (autor założył że już to wiem? wtf)
#trochę już kombinuję, pytanie czysto teoretyczne, chodzi mi o jakieś proste rozwiązanie, nie o jakąś własną, złożoną implementację czy w takim razie da się tablicę przekazać do funkcji tak, jak zwykłą zmienną? najlepiej, jakimś magicznym sposobem który by nie marnował pamięci, ale żeby tablica po zakończeniu funkcji pozostała bez zmian?

http://melpon.org/wandbox/permlink/9jgAQV0DwYoXmzmV
tylko co w takim razie robi to rozwiązanie pingwina? nie jest to w takim razie wyważanie otwartych drzwi :D ?

edit:

  • Tylko jeszcze, jakby mi ktoś napisał, po co? Poważnie pytam... Bo jakoś nie widzę zastosowania takiego wymuszania i to przez referencję... Jak już, to ja bym wolał tak: *
    struct TabInt100 {
        int t[100];
    };
  • No i wtedy sobie mogę przekazywać TabInt100 jak chcę. I przez wartość (kopiowanie), i przez referencję, i przez stałą -- mam wybór semantyki przekazywania wartości, a rozmiar zawsze pozostaje 100...*

*Nie. Jak chcesz mieć taki wybór to std::array. *
obstawiam że tu jest odpowiedź na pytanie, tylko że za mało wiem żeby to zrozumieć :D

1
strawberry shake napisał(a):

#skąd czerpać tą podstawową wiedzę składni języka? czytałem różne poradniki, kursy, ale albo zakładają że już wszystko wiem, przy algorytmice, albo dotyczą kompletnych podstaw... a i w kursach o referencji nie trafiłem kompletnie na tablice, żadnego wytłumaczenia, po prostu nic, (autor założył że już to wiem? wtf)

http://www.cplusplus.com/
http://www.tutorialspoint.com/cplusplus/
https://en.wikibooks.org/wiki/C%2B%2B_Programming -- wszystkie po angielsku, ale jak ktoś chce poważnie zajmować się informatyką/programowaniem, to nie powinien być problem. :)
Po polsku: https://pl.wikibooks.org/wiki/C%2B%2B -- polska wersja tego ostatniego, ale dużo jeszcze nie przetłumaczone...

Ale ponieważ tablice to tak naprawdę część C++ odziedziczona z C, to i w podręcznikach do C trzeba tego szukać:
https://pl.wikibooks.org/wiki/C/Funkcje#Tablice_jako_parametr_funkcji

1

<quote="1261559">czy w takim razie da się tablicę przekazać do funkcji tak, jak zwykłą zmienną? najlepiej, jakimś magicznym sposobem który by nie marnował pamięci, ale żeby tablica po zakończeniu funkcji pozostała bez zmian?

void DajMiTabliceIntowPrzysiegamZeNiczegoNieZmienie( const int* table, size_t table_size );
1
strawberry shake napisał(a):

#...
#trochę już kombinuję, pytanie czysto teoretyczne, chodzi mi o jakieś proste rozwiązanie, nie o jakąś własną, złożoną implementację czy w takim razie da się tablicę przekazać do funkcji tak, jak zwykłą zmienną? najlepiej, jakimś magicznym sposobem który by nie marnował pamięci, ale żeby tablica po zakończeniu funkcji pozostała bez zmian?

Właściwie to jest pytanie do C, nie do C++ -- bo w C++, przy pisaniu na 'normalnym' :) poziomie, nie ma potrzeby używania tablic -- używa się klas bibliotecznych -- jak już to było pisane -- takich jak vector, array itp., w zależności od potrzeb...

Z drugiej strony, żeby posługiwać się efektywnie C++ nie trzeba znać dobrze C, tylko właśnie używać biblioteki -- co na każdym kroku podkreśla Bjarne S.

0
tajny_agent napisał(a):
strawberry shake napisał(a):

czy w takim razie da się tablicę przekazać do funkcji tak, jak zwykłą zmienną? najlepiej, jakimś magicznym sposobem który by nie marnował pamięci, ale żeby tablica po zakończeniu funkcji pozostała bez zmian?

void DajMiTabliceIntowPrzysiegamZeNiczegoNieZmienie( const int* table, size_t table_size );

kompletnie nie o to mi chodziło

*chodzi mi o takie wywołanie tablicy w funkcji, aby zachowała się kompletnie jak zwykła zmienna. aby można ją zmieniać w funkcji, a po wywołaniu, wróciła do pierwotnego stanu, jak zwykła zmienna.
*Tutaj po prostu zakładam blokadę na kompilator jeśli spróbuję coś z nią zrobić,no ale prostego rozwiązania w takim razie pewnie nie ma, nie szukam długiego kodu, może kiedyś sam na to wpadnę

1

W takim razie użyj std::array

void foo(array<int,3> arr)
{
	fill(arr.begin(), arr.end(), 42);
	DBG_CONT(arr);
}

auto main() -> int
{
	array<int,3> main_arr = { {1, 33, 7} };
	DBG_CONT(main_arr);
	foo(main_arr);
	DBG_CONT(main_arr);
}

http://melpon.org/wandbox/permlink/aZbeTuqVdghfiWOm

0
strawberry shake napisał(a):

kompletnie nie o to mi chodziło

*chodzi mi o takie wywołanie tablicy w funkcji, aby zachowała się kompletnie jak zwykła zmienna. aby można ją zmieniać w funkcji, a po wywołaniu, wróciła do pierwotnego stanu, jak zwykła zmienna.
*Tutaj po prostu zakładam blokadę na kompilator jeśli spróbuję coś z nią zrobić,no ale prostego rozwiązania w takim razie pewnie nie ma, nie szukam długiego kodu, może kiedyś sam na to wpadnę

Po prostu przy 'zwykłych' zmiennych przekazywanych przez wartość kompilator sam dba o to, żeby zrobić lokalną kopie parametru. W przypadku tablic musisz to zrobić własnoręcznie.
Rozwiązanie prehistoryczne: Opakuj tablice w klase i zdefiniuj konstruktor kopiujący.
Rozwiązanie nowoczense: Tak jak wspomniano nie raz - użyj std::array/std::vector

1 użytkowników online, w tym zalogowanych: 0, gości: 1