C++ Pointer-To Probleme

OP #5665434
Lesenswert?

Hallo liebe Community,

ich bin noch recht unerfahren was das Programmieren angeht und hab 
deswegen mal angefangen, einen kleinen Taschenrechner zu programmieren. 
Nun bin ich soweit das ich bei der Addition bin... und irgendwie bekomme 
ich diese Fehlermeldung... Der Code sollte eigentlich vollständig 
sein... hab diesen Taschenrechner davor ohne if / else getestet also als 
laufendes Programm und da ging das ganze... Jetzt bei if / else ist das 
irgendwie komisch...Und ja man könnte das Programm viel kürzer gestalten 
aber ich möchte es mal so probiert haben... da ich noch recht neu 
bin....

1
#include "pch.h"
2
#include <conio.h>
3
#include <stdio.h>
4
#include <iostream>
5
#include <math.h>
6
using namespace std;
7

8
int Addition(int, int); 
9

10
int main(void)
11
{
12
  int Eingabe;
13
  int addition;
14
  int add1;
15
  int add2;
16
  int addsum;
17

18
  
19

20
  printf("Welche Rechenart benutzt du?\n");
21
  printf("\n");
22
  printf("[1] Addition\n");
23
  printf("[2] Subtraktion\n");
24
  printf("[3] Multiplikation\n");
25
  printf("[4] Division\n");
26
  printf("\n");
27
  printf("Tippe die passende Zahl in das Fenster");
28
  printf("\n");
29
  printf("Eingabefenster:");
30
  scanf_s("%d", &Eingabe);
31

32
  if (Eingabe == 1)
33
  {
34
    system("cls");
35

36
    printf("Addition\n");
37
    printf("\n");
38
    printf("Bitte geben Sie zwei ganze Zahlen ein!\n");
39
      printf("Zahl 1: ");
40
      scanf_s("%d", &add1);
41
      printf("Zahl 2: ");
42
      scanf_s("%d", &add2);
43
      addition = addsum(add1, add2);             // Problem tritt hier auf
44
      printf("Die Summe der Zahlen lautet: %d", addsum);
45

46
  }
47

48
  else if (Eingabe == 2)
49
  {
50
    system("cls");
51
    printf("Subtraktion");
52

53
  }
54
  else if (Eingabe == 3)
55
  {
56
    system("cls");
57
    printf("Multiplikation");
58
  }
59
  else if (Eingabe == 4)
60
  {
61
    system("cls");
62
    printf("Division");
63
  }
64
  else
65
  {
66
    system("cls");
67
    printf("Keine gueltige Eingabe");
68
  }
69

70
  _getch();
71
}
72
int addition(int add1, int add2)
73
{
74
  int addsum;
75
  addsum = add1 + add2;
76
  return addsum;
77
}
Gast #5665450
Lesenswert?

Ah. Jetzt sehe ich es. :-)

1. Du hast "addsum" erst als Variable definiert und verwendest es dann 
als Funktionsnamen.

2. Du willst vermutlich die Funktion "Addition" verwenden.

3. Du hast die Funktion "Addition" deklariert, aber eine Funktion 
"addition" definiert. Groß-/Kleinschreibung ist relevant.
Persönliche Seite #5665453
Lesenswert?

Dein Code benutzt einige Windows-spezifischer Dinge. Es ist besser, 
direkt zu lernen Standard-C++ zu schreiben, welches dann überall 
funktioniert. Außerdem sollte man die alten C-Arbeitsweisen direkt 
weglassen und es so lernen, wie es in C++ geht:

Dominik S. schrieb:
> #include <conio.h>
Ist Windows-Only. Weglassen.

Dominik S. schrieb:
> #include <stdio.h>

Das heißt in C++ #include <cstdio>.

Dominik S. schrieb:
> #include <math.h>

Heißt <cmath>. Aber für Grundrechenarten nicht nötig.

Dominik S. schrieb:
> using namespace std;
Ist grundsätzlich zu vermeiden:
https://stackoverflow.com/a/1452738

Dominik S. schrieb:
> int Addition(int, int);

Ist hier groß geschrieben, unten aber klein.

