Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » c++ neuling

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
09.07.2020, 13:32 Uhr
flydia



Hallo liebe Menschen,
Ich lerne gerade C++ im Rahmen eines Uni Kurses. Mir ist alles noch relativ neu, dieser Code kommt aus einer übungsaufgabe und soll Hexadezimalzahlen ind Dezimalzahlen umwandeln und andersherum. Selbst gecodet habe ich nur die beiden Funktionen, der Rest war schon vorgegeben und soll die Funktionen testen.
Mein Problem ist, dass das Programm kompiliert, bei Ausführung aber das hier ausgibt:
terminate called after throwing an instance of 'std::out_of_range'
what(): vector::_M_range_check: __n (which is 0) >= this->size() (which is 0)

wenn ich richtig recherchiert habe weist std::out_of_range auf einen logischen Fehler hin
(https://en.cppreference.com/w/cpp/error/out_of_range)

Ich hab das erste mal Vektoren verwendet, ist da evtl. etwas falsch?

Und dann ist mir Allgemein nicht ganz klar wann ich Referenzen übergebe, wann ich einen Pointer brauche usw. zum Bespiel habe ich zuerst
copy_dezz = &dezimalzahl;
im code stehen gehabt, das wollte der compiler aber nicht akzeptieren. Warum verwende ich jetzt nicht mehr die referenz?
Besten Gruß und schonmal vielen lieben Dank!


C++:
#include <iostream>
#include <sstream>
#include <cmath>
#include <vector>

using namespace std;

vector<char> dezimalZuHexadezimal(unsigned int &dezimalzahl){
    // Hier ihr Code ...
    vector<char> hexvec;
    // Kopie dezimalzahl
    unsigned int copy_dezz = dezimalzahl;
    unsigned int Rest;
    int z =0;
    do {
        copy_dezz/=16;
        Rest = copy_dezz%16;
        hexvec.at(z) = Rest;
        z++;
    }while (dezimalzahl / 16 != 0);
    return hexvec;
}

unsigned int hexadezimalZuDezimal(vector<char> &hexadezimalzahl){
    // Hier ihr Code ...
    unsigned int dezimalzahl2;
    for (unsigned int i = 0; i<hexadezimalzahl.size();i++){
        dezimalzahl2 += (pow(16,i))*hexadezimalzahl.at(i);
    }
    return dezimalzahl2;
}

string printHexadezimalZahl(vector<char> &hexadezimalzahl){
    stringstream s;
    for(int i = hexadezimalzahl.size()-1; i >= 0 ; i--){
        s << hexadezimalzahl.at(i);
    }
    return s.str();
}

int main(void){

    unsigned int dez_A = 500; // Hexadezimal: 1F4
    unsigned int dez_B = 439; // Hexadezimal: 1B7
    
    // Achtung: die Dualzahl wird hier "verkehrt herum" initialisiert!
    // Die niederwertigste Ziffer steht vorne im Vektor (Index 0)
    vector<char> hexadezimal_C = {'4','2','5','C','9'}; // Dezimal: 640292
    vector<char> hexadezimal_D = {'A','4'}; // Dezimal: 74
    
    // Konvertiere dezimal zu hexadezimal
    vector<char> hexadezimal_A = dezimalZuHexadezimal(dez_A);
    vector<char> hexadezimal_B = dezimalZuHexadezimal(dez_B);
    
    // Konvertiere hexadezimal zu dezimal
    unsigned int dez_C = hexadezimalZuDezimal(hexadezimal_C);
    unsigned int dez_D = hexadezimalZuDezimal(hexadezimal_D);
    
    // Ergebnisse ausgeben
    cout << "--------------------------------------" << endl;
    cout << "|        |     Dezimal | Hexadezimal |" << endl;
    cout << "--------------------------------------" << endl;
    
    cout.fill(' ');

    cout << "| Zahl A |";
    cout.width(12);
    cout << dez_A << " | ";
    cout.width(11);
    cout << printHexadezimalZahl(hexadezimal_A) << " |"<< endl;

    cout << "| Zahl B |";
    cout.width(12);
    cout << dez_B << " | ";
    cout.width(11);
    cout << printHexadezimalZahl(hexadezimal_B) << " |"<< endl;

    cout << "| Zahl C |";
    cout.width(12);
    cout << dez_C << " | ";
    cout.width(11);
    cout << printHexadezimalZahl(hexadezimal_C) << " |"<< endl;

    cout << "| Zahl D |";
    cout.width(12);
    cout << dez_D << " | ";
    cout.width(11);
    cout << printHexadezimalZahl(hexadezimal_D) << " |"<< endl;
    
}


Dieser Post wurde am 09.07.2020 um 19:14 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.07.2020, 19:16 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,

out of range = du greifst auf ein nicht existentes Element im vector zu:


C++:
hexvec.at(z) = Rest;



hier.

vermutlich meinst du


C++:
hexvec.push_back(Rest);



bzw modern:


C++:
hexvec.emplace_back(Rest);



z brauchst du gar nicht an der Stelle.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: