• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z przekazywaniem tablicy do funkcji

Object Storage Arubacloud
+1 głos
196 wizyt
pytanie zadane 21 października 2016 w C i C++ przez thekibi27 Bywalec (2,110 p.)

Witam!

Program ma spytać użytkownika ile liczb chce porównać, a następnie wpisać do tablicy podane liczby, po czym przez funkcje wyznaczy największą z nich. 

 

#include <iostream>

using namespace std;

float najwieksza_liczba(float *liczby[], int n)
{
    float N=*liczby[0];
    for (int x=1;x<=n;x++)
    {
        if (N<*liczby[x]) N=*liczby[x];
        return N;
    }
}

int main()
{
    int n; //ile liczb w tablicy
    cout <<"Ile liczb chcesz porownac?"<<endl;
    cin>>n; cout<<endl;

    float liczby[n];
    for (int x=0;n>x;x++)
    {cout << "Podaj liczbe: "; cin>>liczby[x]; cout<<endl;}

    int N=najwieksza_liczba(liczby[n], n);
    cout<<endl<<"Największa liczba to: "<<n;
    return 0;
}

 

Jestem świeżo po zapoznaniu się ze wskaźnikami, więc podejrzewam, że źle się nimi posłużyłem. Błąd kompilacji pojawia się w 25 linijce (cannot convert 'float' to 'float**' for argument '1' to 'float najwieksza_liczba(float**, int).

3 odpowiedzi

+1 głos
odpowiedź 21 października 2016 przez plkpiotr Stary wyjadacz (12,420 p.)
edycja 21 października 2016 przez plkpiotr
 
Najlepsza

Takie rozwiązanie powinno Cię usatysfakcjonować, starałem się dużo nie zmieniać:

#include <iostream>
using namespace std;

float najwieksza_liczba(float liczby[], int n) {
    float N = liczby[0];
    for (int x = 1; x < n; x++) {
        if (N < liczby[x])
            N = liczby[x];
    }
    return N;
}

int main() {
    int n;
    cout << "Ile liczb chcesz porownac?" << endl;
    cin >> n;

    float liczby[n];
    for (int x = 0; n > x; x++) {
        cout << "Podaj liczbe: ";
        cin >> liczby[x];
    }

    int N = najwieksza_liczba(liczby, n);
    cout << endl << "Największa liczba to: " << N;
    return 0;
}

Rzuć okiem na poprawiony kod:

  • Wyrzuciłem kluczowe słowo return poza pętlę - u Ciebie ta instrukcja zwracająca znajdowała się w instrukcji warunkowej oraz co za tym idzie w pętli, którą mogłeś przerwać gdy warunek był spełniony już po pierwszym przelocie lub którymś z następnych, nie sprawdzając pozostałych liczb,
  • W linijce 25 wyświetlałeś wielkość tablicy, a nie największą liczbę, która miała zostać zwrócona
  • W Twoim kodzie niepoprawnie została przekazywana tablica do funkcji, tutaj możesz poczytać sobie jak można to robić w C++ Przekazywanie tablic jednowymiarowych do funkcji
  • Czwartą linijkę możesz również zastąpić zapisem, co będzie bliższe językowi C:
    float najwieksza_liczba(float *liczby, int n) {
    
  • Nazwę tablicy bez indeksu możesz traktować jako wskaźnik na pierwszy jej indeks, stąd nie trzeba używać gwiazdki. Chodzi mi o coś takiego:
    tab == &tab[0]
    W tym programiku po prostu nie trzeba zmuszać się do używania gwiazdek, tak jak mogłoby się to wydawać we wskaźnikach...

Powodzenia w dalszej pracy i cierpliwości przy poznawaniu wskaźników ; ) 

1
komentarz 21 października 2016 przez thekibi27 Bywalec (2,110 p.)
Wielkie dzięki za pochyleniem się nad kodem oraz za tak wyczerpującą i merytoryczną odpowiedź ;)
komentarz 21 października 2016 przez plkpiotr Stary wyjadacz (12,420 p.)
edycja 21 października 2016 przez plkpiotr

Nie ma sprawy. „Zedytowałem” jeszcze odpowiedź by wycisnąć z tego kodu jak najwięcej ; )
Cieszę się, że mogłem pomóc :) Sam pamiętam jakim nużącym zajęciem było zrozumienie wskaźników i najlepszym sposobem do ich ogarnięcia jest to, aby ktoś pochylił się nad czyimś kodem, poprawił go i po prostu spokojnie wytłumaczył co nie gra...

+2 głosów
odpowiedź 21 października 2016 przez Ditrix Mądrala (5,650 p.)
Po 1. W definicji funkcji argument tablicy możesz podać na 2 sposoby poprzez [], lub *. Oba wskazują na adres pierwszego elementu przesłanej tablicy.

Po 2 W wywołaniu funkcji przesyłasz tylko adres początkowy tablicy czyli w Twoim wypadku

najwieksza_liczba(liczby, n);

Po 3 Nie ma czegoś takiego jak *liczby[2]. Nawet jeśli w prototypie użyłeś *, to nadal odwołując się do elementów tablicy piszesz liczby[i];.
0 głosów
odpowiedź 21 października 2016 przez Avernis Nałogowiec (27,400 p.)
Przesyłasz tablicę 2 wymiarową. Zmieeń argument na float liczby[] lub float *liczby. Poza tym rzesyłasz tylko 1 element. Przesyłaną tablicę z liczby[n] na samo liczby
komentarz 21 października 2016 przez thekibi27 Bywalec (2,110 p.)
przywrócone 21 października 2016 przez thekibi27

Zmieniłem na liczby[], ale teraz nadal pokazuje błąd kompilacji przy linijce

najwieksza_liczba(liczby[n], n);

tym razem cannot convert float to *float

komentarz 22 października 2016 przez Avernis Nałogowiec (27,400 p.)
Napisałem że przesyłasz element tablicy, zamień z liczby[n] na liczby

Podobne pytania

0 głosów
1 odpowiedź 456 wizyt
0 głosów
1 odpowiedź 118 wizyt
0 głosów
1 odpowiedź 287 wizyt
pytanie zadane 18 listopada 2018 w C i C++ przez PelikanFix16 Użytkownik (950 p.)

92,621 zapytań

141,477 odpowiedzi

319,817 komentarzy

62,005 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...