Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » fehlerhafter Zugriff auf String-Vector[i]

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 ] > 2 < [ 3 ]
010
27.10.2016, 16:47 Uhr
ao

(Operator)



Zitat von ~Julia_w:
was eine IDE ist weiss ich nicht.

Eine IDE ist eine Integrated Development Environment. Dev-CPP 4.9 ist eine IDE, wenn auch eine hoffnungslos veraltete. Kannst du nicht umsteigen auf was Moderneres? Du tust dir mit diesem alten Ding keinen Gefallen.

Wenn du Windows hast, kannst du die kostenlose Version von Visual Studio nehmen (nicht für kommerzielle Zwecke). Und auf Linux geht nix über Eclipse-CDT oder kdevelop.

Studierst du Informatik, oder wofür machst du das?


Zitat:
Läuft dieser Code den bei dir, so wie gedacht? also die ausstehenden Kosten je Kategorie?

Nö, der kracht, weil du in auswerten2() auf kategorie.at(x) zugreifst, obwohl der vector überhaupt noch keine Elemente hat.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
27.10.2016, 19:15 Uhr
~Julia_w
Gast


ich dachte hierüber initialisiere ich die entsprechende kategorie(x) des struct Ausgaben.

C++:
int i=0;
    // Beispielsätze
    Ausgaben ausgaben, ausgaben1, ausgaben2, ausgaben3, ausgaben4, ausgaben5, ausgaben6, ausgaben7, ausgaben8, ausgaben9, ausgaben10, ausgaben11;
    ausgaben.kategorie = "Miete";
    ausgaben.monat = "Januar";
    ausgaben.nummer = 10;
    ausgaben.betrag= 10;

    ausgaben1.kategorie = "Tanken";
    ausgaben1.monat = "Januar";
    ausgaben1.nummer = 1;
    ausgaben1.betrag= 40;

    ausgaben2.kategorie = "Kleidung";
    ausgaben2.monat = "Februar";
    ausgaben2.nummer = 4;
    ausgaben2.betrag= 100;
    
    ausgaben3.kategorie = "Tanken";
    ausgaben3.monat = "Februar";
    ausgaben3.nummer = 2;
    ausgaben3.betrag= 150;
    
    ausgaben4.kategorie = "Urlaub";
    ausgaben4.monat = "April";
    ausgaben4.nummer = 5;
    ausgaben4.betrag= 503;
    
    ausgaben5.kategorie = "Miete";
    ausgaben5.monat = "Mai";
    ausgaben5.nummer = 6;
    ausgaben5.betrag= 10;

    ausgaben6.kategorie = "Tanken";
    ausgaben6.monat = "April";
    ausgaben6.nummer = 7;
    ausgaben6.betrag= 40;

    ausgaben7.kategorie = "Kleidung";
    ausgaben7.monat = "April";
    ausgaben7.nummer = 3;
    ausgaben7.betrag= 100;
    
    ausgaben8.kategorie = "Tanken";
    ausgaben8.monat = "Juli";
    ausgaben8.nummer = 7;
    ausgaben8.betrag= 130;
    
    ausgaben9.kategorie = "Urlaub";
    ausgaben9.monat = "April";
    ausgaben9.nummer = 9;
    ausgaben9.betrag= 106;
    
    ausgaben10.kategorie = "Urlaub";
    ausgaben10.monat = "Dezember";
    ausgaben10.nummer = 10;
    ausgaben10.betrag= 56;
    
    ausgaben11.kategorie = "Sex";
    ausgaben11.monat = "November";
    ausgaben11.nummer =13;
    ausgaben11.betrag= 56;
    
    AusgabenListe ausgabene;
    ausgabene.hinzufuegen(ausgaben);
    ausgabene.hinzufuegen(ausgaben1);
    ausgabene.hinzufuegen(ausgaben2);
    ausgabene.hinzufuegen(ausgaben3);
    ausgabene.hinzufuegen(ausgaben4);
    ausgabene.hinzufuegen(ausgaben5);
    ausgabene.hinzufuegen(ausgaben6);
    ausgabene.hinzufuegen(ausgaben7);
    ausgabene.hinzufuegen(ausgaben8);
    ausgabene.hinzufuegen(ausgaben9);
    ausgabene.hinzufuegen(ausgaben10);
    ausgabene.hinzufuegen(ausgaben11);



und hiermit greife ich darauf zu.

C++:
  if(p->ausgaben.kategorie=="Urlaub"){ kategoriebetrag[0]=kategoriebetrag[0] +p->ausgaben.betrag; kategorie.at(0)=("Urlaub");}  


ich bin WIng Student, und mache freiwillig einen Onlinekurs in C-Programmieren mit. Ich hatte vorher nur normales C für Embedded Systems als Vorlesung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
28.10.2016, 11:56 Uhr
ao

(Operator)



Zitat von ~Julia_w:
ich dachte hierüber initialisiere ich die entsprechende kategorie(x) des struct Ausgaben.

Das stimmt auch soweit.

Das Problem entsteht hier:

C++:
// Ab hier existiert ein vector-Objekt mit 0 Elementen.
std::vector<std::string> kategorie;

// .... ganz viel Verarbeitung ...

// Hier greifst du über .at(X) auf das (X+1)te Element des Vektors zu.
// Und weil die alle nicht vorhanden sind, macht es Bumm.
    if(p->ausgaben.kategorie=="Urlaub"){ kategoriebetrag[0]=kategoriebetrag[0] +p->ausgaben.betrag; kategorie.at(0)=("Urlaub");}
    else if(p->ausgaben.kategorie=="Tanken"){ kategoriebetrag[1]=kategoriebetrag[1] +p->ausgaben.betrag; kategorie.at(1)=("Tanken");}
    else if(p->ausgaben.kategorie=="Miete"){ kategoriebetrag[2]=kategoriebetrag[2] +p->ausgaben.betrag; kategorie.at(2)=("Miete");}
    else if(p->ausgaben.kategorie=="Kleidung"){ kategoriebetrag[3]=kategoriebetrag[3] +p->ausgaben.betrag; kategorie.at(3)=("Kleidung");}
    else if(p->ausgaben.kategorie=="Sex"){ kategoriebetrag[4]=kategoriebetrag[4] +p->ausgaben.betrag; kategorie.at(4)=("Sex");}
    else if(p->ausgaben.kategorie=="Kino"){ kategoriebetrag[5]=kategoriebetrag[5] +p->ausgaben.betrag; kategorie.at(5)=("Kino");}



Du musst, bevor du at(0), at(1) usw. machen kannst, die entsprechenden Elemente in den Vector einfügen (mit push_back oder resize), oder du musst bei der Konstruktion schon die Kategorienamen reinreichen. In diesem Fall (konstante Liste von Kategorien) wäre das vermutlich das Passendste.


Zitat:
ich bin WIng Student, und mache freiwillig einen Onlinekurs in C-Programmieren mit. Ich hatte vorher nur normales C für Embedded Systems als Vorlesung.

Onlinekurs in C oder in C++?

Und Wirtschaftsingenieure lernen heutzutage C für Embedded-Systeme? Interessant. An welcher Hochschule, wenn ich fragen darf?

Dieser Post wurde am 28.10.2016 um 11:59 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
28.10.2016, 14:02 Uhr
~Julia_w
Gast



C++:
/*


*/


#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>
#include <stdio.h>

// Ausgaben als Datenstruktur
struct Ausgaben
{
    std::string kategorie;
    std::string monat;
    int nummer;
    double betrag;
    double monatsbetrag;
};
double monatsbetrag[12];
double kategoriebetrag[8];
int monate[13]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
std::vector<std::string> kategorie;
// Grundgerüst
class AusgabenListe
{

    // Definition eines Listenelements
    class Listenelement
    {
    public:
        // Konstruktor
        Listenelement(Ausgaben ausgaben)
        {
            this->ausgaben.nummer = ausgaben.nummer;
            this->ausgaben.monat = ausgaben.monat;
            this->ausgaben.kategorie = ausgaben.kategorie;
            this->ausgaben.betrag = ausgaben.betrag;
            this->ausgaben.monatsbetrag = ausgaben.monatsbetrag;
            this->nachfolger = NULL;
        }

        // Das sind die Daten die wir verwalten wollen ( Datenbereich)
        Ausgaben ausgaben;

        // Zeiger auf den Nachfolger ( Zeiger)
        Listenelement *nachfolger;
    };

    // Listenkopf
    Listenelement* kopf;
    
    // Listenende
    Listenelement* ende;

public:

    // Konstruktor
    AusgabenListe(void)
    {
        kopf = ende = NULL;
    }

    // Destruktor
    ~AusgabenListe()
    {
    }

    // einen Ausgaben in die Liste einfügen
    void hinzufuegen(const Ausgaben & ausgaben)
    {
        // Ein neues Listenelement erstellen und mit 'ausgaben' initialisieren
        Listenelement *neuesListenelement = new Listenelement(ausgaben);

        // liste ist leer
        if(istLeer())
            ende = kopf = neuesListenelement;
        else
        {
            // das letzte Element zeigt auf das neue Element
            ende->nachfolger = neuesListenelement;

            // das neue Element wird zum Letzten
            ende = neuesListenelement;
        }
    }

    // prüft ob die Liste leer ist
    bool istLeer()
    {
        return (kopf == NULL) ? true : false;
    }

    // Liste löschen
    void loeschen(void)
    {
        if(istLeer())
            return;

        // solange der Zeiger nicht Null ist, also noch Elemente vorhanden sind...
        while(kopf->nachfolger != NULL)
        {
            // ...suche das vorletzte ELement
            Listenelement *vorletztesElement = kopf;
            while(vorletztesElement->nachfolger != ende)
            {
                vorletztesElement = vorletztesElement->nachfolger;
            }

            // lösche das letzte Element
            delete ende;

            // das vorletzte Element wird zum Letzten
            vorletztesElement->nachfolger = NULL;
            ende = vorletztesElement;
        }

        // zuletzt noch den Listenkopf löschen
        delete kopf;
    }

