Forum: PC-Programmierung C++ Pointer-To Probleme


von Dominik S. (domxnxks)


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
}

: Bearbeitet durch User
von Theor (Gast)


Lesenswert?

Welches Problem?
Welche Fehlermeldung?
Was ist komisch und was meinst Du mit "komisch"?

von Dirk B. (dirkb2)


Lesenswert?

Wo ist die Funktion  addsum definiert?

von Dominik S. (domxnxks)


Lesenswert?

Problem:
- Der Ausdruck vor den Klammern des sichtbaren Aufrufs muss einen 
Funktionstyp (pointer-to-) aufweisen.
- Ausdruck ergibt keine Funktion, die 2 Argumente übernimmt

Zeile 46 (hab es im Code eigentlich auch markiert extra...

von Dominik S. (domxnxks)


Lesenswert?

Wie definiere ich addsum denn wenn ich es nicht bereits schon gemacht 
habe?

von Theor (Gast)


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.

von Volle22 (Gast)


Lesenswert?

korrekt ist
addsum = addition(add1, add2);

der Compiler sagt dir immer ganz genau was falsch ist
halt aus seiner Sicht

von Niklas G. (erlkoenig) Benutzerseite


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...

: Bearbeitet durch User
von Dominik S. (domxnxks)


Lesenswert?

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

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Ja, weil du es unten klein geschrieben hast. C++ achtet auf Groß- und 
Kleinschreibung.

von Theor (Gast)


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.

von Dominik S. (domxnxks)


Lesenswert?

Was muss ich wie ändern... ich blick gerade nicht mehr durch...

von Theor (Gast)


Lesenswert?

Dominik S. schrieb:
> Was muss ich wie ändern... ich blick gerade nicht mehr durch...

Du schreibst den Funktionsnamen überall gleich, wo er erscheint.

von Niklas G. (erlkoenig) Benutzerseite


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.

: Bearbeitet durch User
von Dominik S. (domxnxks)


Lesenswert?

Danke! :) Damit lässt sich arbeiten und es besser zu verstehen lernen! 
:)

: Bearbeitet durch User
von Dirk B. (dirkb2)


Lesenswert?

Lernst du C oder C++?
Womit lernst du?

von Dominik S. (domxnxks)


Lesenswert?

C++ ich lerne gerade in der Schule... ich hab mir das Wissen so vom 
Unterricht her angeeignet bisher... Das war jetzt mein erstes 
Programm...

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

So lernt ihr in der Schule? Dann schau dir am Besten parallel ein gutes 
Buch an, damit du siehst wie es richtig geht. Viele Bücher sind leider 
auch nicht gut, daher hier eine Liste:

https://stackoverflow.com/a/388282

von Dirk B. (dirkb2)


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.

von Dominik S. (domxnxks)


Lesenswert?

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

von Dominik S. (domxnxks)


Lesenswert?

Ist das was der Erlkoenig geschrieben hat den C++? oder auch "nur" C?

von Theor (Gast)


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.

von Niklas G. (erlkoenig) Benutzerseite


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++.

von Theor (Gast)


Lesenswert?

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

Ja. Das ist C++. Das hat er auch ausdrücklich hingeschrieben. :-)

von Dirk B. (dirkb2)


Lesenswert?

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

Man kann das auch als "C mit cout" bezeichnen.
Aber die Aufgabe gibt für C++ nicht mehr her.
Das findest du ziemlich schnell bei Strings raus.

von Rolf M. (rmagnus)


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.

von Eric B. (beric)


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++?

von Dominik S. (domxnxks)


Lesenswert?

Also naja er hat schon in anderen Sprachen programmiert... aber C++ noch 
nicht... Und naja im ersten Jahr sind jetzt erstmal nur Grundlagen dran 
:D

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Dominik S. schrieb:
> Also naja er hat schon in anderen Sprachen programmiert... aber C++ noch
> nicht...

Ob es dann eine gute Idee ist das beizubringen... C++ ist eine der 
komplexesten Sprachen, die braucht schon ein paar Jahre zum Lernen. Zum 
Einstieg sind Python oder Java viel angenehmer.

von Dominik S. (domxnxks)


Lesenswert?

So will das die Schule, nicht wir :D

von Dominik S. (domxnxks)


Lesenswert?

Wie bringe ich eigentlich das Programm dazu, das es bei "else" wieder 
von Anfang an lädt?

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Dominik S. schrieb:
> Wie bringe ich eigentlich das Programm dazu, das es bei "else" wieder
> von Anfang an lädt?

Alles in eine while- oder do-while-Schleife verpacken.

von Dominik S. (domxnxks)


Lesenswert?

Alles oder nur die else?

von DPA (Gast)


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.

von A. S. (Gast)


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.

von Dominik S. (domxnxks)


Lesenswert?

Wie kann ich meine while Schleife denn auf diesen Code von Erlenkoenig 
anwenden? Und wie kann ich es machen, das wenn die Ausgabe von z.B. 
Addition erfolgreich ausgegeben worden ist, das es dann wieder zur 
Auswahl vom Anfang kommt? Also wo man auswählen kann, welche Rechenart

von Niklas G. (erlkoenig) Benutzerseite


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.

von x^2 (Gast)


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.

von Niklas Gürtler (Gast)


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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.