Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Prex

Frischling

  • »Prex« ist der Autor dieses Themas
  • Private Nachricht senden

1

09.08.2016, 21:23

CPP Neuling und ein Problem

Hallo alle zusammen,

ich bin neu in CPP und lerne schon eine Zeit alles nötige um diese Sprache zu erlernen.

Eine Frage muss ich zu meinem bedauern allerdings stellen ( da ich neu in diesem Forum bin ).Ich werde darauf hingewiesen das Zitat :"Im Normalfall gilt: Eine Frage pro Thema!", bedeutet dies nun wirklich das ich für zukünfitge Fragen immer wieder ein neues Thema erstellen muss ( Natürlich ist das kein Problem ), oder darf ein Thema nach einer beantworteten Frage auch um eine neue Frage editiert werden. An alle unter euch die jetzt vielleicht denken :" Kann der Neuling nicht lesen ?", doch ich kann Lesen möchte nur nicht das Froum mit gegebenfalls 1000 Themen "zu müllen" wenn alternativen bestehen.

Das aber wie gesagt nur Vorweg.

Ich habe mithilfe von Freunden angefangen mich an CPP zu wagen, allerdings möchte ich diese nicht für jede Kleinigkeit nerven ( Also werdet ihr genervt ;) :P , nur ein kleiner ulk ) nun die Grundzüge einer Programmierung sind bereits von anderen Projekten bekannt, allerdings ist für jeden der sich mit CPP auseinandersetz sofort ersichtlich das es eine Sprache mit unglaublichem Potenzial ist, aber für einen " Neuling " sehr Komplex.

Ich weiß ebenso das es einige unter euch geben wird die nun sagen :" Fang doch erstmal mit Java oder C an das ist einfacherer" , meine Antwort an diejenigen unter euch direkt vorweg.
Ich bin ein Mensch der auch gerne mal einen komplizierten Weg geht und natürlich könnte ich jetzt anfangen und mit Java etwas schreiben oder mit C aber, ich habe mich entschieden direkt CPP zu erlernen es mag schwieriger sein aber im Endeffekt ist es unsinnig darüber zu diskutieren ob man erst C lernt und dann die Besonderheiten von CPP oder ob man direkt mit CPP beginnt und überspitzt gesagt C parallel lernt.

Gut nun also endlich meine Frage und entschuldigt den langen Exkurs.

C-/C++-Quelltext

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
#include <iostream>

int main()
{
    char Name;
    int Alter;

    Name = "Max"
    Alter = 20

    std::cout << "Mein Name ist" << Name << std::endl;
    std::cout << "Mein Name ist nicht" << Name << std::endl;
    std::cout << "Mein Name ist eventuell" << Name << std::endl;

    std::cout << "Ich bin" << Alter << "Jahre alt" << std::endl;
    std::cout << "Ich bin nicht" << Alter << "Jahre alt" << std::endl;
    std::cout << "Ich bin heute" << Alter << "Jahre alt geworden" << std::endl;

    system("pause");

    return 0;



}


Das was in anderen von mir getesteten Programmen funktioniert nämlich das durch system("pause"); die Eingabeaufforderung wartet und ich sehen kann ob alles Funktioniert, funktioniert in diesem Fall nicht. Aber warum ?, Das Fenster öffnet sich so schnell und schließt sich so schnell das ich schon genau hinsehen muss. Ich weiß das der oben geschriebene Code langweilig ist und natürlich funktioniert dieser, aber ich wüsste gerne wieso system("pause"); in diesem Fall nicht funktioniert.

Ich bedanke mich bereits im voraus für alle Antworten.

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

2

09.08.2016, 21:36


C-/C++-Quelltext

1
2
3
char Name;
Name = "Max"
Alter = 20



der oben geschriebene Code langweilig ist und natürlich funktioniert dieser


Äh nein. Eigentlich dürfte der nicht funktionieren ;)
Da fehlen Semikolons und den Datentyp solltest du dir noch mal angucken.

Prex

Frischling

  • »Prex« ist der Autor dieses Themas
  • Private Nachricht senden

3

09.08.2016, 22:08

Nun gut das ist natürlich peinlich :P, aber wofür geht man schon in ein Forum. Wenn ich alles könnte müsste ich nicht Hilfe suchen :D.

Gut die Simikolons sind ersetzt und natürlich kann char nicht funktionieren xD, also versuchen wir dasselbe doch mal mit string ?.

Leider löst diess mein Problem nicht das Fenster verschwindet immernoch.

Hier der neue Code :

C-/C++-Quelltext

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
#include <iostream>
#include <string>


int main()
{
    string meinname;

        std::cout << "Bitte geben Sie ihren Namen ein" << std::endl;
        std::cin >> meinname;

        std::cout << "Mein Name ist" << Name << std::endl;
        

    int Alter;

        std::cout << "Bitte geben Sie ihr Alter ein" << std::endl;
        std::cin >> Alter;

        std::cout << "Ich bin" << Alter << "Jahre alt" << std::endl;

    system("pause");

    return 0;

}


Ok wo ist mein denk Fehler ... und ja aller Anfang ist wohl schwer.

4

09.08.2016, 23:13

Der Code da kompiliert so auch nicht, Max, da string in dem Fall unbekannt ist. Versuch es mal mit std::string... :P

system("pause") sollte nicht verwendet werden, da es nicht auf jedem System so funktioniert, wie du es erwarten würdest.
Eine Alternative, die vielleicht weniger hübsch sein mag, dafür aber überall funktioniert, wäre die Verwendung von std::cin.get(). Damit liest man aus dem Eingabebuffer den nächsten Character. Dabei ist allerdings darauf zu achten, dass der Eingabebuffer auch entsprechend leer ist, sonst kann es passieren, dass noch etwas im Buffer ist und einfach übernommen wird, wodurch wir keine Eingabe machen müssen!
Da es beim Einlesen dieses Eingabebuffers auch zu Problemen gekommen sein könnte, sollte man auch mögliche Error-Flags entfernen, die ein späteres Einlesen auch blockieren. Das ist sind einfach bestimmte Eigenschaften, die das Objekt std::cin annimmt, um dir auf Abruf sagen zu können, ob was schief gelaufen ist oder eben nicht.
(das würde dann beispielsweise mit good() oder bad() funktionieren, es gibt aber noch andere Wege)
Die Flags kann man mit einem Aufruf von clear() entfernen. Das Ignorieren des Zeugs im Buffer funktioniert durch ignore(std::numeric_limits<std::streamsize>::max(), '\n'). In Worten bedeutet dieser Funktionsaufruf: "Ignoriere alles im Buffer, wenn nötig bis zur auf dem System maximal möglichen Buffergröße, bis du auf den Character '\n' (also 'newline') stößt". Um allerdings std::numeric_limits verwenden zu können, muss man zusätzlich die Bibliothek limits einbinden. Letztlich bist du dann bei so einem Konstrukt wie dem folgendem:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <limits>

int main()
{
    int age = 0;
    std::cin >> age;
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    std::cout << "I'm " << age << " years old!" << std::endl;
    
    std::cout << "Press return to stop..." << std::endl;
    std::cin.get();

    return 0;
}

Bei Interesse kannst du damit auch online ein wenig mit herumspielen. :)

MfG
Check

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

09.08.2016, 23:21

Auch wenn system("pause"); nicht schön ist, sollte es unter Windows aber schon funktionieren.
Mich wundert eher, dass du hier offensichtlich nicht kompilierenden Code postest, aber trotzdem etwas über das Verhalten des Programms sagst. Kann es sein, dass dein Programm gar nicht kompiliert wird und du immer nur eine ältere, bereits kompilierte Version ausführst, in der noch kein system("pause"); drin war?

Prex

Frischling

  • »Prex« ist der Autor dieses Themas
  • Private Nachricht senden

6

09.08.2016, 23:24

Gut das ist mal eine Antwort über die man nachdenken muss :D. Ich danke dir. Jetzt heißt es Ärmel hochkrempeln und weiter geht es.
Auf die Idee den Input mit einem clear zu versehen ... könnte man auch selber kommen.

Dann schauen wir mal wann das nächste Problem auftaucht.

[ EDIT ] Wenn Scherfgen und ich parallel schreiben :P ich schaue mal ob du Recht hast.

Nun ich ziehe meinen Hut aber nun hast du mir ein neues Problem produziert oder eher ich mir selber :(.

Ich versuche das mal zu schildern : Nachdem ich es Gespeichert habe und neu Geöffnet habe, funktioniert mein Programm im ersten durchlauf wie folgt.

1. In der Konsole werde ich aufgefordert eine Taste zu drücken ohne zuvor eine Eingabe getätigt zu haben somit wird alles oberhalb der system("pause"); ignoriert, soweit ok aber anschließend erscheinen ich schätze 6-8 Zeilen in der Eingabeaufforderung, diese kann ich aber nicht Lesen weil die CMD sofort wieder verschwindet.

Nun das wirklich seltsame das mich wirklich verwirrt, versuche ich das Programm erneut auszuführen werde ich nicht darum gebeten eine Taste zu drücken diese 6-8 Zeilen erscheinen sofort wieder und die CMD schließt sich.

Warum ? ?(

Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »Prex« (09.08.2016, 23:48)


7

09.08.2016, 23:31

Auf die Idee den Input mit einem clear zu versehen ... könnte man auch selber kommen.

Das "clear" hat nichts mit dem Input per se zu tun, "der Input wird mit dem ignore versehen". Bevor du versuchst die Hintergründe zu verstehen, ist es sicherlich erstmal besser, wenn du "blind" einfach die Routine "clear, dann ignore nach dem Einlesen" benutzt. Wenn du dann mehr Erfahrung hast, wird das sicherlich auch besser verständlich sein.

MfG
Check

EDIT: Bitte poste deinen aktuellen und vollständigen Code.

Prex

Frischling

  • »Prex« ist der Autor dieses Themas
  • Private Nachricht senden

8

09.08.2016, 23:34

@ Checkmateing

Ich hatte nicht vor auch nur einen Code Schnipsel zu verwenden den ich nicht verstehe bzw. nicht kenne. ICh wollte nur damit sagen das mir nach 2 3 Antworten bereits klar wird, bzw. natürlich ich schon durch Freunde oder Bücher einen Eindruck habe wie Komplex es doch sein kann.

Aber danke für die Warnung :P

[EDIT]

C-/C++-Quelltext

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
#include <iostream>
#include <string>


int main()
{
    /*std::string meinname;

        std::cout << "Bitte geben Sie ihren Namen ein" << std::endl;
        std::cin >> meinname;

        std::cout << "Mein Name ist" << Name << std::endl;*/
    int Alter;

        std::cout << "Bitte geben Sie ihr Alter ein" << std::endl;
        std::cin >> Alter;
        std::cout << "Ich bin" << Alter << "Jahre alt" << std::endl;

    system("pause");

    return 0;



}

fraggr

unregistriert

9

09.08.2016, 23:35

Den beiden hier angebotenen Lösungsvorschlägen möchte ich noch anfügen, dass es sich dabei eigentlich um "Hacks" handelt. Dass sich das Fenster selbstständig wieder schließt mag dir vielleicht unerwünscht sein, ist aber dennoch das korrekte Verhalten. Normalerweise startet man Konsolenprogramme aus der Konsole heraus, also öffne einfach mal eine Eingabeaufforderung im entsprechenden Verzeichnis (Shift und Rechtsklick im Explorer sollte dir dazu einen Menüeintrag anbieten) und starte das Programm, indem du dessen Dateinamen eintippst. Wenn du das probierst siehst du auch, warum die "Pause" am Ende ein Problem ist.

Wenn du dein Programm mit einem Doppelklick trotzdem direkt starten können willst, würde ich stattdessen vorschlagen eine Stapelverarbeitungsdatei anzulegen und darin das Programm, gefolgt von pause, aufzurufen. Sollte zum gleichen Ergebnis führen, aber dein Programm selbst bleibt damit etwas "korrekter".

Prex

Frischling

  • »Prex« ist der Autor dieses Themas
  • Private Nachricht senden

10

09.08.2016, 23:40

Ok @fraggr aber dennoch stellt sich die Frage warum werde ich garnicht erst nach einer Eingabe gefragt ?.

Werbeanzeige