C++ Benötige Korrektur beim Syntax

TheWayOfStudy

Newbie
Registriert
Apr. 2020
Beiträge
5
Ich grüße wertes Volk,

Ich habe eine Aufgabe bekommen es geht darum eine Mathe Funktion über ein Header file zu referre
Könnt ihr mir bei folgendem Problem helfen:

Main script:

Code:
#include <iostream>
#include <stddef.h>
#include "Functions.h"

using namespace std;

unsigned int test = 69;

int math();

int main()
{
    test = math(5, 3);
    std::cout << test << std:endl;
    std::cin.get();
    return 0;
}

Header file:

Code:
#pragma once
#include <iostream>

int math(int a,int b)
{
    std::cout << a * b << std::endl;
    return a * b;
}

Dieser Code ist leider fehlerhaft was mache ich falsch? Im übrigen bin ich Anfänger aber das solltet ihr ja am Code feststellen können.
Es handelt sich um eine "console application" nur um das Prinzip nachvollziehen zu können.
 
Das frage ich mich ja auch kann nicht builden der Debugger sagt : |In function 'int main()':|
|error: found ':' in nested-name-specifier, expected '::'| Das sagt mir als Anfänger nichts.
 
Du hast ein Doppelpunkt beim std::endl vergessen (Zeile 14, main script).
Die Fehlermeldung sagt: "Ich habe ein ':' gefunden, habe aber '::' erwartet. Bitte hilf mir, weil ich das selbst nicht fixen kann LOL. Viele Grüße, Dein Compiler :heul:"
 
  • Gefällt mir
Reaktionen: cpp_beginner, BeBur, bog und 4 andere
In Zeile 14 fehlt ein Doppelpunkt
 
Ah vielen dank jetzt geht es oweia einen Flüchtigkeitsfehler kannst du mir nun vielleicht helfen das ganze komplexer zu gestalten so damit man damit eindruck schinden kann? Kann man es besser schreiben?
 
In den Headerfiles werden nur die Prototypen der Funktionen definiert.
Also:
Code:
#pragma once
#include <iostream>

int math(int a, int b);

In der dazu gehörigen C Datei function.c würdest du dann die eigentliche Funktion schreiben:
Code:
#include "Function.h"

int math(int a,int b)
{
    std::cout << a * b << std::endl;
    return a * b;
}

Edit: Natürlich für C++ nicht umbedingt eine C-Datei sondern eher eine CPP-Datei, wobei in der Regel beides akzeptiert wird.
 
Wie deklariere ich den dann das ganze? Also in welcher verbindung steht denn die cpp mit dem header file könntest du mir das ein wenig erklären Herr Lehrer
 
Du weißt wahrscheinlich nicht was
C++:
using namespace std;
macht, denn du verwendest weiterhin die den namespace-prefix std weiter unten in main().

Hier kannst du mehr dazu lesen: using namespace

auch das
C++:
int math();
ist unnötig, da du die math-Funktion über das
C++:
#include "Functions.h"
definierst und deklarierst.

Nun zu deiner letzten Frage, auch hier kann die C++ Reference weiterhelfen:
So deklarierst du Funktionen
 
  • Gefällt mir
Reaktionen: Poati
Header Files -> Definitionen, Funktionssignaturen, etc.
cpp/c Files -> Implementierung

Speziell die main.c/cpp ist dann der Eintrittspunkt, wo du deine geschriebenen Funktionen aufrufen kannst.
 
Vielen dank für die Hilfe ich habe keine weiteren Fragen und die Links füllen meine Wissenslücke toll.
Jetzt kann der Unterricht weitergehen. Auf ComputerBase ist immer verlass.
 
In der Regel besteht ein größeres C oder C++ Projekt aus einer main.c(pp)-Datei und vielen "Zusatzdateien".
Die Zusatzdateien enthalten u.A. weitere Funktionen, Definitionen, Typen oder bei C++ auch Klassen und Namespaces. In der Regel werden diese nach logischen Zusammenhängen gruppiert und dann symetrisch mit <modul>.cpp und <modul>.h definiert und implementiert. Die cpp und h Dateien müssen nicht den gleichen Namen haben, der Compiler und der Linker suchen sich alles zusammen. Für größere Projekte ist es aber "extemly recommended", dass man bei der Namensgebung der Dateien die selbe Bezeichnung wählt.

In den Headerdateien werden die Prototypen der Funktionen als auch (globale) Typdefinitionen deklariert. Jede andere Datei, die diese Header-Datei inkludiert, kennt damit den Namen und die Parameter der Funktionen.
In den CPP-Dateien werden dann die Funktionen konkret mit dem vollständigen Programmcode umgesetzt. Die CPP und H Dateien können natürlich wiederum weitere Sub-Headerdateien inkludieren.

Solltest du dann später auch anfangen, deinen Code umfangreich zu dokumentieren, würdest du in den Headerdateien auch die Funktionsbeschreibung einfügen.
Ergänzung ()

Um noch zwei Dinge hinzuzufügen, warum diese Aufteilung sinnvoll ist:
1. Theoretisch kannst du den gesamten Code in einer einzigen Datei schreiben. Damit würdest du aber bei großen Projekten jede Übersicht verlieren. Diese Aufteilung ist als aller erstes dafür gedacht, den Code einfacher zu verwalten. Interessanterweiße sucht der Compiler alle verlinkten Headerdateien und kombiniert diese wieder in eine große Datei.

2. Es ist mit den C(PP) und H Dateien möglich, Programmcode "gesichert" weiterzugeben. Du könntest deine cpp Datei mit dem Compiler zu einer Object-Datei compilieren und diese mit der Headerdatei jemanden geben. Dieser kann die Funktionen, die in der Headerdatei deklariert sind, ohne Einschränkungen nutzen, würde aber niemals* deinen Programmcode sehen können. Dadurch kannst du deinen eigentlichen Programmcode schützen.

* Sage niemals nie
 
Zuletzt bearbeitet:
Schattenan schrieb:
2. Es ist mit den C(PP) und H Dateien möglich, Programmcode "gesichert" weiterzugeben. Du könntest deine cpp Datei mit dem Compiler zu einer Object-Datei compilieren und diese mit der Headerdatei jemanden geben. Dieser kann die Funktionen, die in der Headerdatei deklariert sind, ohne Einschränkungen nutzen, würde aber niemals* deinen Programmcode sehen können. Dadurch kannst du deinen eigentlichen Programmcode schützen.

* Sage niemals nie
wie läuft das dann eigentlich mit Modules, welche bekanntlich ja den #include-Mechanismus ersetzen?
 
TheWayOfStudy schrieb:
kannst du mir nun vielleicht helfen das ganze komplexer zu gestalten so damit man damit eindruck schinden kann?
was bringt das wenn es nicht von dir ist? Du kannst es doch anscheinend noch nicht, welchen damit falschen Eindruck soll das bei wem erwecken?

Eindruck haettest du ja schon mal schinden koennen, wenn du die Compiler Meldung einfach nur gelesen haettest. Da stand doch wirklich 1 zu 1 da was nicht passte. Schade, wenn man bedenkt wie viel Arbeit darin steck und wie hilfreich je nach Sprache solche Meldungen heutzutage sind. Es gibt da zudem genug andere Sprachen, wo die Fehlermeldung weniger nuetzlich sind und man auch noch selbst denken muss.
Hauptteil beim Programmieren (lernen) ist uebrigens sehr viel Lesen und sich Wissen aneignen. Und vor allem zu wissen wo was steht, bei vielen Problemen bist du nicht der erste - viel wichtiger allerdings, Copy und Paste von Loesungen bringt einen oft langfristig nicht weiter, wenn man sich das dann nicht ansieht und versucht zu verstehen. So zumindest meine Erfahrung.

Naja, viel Erfolg weiterhin.
 
  • Gefällt mir
Reaktionen: I'm unknown
new Account() schrieb:
wie läuft das dann eigentlich mit Modules, welche bekanntlich ja den #include-Mechanismus ersetzen?
Im aktuellen VS 2019 geht das schon, der Modul-Quelltext muss *.ixx heissen:
vs2019modules.jpg

Es wird hier lediglich eine MathModule.obj-Datei erzeugt, die wohl das benötigte Interface enthält. Es ist eine Binärdatei, es wird also hier (hoffentlich) irgend eine Konvention existieren, wie das auszusehen hat.
 
Zuletzt bearbeitet:
Zurück
Oben