    // zeigt alle Listenelemente
    void elementeAnzeigen(void)
    {
        // aktueller Knoten
        Listenelement *p = kopf;

        // solange der Knoten nicht Null ist, also das Ende nicht erreicht ist...
        while(p != NULL)
        {
            // ...Inhalt ausgeben
            std::cout << "kategorie: "<< p->ausgaben.kategorie.c_str()
                << " monat: " << p->ausgaben.monat
                << " betrag: " << p->ausgaben.betrag
                << " nummer: " << p->ausgaben.nummer << std::endl;

            // der Nachfolger wird zum aktuellen Knoten
            p = p->nachfolger;
        }
    }
    //auswerten der Datensätze aus den Listenelement
    void auswerten1(void)
    {
                 // aktueller Knoten
        Listenelement *p = kopf;
             while(p != NULL)
        {
            // ...Inhalt ausgeben
    if(p->ausgaben.monat=="Januar") monatsbetrag[0]=monatsbetrag[0]+ p->ausgaben.betrag;
    else if(p->ausgaben.monat=="Februar") monatsbetrag[1]=monatsbetrag[1]+ p->ausgaben.betrag;
    else if(p->ausgaben.monat=="März") monatsbetrag[2]=monatsbetrag[2]+ p->ausgaben.betrag;
    else if(p->ausgaben.monat=="April") monatsbetrag[3]=monatsbetrag[3]+ p->ausgaben.betrag;
    else if(p->ausgaben.monat=="Mai") monatsbetrag[4]=monatsbetrag[4]+ p->ausgaben.betrag;
    else if(p->ausgaben.monat=="Juni") monatsbetrag[5]=monatsbetrag[5]+ p->ausgaben.betrag;
    else if(p->ausgaben.monat=="Juli") monatsbetrag[6]=monatsbetrag[6]+ p->ausgaben.betrag;
    else if(p->ausgaben.monat=="August") monatsbetrag[7]=monatsbetrag[7]+ p->ausgaben.betrag;
    else if(p->ausgaben.monat=="September") monatsbetrag[8]=monatsbetrag[8]+ p->ausgaben.betrag;
    else if(p->ausgaben.monat=="Oktober") monatsbetrag[9]=monatsbetrag[9]+ p->ausgaben.betrag;
    else if(p->ausgaben.monat=="November") monatsbetrag[10]=monatsbetrag[10]+ p->ausgaben.betrag;
    else if(p->ausgaben.monat=="Dezember") monatsbetrag[11]=monatsbetrag[11]+ p->ausgaben.betrag;
    
            // der Nachfolger wird zum aktuellen Knoten
            p = p->nachfolger;
        }
        
        for(int i=0; i<=11; i++)
        {
        printf("im Monat: %d %2.2lf \n", monate[i], monatsbetrag[i]);
        if(monatsbetrag[i]>500) printf("!!!!!!!!!!! Monatsbudget ueberschritten\n");
        }
    }
        void auswerten2(void)
    {
                 // aktueller Knoten
        Listenelement *p = kopf;    
        while(p != NULL)
        {
            // ...Inhalt ausgeben
    if(p->ausgaben.kategorie=="Urlaub"){ kategoriebetrag[0]=kategoriebetrag[0] +p->ausgaben.betrag;  kategorie.at(0)=("Urlaub");}  
    else if(p->ausgaben.kategorie=="Tanken"){ kategoriebetrag[1]=kategoriebetrag[1] +p->ausgaben.betrag;  kategorie.at(1)=("Tanken");}
    else if(p->ausgaben.kategorie=="Miete"){ kategoriebetrag[2]=kategoriebetrag[2] +p->ausgaben.betrag;  kategorie.at(2)=("Miete");}
    else if(p->ausgaben.kategorie=="Kleidung"){ kategoriebetrag[3]=kategoriebetrag[3] +p->ausgaben.betrag;  kategorie.at(3)=("Kleidung");}
    else if(p->ausgaben.kategorie=="Sex"){ kategoriebetrag[4]=kategoriebetrag[4] +p->ausgaben.betrag;  kategorie.at(4)=("Sex");}
    else if(p->ausgaben.kategorie=="Kino"){ kategoriebetrag[5]=kategoriebetrag[5] +p->ausgaben.betrag; kategorie.at(5)=("Kino");}
            // der Nachfolger wird zum aktuellen Knoten
               p = p->nachfolger;
       }      
        for(int i=0; i<kategorie.size(); i++)
        {
       std::cout<<kategorie.at(i);
       std::cout<<kategoriebetrag[i]<<"\n";
       }
     }
};

int main()
{
    int i=0;
    // Beispielsätze
    Ausgaben ausgaben, ausgaben1, ausgaben2, ausgaben3, ausgaben4, ausgaben5, ausgaben6, ausgaben7, ausgaben8, ausgaben9, ausgaben10, ausgaben11;
    ausgaben.kategorie = "Miete";
    ausgaben.monat = "Januar";
    ausgaben.nummer = 10;
    ausgaben.betrag= 10;

    ausgaben1.kategorie = "Tanken";
    ausgaben1.monat = "Januar";
    ausgaben1.nummer = 1;
    ausgaben1.betrag= 40;

    ausgaben2.kategorie = "Kleidung";
    ausgaben2.monat = "Februar";
    ausgaben2.nummer = 4;
    ausgaben2.betrag= 100;
    
    ausgaben3.kategorie = "Tanken";
    ausgaben3.monat = "Februar";
    ausgaben3.nummer = 2;
    ausgaben3.betrag= 150;
    
    ausgaben4.kategorie = "Urlaub";
    ausgaben4.monat = "April";
    ausgaben4.nummer = 5;
    ausgaben4.betrag= 503;
    
    ausgaben5.kategorie = "Miete";
    ausgaben5.monat = "Mai";
    ausgaben5.nummer = 6;
    ausgaben5.betrag= 10;

    ausgaben6.kategorie = "Tanken";
    ausgaben6.monat = "April";
    ausgaben6.nummer = 7;
    ausgaben6.betrag= 40;

    ausgaben7.kategorie = "Kleidung";
    ausgaben7.monat = "April";
    ausgaben7.nummer = 3;
    ausgaben7.betrag= 100;
    
    ausgaben8.kategorie = "Tanken";
    ausgaben8.monat = "Juli";
    ausgaben8.nummer = 7;
    ausgaben8.betrag= 130;
    
    ausgaben9.kategorie = "Urlaub";
    ausgaben9.monat = "April";
    ausgaben9.nummer = 9;
    ausgaben9.betrag= 106;
    
    ausgaben10.kategorie = "Urlaub";
    ausgaben10.monat = "Dezember";
    ausgaben10.nummer = 10;
    ausgaben10.betrag= 56;
    
    ausgaben11.kategorie = "Sex";
    ausgaben11.monat = "November";
    ausgaben11.nummer =13;
    ausgaben11.betrag= 56;
    
    
// entsprechenden Elemente in den Vector einfügen
        kategorie.push_back("Urlaub");
        kategorie.push_back("Tanken");
        kategorie.push_back("Miete");
        kategorie.push_back("Kleidung");    
        kategorie.push_back("Sex");
        kategorie.push_back("Kino");
    
    AusgabenListe ausgabene;
    ausgabene.hinzufuegen(ausgaben);
    ausgabene.hinzufuegen(ausgaben1);
    ausgabene.hinzufuegen(ausgaben2);
    ausgabene.hinzufuegen(ausgaben3);
    ausgabene.hinzufuegen(ausgaben4);
    ausgabene.hinzufuegen(ausgaben5);
    ausgabene.hinzufuegen(ausgaben6);
    ausgabene.hinzufuegen(ausgaben7);
    ausgabene.hinzufuegen(ausgaben8);
    ausgabene.hinzufuegen(ausgaben9);
    ausgabene.hinzufuegen(ausgaben10);
    ausgabene.hinzufuegen(ausgaben11);
    ausgabene.elementeAnzeigen();
    
    ausgabene.auswerten1();
    
    ausgabene.auswerten2();

    ausgabene.loeschen();

    std::cin.get();

    return 0;
}



Es läuft, danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
28.10.2016, 14:09 Uhr
~Julia_w
Gast


ich studiere WIng mit FR Mechatronik. An der TH Deggendorf mache ich den Onlinekurs Programmieren in C++. Was machst du den so?
hier mal zwei Beispeile meiner alten Embedded System Vorlesung.

C++:

//---------------------------------------------------------------------
#include <stdio.h>
#include <string.h>
#include "reg537.h"
//---------------------------------------------------------------------
// Prototypen

char getchar (void) ;
void putchar (char) ;
void sio0init (void) ;
//---------------------------------------------------------------------
#define BR19200_16 998    // 19200 baud at 16 MHz
//---------------------------------------------------------------------
volatile signed int exponent;

union ganzzahl32 //32-Bit UNION
{
    unsigned long ul;
    unsigned char uc32[4];
};

union ganzzahl16 //16-Bit UNION
{
    unsigned int ui;
    unsigned char uc16[2];      
};
union ganzzahl32 werte; //initialisierung der UNION-Variabellen [32-Bit]
union ganzzahl32 mantisse; //initialisierung der UNION-Variabellen [32-Bit]

