PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ lernen


Dunkelwald
2015-10-26, 17:55:12
Ich bin gerade dabei mir C++ beizubringen und besitze außer rudimentären Pascal-Kenntnissen kaum Erfahrung im Programmieren. Als Lerngrundlage verwende ich folgendes Ebook: http://www.heise.de/download/c-programmierung-1178363.html.

Ich komme damit sehr gut zurecht und habe es auch schon zu etwa 2/3 durchgearbeitet. Allerdings ist bekanntlich die praktische Anwendung das A und O - kann mir jemand eine didaktisch gute Sammlung an Programmieraufgaben (von einfach bis komplex, incl. Musterlösungen) für C++ empfehlen? Das würde mir sehr helfen!

Auch Tipps für weitere gute Bücher / Vorlesungsscripts, o.Ä. zum Lernen (müssen nicht kostenlos sein) sind natürlich sehr willkommen!

Trap
2015-10-26, 19:16:45
Etwas älter, aber nicht veraltet und mit Beispielaufgaben für Programmieranfänger:
http://www.informit.com/store/accelerated-c-plus-plus-practical-programming-by-example-9780201703535 oder in Deutsch http://www.pearson-studium.de/9783827372581.html

hadez16
2015-10-27, 07:40:40
Wir hatten damals den Borland C++ Builder genutzt um dann auch in die GUI-Programmierung mit dem VCL-Framework vorzustoßen.

Auf der einen Seite muss man C++ anwenden und auf der anderen Seite fällt es sehr leicht mit der VCL was GUI-mäßiges zu bauen.

Damals gabs das beim Lehrer unter dem Pult durch, keine Ahnung wie man das heutzutage bekommt.

Colin MacLaren
2015-10-27, 08:17:26
C/C++: Das umfassende Lehrbuch von Martin Guddat und Ulrich Kaiser

Entspricht dem Inhalt der Programmiervorlesungen der ersten zwei Semester eines Inforamtikstudiums inkl. sehr viele Übungsaufgaben. Man baut erstmal sehr viel von Hand, aber es hilft es sehr gut zu verstehen wie das ganze aus den Libraries funktioniert, was die Grundlage ist damit man später die richtigen Werkzeuge auswählen kann.

minos5000
2015-10-27, 09:27:46
Wenn dir Englisch nichts ausmacht kann ich auch das hier empfehlen

http://www.amazon.de/dp/0321113586/ref=rdr_ext_sb_ti_sims_2

bzw

http://www.amazon.de/Effective-Specific-Addison-Wesley-Professional-Computing/dp/0321334876

Dunkelwald
2015-10-27, 10:56:10
Vielen Dank allerseits für die Tipps! Ich habe mir jetzt mal das Buch von Guddat u. Kaiser bestellt; das scheint sich ja später auch als Nachschlagewerk gut zu eigenen.

Grundkurs
2015-10-27, 12:34:29
Falls du C++ anhand "praktischer Fälle" lernen willst kann ich dir ansonsten auch SFML-Game-Development
http://www.amazon.de/SFML-Game-Development-Jan-Haller/dp/1849696845/ref=sr_1_1?ie=UTF8&qid=1445945381&sr=8-1&keywords=SFML
sehr ans Herz legen.
In dem Buch wird von der Pieke auf bis zum bitteren Ende die Entwicklung eines Cross-Plattform 2D-Sidescroll-Shooters mit C++ beschrieben.
Die Autoren sind Spieleentwickler und nutzen viele der neuen C++11/14 Features auf sinnvolle Art. Gleichzeitig werden "alte Features" wie etwa Pointer, Enums als Bitflags etc. angewendet und zwar nur dann, wenn es auch wirklich Sinn macht. Man kriegt einen guten Eindruck wie vielseitig, mächtig und elegant C++ sein kann. Der Preis ist, dass es gerade für Anfänger eventuell zu anspruchsvoll sein könnte, mir hat nicht nur einmal die Rübe gequalmt. speziell bei so Schmankerln wie
https://github.com/SFML/SFML-Game-Development-Book/blob/master/08_Graphics/Include/Book/Command.hpp

Dunkelwald
2015-10-28, 14:00:14
Falls du C++ anhand "praktischer Fälle" lernen willst kann ich dir ansonsten auch SFML-Game-Development
http://www.amazon.de/SFML-Game-Development-Jan-Haller/dp/1849696845/ref=sr_1_1?ie=UTF8&qid=1445945381&sr=8-1&keywords=SFML
sehr ans Herz legen.
In dem Buch wird von der Pieke auf bis zum bitteren Ende die Entwicklung eines Cross-Plattform 2D-Sidescroll-Shooters mit C++ beschrieben.
Die Autoren sind Spieleentwickler und nutzen viele der neuen C++11/14 Features auf sinnvolle Art. Gleichzeitig werden "alte Features" wie etwa Pointer, Enums als Bitflags etc. angewendet und zwar nur dann, wenn es auch wirklich Sinn macht. Man kriegt einen guten Eindruck wie vielseitig, mächtig und elegant C++ sein kann. Der Preis ist, dass es gerade für Anfänger eventuell zu anspruchsvoll sein könnte, mir hat nicht nur einmal die Rübe gequalmt. speziell bei so Schmankerln wie
https://github.com/SFML/SFML-Game-Development-Book/blob/master/08_Graphics/Include/Book/Command.hpp

Danke für den Tipp. Ich denke das könnte sehr interessant sein wenn ich bissl tiefer in der Materie drin stecke. Aktuell habe ich glaube schon einiges theoretisch nachvollzogen und hoffentlich auch kapiert, jetzt möchte ich erstmal an einfacheren Beispielen das Gelernte anwenden, so dass die Konzepte in Fleisch un Blut übergehen.

Das Buch von Kaiser und Guddat ist heute angekommen und macht nen super Eindruck. Thx nochmal.

bagbear
2015-10-28, 19:16:00
Uni Vorlesungsskripte sind m.M.n die idealen Einstiegstutorial zum Thema C++, manchmal sind da auch gut verständliche und nachvollziehbare Beispiel Codes enthalten:smile:

Nakai
2015-10-28, 22:26:37
Bitte sofort mit C++11 und C++14 einsteigen.

Wichtige Punkte, welche gelernt werden müssen:
- Pointer und Referenzen verstehen
- Templates und Generics
- Variablen Speicherbereiche (Stack, Heap, Local, ReadOnly...)
- Compiler-Flags, Linker-Flags

Wer mit C++ umgehen kann, kommt mit den meisten anderen OO-Programmiersprachen auch problemlos klar. C++ ist gelegentlich etwas umständlicher.

Gast
2015-10-29, 16:30:40
Uni Vorlesungsskripte sind m.M.n die idealen Einstiegstutorial zum Thema C++, manchmal sind da auch gut verständliche und nachvollziehbare Beispiel Codes enthalten:smile:

Wo finde ich solche Skripte ?

bagbear
2015-10-29, 17:24:41
Wo finde ich solche Skripte ?

Über Google findet man viele Uni verlinkte, nicht passwortgeschützte Vorlesungsskripte als PDF Dateien, aber ich helfe dir gerne :)

Hier habe ich ein Beispiel für dich... => http://www2.informatik.hu-berlin.de/~ahrens/c++vorlesung/skript/C++Skript2001.pdf

Käsetoast
2015-10-29, 23:57:08
Also ich habe auch mehrere Bücher und Ansätze hinter mir und würde rückblickend das Buch "Der C++ Programmierer" empfehlen. Angenehm und verständlich geschrieben, guter Aufbau, ziemlich umfassend, nette Gimmicks wie eine Buchbindung durch die sich das Buch nicht von selbst zuklappt und man es so angenehm irgendwo hinlegen und daraus lesen kann und natürlich auch mit Beispielen. Auch preislich finde ich es äußerst angenehm dafür, dass es schon ein ordentlicher Brummer ist...

Siehe auch hier:
http://www.cppbuch.de/

http://www.amazon.de/-Programmierer-lernen-professionell-anwenden-L%C3%B6sungen/dp/3446443460/ref=sr_1_1?ie=UTF8&qid=1446159221&sr=8-1&keywords=der+c%2B%2B+programmierer

Wird auch stets aktuell gehalten wie jüngst eben die C++14 Fassung...

Grivel_
2015-11-02, 22:22:24
Hier hast du mal eine längere Übungsaufgabe von meiner FH.

http://workupload.com/file/lLiLYhtX


War die Übungsaufgabe zum Modul "Einführung in die OOP mit C++ für embedded Systems".

Ich mag, dass man hier nach und nach etwas grösseres bauen kann.
Vielleicht ja was für dich. Kannst ja noch einen drauflegen und das ganze mit QT angehen.

Gast
2015-11-04, 10:50:43
Ich finde "Die C++-Programmiersprache" von Bjarne Stroustrup am besten.

Dunkelwald
2015-11-04, 12:26:55
Hier hast du mal eine längere Übungsaufgabe von meiner FH.

Thx! Da werde ich mich bei Zeiten dran machen, aktuell wäre mir das noch etwas zu fortgeschritten. ;)

Gauß
2015-11-16, 12:25:49
Falls du C++ anhand "praktischer Fälle" lernen willst kann ich dir ansonsten auch SFML-Game-Development
http://www.amazon.de/SFML-Game-Development-Jan-Haller/dp/1849696845/ref=sr_1_1?ie=UTF8&qid=1445945381&sr=8-1&keywords=SFML
sehr ans Herz legen.
In dem Buch wird von der Pieke auf bis zum bitteren Ende die Entwicklung eines Cross-Plattform 2D-Sidescroll-Shooters mit C++ beschrieben.
Die Autoren sind Spieleentwickler und nutzen viele der neuen C++11/14 Features auf sinnvolle Art. Gleichzeitig werden "alte Features" wie etwa Pointer, Enums als Bitflags etc. angewendet und zwar nur dann, wenn es auch wirklich Sinn macht. Man kriegt einen guten Eindruck wie vielseitig, mächtig und elegant C++ sein kann. Der Preis ist, dass es gerade für Anfänger eventuell zu anspruchsvoll sein könnte, mir hat nicht nur einmal die Rübe gequalmt. speziell bei so Schmankerln wie
https://github.com/SFML/SFML-Game-Development-Book/blob/master/08_Graphics/Include/Book/Command.hppDieses "Schmankerln" ist eine perfekte Demonstration von der massenhaften Zwangsneurose einer voellig unsinnigen und destruktiven Abstraktion.

Was Du da als Code-Beispiel auffuehrst, sieht nach dem scheusslichem visitor pattern aus, was hoechstwarscheinlich auf einem absurd abstrahiertem Szenengraph operiert.
Schwachsinn wie dieser in Lehrbeispielen ist der Grund, warum selbst Textverarbeitung auf Rechnern mit Milliarden von Gattern Wartezeiten vom Nutzer abverlangt, und warum Softwareentwicklung trotz weitaus maechtigerer Werkzeuge nicht zeiteffektiver geworden ist.

Zum Fragenden: Dinge wie Polymorphismus sollten definitiv das LETZTE sein, was man zum beherrschen von C/CPP erlernt.

Novum
2015-11-16, 16:36:58
Kann man schon so machen, dann ist es aber halt scheisse langsam. dynamic_cast ist intern ein Zeichenketten-Vergleich, das ist schlimmer als ein virtual-Aufruf :3

del_4901
2015-11-16, 17:49:14
Kann man schon so machen, dann ist es aber halt scheisse langsam. dynamic_cast ist intern ein Zeichenketten-Vergleich, das ist schlimmer als ein virtual-Aufruf :3
dynamic_cast ist nur fuers debugging. Das machen wir auch so. Der functor ist halt ein garantierter prediction und evtl. ein icache miss. Der eigentlich bedenkliche Part ist der Overuse an lambdas und der damit verbundenen unklaren LifeTime von captures.

Novum
2015-11-17, 00:18:00
Ach da ist ein assert, nich gescheit drauf geschaut :)

hell_bird
2015-11-17, 01:32:56
dynamic_cast ist intern ein Zeichenketten-Vergleich, das ist schlimmer als ein virtual-Aufruf :3
Wie kommst du auf einen Zeichenkettenvergleich? Hast du eine Quelle dafür?

Der eigentlich bedenkliche Part ist der Overuse an lambdas und der damit verbundenen unklaren LifeTime von captures.
Was ist an der lifetime von captures unklar?

Ectoplasma
2015-11-17, 08:07:54
http://workupload.com/file/lLiLYhtX


Nette Aufgabe, aber was ich echt nie verstehen werde ist, warum man diesen grotten schlechten Mix aus deutsch und englisch macht. Leute bitte, in der Industrie könnte man für sowas ausgepeitscht werden. Ausnahmen sind deutsche Fachbegriffe, die im englischen wenig Sinn ergeben.

Novum
2015-11-17, 09:02:23
Wie kommst du auf einen Zeichenkettenvergleich? Hast du eine Quelle dafür?
Kurze Antwort: Ja, schau dir das Disassemblat an. Oder benutz Google "dynamic_cast strcmp".

Lange Antwort: Es kommt aber natürlich auf die runtime an, aber der einzig zuverlässige Weg mit dynamisch nachgeladenen libraries ist ein Zeichenketten-Vergleich oder vergleichbares. Einen Wert zu vergleichen reicht definitiv nicht. GCC schummelt, aber das ist eigentlich ein Bug. MSVC ruft def. strcmp auf. Wir reden hier von 100-200 Takten.

Und selbst wenn es nur 20 Takte sind hat man von der Performance her schon einen Fehler gemacht wenn man Arrays mit Pointern auf nicht sortierte polymorphische Typen hat. Kommt natürlich darauf an ob die wirklich eine große Rolle spielt.

del_4901
2015-11-17, 10:59:23
Was ist an der lifetime von captures unklar?
An den captures selber nicht, aber wenn man wahllos Events per Referenz in eine queue schiebt dann finde ich das schon sehr Fehleranfällig. Immerhin sind da auch Texturen und Rendertagets dabei. Was passiert denn beispielsweise wenn das Fenster vergrössert oder verkleinert wird? Dann ist auch mal schnell constRef vergessen und dann liegt das Ding auf dem Stack min nem super tollen Stackstomp.

Yavion
2015-11-17, 20:32:07
Also wenn C++, dann gleich 11 oder 14.

Wenn man unbedingt ein älteres Werk benutzen will, dann in Kombination hiermit:
https://github.com/isocpp/CppCoreGuidelines

Ansonsten finde ich "Der C++ Programmierer" (s. Beitrag von Käsetoast) auch recht gut.

Godmode
2015-11-17, 20:52:48
Wir haben damals C++ Primer verwendet. Dicker Wältzer, aber da stand alles wichtige drinnen. Gibts wohl auch als Neuauflage mit den neuen ISO Standards.

Gast
2015-11-17, 22:44:05
stackoverflow.com uralt und einer der Erstes wenns um C++ geht.

Novum
2015-11-18, 05:27:33
Auf stackoverflow steht jede Menge Unsinn an erster Stelle. Würde ich so nicht ohne eine große Priese Salz empfehlen.

Godmode
2015-11-18, 08:13:34
Auf stackoverflow steht jede Menge Unsinn an erster Stelle. Würde ich so nicht ohne eine große Priese Salz empfehlen.

Vor allem bekommt man dort keinen Gesamtüberblick über die Sprache. Stacko ist oft nützlich bei kleineren Problemen.

Novum
2015-11-18, 10:10:06
Ich halte es selbst dafür für gefährlich. Viel zu viele Trottel.

Beispiel: Es hat mal einer gefragt wie man einen int zum nächsten power of two aufrundet und eine Antwort mit 50 upvotes war pow(2, ceil(log(x)/log(2))) ;D

Godmode
2015-11-18, 10:31:19
Ich nutze es recht oft bei der Fehlersuche. Aber du hast schon recht, man findet dort wirklich viel Mist.

Sewing
2015-11-18, 10:43:57
Ich benutzt auch C++ Primer 5th Edition, ist das noch up to date?


Desweiteren bin ich momentan auf der Compiler/Editor Suche. Mit Eclipse bekomme ich den berüchtigten Binary failure error, den ich bislang nicht umgehen konnte.


Welche Arbeitsumgebung (vielleicht mit Anleitung wie diese zu installieren ist) könnt ihr empfehlen?

Godmode
2015-11-18, 10:45:02
Wenn ich mit C++ was machen muss, verwende ich Visual Studio.

Sewing
2015-11-18, 10:47:33
das ist aber kostenpflichtig oder?

Godmode
2015-11-18, 10:54:40
Es gibt eine gratis Express Edition. Ich weiß aber nicht wie gut VS für Multiplattformentwicklung geeignet ist.

Exxtreme
2015-11-18, 12:21:55
Ich weiß aber nicht wie gut VS für Multiplattformentwicklung geeignet ist.
VS und Multiplattform eher gar nicht. Wenn man Vollkasko-C++-Entwicklung haben will dann lieber Eclipse CDT oder Qt Creator oder Netbeans C++ nehmen.

Sewing
2015-11-18, 13:02:52
Eclipse CDT bekomme ich eben wegen oben genanntem Problem nichts ans Laufen oO

Chris Lux
2015-11-18, 13:14:25
Für einen Anfänger: Nimm VS2015 Express.

Wenn man nur Standard-Features benutzt ist das mit dem Cross-Platform auch kein Problem. Da gibt es später nur den Weg über ein andere Build-System, bspw. CMake, welches dann VS Solution or GNU Makefiles generiert.

Für den Anfang nicht an sowas festhängen. Loslegen...

Demirug
2015-11-18, 13:22:15
Express gibt es nicht mehr

Das Ding heißt jetzt "Visual Studio 2015 Community"

Exxtreme
2015-11-18, 13:32:33
Express gibt es nicht mehr

Das Ding heißt jetzt "Visual Studio 2015 Community"
Doch doch, die Express-Version gibt es weiterhin:

https://www.visualstudio.com/de-de/downloads/download-visual-studio-vs.aspx

Sewing
2015-11-18, 14:00:59
versuche es jetzt mit netbeans C++. Das habe ich bei Java Programmierung immer verwendet in den letzten Jahren

Demirug
2015-11-18, 14:12:31
Doch doch, die Express-Version gibt es weiterhin:

https://www.visualstudio.com/de-de/downloads/download-visual-studio-vs.aspx

OK ganz versteckt wenn man extra danach sucht. Gibt aber eigentlich keinen guten Grund privat eine der Express Versionen zu nehmen da die Community viel mehr kann.

Sewing
2015-11-18, 14:40:19
was muss ich denn neben der community version noch installieren ?

del_4901
2015-11-18, 14:55:03
Windows SDK koennte sinn machen

Chris Lux
2015-11-18, 14:55:16
Nix...

Edit: Das SDK sollte eigentlich mitkommen.

Sewing
2015-11-18, 15:57:24
nervig wie lange die installationen hier brauchen. Visual Studio ca. 2 Stunden

Godmode
2015-11-18, 16:06:54
nervig wie lange die installationen hier brauchen. Visual Studio ca. 2 Stunden

Woot? Installierst du von ner Festplatte?

Sewing
2015-11-18, 16:26:38
ich führ einfach die .exe auf meiner internen HD aus

Dunkelwald
2015-11-18, 16:53:31
nervig wie lange die installationen hier brauchen. Visual Studio ca. 2 Stunden

Das hat bei mir auch etwas gedauert, aber keine 2 Stunden... :eek:

Btw: Ich programmiere aktuell zu Übung ein selbst erdachtes RPG-System, also Klassen, Stats und deren Auswirkungen, Kampfsystem, Items mit Auswirkung auf die Stats, usw. Damit kann man eigentlich alles super üben, insbesondere OOP, Vererbung, usw. Zudem kann man das immer weiter erweitern und verkomplizieren. *g*

Programmieren macht echt Spass, aber man muss schon Energie investieren. So auf die Fixe is nich...

Sewing
2015-11-18, 16:58:30
werde mir das hier mal ansehen

https://www.coursera.org/course/cplusplus4c

auch wenn ich mit C bisher wenig zu tun hatte. btw, weiss jemand, ob sich C++ auch für numerische Berechnungen eignet?

Grundkurs
2015-11-18, 17:39:16
Das hat bei mir auch etwas gedauert, aber keine 2 Stunden... :eek:
Die Installationsdatei für VS ist selten größer als ein paar MB, aber wenn man die erstmal startet, lädt sie während des Installationsvorgangs einige GB runter (bei Visual Studio Community Edition sinds 4 GB), je nach Leitung kann sich das ewig ziehen.

Sewing
2015-11-18, 18:26:07
Wollte gerade in VS Community den toggle comment shortcut ändern. Wie genau mache ich das? irgendwie funktioniert das nicht


Weiterhin bin ich in nem drop down menu über eine Auswahl gestolpert, in der ich maximal C++ 6 auswählen kann. Ich hatte in diesem Thread hier irgendwas gelesen von C++11 oder so.

Hat das etwas damit zu tun?

http://666kb.com/i/d3x83ka1hsurvjds0.png

Novum
2015-11-18, 18:37:27
Nein, das ist nur die Voreinstellung fuer die Hotkeys.

Ectoplasma
2015-11-18, 21:30:26
nervig wie lange die installationen hier brauchen. Visual Studio ca. 2 Stunden

Hast du alles installiert oder nur C++? Community C++ 2015 dauert keine 10 Min. von der Festplatte.

Käsetoast
2015-11-18, 23:07:08
auch wenn ich mit C bisher wenig zu tun hatte. btw, weiss jemand, ob sich C++ auch für numerische Berechnungen eignet?
Mit C++ kannst du alles machen und das sogar sehr effizient. Ich habe selber mal in OpenFOAM gewerkelt - das dient der CFD Simualtionen und ist OpenSource, so dass man im Quellcode arbeiten kann. Ein anderes Beispiel das mir einfällt, wo ich aber nur reingeschnuppert habe ist Z88. Auch OpenSource, nur diesmal eine FEA Software...

Ich glaube allerdings nicht, dass du viel "alteingesessene" Software in der Richtung findest, wo du C++ Schnittstellen hast. Reines C hat man hingegen öfters mal, aber die, die wirklich länger am Markt sind nutzen meist Fortran, weil da einfach eine Jahrzehnte alte Codebasis besteht. Ich muss Fortran gerade auch lernen - durchaus interessant, aber selbst bei den neueren Varianten in meinen Augen vom Grundaufbau her sehr umständlich im Vergleich zu C++. Wobei den ein oder anderen Vorteil hat's natürlich auch, aber vom Grundstil her gefällt mir C++ dann doch merklich besser. Zumindest solange wie es nicht um Template Code geht - da musste ich an OpenFOAM an einer Stelle nämlich mal tiefer eingreifen wo alles in Templates formuliert war, was ich vom Grundsatz nachvollziehen konnte, aber in der Handhabung unglaublich schrecklich war - zumindest wenn man sich quasi ohne nennenswerte Dokumentation da reinfuchsen soll. Habe seitdem eine gewisse Abneigung gegenüber Templates... ;D

Exxtreme
2015-11-19, 10:31:43
werde mir das hier mal ansehen

https://www.coursera.org/course/cplusplus4c

auch wenn ich mit C bisher wenig zu tun hatte. btw, weiss jemand, ob sich C++ auch für numerische Berechnungen eignet?
Für numerische Berechnungen eignet sich C++ auch. Nur wird hier recht oft Fortran benutzt da die Bibliotheken fertig und sehr ausgereift sind.

Wenn du mutig bist dann gibt es auch noch Julia.

http://julialang.org/

Sewing
2015-11-19, 12:30:03
Julia verwendet ein bekannter von mir für FEM. Hat da seinen eigenen Code geschrieben und ist überzeugt davon. Ich weiss nur, dass es Matlab-ähnlichen Syntax hat aber sehr viel schneller ist.

Wieso mutig?

Exxtreme
2015-11-19, 12:48:38
Wieso mutig?
Weil Julia noch recht neu ist und man sich oft auf ungeteertem Terrain bewegt wenn man es nutzt. Die Sprache/die Compiler können auch größere Bugs enthalten und es kann gut sein, dass da öfter neue Sachen hinzukommen und welche rausfliegen etc.

Sewing
2015-11-19, 14:06:33
was hältst du persönlich von Julia?

Sewing
2015-11-19, 14:14:34
sehe ich das richtig, dass eine Referenz auf eine bestehende Variable nichts anderes ist, als eine weitere Möglichkeit den Inhalt, der in der Variablen steht anzusprechen?

Also einfach ein weiterer Bezeichner, der sich den Inhalt von der gleichen Speicheradresse holt?

Ectoplasma
2015-11-19, 19:06:36
sehe ich das richtig, dass eine Referenz auf eine bestehende Variable nichts anderes ist, als eine weitere Möglichkeit den Inhalt, der in der Variablen steht anzusprechen?

Also einfach ein weiterer Bezeichner, der sich den Inhalt von der gleichen Speicheradresse holt?

Das siehst du richtig. Und je nach Konstrukt, kann der Compiler die Referenz komplett weg optimieren, oder speichert die Referenz intern wie einen Pointer ab.

Exxtreme
2015-11-20, 09:08:23
was hältst du persönlich von Julia?
Ich persönlich kenne Julia nicht. Aber da du numerische Berechnungen erwähnt hast fiel mir diese Sprache ein. Da sie dafür entwickelt wurde.
sehe ich das richtig, dass eine Referenz auf eine bestehende Variable nichts anderes ist, als eine weitere Möglichkeit den Inhalt, der in der Variablen steht anzusprechen?

Also einfach ein weiterer Bezeichner, der sich den Inhalt von der gleichen Speicheradresse holt?
Ja, das siehst du richtig. Man hat Referenzen eingeführt weil der bisherige Umgang mit und das Verständnis von Zeigern anscheinend nicht so zufriedenstellend war.

Sewing
2015-11-20, 13:51:15
Zwei Fragen:

1. Wieso sollte eine Funktion geprototyped werden, wenn ich sie weiter unten sowieso definiere? Ich weiss, dass man den Prototyp in ne Header Datei auslagern kann/soll aber den Sinn des Ganzen versteh ich nicht

2. Bei dem nachfolgenden Programm werden zwei Adressen an die Funktion übergeben. Im Funktionsrumpf wird dereferenziert und dann die Werte vertauscht. Heisst das, es werden nach wie vor die Werte miteinander vertauscht oder die Adressen?


1: #include <iostream>
2:
3: void swap(int *px, int *py);
4:
5: int main()
6: {
7: int x = 5, y = 10;
8: std::cout << "Vor der Vertauschung x: " << x << " y: " << y << std::endl;
9: swap(&x,&y);
10: std::cout << "Nach der Vertauschung x: " << x << " y: " << y << std::endl;
11: return 0;
12: }
13:
14: void swap (int *px, int *py)
15: {
16: int temp;
17: temp = *px;
18: *px = *py;
19: *py = temp;
20: }

Exxtreme
2015-11-20, 14:15:26
1. Ist ein uraltes Relikt aus C-Zeiten. Früher gingen die Kompiler den Sourcecode Zeile für Zeile durch. Das bedeutet, man musste die Reihenfolge in der die Prozeduren implementiert waren strikt einhalten. Man konnte z.B. in Zeile 10 keine Prozedur aufrufen, die erst in Zeile 20 definiert war. Weil der Kompiler diese Prozedur zu dem Zeitpunkt nicht kannte. Also hat man Headerdateien erfunden damit der Kompiler schon vorab weiss wie die Prozedur aussieht. Denn die Headerdateien werden zuerst eingelesen.

2. So wie ich das sehe werden Werte und nicht Adressen vertauscht.

Sewing
2015-11-20, 14:31:02
Danke dir, ich hoffe es ist in Ordnung, wenn ich hier in Zukunft ein paar Fragen stelle...

Heisst das, dass man heutzutage Funktionen nicht mehr zu prototypen braucht?

Also die Ausgabe des obigen Programmes ist

Vor der Vertauschung x: 5 y: 10
Nach der Vertauschung x: 10 y: 5

Exxtreme
2015-11-20, 14:42:17
Heisst das, dass man heutzutage Funktionen nicht mehr zu prototypen braucht?

Doch, musst du bzw. solltest du. Denn was anderes sieht der C/C++-Standard nicht vor. Mag sein, dass es Kompiler gibt, die das nicht unbedingt brauchen. Aber darauf verlassen würde ich mich nicht.

Gast
2015-11-20, 16:23:28
1. Wieso sollte eine Funktion geprototyped werden, wenn ich sie weiter unten sowieso definiere? Ich weiss, dass man den Prototyp in ne Header Datei auslagern kann/soll aber den Sinn des Ganzen versteh ich nichtAls jemand, der einst mit Pascal angefangen hat und erst viel später zu C und C++ kam, kann ich dir auch noch diese Variante vorschlagen:

#include <iostream>

void swap (int *px, int *py)
{
int temp;
temp = *px;
*px = *py;
*py = temp;
}

int main()
{
int x = 5, y = 10;
std::cout << "Vor der Vertauschung x: " << x << " y: " << y << std::endl;
swap(&x,&y);
std::cout << "Nach der Vertauschung x: " << x << " y: " << y << std::endl;
return 0;
}

Also die Funktion swap() nicht nur vor der main()-Funktion deklarieren (oder protoypen), sondern direkt auch dort implementieren. In Pascal (zumindest in der Version, die war damals benutzten) konnte man das sogar nur so machen, weil es da keine Trennung von Deklaration und Implementierung gab, deswegen war das auch noch bis weit in meine C/C++ Ära hinein Gewohnheit für mich ;)

Nur das umgekehrte, swap() hinter main() zu implementieren, ohne sie vorher zu deklarieren, das geht nicht. Das liegt daran, dass eine Funktion vor ihrer ersten Verwendung deklariert sein muss. Oder halt auch gleich implementiert, da sie dadurch auch gleich deklariert wird.

Sewing
2015-11-20, 16:56:06
ja das war mir irgendwie implizit klar. Aber dieses Prototypen kannte ich zum Beispiel von Java her nicht. Das heisst, so lange ich meine Funktion vor der Main definiere, kann ich eine vorhergehende Deklarierung weglassen? Oder hat das auch performance gründe

Marscel
2015-11-20, 18:41:25
Eigentlich kommt man faktisch kaum in die Lage: Du hast eine Header-Datei, in welche du die Deklarationen packst, und die Source-Datei für die Definitionen dieser.

Einbinden wirst du jeweils nur die Header und die liegen i.d.R. damit vorm Einstiegspunkt. Der Linker setzt dann später die Sprünge in die anderen Objekt- oder Lib-Dateien.

Ausnahmen sind Definitionen aus Templates, die - sofern das mittlerweile nicht irgendein smarter Mechanismus abgeschafft hat - im Header stattfinden müssen.

Sewing
2015-11-21, 16:03:57
worin besteht der Unterschied zwischen

int *ppointer;

und

int *ppointer = new int;

bei beidem wird doch lediglich unbelegter Speicher für einen Pointer auf ne integer bereitgestellt...

Exxtreme
2015-11-21, 19:22:35
Nein.

int *ppointer; ist nicht initialisiert und zeigt irgendwo hin. Wenn man so einen Zeiger benutzt und das OS hat einen funktionierenden Speicherschutz dann stürzt das Programm ab. Deshalb benutzt man new damit Speicher initialisiert wird und der Zeiger auf den initialisierten Speicher zeigt.

Funky Bob
2015-11-21, 19:49:46
Fürs swappen würde ich

void swap(int* a, int* b) {
*a=(*a ^ *b)
*b= (*a ^ *b) //b=a
*a=(*a ^*b) //a=b

}
verwenden und das ganze evtl noch inlinen.

Nakai
2015-11-21, 19:49:49
worin besteht der Unterschied zwischen

int *ppointer;

und

int *ppointer = new int;

bei beidem wird doch lediglich unbelegter Speicher für einen Pointer auf ne integer bereitgestellt...

int * ppointer;
Ist ein Pointer auf dem Stack. Variablen auf den Stack werden bei } gelöscht.

int *ppointer = new int;
Es liegt ein Pointer auf dem Stack und mit new wird Speicher vom Heap reserviert. Bei } wird der Pointer auf dem Stack gekillt, aber der reservierte Speicher im Heap bleibt bestehen. Bei } wird normalerweise der Destruktor aufgerufen, um den Speicher auf dem Heap freizugeben.
Das gleiche gilt bei malloc.

Hat ein System keine MMU, dann aknn, wenn der Heap voll ist, das System crashen...bzw es wird crashen. Das ist auf embedded Systeme wichtig.

AwesomeSauce
2015-11-21, 22:04:47
Fürs swappen würde ich
[...]
verwenden und das ganze evtl noch inlinen.
Warum? Ist unleserlich und benötigt Kommentare, und funktioniert nicht einmal in jedem Fall.

Sewing
2015-11-25, 16:36:11
Werden structs überhaupt noch verwendet, wenn man OOP hat ?

Grundkurs
2015-11-25, 17:36:09
Du meinst, weil man ja Klassen hat?

Novum
2015-11-25, 17:39:20
Werden structs überhaupt noch verwendet, wenn man OOP hat ?
Ja, nach gaengiger Konvention fuer reine Daten.

Der Uebergang ist aber fliessend. Das Keyword "struct" ist ohnehin austauschbar mit "class", der einzige Unterschied ist public/private als default fuer die member.

Fürs swappen würde ich

void swap(int* a, int* b) {
*a=(*a ^ *b)
*b= (*a ^ *b) //b=a
*a=(*a ^*b) //a=b

}
verwenden und das ganze evtl noch inlinen.
Solche Taschenspielertricks wuerde ich wenn ueberhaupt nur verwenden wenn der Swap nach Profiling immer noch ein Hotspot ist und es kommentieren, sonst ist das reine Obfuscation. Benutzt einfach std::swap.

Im uebrigens ist niemand beeindruckt, dass du weisst, dass man mit XOR ohne temp integer raustauschen kann.

hell_bird
2015-11-25, 18:35:03
Wo wir gerade bei dem Codeschnipsel sind würde ich doch noch in die Runde werfen, dass man die Pointer durch Referenzen ersetzen sollte. Pointer wären nötig wenn das Ziel sich ändern würde oder wenn ein nullptr zulässig wäre. So sind hier Referenzen sauberer und sicherer!

Funky Bob
2015-11-25, 19:14:25
Solche Taschenspielertricks wuerde ich wenn ueberhaupt nur verwenden wenn der Swap nach Profiling immer noch ein Hotspot ist und es kommentieren, sonst ist das reine Obfuscation. Benutzt einfach std::swap.

Darum ging es gar nicht. Und es wird vermutlich auch nicht schneller sein, je nach Compiler, aber:
Wenn jemand anfangen möchte zu programmieren ist es ganz gut, sich auch mit Bitoperationen auseinander zu setzen und warum die angegebene Funktion überhaupt funktioniert. Es gibt genügend Leute die schon einige Jahre im Softwarebereich unterwegs sind und dennoch keine klare Vorstellung davon haben, wie ein Rechner Daten ablegt/verwendet und was das ganze eigentlich bedeuten kann. Ganz zu schweigen vom Verständnig zu Code, wo ich regelmäßig feststellen musste, dass selbst einfache Konstrukte mit ein paar Bedingungen und sinnvollen Variablennamen die Leute aus dem Konzept bringen. Wenn sich jemand nun hinsetzt und sich klar macht, was in der Funktion eigentlich passiert und dann evtl. noch selbst drauf kommt, wann das ganze nicht klappt, hat derjenige zusätzlich noch ein bisschen Methodiken anwenden müssen, sich in fremden (wenn auch kurzen und für die meisten sicherlich trivialen) Code einzuarbeiten, was für den TS sicherlich nur gut sein kann.

Monger
2015-11-25, 20:10:02
Es gibt genügend Leute die schon einige Jahre im Softwarebereich unterwegs sind und dennoch keine klare Vorstellung davon haben, wie ein Rechner Daten ablegt/verwendet und was das ganze eigentlich bedeuten kann.
Im Umkehrschluss also: man kann sich problemlos jahrelang im Softwarebereich aufhalten, ohne dass man das wissen muss.
Das ist doch für Anfänger recht tröstlich.

Ectoplasma
2015-11-28, 08:07:32
Im Umkehrschluss also: man kann sich problemlos jahrelang im Softwarebereich aufhalten, ohne dass man das wissen muss.

Man kann sich da sogar recht lange aufhalten, ohne das überhaupt irgendetwas wissen muss. Das meine ich durchaus ernst.

Oid
2015-11-28, 09:40:21
Zwei Fragen:
1. Wieso sollte eine Funktion geprototyped werden, wenn ich sie weiter unten sowieso definiere? Ich weiss, dass man den Prototyp in ne Header Datei auslagern kann/soll aber den Sinn des Ganzen versteh ich nicht

Unabgängig von der technischen Notwendigkeit - kann es den Code les- und wartbarer machen, wenn an einer Stelle alle Funktionen eines Moduls als Prototypen aufgelistet sind.

Oid
2015-11-28, 09:46:44
Im Umkehrschluss also: man kann sich problemlos jahrelang im Softwarebereich aufhalten, ohne dass man das wissen muss.
Das ist doch für Anfänger recht tröstlich.
Ich komme aus dem embedded Bereich, aber ist das nicht der Sinn (u.a.) von Hochsprachen (höher als C++) genau sowetwas nicht wissen zu müssen?

Gast
2015-11-28, 11:40:41
Ich komme aus dem embedded Bereich, aber ist das der Sinn (u.a.) von Hochsprachen (höher als C++) genau sowetwas nicht wissen zu müssen?
Der Code läuft dennoch auf konkreten Maschinen und Performance ist früher oder später ein Thema. Abstraktion hat nicht nur einen Wert, sondern auch einen Preis. :/

Marscel
2015-11-28, 13:36:03
Ich komme aus dem embedded Bereich, aber ist das der Sinn (u.a.) von Hochsprachen (höher als C++) genau sowetwas nicht wissen zu müssen?

Man könnte jetzt ja sagen: Ja.

Aber man landet früher oder später doch dabei, zmd. die ernstzunehmenden unter den Entwicklern, die internen Verfahren eines RDBMS zu ergründen, weil ein billiges SQL-Statement unglaublich lahm ist, und baut es dann im Sinne der Layer-Interna darunter um. Oder im Assemblat des Compilers, oder dem Quellcode der Runtime.

Sewing
2015-11-28, 16:05:19
Anfänger Frage

double factor;
while (!(cin >> factor))

führt den Schleifenrumpf genau so lange aus wie?

Monger
2015-11-28, 16:13:42
Man könnte jetzt ja sagen: Ja.

Aber man landet früher oder später doch dabei, zmd. die ernstzunehmenden unter den Entwicklern, die internen Verfahren eines RDBMS zu ergründen, weil ein billiges SQL-Statement unglaublich lahm ist, und baut es dann im Sinne der Layer-Interna darunter um. Oder im Assemblat des Compilers, oder dem Quellcode der Runtime.
Oder mit anderen Worten: man muss immer dann in fremden Domänen wildern, wenn sie dort Scheiße gebaut haben.

Ich komme aus dem embedded Bereich, aber ist das der Sinn (u.a.) von Hochsprachen (höher als C++) genau sowetwas nicht wissen zu müssen?
Natürlich. Das Problem ist halt: es gibt gelöste und ungelöste Probleme der Informatik. So die ganzen Standardalgorithmen sind alle gelöste Probleme, wer heute noch (egal in welcher Sprache) selber Such- und Sortieralgorithmen oder banale Datenstrukturen wie Listen o.ä. selbst schreibt, gehört in aller Regel geohrfeigt.
Compile (also das übersetzen von einer Sprache in eine andere) ist ein gelöstes Problem. Das Sprachverständnis moderner Compiler ist so hoch, das kriegt kein Mensch besser hin. Und sie sind unfassbar schnell.
Garbage Collection ist zu 99% ein gelöstes Problem. Zumindest in einer Umgebung wo dynamisch Speicher alloziiert werden darf (das gilt für Embedded ja normalerweise eben nicht), kriegt das kein Mensch von Hand besser hin. Auch mit Garbage Collection muss man natürlich die Lebenszeit managen, aber dafür gibt es Werkzeuge und Programmiertechniken.

Und dann gibt es noch die große Zahl der ungelösten Probleme. Wobei ich behaupte, der allergrößte Teil davon ist auf mieses Design und schlechte Implementierungen zurückzuführen.

Datenbanken, zum Beispiel. Der Quasi-Standard zur Datenbankenkommunikation sind ja SQL Queries. Trotzdem schreibt fast keiner selber solche Queries, für jede Sprache existieren oft mehrere konkurrierende Adapter die die Unzulänglichkeiten der SQL Queries (wie z.B. die schwache Typisierung) ausgleichen. Die SQL Implementierungen gehen ja selbst bei den großen bekannten Anbietern mitunter deutlich auseinander, von verlässlicher API keine Spur. Dass man in so einem Umfeld gerne mal selber ins Getriebe fasst ist verständlich, aber normalerweise sollte eine gescheite Abstraktion so etwas überflüssig machen. Man stelle sich mal vor, man würde auf ner x86 Architektur aufsetzen, und manche Rechner würden ein paar der x86 Operationen einfach ignorieren. Unvorstellbar, in vielen anderen Bereichen der Informatik aber Alltag.

Dass man in der Informatik aus solchen und anderen Gründen immer wieder zurück auf Low-Level geworfen wird, ist in meinen Augen ein Bug, kein Feature.

Exxtreme
2015-11-29, 16:55:18
Ich komme aus dem embedded Bereich, aber ist das nicht der Sinn (u.a.) von Hochsprachen (höher als C++) genau sowetwas nicht wissen zu müssen?
Hochsprachen sind in erster Linie Produktivitätsbooster. Sprich, sie senken primär die Kosten für die Entwicklung von Software. Und anhand der Produktivität kann man auch absehen welche Sprachen sich eher durchsetzen und welche nicht. Dass man Details wie das Verschieben von Bits nicht mehr kennen muss weil es auch so funktioniert ist lediglich in Nebeneffekt. Ob positiv oder negativ, darüber können sich irgendwelche Philosophen den Kopf zerbrechen.

Gauß
2015-11-30, 10:56:34
1. Ist ein uraltes Relikt aus C-Zeiten. Früher gingen die Kompiler den Sourcecode Zeile für Zeile durch. Das bedeutet, man musste die Reihenfolge in der die Prozeduren implementiert waren strikt einhalten. Man konnte z.B. in Zeile 10 keine Prozedur aufrufen, die erst in Zeile 20 definiert war. Weil der Kompiler diese Prozedur zu dem Zeitpunkt nicht kannte.Falsch. Bei Standards vor C99 ist keine Forwegdeklaration zwingend notwendig und eine implizite Deklaration moeglich.

Also hat man Headerdateien erfunden damit der Kompiler schon vorab weiss wie die Prozedur aussieht. Denn die Headerdateien werden zuerst eingelesen.

Eigentlich kommt man faktisch kaum in die Lage: Du hast eine Header-Datei, in welche du die Deklarationen packst, und die Source-Datei für die Definitionen dieser.Das sind ganz bittere Falschinformationen!
Header-Dateien sind einzig und allein als Deklarationsschnittstelle zwischen Modulen gedacht. Alles was nicht ausserhalb des Moduls benoetigt wird sollte wenn immer moeglich NICHT in der header-Datei deklariert werden.

Gauß
2015-11-30, 11:19:41
Natürlich. Das Problem ist halt: es gibt gelöste und ungelöste Probleme der Informatik. So die ganzen Standardalgorithmen sind alle gelöste Probleme, wer heute noch (egal in welcher Sprache) selber Such- und Sortieralgorithmen oder banale Datenstrukturen wie Listen o.ä. selbst schreibt, gehört in aller Regel geohrfeigt.
Compile (also das übersetzen von einer Sprache in eine andere) ist ein gelöstes Problem. Das Sprachverständnis moderner Compiler ist so hoch, das kriegt kein Mensch besser hin. Und sie sind unfassbar schnell.
Garbage Collection ist zu 99% ein gelöstes Problem. Zumindest in einer Umgebung wo dynamisch Speicher alloziiert werden darf (das gilt für Embedded ja normalerweise eben nicht), kriegt das kein Mensch von Hand besser hin. Auch mit Garbage Collection muss man natürlich die Lebenszeit managen, aber dafür gibt es Werkzeuge und Programmiertechniken.

Und dann gibt es noch die große Zahl der ungelösten Probleme. Wobei ich behaupte, der allergrößte Teil davon ist auf mieses Design und schlechte Implementierungen zurückzuführen.

Datenbanken, zum Beispiel. Der Quasi-Standard zur Datenbankenkommunikation sind ja SQL Queries. Trotzdem schreibt fast keiner selber solche Queries, für jede Sprache existieren oft mehrere konkurrierende Adapter die die Unzulänglichkeiten der SQL Queries (wie z.B. die schwache Typisierung) ausgleichen. Die SQL Implementierungen gehen ja selbst bei den großen bekannten Anbietern mitunter deutlich auseinander, von verlässlicher API keine Spur. Dass man in so einem Umfeld gerne mal selber ins Getriebe fasst ist verständlich, aber normalerweise sollte eine gescheite Abstraktion so etwas überflüssig machen. Man stelle sich mal vor, man würde auf ner x86 Architektur aufsetzen, und manche Rechner würden ein paar der x86 Operationen einfach ignorieren. Unvorstellbar, in vielen anderen Bereichen der Informatik aber Alltag.

Dass man in der Informatik aus solchen und anderen Gründen immer wieder zurück auf Low-Level geworfen wird, ist in meinen Augen ein Bug, kein Feature.Dieser Irrglaube ist der Hauptgrund dafuer warum zum Betreiben von websites eine oekonomisch motivierte Vorausplanung der Energieversorgung notwendig ist.

Hochsprachen sind in erster Linie Produktivitätsbooster. Sprich, sie senken primär die Kosten für die Entwicklung von Software. Und anhand der Produktivität kann man auch absehen welche Sprachen sich eher durchsetzen und welche nicht. Dass man Details wie das Verschieben von Bits nicht mehr kennen muss weil es auch so funktioniert ist lediglich in Nebeneffekt. Ob positiv oder negativ, darüber können sich irgendwelche Philosophen den Kopf zerbrechen.Abstraktion in der Softwareentwicklung ohne Sinn- und Notwendigkeitsverstand ist bei weitem der groesste Produktivitätsvernichter in der Industrie.

Marscel
2015-11-30, 16:22:55
Das sind ganz bittere Falschinformationen!
Header-Dateien sind einzig und allein als Deklarationsschnittstelle zwischen Modulen gedacht. Alles was nicht ausserhalb des Moduls benoetigt wird sollte wenn immer moeglich NICHT in der header-Datei deklariert werden.

Was nicht exposed werden soll: Klar. Einzig und allein: Nein, siehe Templates.*

* Wildes Pattern-Matching für Delegationen an Methoden mit statischen Signaturen mal außer Acht gelassen.

Ectoplasma
2015-11-30, 16:30:48
@Gauß, es klingt ja echt interessant was du sagst, aber ein wenig präziser und nicht ganz so deutungsschwanger, könntest du dich schon ausdrücken oder?

Novum
2015-11-30, 16:58:58
Er meint damit, dass wegen dem ganzen Noob-Gecode alles lahm wie sau ist und man dann Hardware drauf werfen muss was unnoetig Strom verbraucht.

Zweiter Punkt ist dass die ganzen Abstraktionsschichten den Code unnoetig kompliziert machen koennen und dann das maintainen extrem teuer wird. Hab ich auch schon oft genug gesehen.

Sewing
2015-11-30, 16:59:15
Anfänger Frage

double factor;
while (!(cin >> factor))

führt den Schleifenrumpf genau so lange aus wie?

bitte...

Gast
2015-11-30, 17:01:18
bitte...

http://lmgtfy.com/?q=c%2B%2B+while+cin

Novum
2015-11-30, 17:03:09
So lange man nicht 0 eingibt. Ist extrem widerlicher Stil.

Dunkelwald
2015-11-30, 17:23:39
hat sich erledigt...

Ectoplasma
2015-11-30, 17:35:01
Er meint damit, dass wegen dem ganzen Noob-Gecode alles lahm wie sau ist und man dann Hardware drauf werfen muss was unnoetig Strom verbraucht.

Das ist doch der Punkt, was heißt schon Noob-Gecode mit Abstraktionsschichten (um diese ging es ja), wenn ich auch ohne diese beschissenen Code produzieren kann? Das sind immer so unausgegorene Aussagen. Es wäre z.B. ziemlich dämlich, wenn ich in C++ nicht auf einen std::vector zurückgreifen würde oder in Java auf eine ArrayList. Da ist auch nicht mit Performanceverlust zu rechnen. Im Java-Enterprise Bereich ist das einzige was Resourcen frisst, evtl. die Größe der EAR Archive. Ansonsten sehe ich den Zussamenhang von Noob-Code und Abstraktionsschicht nicht. Ein Noob würde höchstens noch noobigeren Code produzieren, wenn er diese Schichten nicht hätte. Ein richtiger Profi weiß mit solchen Abstraktionen richtig umzugehen. Er wäre keiner, wenn nicht darauf zurückgreifen würde.

Dunkelwald
2015-11-30, 17:38:56
So lange man nicht 0 eingibt. Ist extrem widerlicher Stil.

Hmm, ich lese das so dass die Schleife so lange ausgeführt wird, bis die Variable factor über cin eingelesen wird.

So langer der Ausruck (cin >> factor) false liefert, ist !(cin >> factor) true und der Schleifenrumpf wird ausgeführt. Sobald factor eingelesen wird, wird die Schleifenbedingung dann false und die Schleife abgebrochen. Wo liegt mein Denkfehler?

Monger
2015-11-30, 17:48:41
Was nicht exposed werden soll: Klar. Einzig und allein: Nein, siehe Templates.*

* Wildes Pattern-Matching für Delegationen an Methoden mit statischen Signaturen mal außer Acht gelassen.
@Gauß, es klingt ja echt interessant was du sagst, aber ein wenig präziser und nicht ganz so deutungsschwanger, könntest du dich schon ausdrücken oder?
Don't feed the troll. Wir sind eh schon weit vom Thema weg.


Zweiter Punkt ist dass die ganzen Abstraktionsschichten den Code unnoetig kompliziert machen koennen und dann das maintainen extrem teuer wird. Hab ich auch schon oft genug gesehen.
Gibt ja ne ganze Gruppe von Antimustern die sich nur um das Thema von falsch umgesetzter Abstraktion drehen. Sehe ich auf Arbeit regelmäßig, und ist auch - finde ich - selbst für erfahrene Entwickler mitunter extrem kontraintuitiv. Menschen sind wohl allgemein nicht besonders super darin abstrahiert zu denken.

Dunkelwald
2015-12-08, 19:15:46
Wir haben damals C++ Primer verwendet. Dicker Wältzer, aber da stand alles wichtige drinnen. Gibts wohl auch als Neuauflage mit den neuen ISO Standards.

Nachdem ich mich mittlerweile mit mehreren Büchern tiefer beschäftigt habe, ist das mein absoluter Favorit. Deswegen nochmal Danke für den Tipp! (y) Vor ca. 3 Wochen habe mir die 5th Edition zugelegt.

Das Buch ist einfach super, verständlich und präzise geschrieben ohne unnötiges Gelaber und seitenlange Listing, viele Übungsaufgaben. Für mich funktioniert das absolut perfekt. :smile:

Sewing
2015-12-08, 21:37:10
Nachdem ich mich mittlerweile mit mehreren Büchern tiefer beschäftigt habe, ist das mein absoluter Favorit. Deswegen nochmal Danke für den Tipp! (y) Vor ca. 3 Wochen habe mir die 5th Edition zugelegt.

Das Buch ist einfach super, verständlich und präzise geschrieben ohne unnötiges Gelaber und seitenlange Listing, viele Übungsaufgaben. Für mich funktioniert das absolut perfekt. :smile:

du solltest aber vielleicht die 6th edition nehmen

Dunkelwald
2015-12-08, 22:35:26
du solltest aber vielleicht die 6th edition nehmen

Nein, ich meine das C++ Primer von Stanley Lippman und da ist die 5. Edition die Aktuellste (von 2012, incl. C++11 Standard).

Du denkst wahrscheinlich an C++ Primer Plus von Stephen Prata (davon gibt es eine 6. Edition), was ich aber deutlich schlechter finde.

Sewing
2015-12-08, 22:42:14
habe aber auch noch ne Frage. Sind in C++ getter und setter Methoden nicht üblich um auf private object data zuzugreifen?

in den Beispielen, die ich bisher sehe, wird meist im public interface direct auf Klassenattribute zugegriffen...

Sewing
2015-12-08, 22:44:46
Nein, ich meine das C++ Primer von Stanley Lippman und da ist die 5. Edition die Aktuellste (von 2012, incl. C++11 Standard).

Du denkst wahrscheinlich an C++ Primer Plus von Stephen Prata (davon gibt es eine 6. Edition), was ich aber deutlich schlechter finde.


Wieso das? Es ist u.a. fast doppelt so lang

Marscel
2015-12-08, 22:49:22
habe aber auch noch ne Frage. Sind in C++ getter und setter Methoden nicht üblich um auf private object data zuzugreifen?

in den Beispielen, die ich bisher sehe, wird meist im public interface direct auf Klassenattribute zugegriffen...

Das hängt doch total davon ab, was man machen möchte. Wenn du lediglich Records mit ein paar computing Methods haben möchtest: wen interessierts.

Wenn du darauf aus bist, dass z.B. nie etwas außerhalb deine const-Constraints in Bezug auf das Objekt verletzt, du irgendwas validieren, normalisieren, freigeben musst, wenn etwas gesetzt wird, dann machen Getter und Setter stark Sinn.

Es ist u.a. fast doppelt so lang

Unbestreitbar, dass etwas deswegen besser sein muss.

Sewing
2015-12-08, 23:00:19
Das hängt doch total davon ab, was man machen möchte. Wenn du lediglich Records mit ein paar computing Methods haben möchtest: wen interessierts.

Wenn du darauf aus bist, dass z.B. nie etwas außerhalb deine const-Constraints in Bezug auf das Objekt verletzt, du irgendwas validieren, normalisieren, freigeben musst, wenn etwas gesetzt wird, dann machen Getter und Setter stark Sinn.



Unbestreitbar, dass etwas deswegen besser sein muss.

ich wusste! dass das jemand bringt, deshalb schrieb ich u.a.

Dunkelwald
2015-12-08, 23:35:45
Wieso das? Es ist u.a. fast doppelt so lang

Ich finde es einfach besser. Lippman schreibt für mich super auf den Punkt und erklärt verständlich ohne zu viel Text und oberflächlich zu werden. Dazu gibt es viele Übungsaufgaben. Für mich ist das Buch didaktisch einfach das beste von allen die ich mit bisher genauer angeschaut habe:

Der C++ Programmierer (Breymann, wäre für mich Platz 2), C++ Primer Plus (Prata), C++ für Spieleprogrammierer (Kalista), C++ Das umfassende Handbuch (Wolf), C++ das umfassende Lehrbuch (Kaiser/Guddat) und das Ding was im ersten Post verlinkt ist.

In allen habe ich mind. 200 Seiten gelesen/durchgearbeitet. C++ Primer (Lippman) ist für mich ganz klar das Beste.

Novum
2015-12-08, 23:58:31
habe aber auch noch ne Frage. Sind in C++ getter und setter Methoden nicht üblich um auf private object data zuzugreifen?

in den Beispielen, die ich bisher sehe, wird meist im public interface direct auf Klassenattribute zugegriffen...
Das ist wie in anderen Sprachen eine Abwaegungssache. Wenn man garantieren kann, dass sich die Member nie aendern und sie Teil des Interfaces sind (x, y, z bei einem Vektor z.B.) dann kann man das schon so machen.

kasir
2015-12-09, 00:09:57
Der Herr Wolf wird ja ziemlich krass von der C/C++ Community zerissen, empfehlen würde ich seine Werke von daher überhaupt nicht mehr.

Dunkelwald
2015-12-09, 00:25:58
Der Herr Wolf wird ja ziemlich krass von der C/C++ Community zerissen, empfehlen würde ich seine Werke von daher überhaupt nicht mehr.

Ja, das ist auch so ziemlich das schlechteste Werk dass ich da aufgezählt habe. Das war auch nicht als Empfehlungsliste gedacht, sondern nur ne Aufzählung der Bücher welche ich mir in letzter Zeit intensiver angeschaut habe. Das Buch vom Wolf fand ich mit der Zeit immer schlechter, wobei ich verstehe dass sein einfacher Schreibstil gerade bei Anfängern gut ankommt. Aber empfehlen kann man es nicht, zumindest soweit ich das beurteilen kann. Bin ja selbst noch am lernen.

Sewing
2015-12-10, 11:11:45
Ist C++11 eigentlich das aktuellste?

kasir
2015-12-10, 12:42:45
...
C++14 is intended to be a small extension over C++11, featuring mainly bug fixes and small improvements.

Sewing
2015-12-10, 15:12:48
Alles klar, danke =)

weil ich in Büchern immer nur Neuerungen bzgl C++11 finde

Sewing
2015-12-11, 22:31:03
Habe einen Constructor


Vector::Vector(double x, double y, double z_, const char * s)
{
length = std::strlen(s);
str = new char[length + 1];
std::strcpy(str, s);

this->x = x;
(*this).y = y;
z = z_;
}


bekomme aber folgende Meldung beim kompilieren:


error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files\windows kits\10\include\10.0.10150.0\ucrt\string.h(119): note: Siehe Deklaration von "strcpy"

was genau mache ich denn falsch?

Mit [code]
...
strcpy_s(str, length+1, s);
...
[\code]

krieg ichs hin, allerdings würde ich das oben gerne verstehen

EPIC_FAIL
2015-12-11, 23:15:08
Falsch machst du im Prinzip nichts, ist nur ne Warnung, dass strcpy Bufferoverflows auslösen kann. Die "Safe"-Variante davon verlangt explizit die Länge. Du kannst diesen "Error" irgendwo in Visual Studio auch abstellen, dann klappts auch mit der normalen Variante.

Sewing
2015-12-12, 17:08:27
Gibt es irgendeine Restriktion bzgl des Überladens von || ?

Habe ne member function

bool operator||(const Vector& vec) const { return (*this * vec == 1); }


die bei Kollinearität "true" zurückgibt. Habe zudem den << operator überladen um Vector Objekte auszugeben


ostream & operator<<(ostream & os, const Vector & vec) {
return os << vec.str << " = (" << vec.x<< ", " << vec.y << ", " << vec.z << ")";
}



Der Compiler akzeptiert folgenden Syntax


Vector a;
Vector b;

cout << a.operator||(b) << endl;


Jedoch nicht das gleichwertige


cout << a||b << endl;


Wenn ich statt || den Modulo Operator % verwende, funktioniert es

Gast
2015-12-12, 17:41:45
Jedoch nicht das gleichwertige


cout << a||b << endl;


Auf der einen Seite ist Google offenbar zu schwierig für dich, auf der anderen Seite solche Aussagen...

Nein, das ist NICHT gleichwertig. Stichwort Operator-präzedenz.

Sewing
2015-12-12, 18:10:23
aber ändert diese alternative Schreibweise denn etwas an der Präzedenz?

ist Klammern da der richtige Weg oder lässt sich das Problem auch anders lösen?

Novum
2015-12-15, 07:40:58
Ganz ehrlich, das Problem ist, wenn man sowas schreibt. Die Operations-Ueberladung fuer iostream ist an sich schon grenzwertig, da muss man nicht noch mehr Obfuscation einbauen.

Und wie die anderen schon gesagt haben, der Operator << hat Vorrang vor dem Operator ||. Was du da geschrieben hast entspricht
cout.operator<<( a ).operator||( b.operator<<( endl ) );

und NICHT
cout.operator<<( a.operator||( b ) ).operator<<( endl );

Und natuerlich aendern die Klammern was an der Reihenfolge, dafuer sind sie da.

Dunkelwald
2015-12-15, 14:24:59
Ich will mir gerade einen einfachen Vokabletrainer programmieren, habe aber ein Problem mit dem Einlesen von Variablen aus einer Datei.

Gegeben ist ein Vector (m_Wortschatz) aus Strukturen (Vokabel) welche folgende Member enthalten:

Struct Vokabel
{
short counter = {0};
string m_Fremd;
string m_Deutsch;
};

Der Vektor<Vokabel> wird jetzt in einer Datei gespeichert, wobei jeder Member von Vokabel in eine neue Zeile geschrieben wird. Der Inhalt der Datei schaut also beispielsweise so aus:

0
gehen
to walk
1
sein
to be
usw..

Nun möchte ich die Datei einlesen, den jeweiligen Vokabel-Membern die Daten aus der Datei zuweisen und den Vector aus beliebig vielen Vokabeln aufbauen. Folgende Klassenmethode habe ich dafür geschrieben:

void CSprache::laden()
{
Vokabel temp;
ifstream in("Save.dat", ios::in);
string zeile;

while (in.good())
{
in >> temp.m_Counter;
getline(in, temp.m_Deutsch);
getline(in, temp.m_Fremd);

m_Wortschatz.push_back(temp);
}
cout << "Wortschatz erfolgreich geladen!\n\n";
in.close();
}


Allerdings klappt das nicht, wobei aber keine Fehlermeldung ausgegeben wird, sondern nur die Zuweisung nicht stimmt. Es wird mehrfach das erste Wort zugewiesen (in obigem Fal also "gehen" und das sowohl als m_Frend, wie auch m_Deutsch) wobei das noch von der Dateilänge abhängt. Wo liegt mein Fehler?

Wenn ich die Klassenmethode folgendermaßen schreibe:


void CSprache::laden()
{
Vokabel temp;
ifstream in("Save.dat", ios::in);
string zeile;

while (getline(in, zeile))
{
istringstream record(zeile);
record >> temp.m_Counter >> temp.m_Deutsch >> temp.m_Fremd;
m_Wortschatz.push_back(temp);
}
in.close();
}

Klappt es einwandfrei. Wobei die Variablen in dem Fall aber alle in eine Zeile geschrieben waren. Das Problem ist hier nur dass Whitespaces als Trennzeichen interpretiert werden und somit nur ein Wort für die Strings möglich ist, was sehr suboptimal ist...

Leider stehe ich grad auf dem Schlauch... :confused:

Edit: Habe den Code leicht korrigiert. Ändert aber nichts am Ergebnis, es wird nur die erste String-Variable aus der Datei zugewiesen, wie als wenn der lesen Zeiger nach dem ersten getline() nicht weiterbewegt wird...

Novum
2015-12-15, 17:26:21
Es ist eine gute Uebung das selber mal im Debugger zu untersuchen. Ich seh es auch nicht auf Anhieb.

Ectoplasma
2015-12-15, 17:44:36
Leider stehe ich grad auf dem Schlauch... :confused:


Das Problem ist, dass nach dem ersten "in >> temp.m_Counter;" im Stream immer noch das '\n' der ersten Zeile von "Save.dat" enthalten ist. Also direkt das '\n' hinter der Zahl. D.h., dass du in der Zeile "getline(in, temp.m_Deutsch);", immer noch dieses eine '\n' einließt. Folglich ist temp.m_Deutsch leer. Der weitere Aufruf "getline(in, temp.m_Fremd);", ließt nun die Zeile "gehen" ein, statt der erwarteten Zeile "to walk". Und so pflanzt sich der Fehler immer weiter fort.

Das Beste ist, du ließt erst einmal jede Zeile als String ein und parst dann z.B. die Zahl.


string counterAsString;
while (in.good())
{
getline(in, counterAsString);
getline(in, temp.m_Deutsch);
getline(in, temp.m_Fremd);

stringstream sin(counterAsString);

sin >> temp.m_Counter;

wortschatz.push_back(temp);
}

Dunkelwald
2015-12-15, 18:17:23
Das Problem ist, dass nach dem ersten "in >> temp.m_Counter;" im Stream immer noch das '\n' der ersten Zeile von "Save.dat" enthalten ist. Also direkt das '\n' hinter der Zahl. D.h., dass du in der Zeile "getline(in, temp.m_Deutsch);", immer noch dieses eine '\n' einließt. Folglich ist temp.m_Deutsch leer. Der weitere Aufruf "getline(in, temp.m_Fremd);", ließt nun die Zeile "gehen" ein, statt der erwarteten Zeile "to walk". Und so pflanzt sich der Fehler immer weiter fort.


Vielen Dank, das klingt logisch! Wie immer steckt der Teufel im Detail. Solche Dinge können einem als Anfänger echt den Nerv kosten... :wink:

Gast
2015-12-15, 18:25:55
Was ist der Sinn von " short counter = {0};"?

Grundkurs
2015-12-15, 18:37:21
Hier stand Käse

Ectoplasma
2015-12-15, 18:39:45
Vielen Dank, das klingt logisch! Wie immer steckt der Teufel im Detail. Solche Dinge können einem als Anfänger echt den Nerv kosten... :wink:

Och, das passiert auch erfahrenen Leuten :wink:. Wie Novum schon sagte, sollte man in so einem Falle einfach den Debugger bemühen. Es ist normal, dass man manchmal die einfachsten Dinge nicht sieht.

Dunkelwald
2015-12-15, 18:39:57
Was ist der Sinn von " short counter = {0};"?

Diese Variable nutze ich um die Vokablen danach zu ordnen wie gut ich sie kann. Bei jeder Fehleingabe wird der Counter um 1 erhöht, bei richtiger Eingabe um 1 erniedrigt. Vokablen mit hohem Counter werden bevorzugt abgefragt.

Sewing
2015-12-28, 15:18:17
Wie kann ich in VS Community mehrere .cpp Dateien die jeweils eine Main enthalten als Quelldateien haben? Der Compiler erlaubt immer nur eine nicht auskommentierte zeitgleich

5tyle
2015-12-28, 15:49:02
Wie kann ich in VS Community mehrere .cpp Dateien die jeweils eine Main enthalten als Quelldateien haben? Der Compiler erlaubt immer nur eine nicht auskommentierte zeitgleich
Das ist in C++ per Sprachdefinition so festgelegt, dass es nur einen Programmeinsprungspunkt (main) gibt, der automatisch ausgeführt wird. Der Grund warum das so ist liegt darin, wie der Compiler und der Linker funktioniert. Es kann höchstens die main-Funktion selbst zusätzliche Übergabeparameter haben.
Allerdings kann man schon mehr als eine main-Funktion in einem cpp-Programm haben, aber es gibt immer nur genau einen Programmeinsprungspunkt.

Sewing
2015-12-28, 15:50:10
ich habe aber aus Übungszwecken mehrere .cpp files, in denen jeweils eine main liegt. Kann ich alle bis auf eine vielleicht irgendwie "deaktivieren" ?

5tyle
2015-12-28, 15:51:49
ich habe aber aus Übungszwecken mehrere .cpp files, in denen jeweils eine main liegt. Kann ich alle bis auf eine vielleicht irgendwie "deaktivieren" ?
Achso, ja klar, das geht in VS in den Project Settings.
Vielleicht wäre es aber besser dafür jeweils ein neues Projekt anzulegen, wenn es einzelne Programme sind, die nicht zusammenarbeiten, zwecks der Übersichtlichkeit.

Sewing
2015-12-28, 16:04:23
wo denn genau? ; )

5tyle
2015-12-28, 16:17:15
Wenn man im Projektmappen-Explorer die Projektmappe rechtsklickt, kann man das Startprojekt und die Abhängigkeiten konfigurieren.

Wenn man das Projekt selbst rechtsklickt kann man auch Compilereinstellungen, Buildsettings usw. festlegen (Oben in Extras-Optionen kann man noch generelle Einstellungen für VS festlegen)

Wie ich schon sagte, in VS ist das eigentlich so vorgesehen, dass man z.B. in der Projektmappe mehrere Projekte hat. Dann öffnet man die gesamte Projektmappe und kann entsprechend das Projekt debuggen, das man ausgewählt hat. In größeren Anwendungen kann man das dazu verwenden, die einzelnen Projekte zusammenarbeiten zu lassen. Ein Beispiel dafür wäre, wenn man eine z.B. den Source einer bestimmten Bibliothek hat (z.B. sowas wie curl oder gzip), dann kann man das da mitkompilieren. In der Buildreihenfolge wird dann festgelegt, was zuerst kompiliert wird, z.B. wird zuerst die Bibliothek und dann das Programm kompiliert, das die Bibliothek verwendet, je nachdem wie die Anforderungen für das Projekt sind. Das ist aber nicht von Bedeutung, wenn die Programme sowieso nicht zusammenarbeiten und es keine Abhängigkeiten gibt, dann kann man die auch einzeln starten.

Gerade für C++ ist es nicht verkehrt, wenn man mal ein Projekt ohne VS macht, da das wegen der Compilierung des Programms eher verwirrend als unterstützend wirken kann, auch wegen der vielen Einstellungsmöglichkeiten in VS. Zum Beispiel mal irgend ein kleines bis mittelgroßens Open Source Projekt selbst von github laden und dann kompilieren, da kann man viel über den Aufbau von C++-Programmen lernen (wenn es gut gemacht ist). Manche liegen zusätzlich auch im VS-Projektformat vor und zu manchen gibt es auch Erklärungen, wie man sie in VS kompiliert.

Grundkurs
2015-12-28, 18:21:38
Gerade für C++ ist es nicht verkehrt, wenn man mal ein Projekt ohne VS macht, da das wegen der Compilierung des Programms eher verwirrend als unterstützend wirken kann, auch wegen der vielen Einstellungsmöglichkeiten in VS. Zum Beispiel mal irgend ein kleines bis mittelgroßens Open Source Projekt selbst von github laden und dann kompilieren, da kann man viel über den Aufbau von C++-Programmen lernen (wenn es gut gemacht ist). Manche liegen zusätzlich auch im VS-Projektformat vor und zu manchen gibt es auch Erklärungen, wie man sie in VS kompiliert.

Das Zusammenspiel zwischen Header-Dateien, .cpp-Dateien und Bibliotheken hat für mich auch erst mehr Sinn gemacht als ich ein paar Projekte auf Linux kompiliert hatte. Erst mit reinen g++ "blah" befehlen, dann mit simplen Makefiles, schließlich mit CMake-Files. Hat auf jeden Fall nicht geschadet sich damit zu befassen. Das Einrichten eines VS-Projektes wird danach auch in der Regel selbsterklärend

Sewing
2016-01-09, 15:18:44
Werden Smart Pointer in der Praxis viel verwendet?

Monger
2016-01-09, 16:44:16
Werden Smart Pointer in der Praxis viel verwendet?
Zumindest so wie ich das im Geschäft kennengelernt habe: ja.
Die C++ Welt ist ja riesig. Manche reißen sich da um jede winzige Neuerung im C++ Standard, andere betrachten z.B. Smart Pointer und Iteratoren als Ausgeburten Satans, und meiden es um jeden Preis.

Smart Pointer führen mMn zu ganz neuen intransparenten Problemen, aber sie sind halt auch ein wichtiges Werkzeug gegen Speicherlecks.

Sewing
2016-01-16, 15:13:00
Hab das Primer Buch von Patra jetzt durchgearbeitet. Läuft soweit.

Wollte jetzt mal in das Primer Buch von Lippman reinschauen. Allerdings ist die EBook Version wie auch auf Amazon in den Kommentaren bemerkt wird kaputt.

Hat jemand da vielleicht ne vernünftig gesetzte Version als PDF zur Hand? :wink:

Hab weiterhin ne Frage zu Move Constructors und Move Assignment Operators:

Sehe ich das richtig, dass diese ähnlich wie Copy Constructor und Assignment Operator nur im Falle von Heap Speicher wichtig werden?

Wenn ich das korrekt verstanden habe, dient die Move Semantic dazu bei rvalue Referenzen, wie zB bei Funktion return values in Form von temporären Objekten den Zugriff von bereits allokiertem Speicher zu übertragen, und dem vorherigen Zugreifenden den Zugriff zu verwehren?

Novum
2016-01-17, 05:32:33
Die rvalue-References ermoeglichen Move-Semantics, die dazu dienen Kopien zu vermeiden wo man sie nicht braucht. Wenn du auf der rechten Seite eines Ausdrucks nur ein temporaeres Objekt hast was Speicher alloziert hat und es zuweisst, dann muss mit rvalue references nur der Zeiger kopiert werden statt neuen Speicher zu allozieren, dann zu kopieren und den alten wieder zu loeschen.

Theoretisch kann man auch obskure Konstrukte bauen, die das mit Stack-Speicher machen, in der Praxis geht es aber vor allem um Heap-Speicher.

Wenn du gerade erst mit C++ anfaengst wuerde ich dir raten dir erst mal keinen Kopf um rvalues zu machen.