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

Szablon funkcji - czemu nie działa dla int?

VPS Starter Arubacloud
0 głosów
188 wizyt
pytanie zadane 11 lutego 2016 w C i C++ przez k222 Nałogowiec (30,150 p.)

Napisałem taki szablon funkcji:

#include <iostream>

using namespace std;

template <typename T>
T max(T t[5])
{
    T a = t[0];
    if(t[1] > a)
        a= t[1];
    if(t[2] > a)
        a= t[2];
    if(t[3] > a)
        a = t[3];
    if(t[4] > a)
        a= t[4];
    if(t[5] > a)
        a= t[5];
    return a;
}

int main()
{
    short tabshort[5] = {17 , 3 , 15 , 22 , 7}, t1;
    double tabdouble[5] = {2.512 , 24.75 , 23.977 , 15.734 , 21.0653},t2;
    float tabfloat[5] = {2.5 , 2.7 , 2.9 , 15.7 , 2.0},t3;
    int tabint[5] = {1 , 2 , 3 , 4 , 5}, t4;

    t1 = max(tabshort);
    cout<<t1<<endl;

    t2 = max(tabdouble);
    cout<<t2<<endl;

    t3 = max(tabfloat);
    cout<<t3<<endl;

    t4 = max(tabint);
    cout<<t4<<endl;

    return 0;
}

i właśnie nie mogę zrozumieć dlaczego dzieje się tak, że działa to dobrze dla double, float oraz short a nie działa dla int, long i long long - dla nich wypisuje jakieś długie liczby nie związane z tablicami. Zamieniałem typy - tam gdzie short dawałem int, tam gdzie int short i zawsze tak samo - dla short (dla tej samej tablicy, nic nie zmieniane oprócz typu) pokazywało prawidłowo, dla float i double też, a dla int i long już nie. Może mi to ktoś wytłumaczyć?

2 odpowiedzi

+1 głos
odpowiedź 11 lutego 2016 przez obl Maniak (51,280 p.)
wybrane 12 lutego 2016 przez k222
 
Najlepsza
    if(t[5] > a)
        a= t[5];

masz tablicę 5-cio elementową a indeksowanie zaczyna się od 0 więc ostatni element tablicy to t[4] i teraz przekroczyłeś blok pamięci i odwołałeś się do obszaru pamięci, w której akurat była zapisana jakaś śmieciowa informacja.

Można tą funkcję też napisać tak:

template <typename T>
T max(T t[5])
{
    T a = t[0];
    for(T * i = t + 1; i < (t + 5); i++)
    	if(*i > a)
			a = *i;
    return a;
}

 

komentarz 12 lutego 2016 przez k222 Nałogowiec (30,150 p.)
Dzięki, rzeczywiście głupi błąd - jestem tylko ciekawy czemu działało dla double, float i short
komentarz 16 lutego 2016 przez obl Maniak (51,280 p.)

Bo dla tych zmiennych akurat natrafiłeś na pamięć, w której nic nie było zapisane, albo wartość tam zapisana była mniejsza od tych, które miałeś zapisane w poprzednich komórkach tablicy.

Pamiętaj indeksowanie od 0 się zaczyna, bo to dość ważne jest:)

+2 głosów
odpowiedź 11 lutego 2016 przez Radfler VIP (101,030 p.)
Linijki 17 i 18. Tablica jest 5cio elementowa => indeks 5 jest nieprawidłowy.

Podobne pytania

0 głosów
2 odpowiedzi 110 wizyt
pytanie zadane 22 marca 2016 w C i C++ przez Turqus Obywatel (1,420 p.)
0 głosów
1 odpowiedź 283 wizyt
pytanie zadane 20 lutego 2016 w C i C++ przez Ziuziek Mądrala (5,140 p.)
0 głosów
1 odpowiedź 510 wizyt
pytanie zadane 12 lutego 2016 w C i C++ przez konrad99 Gaduła (4,090 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...