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

question-closed Problem z typem char, szablon klasy

Object Storage Arubacloud
0 głosów
491 wizyt
pytanie zadane 15 listopada 2015 w C i C++ przez Baakoma Użytkownik (780 p.)
zamknięte 15 listopada 2015 przez Baakoma

Witam, problem polega na tym, że, gdy wykorzystuje szablon klasy wektor jako typ char, program...nie działa jak należy, adresy zmiennych nie wyświetlają się i tego typu problemy. W sytuacji, gdy typem będzie int, float, double, bool, long, cokolwiek, program działa normalnie i adresy też się wyświetlają. Przy wykorzystaniu string program skacze o 4, myślę, że tutaj też coś jest nie tak. Tutaj kod:

#ifndef wektor_hpp
#define wektor_hpp

#include <iostream>

namespace amadi
{

template <class T>
class wektor
{
    T * tab;
    T * tabIterator;
    T * tabEnd;
    int tabSize;
public:
    wektor()
    {
        tabSize = 5;
        tab = new T [tabSize];
        std::cout << tab << std::endl;
        tabIterator = tab;
        tabEnd = tab+tabSize-1;
    }
    ~wektor()
    {
        delete [] tab;
        tab = NULL;
    }
    void wypisz()
    {
        for (int i = 0; i < tabSize; i++)
        {
            std::cin >> tab[i];
            std::cout << tab[i] << std::endl;
            std::cout << tab+i << std::endl;
        }
        std::cout << "tab: " << tab << std::endl;
        std::cout << "tabiterator: " << tabIterator << std::endl;
        std::cout << "tabEnd: " << tabEnd << std::endl;
        std::cout << "tabSize: " << tabSize << std::endl;
    }
};
}
#endif // wektor

A tutaj kod klasy main:

#include <iostream>
#include "wektor.hpp"

using namespace std;
using amadi::wektor;
int main()
{
    wektor <char> ziemniak;
    ziemniak.wypisz();
    return 0;
}

 

komentarz zamknięcia: Rozwiązane :)

1 odpowiedź

+1 głos
odpowiedź 15 listopada 2015 przez Radfler VIP (101,030 p.)
edycja 16 maja 2016 przez Radfler
 
Najlepsza

Char jest typem znakowym. Z tego powodu adres zmiennej typu char wypisywany z użyciem std::cout pojawi się jako seria ciąg znaków. Wywołując operator<< dla zmiennej typu char* strumień wypisuje string zakończony znakiem null. Tu jednak jest to adres do pojedynczego znaku, który nie jest stringiem, więc mamy zwyczajne UB.

#include <iostream>

int main() {
  char dummy;
  std::cout << &dummy << '\n'; // undefined behaviour
}

Jeżeli chcesz zobaczyć adres zmiennej, to użyj rzutowania na typ void*:

#include <iostream>

int main() {
  char dummy;
  std::cout << static_cast<void*>(&dummy) << '\n';
}

Podobne pytania

0 głosów
1 odpowiedź 387 wizyt
pytanie zadane 3 czerwca 2016 w C i C++ przez Ehlert Ekspert (212,790 p.)
0 głosów
1 odpowiedź 405 wizyt
0 głosów
1 odpowiedź 277 wizyt
pytanie zadane 9 listopada 2018 w C i C++ przez Daaa22 Dyskutant (8,250 p.)

92,622 zapytań

141,477 odpowiedzi

319,818 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!

...