void main(void)
{
    sio0init();
    for(werte.ul=1; werte.ul<=2147483648; werte.ul=(werte.ul*2))
    {
        MD0=werte.uc32[0]; //zugriff auf Low_Bit
        MD1=werte.uc32[1];
        MD2=werte.uc32[2];
        MD3=werte.uc32[3]; //zugriff auf High_Bit
        ARCON=0; // Shift-Vorgang starten
        _asm
            nop
            nop
            nop
            nop
            nop
            nop
            _endasm; //6 Zyklen warten
        mantisse.uc32[0]=MD0;
        mantisse.uc32[1]=MD1;
        mantisse.uc32[2]=MD2;
        mantisse.uc32[3]=MD3;
        exponent=ARCON;
        exponent=exponent&0x1F;
        printf("Testwerte %08lX - exponent %08i - mantisse %08lX \n", werte.ul, exponent, mantisse.ul);
    if(werte.ul>=2147483648)break;
    }
}

//---------------------------------------------------------------------
char getchar (void)
{
    // Get character from sio 0
    char c ;
    while (RI0 == 0) ;
    c = S0BUF ;
    RI0 = 0 ;
    return (c) ;
}
//---------------------------------------------------------------------
void putchar (char c)
{
    // Put character c to sio 0
    TI0 = 0 ;
    S0BUF = c ;
    while (TI0 == 0) ;
}
//---------------------------------------------------------------------
void sio0init (void)
{
    // Initialize serial input/output 0
    PCON = 0x80 ;            // SMOD = 1 --> Factor = 2
    S0RELH = BR19200_16 >> 8 ;    // Reload-value of baudrate-generator
    S0RELL = BR19200_16 & 0xff ;
    S0CON = 0x50 ;
    BD = 1 ;               // Start baudrate-generator
}
//---------------------------------------------------------------------





C++:
//---------------------------------------------------------------------
/*
   Uebung 11 : Interrupts mit Timer 0 (oder Timer 1) fuer eine Uhrzeit
   ----------- mit Alarm

   a)  Timer 0 (oder Timer 1) soll im 16-Bit-Modus betrieben werden.
   Wie bekannt, erfolgt dann alle (ca.) 50 ms ein Interrupt. Nun
   soll bei jedem 20.Interrupt (also nach jeweils etwa 1 s) die
   Gluehlampe invertiert werden. An die Lampe (und den Piezo-
   Schwinger) gelangt damit eine Frequenz von (ca.) 1 Hz.
   Diese Frequenz soll im Folgenden eine Uhr steuern,
   Format "hh:mm:ss". (hh = hours, mm = minutes, ss = seconds)

   Die ISR soll eine kurze Laufzeit haben. Deshalb wird das Weiter-
   zaehlen der Uhr nicht in der ISR durchgefuehrt. Dies kann man z.B.
   folgendermassen erreichen: In der ISR wird eine globale Variable
   im Sekundentakt erhoeht. Diese Variable wird in der "main"
   abgefragt. Wenn sie sich aendert, wird die Uhrzeit um eine Sekunde
   erhoeht (und evtl. die Minuten und Stunden berichtigt) und dann
   die Zeit ausgegeben.

   Die Ausgabe sollte nicht ueber "printf" erfolgen, sondern z.B.
   ueber eine zu erstellende Funktion "dezaus". Diese Funktion gibt
   eine 2-stellige Dezimalzahl mittels "putchar" aus.

   b)  Testen Sie, ob die Uhr die Uebergaenge bei Sekunde 59 auf 0,
   Minute 59 auf 0 und Stunde 23 auf 0 richtig ausfuehrt.
   Diese Tests koennen durch Vorgeben entsprechender Uhrzeiten oder
   durch (starkes) Verkuerzen des Sekundentaktes erfolgen.

   c)  Nun sollen noch 2 Alarmzeiten fest vorgebbar sein. Beim Erreichen
   der ersten Alarmzeit sollen alle Leuchtdioden eingeschaltet werden,
   beim Erreichen der zweiten Alarmzeit wieder aus.
   */

//---------------------------------------------------------------------
#include <stdio.h>
#include <string.h>
#include "reg537.h"
//---------------------------------------------------------------------
// Prototypen

char getchar (void) ;
void putchar (char) ;
void sio0init (void) ;
//---------------------------------------------------------------------
#define BR19200_16 998        // 19200 baud at 16 MHz
//---------------------------------------------------------------------
data volatile int h=0, m=0, s=0;
volatile int change=0,k,i,j;
volatile int aufrufe=0x00;

void tim0_isr(void) interrupt TIMER0
{
    aufrufe=aufrufe+1;
    if (aufrufe==20) // wenn 20 aufrufe erfolgt sind,...
    {
        P1_2=!P1_2; //.. lampe invertieren
        aufrufe=0; //aufrufe-variabelle auf 0 setzen
        change=1; //Zustandzäher auf 1 setzen

    }
}
void alarm(void)
{
    k=0xFE;
    P4=~P4;
    for(i=1; i<=8; i++)
    {
        k=k<<1;
        for(j=0;j<=30000; j++);
        P4=k;
    }
    k=0x01;
}

void dezaus(char zeit)
{

    putchar(zeit/10 +'0');
    putchar(zeit%10 +'0');
}

void main (void)
{
    sio0init ();
    P4=0x00;
    EAL=1; //enable all Interrups
    ET0=1; //enable timer0
    TMOD=0x01; // TIMER0 und im 16-Bit Modus
    TR0=1; //ansprechen timer0
    while(1)
    {
        critical
        {
            if((change==1)&&(s<=59))
            {
                s=s+1; //Sekundenzähler um 1 erhöhen
                change=0; //Zustandzäher auf 0 setzen
                if(s>=60)
                {
                    s=0;
                    m=m+1; //Minutenzähler um 1 erhöhen
                    if(m>=60) // wenn Minutenzähler über 60,...
                    {
                        m=0; //... Minutenzähler wieder auf 0 setzen
                        h=h+1; //Stundenzähler um 1 erhöhen
                    }
                }

                dezaus(h);
                putchar(':');
                dezaus(m);
                putchar(':');
                dezaus(s);
                printf("\n");
                if((m==2)&&(s==44)) alarm(); // alarm Funktion ausführen
                else if ((m==1)&&(s==01)) alarm(); // alarm Funktion ausführen
            }
        }
    }

}
//---------------------------------------------------------------------
char getchar (void)
{
    // Get character from sio 0

    char c ;

    while (RI0 == 0) ;
    c = S0BUF ;
    RI0 = 0 ;
    return (c) ;
}
//---------------------------------------------------------------------
void putchar (char c)
{
    // Put character c to sio 0

    TI0 = 0 ;
    S0BUF = c ;
    while (TI0 == 0) ;
}
//---------------------------------------------------------------------
void sio0init (void)
{
    // Initialize serial input/output 0

    PCON = 0x80 ;                // SMOD = 1 --> Factor = 2
    S0RELH = BR19200_16 >> 8 ;    // Reload-value of baudrate-generator
    S0RELL = BR19200_16 & 0xff ;
    S0CON = 0x50 ;
    BD = 1 ;                    // Start baudrate-generator
}
//---------------------------------------------------------------------

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
28.10.2016, 14:11 Uhr
~Julia_w
Gast


[quote ~Julia_w]ich studiere WIng mit FR Mechatronik. An der TH Deggendorf mache ich den Onlinekurs Programmieren in C++. Was machst du den so?
hier mal zwei Beispeile meiner alten Embedded System Vorlesung.

Ps: ich studiere noch an der FH Hof.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
30.10.2016, 19:17 Uhr
ao

(Operator)


Ah, verstehe, das ist so ein Mikrocontroller-Praktikum.

Ich selber bin schon ne ganze Weile mit dem Studium (E-Technk) fertig. Ich bin als Softwareentwickler angestellt und schreibe Programme in C++ für ARM-Mikrocontroller und für Embedded Linux, und ab und zu ein Tool in C#.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
02.11.2016, 20:54 Uhr
~Julia_w
Gast


ich würde jetzt noch gerne die Ausgabe: Monat 1: Miete = 10 ¤; Tanken = 40 ¤ ausgeben. Wie verknüpfe ich den die beiden methoden auswerten(1) und auswerten(2) entsprechend? ich würde gerne eine weitere Methode auswerten(3) hinzufügen, doch komme ich mit der Trennung der Kategorie mit Kategoriebetrag pro Monat in Zuordnungsprobleme.....


C++:
#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>
#include <stdio.h>

// Ausgaben als Datenstruktur
struct Ausgaben
{
    std::string kategorie;
    std::string monat;
    int nummer;
    double betrag;
    double monatsbetrag;
};
double monatsbetrag[12];
double kategoriebetrag[8];
int monate[13]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
std::vector<std::string> kategorie;
// Grundgerüst
class AusgabenListe
{

    // Definition eines Listenelements
    class Listenelement
    {
    public:
        // Konstruktor
        Listenelement(Ausgaben ausgaben)
        {
            this->ausgaben.nummer = ausgaben.nummer;
            this->ausgaben.monat = ausgaben.monat;
            this->ausgaben.kategorie = ausgaben.kategorie;
            this->ausgaben.betrag = ausgaben.betrag;
            this->ausgaben.monatsbetrag = ausgaben.monatsbetrag;
            this->nachfolger = NULL;
        }

        // Das sind die Daten die wir verwalten wollen ( Datenbereich)
        Ausgaben ausgaben;

        // Zeiger auf den Nachfolger ( Zeiger)
        Listenelement *nachfolger;
    };

    // Listenkopf
    Listenelement* kopf;
    
    // Listenende
    Listenelement* ende;

public:

    // Konstruktor
    AusgabenListe(void)
    {
        kopf = ende = NULL;
    }

    // Destruktor
    ~AusgabenListe()
    {
    }

    // einen Ausgaben in die Liste einfügen
    void hinzufuegen(const Ausgaben & ausgaben)
    {
        // Ein neues Listenelement erstellen und mit 'ausgaben' initialisieren
        Listenelement *neuesListenelement = new Listenelement(ausgaben);

        // liste ist leer
        if(istLeer())
            ende = kopf = neuesListenelement;
        else
        {
            // das letzte Element zeigt auf das neue Element
            ende->nachfolger = neuesListenelement;

            // das neue Element wird zum Letzten
            ende = neuesListenelement;
        }
    }

