• 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.

+1 głos
466 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ź 311 wizyt
pytanie zadane 27 października 2016 w C i C++ przez sofnir Gaduła (4,690 p.)
+1 głos
2 odpowiedzi 401 wizyt
pytanie zadane 7 stycznia 2016 w C# przez Mateusz Tocha Bywalec (2,560 p.)
0 głosów
1 odpowiedź 1,626 wizyt

93,695 zapytań

142,612 odpowiedzi

323,223 komentarzy

63,225 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...