You are not logged in.

  • Login

1

Sunday, March 11th 2007, 12:44pm

C++ Taschenrechner

Also ich habe ein Problem mit einem Programm (Laufzeitfehler)
das Programm soll einen String einlesen und ausrechnen und das ergebnis ausgeben
nur immer wenn ich es starte kommt en windows- Fehlermeldung:

C Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include <iostream>
#include <cstdlib>
#include <conio.h>
using namespace std;
 
enum tToken 
{
    PLUS, MINUS, MUL, DIV, LPAR, RPAR, NUMBER, END, ERROR
};
 
tToken aktToken;       
double TokenZahlenWert;
 
char *srcPos;           
 
tToken sucheToken()
{
    aktToken = ERROR;
    if (*srcPos==0)
    {
        aktToken = END;
    } 
    else 
    {
        switch (*srcPos)
        {
            case '(': aktToken=LPAR;  break;
            case ')': aktToken=RPAR;  break;
            case '*': aktToken=MUL;   break;
            case '/': aktToken=DIV;   break;
            case '+': aktToken=PLUS;  break;
            case '-': aktToken=MINUS; break;
        }
        if (*srcPos>='0' && *srcPos<'9') 
        {
            aktToken=NUMBER;
            TokenZahlenWert = 0.0;
        }
        while (*srcPos>='0' && *srcPos<'9') 
        {
            TokenZahlenWert *= 10;
            TokenZahlenWert += *srcPos-'0';
            srcPos++;
        }
        if (aktToken != NUMBER)
        {
            srcPos++;
        }
    }
    return aktToken;
}
 
tToken Error(char *s)
{
    cerr << s << endl;
    return ERROR;
}
double PlusMinus();
double Klammern()
{
    double Wert;
    switch(aktToken)
    {
        case NUMBER:
            sucheToken();
            return TokenZahlenWert;
        case MINUS:
            sucheToken();
            return -Klammern();
        case LPAR:
            sucheToken();
            Wert = PlusMinus();
            if (aktToken != RPAR)
            {
               return Error(") expected");
            }
            sucheToken();
            return Wert;
        case END:
            return 1;
    }
    return Error("primary expected");
}
 
double MulDiv()
{
    double Wert;
    Wert = Klammern();
    while (aktToken==MUL || aktToken==DIV)
    {
        if (aktToken==MUL)
        {
            sucheToken();
            Wert *= Klammern();
        }
        else if (aktToken==DIV)
        {
          sucheToken();
          Wert /= Klammern();
        }
    }
    return Wert;
}
 
double PlusMinus()
{
    double Wert;
    Wert = MulDiv();
    while (aktToken==PLUS || aktToken==MINUS)
    {
        if (aktToken==PLUS)
        {
            sucheToken();
            Wert += MulDiv();
        }
        else if (aktToken==MINUS)
        {
            sucheToken();
            Wert -= MulDiv();
        }
    }
    return Wert;
}
 
double Auswertung(char *s)
{
    srcPos = s;
    sucheToken();     
    return PlusMinus();
}
 
int main(int argc, char* argv[])
{
    double Wert = Auswertung(argv[1]);
    cout << Wert << endl;
    return 0;
}


ich kann einfach keinen Fehler dinden :cry: ich hoff man kann mir helfen

2

Sunday, March 11th 2007, 5:17pm

oh hab vergessen zu schreiben wann der fehler auftritt

glei wenn mans startet -.-
is dieses senden net senden dann

3

Sunday, March 11th 2007, 5:31pm

Wär vielleicht mal ganz interessant zu wissen, WAS für ne Fehlermeldung ausgeben wird.
Ist genauso wie die Frage: Mein Auto fährt nicht, woran liegt das, hier ist der Bauplan.

Ich hab von c++ leider nicht so viel Ahnung, aber liegt es vielleicht am

C Quellcode

1
args[1]


vielleicht

C Quellcode

1
args[0]


?

4

Sunday, March 11th 2007, 5:49pm

hab ich ja noch hinzugefügt... ausserdem ist das

argv[0] schließt es ohne fehler...

5

Sunday, March 11th 2007, 6:13pm

Mit was für Parametern(?) hast du das Programm aufgerufen?

Je nach Betriebssystem:
Linux: Welches "Signal" gibt das Programm vor dem Absturz
Windows: Die (hexadezimale) Fehlernummer

Wäre vielleicht hilfreich.

6

Sunday, March 11th 2007, 6:15pm

eben mit keinen es hängt sofort beim ausführen das is ja grad des merkwürdige

7

Sunday, March 11th 2007, 6:32pm

Dort wo "diese Senden / nicht Senden" kommt kann man sich die Technischen Daten ansehen, dann erhällt man auch die Fehlernummer.

Ich vermute mal du verwendest Windows.

Wenn ich das Programm mit g++ kompiliere und ohne argumente aufrufe bekomme ich "Segmentation fault (core dumped)" entspricht dem Windows Fehler 0xc00*05, eine Zugriffsverletzung.

Eigentlich ganz klar: in argc steht drin wie vieleelemente das array argv[] hat. argv[0] ist dabei der programmname (mit Pfad?) argv[1] das erste Argument fals belegt. Wenn nicht ist der zugriff unzulässig. Du kannst ja auch nicht das machen:

C Quellcode

1
2
3
int array[2];
 
array[3] = 5;


Wenn man das programm mit rechner.exe 12+5 aufruft funktioniert es (jedenfalls bei mir) problemfrei.

Versuch das Programm mal mit entsprechenden Parater aufzurufen und sag obs dann geht.

btw: #include <conio.h> wird nicht benötigt

8

Sunday, March 11th 2007, 6:47pm

hmm...

also ich benutz Dev-Cpp
und als OS: Vista

da kann man den Fehlercode net einsehen (soweit ich mitbekommmen hab)
habs mal mit VS 2005 getestet:

Unbehandelte Ausnahme bei 0x0041151d in calc.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.

so stürtz es da ab :lol:

wie ich das mit Parametern starten kann weiß ich net-.-

9

Sunday, March 11th 2007, 6:49pm

Quoted from ""Donasa""

0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.


nimm cmd Start->Ausführen->cmd (wars jedenfalls unter XP)
dann geh mit cd ins entsprechende verzeichniss (die datei liegt beispielsweise in D:\Programmieren\Test\calc.exe ->
du tippst:
D:
cd Programmieren\test
calc.exe 12+5

Alternativ kannst du natürlich die rechnung erst einlesen (scanf / cin)

Was du hier hast ist mal wieder eine C/C++ mischung, enn du cin nimmst würden sich std::strings anbiten, kann man auch schön durchsuchen ;)

10

Sunday, March 11th 2007, 6:50pm

C Quellcode

1
2
3
4
5
6
char eingabe[50];
	cin>>eingabe;
    double Wert = Auswertung(eingabe);
    cout << Wert << endl;
	system("PAUSE");
    return 0;

jetzt mach ich so da funkts wenigstens :)

11

Sunday, March 11th 2007, 6:52pm

wobei das ganze zimlich Problematisch ist, da du auch eine Eingabe, die länger als 50 Zeichen ist machen kannst.

12

Sunday, March 11th 2007, 6:53pm

den bereich kann ich ja auf z.b.:250 groß machen

13

Sunday, March 11th 2007, 7:02pm

was das Problem nur hinauszögert aber nicht löst ...

=> Für eine Übung vll ok, sonst besser vermeiden. std::string ist echt positiv ;)

Social bookmarks