String jako argument funkcji o zmiennej liczności

0

Dobry wieczór, mam pewien problem - mam funkcję o zmiennej liczności (na razie chce zapisać stringi będące argumentami do pomocniczej tablicy w funkcji, której będę potem używał) i muszę przekazać do niej pewną ilość stringów. W takiej postaci program się nie kompiluje i wywala mi błąd - [Error] cannot pass objects of non-trivially-copyable type 'std::string {aka class std::basic_string<char>}' through '...' w miejscu wywołania funkcji. Jeśli zamienię "tablica[0]" na "tablica[0].c_str()" to program się kompiluje, ale i tak nie działa poprawnie. Ponadto w wywołaniu funkcji wątpię by było używane .c_str() ( wymóg zadania, nie moje widzimisie), więc muszę się bez tego obejść i tak. Więc jaki tu jest problem i jak mogę go rozwiązać??

string sum( int iloscLiczb, ... )
	{
		va_list ap;
		va_start ( ap, iloscLiczb );
		string tablica[iloscLiczb];
		for ( int i = 0; i < iloscLiczb; i++ )
			{
				char* s = va_arg( ap, char * );
				tablica[i] = s;
			}	
	}

int main()
	{
		int liczbaCyfr;
		cin >> liczbaCyfr;
		string tablica[liczbaCyfr];
		for ( int i = 0; i < liczbaCyfr; i++ )
			{
				cin >> * ( tablica + i ) ;
			}
		//cout << sum( liczbaCyfr, tablica );
		cout << sum ( liczbaCyfr, tablica[0], tablica[1]) ;
		return 0;
	}
1

Nie możesz tak zrobić. Nie możesz przekazać tablicy tylko obiekty po przecinku. Nie możesz przekazywać obiektów tylko prymitywy / wskaźniki.

0

@kochambacę Pozdrawia :) @Shalom W sumie tablica jest tylko pomocnicza, wszystko rozchodzi się o stringi, o konkretne obiekty... Nie mogę przekazać do funkcji konkretnego elementu tablicy? Czy nva_arg nie może być elementem tablicy...? Co to są prymitywy to nie wiem, więc gdzie mogę przekazywać obiekty a gdzie tylko wskaźniki i prymitywy?

0

Tablica nie jest tu problemem. Problemem jest typ obiektu. Nie możesz tam wrzucić obiektów klas. Tylko typy prymitywne.

0

Ellipsis (czyli ...) działa tylko dla POD (plain old data) i pointerów. Pchanie do ellipsis czegokolwiek, co nie jest POD wcześniej (przed c++11) oznaczało undefined behaviour, teraz oznacza zależność od użytego kompilatora (jego implementacji). Jeśli zależy Ci na przesyłaniu do funkcji zmiennoargumentowej typów non-POD to użyj variadic template.
Co do zadania.... to nie rozumiem jakie jest polecenie. Może wyjaśnij co chcesz osiągnąć.

0

Czemu nie możesz zrobić to po ludzku:

string sum(vector<string> &tb)
  {
   for(int i=0;i<tb.size();++i) cout<<tb[i]<<endl;
  }

int main()
  {
   size_t count;
   cin>>count;
   vector<string> tb(count);
   for(int i=0;i<tb.size();++i) cin>>tb[i];
   cout<<sum(tb);
   return 0;
  }
0

Chodzi o to, by móc do funkcji wprowadzić odpowiednią ilość stringów, ciągów znaków, funkcja musi mieć nieokreśloną liczbę argumentów, dlatego Twoja propozycja Dragon odpada, bo to musi mieć jednego inta i potem tą nieokreśloną ilość argumentów...Ogólnie to funkcja ma sumować wielkie liczby z użyciem właśnie stringów, ale to nie jest tu problemem bo już metodę mam. Chodzi tylko o tą funkcję, ma ona właśnie tak wyglądać ** sum( int, ... ) ** . Więc jak mam to zrobić w takim razie, jak nie mogę tam stringów wsadzić bezpośrednio...? Ech.

Edit: tablice charów wejdą?

0

Skąd ten mus?
Ta funkcja string sum(vector<string> &tb) może sobie zsumować te liczby.

0

Cóż, z treści zadania... Ech, nie mam biegłości w używaniu vectorów, nie wiem czy można ich w ogóle używać, ale spróbuje, dzięki za pomoc.

0

Heh, tej, widać, nie tylko ja z mojej uczelni jestem. W sumie wszystko co tutaj wstawiam to są zadania z tego. Jakieś przemyślenia co do tego?

Edit: co do tego zadania.

0

Przemyślenia są proste.
Pozwolenie na użycie string zaś zmuszanie do użycia dynamicznych tablic zrobionych poprzez new zamiast zwykłego vector'a - to jest jakieś dziwaczne zboczenie - którego Paryż jeszcze nie widział.

0

No tak, dopiero co zaczęliśmy listy robić, vectory pewnie wkrótce będą. Jakieś pomysły jak sobie poradzić z tymi funkcjami z nieokreśloną liczbą argumentów? Zastanawiałem się nad zwykłą, lub dynamiczną tablicą charów, ale nie wiem czy mogę jako argument funkcji użyć takiej tablicy, i czy w programie będą używane takie argumenty, czy stringi. Zwłaszcza, jak wszędzie są używane stringi, a z tego co zrozumiałem z tego wątku, nie można ich użyć jako argumentów... Chyba, że z pomocą jakiejś dynamicznej tablicy? Zgłupiałem szczerze powiedziawszy.

0

wybierz to: string sum(int,string*);

0

To już zrobiłem... Mam zrobić wszystkie funkcje :D.

0

No to zacznij ćwiczyć czytanie ze zrozumieniem.

0

Nie powinien i chyba nie może Pan tak rozumieć. Napisałem "stosowane" i "spełniają", zatem użyta jest liczba mnoga, z czego wynika, że używanych jest WIELE. Zatem domniemanie wymogu pisania JEDNEJ jest błędne. Tym samym nie istnieje wybór i trzeba napisać wszystkie, bo przecież nie wiemy jakie są używane w main.Tym samym drugie rozumowanie jest poprawne. Słowa "wyłącznie JEDEN" należy rozumieć, że każde użycie w main spełnia jeden z poniższych i żadne inne nie są wymagane

Cóż, też myślałem, że chodzi o jedną funkcję, ale piszący te zadanie uważa inaczej :P.

dodanie znacznika <quote> - @furious programming

0

Owszem liczba mnoga, ponieważ musisz zrealizować dokładnie trzy funkcji, zresztą to w zadaniu wyraźnie napisano.

0

Tym samym nie istnieje wybór i trzeba napisać wszystkie, bo przecież nie wiemy jakie są używane w main

Tak czy inaczej dopytywałem się o to i tak właśnie jest, trzeba napisać te 16 funkcji, chodzi także o przeładowywanie nazw funkcji... ale jak mam już pierwszą to robi się z tego trochę kopiuj-wklejka, pomijając oczywiście sprawę tych funkcji z różną ilością argumentów... Ponadto jeśli kogoś to interesuje, to tu jest treść zadania https://ww2.ii.uj.edu.pl/~kawa/P1/P1_Zadanie_G_2014_2015.pdf

(Zadanie oczywiście nie jest moje i nie roszczę sobie żadnych praw do niego, każdy ma do niego dostęp więc dałem link.)

0

Widzę że ciężko cie namówić na nie otrzymanie pały, próbuję ostatni raz.
Którą z funkcji:

string operation(string(*)(int,string*),int,string*);
string operation(string(*)(int,string*),int,...);
void operation(string*,string(*)(int,string*),int,...);
void operation(string*,string(*)(int,string*),int,string*);
void operation(string&,void(*)(string*,int,string*),int,string*);
void operation(string&,void(*)(string*,int,string*),int,...);

możesz użyć razem z:

string sum(int,...);

?
Zastanów się dobrze, jeżeli znowu odpowiedź będzie bezmyślna to już się nie wypowiadam w tym temacie.

0

Ech... mam Ci wstawić logi z systemu na który wysyłam ten program by Ci pokazać, że nawet nie sprawdza funkcjigdy nie mam deklaracji wszystkich...? Będzie to wtedy inteligentna odpowiedź?

3

Hmm, w takim razie dają wam bardzo nieinteligentne zadania.
Więc zrealizuj to w ten sposób:

string sum(const string &a,const string &b) { /* tu kod dodający dwie liczby */ }
string sum(int count, ... )
  {
   va_list ap;
   va_start(ap,count);
   if(i<=0) return "0";
   string v=va_arg(ap,char*);
   if(i<2) return v;
   for(int i=1;i<count;++i) v=sum(v,va_arg(ap,char*));
   return v;
  }
0

Cóż, tutaj się zgadzamy... Okej, o tym nie pomyślałem, dzięki wielkie.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.