Dominik S. schrieb:
> printf("Welche Rechenart benutzt du?\n");
Nimm doch direkt die C++-Streams:
1
std::cout << "Welche Rechenart benutzt du?\n";

Dominik S. schrieb:
> scanf_s("%d", &Eingabe);
Gleiches gilt für die Eingabe; scanf_s ist auch noch Windows-spezifisch:
1
std::cin >> Eingabe;

Dominik S. schrieb:
> system("cls");
Ist Windows-Only. Am Besten ganz weglassen.

Dominik S. schrieb:
> addition = addsum(add1, add2);             // Problem tritt hier
> auf

addition ist eine Funktion, und addsum eine Variable. Die sind wohl 
vertauscht.

Dominik S. schrieb:
> _getch();
Ist Windows-Only. getc() o.ä. nutzen.

Dominik S. schrieb:
> int addsum;
>   addsum = add1 + add2;
>   return addsum;
Geht kürzer
1
return add1 + add2;

Das ganze hat überhaupt nichts mit Pointern zu tun...
Gast #5665462
Lesenswert?

Dominik S. schrieb:
> Ich habe nun addsum = Addition(add1, add2);
> umgeändert...
> Nun kommt "Verweis auf nicht aufgelöstes externes Symbol ""int_cdecl
> Addition(int,int)" (Addition@@YAHHH@Z)" in Funktion "_amin".
> Und
> 1 nicht aufgelöste Externe...
> er verweist mich nun in Zeile 1

Lies noch einmal die Antworten.
Persönliche Seite #5665490
Lesenswert?

So wäre es besser:
1
#include <cstdio>
2
#include <iostream>
3

4
int Addition (int, int);
5

6
int main (void) {
7
  std::cout << "Welche Rechenart benutzt du?\n"
8
      "\n"
9
      "[1] Addition\n"
10
      "[2] Subtraktion\n"
11
      "[3] Multiplikation\n"
12
      "[4] Division\n"
13
      "\n"
14
      "Tippe die passende Zahl in das Fenster"
15
      "\n"
16
      "Eingabefenster:";
17
  std::cout.flush ();
18
  int Eingabe;
19
  std::cin >> Eingabe;
20
  
21
  if (Eingabe == 1) {
22
    std::cout << "Addition\n\n";
23
    std::cout << "Bitte geben Sie zwei ganze Zahlen ein!\n";
24
    std::cout << "Zahl 1: ";
25
    std::cout.flush ();
26
    
27
    int add1;
28
    std::cin >> add1;
29
    
30
    std::cout << "Zahl 2: ";
31
    std::cout.flush ();
32
    int add2;
33
    std::cin >> add2;
34
    int addsum = Addition (add1, add2);
35
    std::cout << "Die Summe der Zahlen lautet: " << addsum << std::endl;
36
  } else if (Eingabe == 2) {
37
    std::cout << "Subtraktion\n\n";
38
    
39
  } else if (Eingabe == 3) {
40
    std::cout << "Multiplikation\n\n";
41
  } else if (Eingabe == 4) {
42
    std::cout << "Division\n\n";
43
  } else {
44
    std::cout << "Keine gueltige Eingabe\n\n";
45
  }
46
  getc (stdin);
47
}
48

49
int Addition (int add1, int add2) {
50
  return add1 + add2;
51
}

Variablen sollte man immer so spät definieren wie möglich; so lange 
Listen wie am Anfang deiner main() sind unübersichtlich und 
fehleranfällig.
#5665524
Lesenswert?

Dein Programm war reines C.

C und C++ sind zwei verschiedene Programmiersprachen.

In C++ programmiert man anders. Zudem hat sich die Sprache in den 
letzten 25 Jahren stark weiter entwickelt.

C++ hat zwar größtenteil C als Untermenge, trotzdem lernst du so C++ 
falsch.

Du solltest die Aussagen deiner Quelle überprüfen.
Gast #5665534
Lesenswert?

Dominik S. schrieb:
> Naja der Lehrer fängt selbst erst wieder an zu programmieren in C++....
> Also er lernt es so gesagt auch mit uns :D
> Deswegen bin ich über jeden Tipp verdammt dankbar... weil das mit das
> man erst so spät wie möglich definiert hätte ich so nicht gewusst :D

