zwracanie przez funkcję kilku wartości

0

cześć.
co prawda moją przygodę z C++ zacząłem kilka lat temu, ale robiłem mało i teraz mam zamiar wziąć się za to porządnie. jednym z problemów, jakie napotkałem, jest właśnie zwracanie przez funkcję kilku wartości. niby przewija się to w tematach, jakie znalazłem, ale nigdzie nie jest jasno opisane co i dalczego. domyślam się, że należy skorzystać z wskaźników. jednak tutaj moje pomysły się kończą. prosiłbym o możliwie szczegółową pomoc.

pozdrawiam serdecznie,
Filip.

0

Jakie zwracanie wielu wartości?

Można to zrobić na pierdyliard różnych sposobów, ale w praktyce się po prostu definiuje strukturę na te wartości.

struct StringWithLength
{
	const char* str;
	const size_t len;
};

StringWithLength getStringWithLength(const char* str)
{
	return {str, strlen(str)};
}

tuple<const char*, size_t> getStringWithLengthT(const char* str)
{
	return make_tuple(str, strlen(str));
}

void getStringWithLengthP(const char* str, const char** outputstr, size_t* len)
{
	*outputstr = str;
	*len = strlen(str);
}

void getStringWithLengthR(const char* str, const char*& outputstr, size_t& len)
{
	outputstr = str;
	len = strlen(str);
}
0

nikt w pracy nie zwraca kilku wartosciach poprzez wskazniki. Robi sie to poprzez klase/strukture. na zasadzie

class Foo {
public:
  int x;
  int y;
}; 

Foo* func(){
  Foo *foo = new Foo();
  foo->x = 5;
  foo->y = 10;
  return foo;
}

int main(){
  Foo *anotherFoo = func();
  cout << anotherFoo->x << " " << anotherFoo->y;
  delete anotherFoo;
}

pisane z palca wiec moze nie dzialac. Chodzi o sama idee (kod nie jest najwyzszej jakosci, ale jest prosty do zrozumienia)

0

Jeżeli zwracasz kilka wartości tego samego typu, wtedy zwracasz tablicę

std::vector<int> foo(){
    return {1,2,3}
}

Jeżeli są różnego typu to strukturę

struct abc{
    int id;
    std::string value;
};

abc foo() {
    return {1, "Hello World"};
}

To tak generalnie, ciężko powiedzieć coś więcej nie znając dokładnego przypadku.

Edit.
Czemu ja zawsze tak wolno piszę posty :/

0

dzięki za pomoc. może podam przykład. wczytuję w funkcji dane z pliku do tablicy dynamicznej i określam ich liczbę, po czym chciałbym przekazać te dane (tzn. wartości kolejnych elementów tablicy i ich liczbę) do funkcji, która je jakoś zmodyfikuje, nie wiem, obliczy średnią wartość. problem w tym, że nie wiem, jak przekazać te wartości.

 
int *wczytanie()
{
	int tmp1 = 0;
	int *tab1 = new int[tmp1];


	ifstream plik1;
	plik1.open("liczby1.txt");
	while(!plik1.eof())
	{
		plik1 >> tab1[tmp1++];
	}
		
		plik1.close();
	
	
	return(tab1);
}

proszę, nie gańcie, jeśli kod jest nieprzyzwoity, to ostatnia wersja, nad którą się bawię. niewiele umiem.

pozdrawiam.

1

Po pierwsze, trzeba pamiętać o zwolnieniu pamięci, a pisząc kod w ten sposób (zwracanie nowozaalokowanej pamięci) łatwo o delete zapomnieć.
Po drugie, alokujesz tablicę zera intów. Zwiększenie zmiennej tmp1 w żaden sposób nie powiększa tablicy.

Po trzecie, w miejscu użycia funkcji wczytanie() nie będziesz miał żadnej informacji, ile intów wczytano z pliku.

0

rozumiem.czy w takim razie mógłbyś podpowiedzieć, co i jak mam poprawić?
zmieniłem

plik1 >> tab1[tmp1++];

na

		plik1 >> tab1[tmp1];
		tmp1++; 

i zwraca mi wartości tej tablicy.

0

ze co ;o?

0

sorry, pisałem o jednym, myślałem o drugim. po prostu przy wywołaniu i dodatniu do pętli cout wyświetla mi zawartość tablicy.

1

no fajnie ale w czym problem? Zanim wyslesz wiadomosc, pokaz komus czy zrozumie o co chodzi od poczatku do konca a nie wyrywkowo wysylasz dwie linijki kodu i mowisz "zwraca tablice" a pozniej "dodalem cout i wyswietla" no super ale ??? w czym problem?

0

w tym problem.

Filippo9669 napisał(a):

dzięki za pomoc. może podam przykład. wczytuję w funkcji dane z pliku do tablicy dynamicznej i określam ich liczbę, po czym chciałbym przekazać te dane (tzn. wartości kolejnych elementów tablicy i ich liczbę) do funkcji, która je jakoś zmodyfikuje, nie wiem, obliczy średnią wartość. problem w tym, że nie wiem, jak przekazać te wartości.

 
int *wczytanie()
{
	int tmp1 = 0;
	int *tab1 = new int[tmp1];


	ifstream plik1;
	plik1.open("liczby1.txt");
	while(!plik1.eof())
	{
		plik1 >> tab1[tmp1++];
	}
		
		plik1.close();
	
	
	return(tab1);
}

proszę, nie gańcie, jeśli kod jest nieprzyzwoity, to ostatnia wersja, nad którą się bawię. niewiele umiem.

pozdrawiam.

0

przeciez dostales odpowiedz i nawet napisales ze ROZUMIESZ... jak widac nie do konca

@Azarien

Po drugie, alokujesz tablicę zera intów. Zwiększenie zmiennej tmp1 w żaden sposób nie powiększa tablicy.

Po trzecie, w miejscu użycia funkcji wczytanie() nie będziesz miał żadnej informacji, ile intów wczytano z pliku.

wiec jak nie rozumiesz to nie pisz ze rozumiesz ;o

0

nie rozumiem, dlaczego tablicę zera intów.

1

robisz dokladnie to. Wiec jaka liczbe ma tmp1?

int tmp1 = 0;
    int *tab1 = new int[tmp1]; 
0

ok, prawda, masz rację, pozbyłem się tego.

0

okej, jeszcze raz. mam taki oto kod:

int *wczytanie1()
{
	int tmp1;
	int *tab1 = new int[tmp1];
	int a;

	ifstream plik1;
	plik1.open("liczby1.txt");
	while(!plik1.eof())
	{
		plik1 >> tab1[tmp1];
		cout << tab1[tmp1] << endl;
		tmp1++;
	}
		
		plik1.close();
		
	a = sizeof(tab1);
	
	delete [] tab1;
	
	return(tab1);
}

	int najwiekszy()
	{
		int najw; /*zmienna do przechowywania najwiekszego elementu*/
		for(int i = 0; i < /*liczba wczytanych elementow w poprzedniej funkcji*/; i++)
		{
		if(/*kolejny element tablicy z poprzedniej funkcji*/ > najw) /*ten element*/ = najw;
		else najw;
                }

                return najw;

	}

funkcja wczytująca dane z pliku do tablicy dynamicznej i przekazująca tę tablicę do drugiej funkcji, która np. będzie wyszukiwać i zwracać jej największy element. trudność, jaką mam, to przekazanie tej tablicy z funkcji wczytanie do funkcji najwiekszy.

2
int tmp1;
int *tab1 = new int[tmp1];

Ile elementów Twoim zdaniem ma tab1?

delete [] tab1;
return(tab1);

Najpierw usuwasz tę "tablicę", a potem ją przekazujesz dalej. Gdzie logika, gdzie sens?

przekazanie tej tablicy z funkcji wczytanie do funkcji najwiekszy

int main()
{
    int* tab = wczytanie();
    int mymax = najwiekszy(tab);
    // pamiętaj o usuwaniu tab, ale tylko raz
}
0

dzięki! czy ten kod jest ok?

int *wczytanie1()
{
	int tmp1;
	int *tab1 = new int[tmp1];
	int i = 0;

	ifstream plik1;
	plik1.open("liczby1.txt");

    
    
	while(!plik1.eof())
	{
		plik1 >> tab1[i];
		cout << tab1[i] << endl;
		i++;
	}
	tmp1 = i;
		
		plik1.close();
	
	
	return(tab1);
}


int najwiekszy(int tab[])
{
    int najw; /*zmienna do przechowywania najwiekszego elementu*/
    najw = tab[0];
    for( int i = 0; i <= sizeof(tab); i++ )
    {
        if(tab[i] > najw ) najw = tab[i];
        else najw;    
    }
    
    
    return najw;
}

int main()
{
	int	*tab1 = wczytanie1();
	int mymax = najwiekszy(tab1);
	
	cout << endl << endl << "najwieksza liczba to: " << mymax << endl << endl;
	system("pause");
	return 0;
} 
0
int tmp1;
int *tab1 = new int[tmp1];

Jaka będzie wielkość utworzonej tablicy tab1?

sizeof(tab)

To nie działa tak jak myślisz.

else najw;

Co to ma Twoim zdaniem robić?

0

tutaj mam problem, bo chciałbym, aby jej rozmiar był zdefiniowany przez liczbę elementów znajdujących się w moim pliku.

0

Wykorzystaj zatem std::vector, a nie zgaduj.

0
int tmp1;
int *tab1 = new int[tmp1];

Jaka będzie wielkość utworzonej tablicy tab1?

tak, tu mam problem, wiem. nie mam pojęcia, jak policzyć liczbę elementów w moim pliku i potem utworzyć tablicę dynamiczną o takiej wielkości.

sizeof(tab)

To nie działa tak jak myślisz.

tak, wiem, pozbyłem się tego.

else najw;

Co to ma Twoim zdaniem robić?

jeśli wartość tablicy jest mniejsza od wcześniejszej (bądź zdefiniowanej na początku dla tab[0]), wtedy nie zmienia się wartość zmiennej przechowującej największy element.

0

tak, tu mam problem, wiem. nie mam pojęcia, jak policzyć liczbę elementów w moim pliku i potem utworzyć tablicę dynamiczną o takiej wielkości.

Nie musisz nic liczyć - wykorzystaj std::vector.

jeśli wartość tablicy jest mniejsza od wcześniejszej (bądź zdefiniowanej na początku dla tab[0]), wtedy nie zmienia się wartość zmiennej przechowującej największy element.

Nie, pytam specyficznie co instrukcja najw; ma Twoim zdaniem robić i po co tam to else tak właściwie.

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