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

szablon funkcji i specjalizacja zwracająca zamiast typu T - adres.

Object Storage Arubacloud
+1 głos
250 wizyt
pytanie zadane 23 grudnia 2016 w C i C++ przez Korybut Użytkownik (520 p.)
edycja 23 grudnia 2016 przez Korybut

Jak w temacie. Mam zadanko które musi być zrobione konkretnie tak jak przedstawiam. Jest sobie funkcja z class T, przyjmująca tablice int i double a zwracająca najwyższą wartość z tychże tablic. Oraz specjalizacja tej tablicy przyjmująca tablicę wartości typu char zwracająca adres najdłuższego łańcucha znaków.

Popełniłem oto taki kod... i utknąłem w punkcie gdzie wyświetla mi tablicę char ale adresy komórek oraz zwraca jak poprzednie wartość zamiast adresu. Prosiłbym o jakąś podpowiedź gdzie robię błąd.

#include <iostream>

using namespace std;

template <class T>
T maxn(T *ar, int size);
template <> char maxn<char>(char *ar, int size);

int main(){
	double dbar[4] = {5.2, 3.1, 3.5, 0.1};
	int inar[5] = {2,5,1,7,4};
	char *arch[5][5]={"aaa","bbbb","cccc","d","eee"};
	
	cout << "Tablica double: ";
	for(int i=0; i<4; i++)
		cout << dbar[i] << " ";
	cout << endl << "Jej najwyzsza wartosc to - " << maxn(dbar, 4);
	cout << "\n\nTablica int: ";
	for(int i=0; i<5; i++)
		cout << inar[i] << " ";
	cout << endl << "Jej najwyzsza wartosc to - " << maxn(inar, 5);
	cout << "\n\nTablica char: ";	
	for(int i=0; i<5; i++)
		cout << arch[i] << " ";
	cout << endl << "Jej najwyzsza wartosc to - " << maxn(*arch, 5);
	return 0;
}

template <class T>
T maxn( T *ar, int size){
	T *temp=new T;
	*temp=ar[0];
	for(int i=1; i<size; i++)
		*temp = (*temp > ar[i]) ? *temp : ar[i];
	return *temp;
}

 

komentarz 23 grudnia 2016 przez JAKUBW Nałogowiec (33,470 p.)
Tworzysz dynamicznie nowy obiekt i go nie usuwasz?

T *temp=new T;
komentarz 23 grudnia 2016 przez Korybut Użytkownik (520 p.)
ups :) musiałem przez przypadek usunąć modyfikując kod, ale i tak nie ma to wpływu na sposób działania programu.

1 odpowiedź

+1 głos
odpowiedź 23 grudnia 2016 przez plkpiotr Stary wyjadacz (12,420 p.)
wybrane 26 grudnia 2016 przez Korybut
 
Najlepsza

Wystarczy, że pozbędziesz się dodatkowego wymiaru tablicy.
Najprawdopodobniej chciałeś utworzyć tablicę pięciu łańcuchów znakowych o pięciu elementach, jednak w istocie stworzyłeś pięcioelementową tablicę tablic o pięciu elementach każda (25 szufladek).

Gwiazdka mówi już nam, że będzie to łańcuch znakowy, wobec tego zadeklarujmy i zainicjalizujmy pięć łańcuchów znakowych:

const char* arch[5]={"aaa","bbbb","cccc","d","eee"};
komentarz 23 grudnia 2016 przez Korybut Użytkownik (520 p.)

niestety, ale bawiąc się dalej zmieniłem ten błąd a wynik wciąż niezadowalający. W każdym przypadku zwraca adres, gdzie w int i double powinien wartość.

 

#include <iostream>

using namespace std;

template <class T>
T *maxn(const T ar, int size);
template <> char *maxn<char>(char ar, int size);

const double dbar[4] = {5.2, 3.1, 3.5, 0.1};
const int inar[5] = {2,5,1,7,4};
const char *arch[5]={"aaa","bbbb","cccc","d","eee"};

int main(){
	
	cout << "Tablica double: ";
	for(int i=0; i<4; i++)
		cout << dbar[i] << " ";
	cout << endl << "Jej najwyzsza wartosc to - " << maxn(dbar, 4);
	cout << "\n\nTablica int: ";
	for(int i=0; i<5; i++)
		cout << inar[i] << " ";
	cout << endl << "Jej najwyzsza wartosc to - " << maxn(inar, 5);
	cout << "\n\nTablica char: ";	
	for(int i=0; i<5; i++)
		cout << arch[i] << " ";
	cout << endl << "Jej najwyzsza wartosc to - " << maxn(*arch, 5);
	return 0;
}

template <class T>
T *maxn(const T ar, int size){
	T *temp=new T;
	*temp=&ar[0];
	for(int i=1; i<size; i++)
		*temp = (*temp > &ar[i]) ? *temp : &ar[i];
	return temp;
}

 

komentarz 23 grudnia 2016 przez plkpiotr Stary wyjadacz (12,420 p.)

Ach, zapomniałem dopisać... Zlikwiduj jeszcze gwiazdkę w 26 linijce - zadziała ;)

cout << endl << "Jej najwyzsza wartosc to - " << maxn(arch, 5);

Otrzymuję na wyjściu:

Tablica double: 5.2 3.1 3.5 0.1
Jej najwyzsza wartosc to - 5.2

Tablica int: 2 5 1 7 4
Jej najwyzsza wartosc to - 7

Tablica char: aaa bbbb cccc d eee
Jej najwyzsza wartosc to - eee

Dla kodu:


#include <iostream>

using namespace std;

template <class T>
T maxn(T *ar, int size);
template <> char maxn<char>(char *ar, int size);

int main(){
    double dbar[4] = {5.2, 3.1, 3.5, 0.1};
    int inar[5] = {2,5,1,7,4};
    const char *arch[5]={"aaa","bbbb","cccc","d","eee"};

    cout << "Tablica double: ";
    for(int i=0; i<4; i++)
        cout << dbar[i] << " ";
    cout << endl << "Jej najwyzsza wartosc to - " << maxn(dbar, 4);
    cout << "\n\nTablica int: ";
    for(int i=0; i<5; i++)
        cout << inar[i] << " ";
    cout << endl << "Jej najwyzsza wartosc to - " << maxn(inar, 5);
    cout << "\n\nTablica char: ";
    for(int i=0; i<5; i++)
        cout << arch[i] << " ";
    cout << endl << "Jej najwyzsza wartosc to - " << maxn(arch, 5);
    return 0;
}

template <class T>
T maxn( T *ar, int size){
    T *temp=new T;
    *temp=ar[0];
    for(int i=1; i<size; i++)
        *temp = (*temp > ar[i]) ? *temp : ar[i];
    return *temp;
}
1
komentarz 25 grudnia 2016 przez Korybut Użytkownik (520 p.)

mam taki sam rezultat.. a ten jest błędny ponieważ przy char powinno zwrócić nie wartość o najwyższym adresie (jak jest w tym przypadku) ale adres najwyższej wartości.

komentarz 26 grudnia 2016 przez plkpiotr Stary wyjadacz (12,420 p.)

Przepraszam, nie doczytałem ; )
Wobec tego napiszmy funkcję tak aby zwracała adres (naturalne wywołanie dla char*), natomiast tam gdzie będzie to potrzebne wyłuskamy z niego wartość (wywołanie dla double oraz int). Dla następującego kodu po drobnych modyfikacjach Twojego:

#include <iostream>

using namespace std;

template <class T>
T* maxn(T *ar, int size);
template <> char* maxn<char>(char *ar, int size);

int main() {
    double dbar[4] = {5.2, 3.1, 3.5, 0.1};
    int inar[5] = {2, 5, 1, 7, 4};
    char* arch[5] = {"aaa", "bbbb", "cccc", "d", "eee"};

    cout << "Tablica double: ";
    for (int i = 0; i < 4; i++)
        cout << dbar[i] << " ";
    cout << endl << "Jej najwyzsza wartosc to - " << *maxn(dbar, 4);
    cout << "\n\nTablica int: ";
    for (int i = 0; i < 5; i++)
        cout << inar[i] << " ";
    cout << endl << "Jej najwyzsza wartosc to - " << *maxn(inar, 5);
    cout << "\n\nTablica char: ";
    for (int i = 0; i < 5; i++)
        cout << arch[i] << " ";
    cout << endl << "Jej najwyzsza wartosc to - " << maxn(arch, 5);
    return 0;
}

template <class T>
T* maxn( T *ar, int size) {
    T *temp = new T;
    *temp = ar[0];
    for (int i = 1; i < size; i++)
        *temp = (*temp > ar[i]) ? *temp : ar[i];
    return temp;
}

Otrzymujemy:

Tablica double: 5.2 3.1 3.5 0.1
Jej najwyzsza wartosc to - 5.2

Tablica int: 2 5 1 7 4
Jej najwyzsza wartosc to - 7

Tablica char: aaa bbbb cccc d eee
Jej najwyzsza wartosc to - 0x5811f8

Podobne pytania

0 głosów
1 odpowiedź 182 wizyt
pytanie zadane 27 października 2016 w C i C++ przez sofnir Gaduła (4,690 p.)
+1 głos
2 odpowiedzi 247 wizyt
pytanie zadane 7 stycznia 2016 w C# przez Mateusz Tocha Bywalec (2,560 p.)
0 głosów
1 odpowiedź 897 wizyt

92,583 zapytań

141,434 odpowiedzi

319,669 komentarzy

61,966 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!

...