Das ist eine Stil-Frage. Denn es funktioniert auch, wenn man Variablen 
"so früh wie möglich" definiert. Das solltest Du wissen. Den Grund für 
beide Stile kannst Du später mal erlernen.
Persönliche Seite #5665535
Lesenswert?

Dominik S. schrieb:
> Deswegen bin ich über jeden Tipp verdammt dankbar... weil das mit das
> man erst so spät wie möglich definiert hätte ich so nicht gewusst :D

Das ist in C++ aber schon immer so! In C "erst" seit 1999 (C99); nur das 
alte C90 verlangt alle Variablen am Anfang der Funktion. Auch wenn man 
Variablen am Anfang der Funktion definieren kann, ist es keine gute 
Idee. Am Besten definiert man sie erst dann wenn man einen sinnvollen 
Wert für sie hat und weist diesen direkt zu. So kann man die Variable 
nie versehentlich vor der ersten Wertzuweisung lesen und man sieht auch 
sofort wo der Wert herkommt. Die Variable "addsum" wird nur in 2 Zeilen 
gebraucht; definiert man sie aber am Anfang der Funktion, kann man sie 
auch versehentlich ganz woanders nutzen.

Dominik S. schrieb:
> Ist das was der Erlkoenig geschrieben hat den C++? oder auch "nur" C?

Das ist "richtiges" C++.
#5665568
Lesenswert?

Niklas G. schrieb:
> #include <cstdio>
> #include <iostream>
>
> int Addition (int, int);
>
> int main (void) {
>   std::cout << "Welche Rechenart benutzt du?\n"
>       "\n"
>       "[1] Addition\n"
>       "[2] Subtraktion\n"
>       "[3] Multiplikation\n"
>       "[4] Division\n"
>       "\n"
>       "Tippe die passende Zahl in das Fenster"
>       "\n"
>       "Eingabefenster:";
>   std::cout.flush ();

Den Flush kann man aber auch gleich mit machen:
[C]
   std::cout << "Welche Rechenart benutzt du?\n"
       "\n"
       "[1] Addition\n"
       "[2] Subtraktion\n"
       "[3] Multiplikation\n"
       "[4] Division\n"
       "\n"
       "Tippe die passende Zahl in das Fenster"
       "\n"
       "Eingabefenster:" << std::flush;

>   int Eingabe;
>   std::cin >> Eingabe;
>
>   if (Eingabe == 1) {

Hier würde ich eher switch/case verwenden. Und natürlich vorher auf 
falsche Eingaben prüfen.
#5665595
Lesenswert?

Dominik S. schrieb:
> Naja der Lehrer fängt selbst erst wieder an zu programmieren in C++....

Nach 25 Jahre Pause? Hat er überhaupt schon mal in C++ programmiert?
Wie schon erwähnt wurde: C und C++ unterscheiden sich doch recht stark 
und C++ hat sich in den letzten Jahren (15-20 ;-)) doch recht weit vom 
alten C entfernt.

Was soll er euch denn beibringen: Programmieren (oder sogar 
Softwareentwicklung) oder nur C++?
Gast #5665720
Lesenswert?

Alles, was wiederholt werden soll, also hier Alles. Im else setzt du nur 
eine variable/flag, das das ganze nochmal laufen soll. Man könnte statt 
der Variable auch continue und break clever anordnen. Oder falls wenn 
man das Tor die Hölle öffnen will, könnte man statt der Schleife auch 
goto nutzen.
Gast #5665811
Lesenswert?

Theor schrieb:
> Das ist eine Stil-Frage. Denn es funktioniert auch, wenn man Variablen
> "so früh wie möglich" definiert. Das solltest Du wissen. Den Grund für
> beide Stile kannst Du später mal erlernen.

Unabhängig von spät oder früh (wobei wir bei uns ausschließlich früh 
verwenden) ist noch wichtiger: So "eng" wie möglich. Also wenn eine 
Variablen nur in einem "Block" (innerhalb {}) verwendet wird, dann nur 
dort anlegen. Wir erlauben sogar unkonditionale Blöcke, wenn temporär 
einige Variablen gebraucht werden, davor und danach aber nicht.

Zumindest in C. In C++ mit Hang zu 10-Zeilen-Funktionen und moderner 
Makroprogrammierung (Templates/const-expr) erübrigt es sich meist.
Persönliche Seite #5665887
Lesenswert?

So z.B:
1
#include <cstdio>
2
#include <iostream>
3

4
int Addition (int, int);
5

6
int main (void) {
7
  int Eingabe;
8
  do {
9
    std::cout << "Welche Rechenart benutzt du?\n"
10
        "\n"
11
        "[1] Addition\n"
12
        "[2] Subtraktion\n"
13
        "[3] Multiplikation\n"
14
        "[4] Division\n"
15
        "\n"
16
        "Tippe die passende Zahl in das Fenster"
17
        "\n"
18
        "Eingabefenster:" << std::flush;
19
    std::cin >> Eingabe;
20
    
21
    if (Eingabe == 1) {
22
      std::cout << "Addition\n\n";
23
      std::cout << "Bitte geben Sie zwei ganze Zahlen ein!\n";
24
      std::cout << "Zahl 1: " << std::flush;
25
      
26
      int add1;
27
      std::cin >> add1;
28
      
29
      std::cout << "Zahl 2: " << std::flush;
30
      int add2;
31
      std::cin >> add2;
32
      int addsum = Addition (add1, add2);             // Problem tritt hier auf
33
      std::cout << "Die Summe der Zahlen lautet: " << addsum << std::endl;
34
    } else if (Eingabe == 2) {
35
      std::cout << "Subtraktion\n\n";
36
      
37
    } else if (Eingabe == 3) {
38
      std::cout << "Multiplikation\n\n";
39
    } else if (Eingabe == 4) {
40
      std::cout << "Division\n\n";
41
    } else {
42
      std::cout << "Keine gueltige Eingabe\n\n";
43
    }
44
  } while (Eingabe < 5);
45
  getc (stdin);
46
}
47

48
int Addition (int add1, int add2) {
49
  return add1 + add2;
50
}
"Eingabe" muss hier vor dem "do" definiert werden, damit es in der 
Bedingung von "while" sichtbar ist.
Gast #5665942
Lesenswert?

Nur weil man iostream statt stdio verwendet, programmiert man noch lange 
kein C++. C++ ist eine Multi-Paradigmen-Sprache die mindestens mal 
objektorientiert ist. Im Prinzip ist das hier einfach klassische 
imperative Programmierung bei der man ein bißchen C++ Zeug mitschleppt. 
Einen Anfänger in C++ imperativ programmieren zu lassen aber von C 
abzuraten entbehrt nicht einer gewissen Komik. Bei dem was ich so 
täglich sehe macht es Sinn den Leuten erstmal richtig C beizubringen. 
Scot Meyers hat ganze Bücher mit den Fallstricken gefüllt die C++ neu zu 
dem hinzufügt, was schon in C komplex ist. Und das war schon deutlich 
vor C++17 Standard.
Gast #5665964
Lesenswert?

x^2 schrieb:
> C++ ist eine Multi-Paradigmen-Sprache

Die muss man aber nicht alle nutzen.

x^2 schrieb:
> Im Prinzip ist das hier einfach klassische imperative Programmierung bei
> der man ein bißchen C++ Zeug mitschleppt

Man nimmt die Vorteile, die sich bieten. Man kann davon ausgehen, dass 
man sich beim Lernen zu größeren Programmen vorarbeitet und dann die 
Vorteile relevanter werden.
Für einen Taschenrechner könnte man das Command Pattern (OOP) oder 
Boost.Spirit (Metaprogrammierung) anwenden. Das ist aber noch ein paar 
Level höher :)

x^2 schrieb:
> Bei dem was ich so täglich sehe macht es Sinn den Leuten erstmal richtig
> C beizubringen

Dann muss man aber danach alle schlechten C-Angewohnheiten wieder 
un-lernen. Besser ist es, es direkt richtig zu lernen. C hat auch so 
seine Tücken. In C++ sind viele Tücken gekapselt, da kann man z.B. mit 
std::string komfortabel arbeiten.

Für einen einfachen Einstieg sind wie gesagt Python, Java, ruby o.ä. 
besser geeignet. Aber C würde ich hier nicht einreihen.
Beitrag #5666166 wurde von einem Moderator gelöscht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren