zwracanie przez funkcję kilku wartości

Odpowiedz Nowy wątek
2015-11-17 13:29

Rejestracja: 4 lata temu

Ostatnio: 4 lata temu

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.

Pozostało 580 znaków

nz
2015-11-17 13:36
nz

Rejestracja: 4 lata temu

Ostatnio: 3 lata temu

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);
}

Pozostało 580 znaków

2015-11-17 13:36

Rejestracja: 8 lat temu

Ostatnio: 2 dni temu

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)

edytowany 2x, ostatnio: fasadin, 2015-11-17 13:38
Pokaż pozostałe 14 komentarzy
GCC 4.4 też to kompiluje -> https://goo.gl/Lgj0V5 Nie cofnę się w czasie, ani nie zaciągne wszystkich wersji gcc. Po prostu ten ficzer wszedł wcześniej. To nie jest tak, że nagle w 2011 kompilatory dostały wszystko... - nz 2015-11-17 14:19
dostały std::initializer_list i o to chodzi - gośćabc 2015-11-17 14:22
Żeby było weselej, w C to się nawet kompiluje z -std=c89. - nz 2015-11-17 14:23
bez C++11: Foo func() { Foo foo = {5,10}; return foo; } - Azarien 2015-11-17 15:50
@nz ten kod nie jest poprawny względem c++98/03 i starszych, bo initializer list (dla nie-agregatów) weszły dopiero w C++0x. Dowód: https://goo.gl/ZY6ISu Initializer list to co innego niż std::initializer_list - w tym miejscu odsyłam do standardu: 8.5.4 z szczególnym uwzględnieniem 8.5.4[2] oraz tego drafta: http://www.open-std.org/jtc1/[...]21/docs/papers/2005/n1890.pdf (na 5 stronie macie nawet podobny przykład do tego z waszego kodu). - satirev 2015-11-20 00:57

Pozostało 580 znaków

2015-11-17 13:40

Rejestracja: 7 lat temu

Ostatnio: 2 lata temu

Lokalizacja: Wrocław

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 :/

edytowany 1x, ostatnio: Zellus, 2015-11-17 13:41

Pozostało 580 znaków

2015-11-19 23:56

Rejestracja: 4 lata temu

Ostatnio: 4 lata temu

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.

Pozostało 580 znaków

2015-11-20 01:30

Rejestracja: 16 lat temu

Ostatnio: 3 godziny temu

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.

Pozostało 580 znaków

2015-11-20 08:42

Rejestracja: 4 lata temu

Ostatnio: 4 lata temu

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.

edytowany 2x, ostatnio: Filippo9669, 2015-11-20 08:51

Pozostało 580 znaków

2015-11-20 09:18

Rejestracja: 8 lat temu

Ostatnio: 2 dni temu

0

ze co ;o?

Pozostało 580 znaków

Wybitny Lew
2015-11-20 09:21
Wybitny Lew
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.

Pozostało 580 znaków

2015-11-20 09:23

Rejestracja: 8 lat temu

Ostatnio: 2 dni temu

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?

edytowany 1x, ostatnio: fasadin, 2015-11-20 09:23

Pozostało 580 znaków

2015-11-20 09:26

Rejestracja: 4 lata temu

Ostatnio: 4 lata temu

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.

Pozostało 580 znaków

Odpowiedz

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