    // prüft ob die Liste leer ist
    bool istLeer()
    {
        return (kopf == NULL) ? true : false;
    }

    // Liste löschen
    void loeschen(void)
    {
        if(istLeer())
            return;

        // solange der Zeiger nicht Null ist, also noch Elemente vorhanden sind...
        while(kopf->nachfolger != NULL)
        {
            // ...suche das vorletzte ELement
            Listenelement *vorletztesElement = kopf;
            while(vorletztesElement->nachfolger != ende)
            {
                vorletztesElement = vorletztesElement->nachfolger;
            }

            // lösche das letzte Element
            delete ende;

            // das vorletzte Element wird zum Letzten
            vorletztesElement->nachfolger = NULL;
            ende = vorletztesElement;
        }

        // zuletzt noch den Listenkopf löschen
        delete kopf;
    }

    // zeigt alle Listenelemente
    void elementeAnzeigen(void)
    {
        // aktueller Knoten
        Listenelement *p = kopf;

        // solange der Knoten nicht Null ist, also das Ende nicht erreicht ist...
        while(p != NULL)
        {
            // ...Inhalt ausgeben
            std::cout << "kategorie: "<< p->ausgaben.kategorie.c_str()
                << " monat: " << p->ausgaben.monat
                << " betrag: " << p->ausgaben.betrag
                << " nummer: " << p->ausgaben.nummer << std::endl;

            // der Nachfolger wird zum aktuellen Knoten
            p = p->nachfolger;
        }
    }
    //auswerten der Datensätze aus den Listenelement
    void auswerten1(void)
    {
                 // aktueller Knoten
        Listenelement *p = kopf;
             while(p != NULL)
        {
            // ...Inhalt ausgeben
    if(p->ausgaben.monat=="Januar") monatsbetrag[0]=monatsbetrag[0]+ p->ausgaben.betrag;
    else if(p->ausgaben.monat=="Februar") monatsbetrag[1]=monatsbetrag[1]+ p->ausgaben.betrag;
    else if(p->ausgaben.monat=="März") monatsbetrag[2]=monatsbetrag[2]+ p->ausgaben.betrag;
    else if(p->ausgaben.monat=="April") monatsbetrag[3]=monatsbetrag[3]+ p->ausgaben.betrag;
    else if(p->ausgaben.monat=="Mai") monatsbetrag[4]=monatsbetrag[4]+ p->ausgaben.betrag;
    else if(p->ausgaben.monat=="Juni") monatsbetrag[5]=monatsbetrag[5]+ p->ausgaben.betrag;
    else if(p->ausgaben.monat=="Juli") monatsbetrag[6]=monatsbetrag[6]+ p->ausgaben.betrag;
    else if(p->ausgaben.monat=="August") monatsbetrag[7]=monatsbetrag[7]+ p->ausgaben.betrag;
    else if(p->ausgaben.monat=="September") monatsbetrag[8]=monatsbetrag[8]+ p->ausgaben.betrag;
    else if(p->ausgaben.monat=="Oktober") monatsbetrag[9]=monatsbetrag[9]+ p->ausgaben.betrag;
    else if(p->ausgaben.monat=="November") monatsbetrag[10]=monatsbetrag[10]+ p->ausgaben.betrag;
    else if(p->ausgaben.monat=="Dezember") monatsbetrag[11]=monatsbetrag[11]+ p->ausgaben.betrag;
    
            // der Nachfolger wird zum aktuellen Knoten
            p = p->nachfolger;
        }
        
        for(int i=0; i<=11; i++)
        {
        printf("im Monat: %d %2.2lf \n", monate[i], monatsbetrag[i]);
        if(monatsbetrag[i]>500) printf("!!!!!!!!!!! Monatsbudget ueberschritten\n");
        }
    }
        void auswerten2(void)
    {
                 // aktueller Knoten
        Listenelement *p = kopf;    
        while(p != NULL)
        {
            // ...Inhalt ausgeben
    if(p->ausgaben.kategorie=="Urlaub"){ kategoriebetrag[0]=kategoriebetrag[0] +p->ausgaben.betrag;  kategorie.at(0)=("Urlaub");}  
    else if(p->ausgaben.kategorie=="Tanken"){ kategoriebetrag[1]=kategoriebetrag[1] +p->ausgaben.betrag;  kategorie.at(1)=("Tanken");}
    else if(p->ausgaben.kategorie=="Miete"){ kategoriebetrag[2]=kategoriebetrag[2] +p->ausgaben.betrag;  kategorie.at(2)=("Miete");}
    else if(p->ausgaben.kategorie=="Kleidung"){ kategoriebetrag[3]=kategoriebetrag[3] +p->ausgaben.betrag;  kategorie.at(3)=("Kleidung");}
    else if(p->ausgaben.kategorie=="Sex"){ kategoriebetrag[4]=kategoriebetrag[4] +p->ausgaben.betrag;  kategorie.at(4)=("Sex");}
    else if(p->ausgaben.kategorie=="Kino"){ kategoriebetrag[5]=kategoriebetrag[5] +p->ausgaben.betrag; kategorie.at(5)=("Kino");}
            // der Nachfolger wird zum aktuellen Knoten
               p = p->nachfolger;
       }      
        for(int i=0; i<kategorie.size(); i++)
        {
       std::cout<<kategorie.at(i);
       std::cout<<kategoriebetrag[i]<<"\n";
       }
     }
};

int main()
{
    int i=0;
    // Beispielsätze
    Ausgaben ausgaben, ausgaben1, ausgaben2, ausgaben3, ausgaben4, ausgaben5, ausgaben6, ausgaben7, ausgaben8, ausgaben9, ausgaben10, ausgaben11;
    ausgaben.kategorie = "Miete";
    ausgaben.monat = "Januar";
    ausgaben.nummer = 10;
    ausgaben.betrag= 10;

    ausgaben1.kategorie = "Tanken";
    ausgaben1.monat = "Januar";
    ausgaben1.nummer = 1;
    ausgaben1.betrag= 40;

    ausgaben2.kategorie = "Kleidung";
    ausgaben2.monat = "Februar";
    ausgaben2.nummer = 4;
    ausgaben2.betrag= 100;
    
    ausgaben3.kategorie = "Tanken";
    ausgaben3.monat = "Februar";
    ausgaben3.nummer = 2;
    ausgaben3.betrag= 150;
    
    ausgaben4.kategorie = "Urlaub";
    ausgaben4.monat = "April";
    ausgaben4.nummer = 5;
    ausgaben4.betrag= 503;
    
    ausgaben5.kategorie = "Miete";
    ausgaben5.monat = "Mai";
    ausgaben5.nummer = 6;
    ausgaben5.betrag= 10;

    ausgaben6.kategorie = "Tanken";
    ausgaben6.monat = "April";
    ausgaben6.nummer = 7;
    ausgaben6.betrag= 40;

    ausgaben7.kategorie = "Kleidung";
    ausgaben7.monat = "April";
    ausgaben7.nummer = 3;
    ausgaben7.betrag= 100;
    
    ausgaben8.kategorie = "Tanken";
    ausgaben8.monat = "Juli";
    ausgaben8.nummer = 7;
    ausgaben8.betrag= 130;
    
    ausgaben9.kategorie = "Urlaub";
    ausgaben9.monat = "April";
    ausgaben9.nummer = 9;
    ausgaben9.betrag= 106;
    
    ausgaben10.kategorie = "Urlaub";
    ausgaben10.monat = "Dezember";
    ausgaben10.nummer = 10;
    ausgaben10.betrag= 56;
    
    ausgaben11.kategorie = "Sex";
    ausgaben11.monat = "November";
    ausgaben11.nummer =13;
    ausgaben11.betrag= 56;
    
    
// entsprechenden Elemente in den Vector einfügen
        kategorie.push_back("Urlaub");
        kategorie.push_back("Tanken");
        kategorie.push_back("Miete");
        kategorie.push_back("Kleidung");    
        kategorie.push_back("Sex");
        kategorie.push_back("Kino");
    
    AusgabenListe ausgabene;
    ausgabene.hinzufuegen(ausgaben);
    ausgabene.hinzufuegen(ausgaben1);
    ausgabene.hinzufuegen(ausgaben2);
    ausgabene.hinzufuegen(ausgaben3);
    ausgabene.hinzufuegen(ausgaben4);
    ausgabene.hinzufuegen(ausgaben5);
    ausgabene.hinzufuegen(ausgaben6);
    ausgabene.hinzufuegen(ausgaben7);
    ausgabene.hinzufuegen(ausgaben8);
    ausgabene.hinzufuegen(ausgaben9);
    ausgabene.hinzufuegen(ausgaben10);
    ausgabene.hinzufuegen(ausgaben11);
    ausgabene.elementeAnzeigen();
    
    ausgabene.auswerten1();
    
    ausgabene.auswerten2();

    ausgabene.loeschen();

    std::cin.get();

    return 0;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
02.11.2016, 22:37 Uhr
~somebody
Gast


Ernsthaft, niemand will das lesen.
Reduziere deinen Code auf die Problemstelle, sonst wird dir hier niemand helfen.
Was mir auffällt ist, dass du versuchst eine Liste nachzubauen, benutze doch einfach einen Container aus der STL, dein Code wird schlanker dadurch.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
02.11.2016, 23:01 Uhr
ao

(Operator)


Du wirst die Liste der Ausgaben nochmal neu auswerten müssen und dabei für jeden Monat jede Kategorie einzeln aufsummieren. Die Auswertungen, die du bisher machst (auswerten1 und auswerten2) geben das nicht her.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ]     [ 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: