C++ Taschenrechner

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

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

    Quellcode

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


    ich kann einfach keinen Fehler dinden :cry: ich hoff man kann mir helfen
    Meine Sprachen: C, C++,C# PHP
    E-Mail | MSN: gre.burgstaller@aon.at
  • 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.
    There are only 10 types of people in the world: Those who understand binary, and those who don't.

    Download meines ersten Spiels:HIER
    Über Feedback würde ich mich freuen ;)
  • 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:

    Quellcode

    1. int array[2];
    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
    There are only 10 types of people in the world: Those who understand binary, and those who don't.

    Download meines ersten Spiels:HIER
    Über Feedback würde ich mich freuen ;)
  • 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-.-
    Meine Sprachen: C, C++,C# PHP
    E-Mail | MSN: gre.burgstaller@aon.at
  • "Donasa" schrieb:

    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 ;)
    There are only 10 types of people in the world: Those who understand binary, and those who don't.

    Download meines ersten Spiels:HIER
    Über Feedback würde ich mich freuen ;)