Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Jun 09, 2024 00:14

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 70 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4, 5  Nächste
Autor Nachricht
 Betreff des Beitrags: Re: Ein paar Fragen zu C++11
BeitragVerfasst: Do Jun 05, 2014 19:48 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Zitat:
*.cpp, *.c, *.c++ sind Module.

Interessante Defintion, habe ich noch nie gehört? Konnte ich gerade auch im Internet nicht wirklich finden. Für mich und im Internet sind das immer schon Quelldateien bzw. Sourcefiles gewesen.
Unter Module verstehe ich das: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1778.pdf, http://clang.llvm.org/docs/Modules.html

Zitat:
Wieso gehen Templates nicht in Java ? Wenn die Frage beantworten kannst, dann hast auch die Antwort für deine Frage.

Meiner Meinung nach hast du leicht falsch bzw. nicht aktuelle Vorstellungen.
Um mal ein konkretes Gegenbeispiel zu nennen: D
Eine Sprache mit Templatemechanismen mit viel statischen Codemechanismen die vielfältiger und durchdachter sind als in C++ und das ohne Header/Source Trennung. Die Trennung zwischen Header und Quellcode sehe ich ganz klar historisch. Das Argument das du bereits genannt hast und die simple Implementierung haben es in C eingeführt. C++ hat es übernommen und bisher noch nicht geschafft über diese Altlast hinwegzukommen. Neben der Fehleranfälligkeit(Includeguards, Präprozessor allgemein schlecht debugbar), der Redundanz(Die gleiche Deklaration muss zwei mal identisch dastehen) und Uneleganz(Inkonsistent zum Beispiel bei Templates, oder umständlich bei Konstanten, oder Forwarddeklerationen) ist der gravierendste Nachteil den du, wie ich nicht ganz nachvollziehen kann, bereits in einem anderen Kontext verwendet hast:
Zitat:
weil das Kompilieren so extrem langsam wäre, weil erstmal einige hundert Templates [...]

Das Problem am Headersystem ist ein "Lawinenproblem". Jeder Header inkludiert Weitere. Dadurch das es sich letztendlich bloß um ein Zusammenfügen seitens des Präprozessors handelt, müssen eine immense Menge Header für jede Datei zusammengebaut werden. Dabei entstehen nicht selten MB große temporäre Dateien die auch noch geparst werden müssen. Und das immer und immer wieder, einmal für jede Compile Unit, anstatt die Aufgaben sauber zu teilen und jede Datei nur einmal zu verarbeiten.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ein paar Fragen zu C++11
BeitragVerfasst: Fr Jun 06, 2014 13:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
OpenglerF hat geschrieben:
der Redundanz(Die gleiche Deklaration muss zwei mal identisch dastehen)
Was meinst du damit?

OpenglerF hat geschrieben:
Uneleganz(Inkonsistent zum Beispiel bei Templates, oder umständlich bei Konstanten, oder Forwarddeklerationen)
Kannst du Beispiele nennen?

OpenglerF hat geschrieben:
ist der gravierendste Nachteil den du, wie ich nicht ganz nachvollziehen kann, bereits in einem anderen Kontext verwendet hast:[…]Das Problem am Headersystem ist ein "Lawinenproblem". Jeder Header inkludiert Weitere.
Point taken. Das ist gewissermaßen ein Problem, was man aber mit Arbeitsspeicher erschlagen kann.

OpenglerF hat geschrieben:
Dabei entstehen nicht selten MB große temporäre Dateien die auch noch geparst werden müssen.
Wäre mir neu, dass irgendein Compiler diese Zwischenprodukte auf die Festplatte schreibt.


Das Problem, das du aber glaube ich noch nicht verstanden hast, ist, dass man bei Templates (Templates! nicht Generics!) eben nicht nur Interface im Header stehen hat, sondern auch Implementation. Und das geht auch garnicht anders, da die Implementation noch nicht fest steht, bis das Template instanziiert wird. Man kann nicht einfach Löcher lassen wo templateabhängige Werte sind und die Arbeit dem Linker überlassen. Da braucht es mehr Logik und Wissen, als der Linker noch hat (z.B. könnten Funktionen benötigt werden, die weggeschmissen wurden (weil nicht gebraucht), weshalb der Linker keinen Zugriff auf diese hat).

Und in dem Moment wäre eine Trennung wieder ad absurdum geführt.

grüße,
Horazont

p.s.: Das C++-Templatesystem ist Turing Complete. Vielseitiger gehts nich ;) *scnr*

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ein paar Fragen zu C++11
BeitragVerfasst: Fr Jun 06, 2014 15:21 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Zitat:
Was meinst du damit?

Ich meine damit schlicht und ergreifend das das bei "normalen Funktionen" die gleichen Informationen die im Header stehen sich auch schon in der Quelldatei stecken. Die Information in der Deklaration einer Funktion ist redundant. Das das nicht so praktisch ist, als wenn das nicht notwendig wäre, sollte leicht ersichtlich sein. Mehr Schreibaufwand. Dateien müssen Gewechselt werden. Änderungen an der Deklaration müssen doppelt gemacht werden.

Zitat:
Kannst du Beispiele nennen?

Na, die Beispiele waren doch in der Klammer. ;-)
Eine Template-Funktion muss anders als alle anderen Funktionen mit in den Header. Konstanten sind besonders umständlich zu definieren. Insbesondere bei Templatekonstanten wird es richtig wild. Während man Templatefunktionen einfach in den Header packt, geht das da wieder nicht so. Da braucht man 2 weitere sinnlose Zeilen um zu definieren. Forwarddeklaration funktioniert wieder anders und erhöht wieder die Redundanz. Der C++14 Standard hat mit "constexpr"-Konstanten hier einen guten Schritt gemacht. Bloß, wann werde ich das in Visual Studio haben? Mit etwas Glück noch in diesen Jahrzehnt. Toll.

Zitat:
Das ist gewissermaßen ein Problem, was man aber mit Arbeitsspeicher erschlagen kann.

Ja das kann man. Allerdings ist "erschlagen" zu recht negativ behaftet. Das Hauptproblem ist die verbratene CPU Zeit und die dafür kreiselnde Festplatte(Außer es ist noch gecached). Es müssen leicht hunderte Dateien dafür geöffnet werden. Dann muss der Präprozessor sein Bestes versuchen und das alles zusammen basteln. Und noch CPU intensiver ist dann das parsen des Codes. Präprozessor Ausgabecode ist schön und nett, aber damit kann weder Syntaxprüfung, Optimierung oder Codegenerierung damit arbeiten. Die MB weise Code müssen vom Compiler erstmal "verstanden" werden und in einen internen einfacheren Zustand überführt werden (AST). Und der Syntax muss auch überprüft sein. Und damit gibt sich der Compiler ab. MBs werden so für jede Datei verarbeitet obwohl jede einzelne Datei nur einige KB groß sein kann. Die Arbeit den Code in den inkludierten Headern zu verstehen wird also für jede Compile Unit wiederholt anstatt sich diese Arbeit zu teilen und jede Datei nur einmal einzulesen.

Zitat:
Wäre mir neu, dass irgendein Compiler diese Zwischenprodukte auf die Festplatte schreibt.

Na, so habe ich das auch nicht gemeint. Die temporäre Datei war nur bildlich gemeint, halt als Präprozessorausgabe. Das diese Daten nicht vorher auf die Festplatte geschrieben werden, hoffe ich stark. :lol:

Zitat:
Man kann nicht einfach Löcher lassen wo templateabhängige Werte sind und die Arbeit dem Linker überlassen.
Das Problem lässt sich ganz einfach lösen in dem man zum Beispiel das generieren von Maschinencode zu einer "Linker"aufgabe erklärt. In der Praxis wird das für LTCG ohnehin schon teilweise so gemacht. Vielleicht überraschend ist, dass dies nicht das nicht so kritisch in der Performance wie man vielleicht annehmen könnte wenn diese Arbeit immer wieder gemacht wird. Das kann man in der Praxis deutlich erkennen, das insbesonderei n C++ andere Abschnitte dominieren. Um außerdem nochmal zu den Templates zurück zu kommen. Wenn die Templates nicht erst im "Linker" instanziert werden sondern vom Compiler wird auch diese Arbeit doppelt gemacht und teilweise wieder verworfen werden.

PS: Als Beispiel in D nenne ich zum Beispiel mal Compile Time fähige Strings, "Static If" oder auch Mixins. In C++ geht das so gut wie nicht. :P


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ein paar Fragen zu C++11
BeitragVerfasst: Fr Jun 06, 2014 15:44 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Da habe ich mir gestern den Kopf zerbrochen, ich habe anstelle endl end geschrieben.
Anstelle einer kurzen Fehlermeldung, kommt ein riessen Block mit Meldungen, die mir wenig sagten.
Code:
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7.     cout << "Hello World" << end;
  8. } 

Ich habe mit Code::Block kompiliert.
Bei Eclipse sieht man den Fehler sofort.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ein paar Fragen zu C++11
BeitragVerfasst: Fr Jun 06, 2014 15:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
OpenglerF hat geschrieben:
Ich meine damit schlicht und ergreifend das das bei "normalen Funktionen" die gleichen Informationen die im Header stehen sich auch schon in der Quelldatei stecken. Die Information in der Deklaration einer Funktion ist redundant. Das das nicht so praktisch ist, als wenn das nicht notwendig wäre, sollte leicht ersichtlich sein. Mehr Schreibaufwand. Dateien müssen Gewechselt werden. Änderungen an der Deklaration müssen doppelt gemacht werden.
Gehtso. Wenn man drauf steht kann man ca. die hälfte der Informationen weglassen (Argumentnamen sind im Header nicht erforderlich). Aber das gehört in die gleiche Kategorie wie das was ich neulich schon sagte: Das dokumentiert den Code, man hat das Interface an einer Stelle vollständig zusammengefasst.

OpenglerF hat geschrieben:
Zitat:
Kannst du Beispiele nennen?

Na, die Beispiele waren doch in der Klammer. ;-)
Ich meinte Beispiele in Form von Code, denn meine Vermutung ist, dass du von einigen Dingen eine falsche Vorstellung hast. Früher waren Konstanten tatsächlich anstrengend, mit C++11 darf man static const, static constexpr und normale Member in der Klassendeklaration initialisieren.

Was dein Problem mit Forward declarations ist, versteh ich nicht. Die sind genauso wie in Pascal class Foo;. constexpr haben wir schon in C++11. Visual Studio kannste gleich vergessen – meine favorisierte Verschwörungstheorie dazu ist, dass Microsoft die leute zu C# drücken will, indem es einfach keine neuen C++-Features implementiert. Dass VS nen scheißcompiler ist, ist klar. Aber da hilft dir D auch nicht.

OpenglerF hat geschrieben:
Zitat:
Das ist gewissermaßen ein Problem, was man aber mit Arbeitsspeicher erschlagen kann.

Ja das kann man. Allerdings ist "erschlagen" zu recht negativ behaftet. […]

Jau klar. Das greife ich nicht weiter an. Das ist ein Problem, das ist aber inhärent in der C/C++ Architektur. Das kann man zu teilen beheben indem man Precompiled Header einführt, aber halt nicht ganz. Ich würde fast vermuten, dass man das auch aus gründen der C-Kompatibilität nicht weggeben will. Es ist schließlich ein Feature von C++, dass man mit einem extern "C" {}-Block ein C-kompatibles ABI erhält.

OpenglerF hat geschrieben:
Zitat:
Man kann nicht einfach Löcher lassen wo templateabhängige Werte sind und die Arbeit dem Linker überlassen.
Das Problem lässt sich ganz einfach lösen in dem man zum Beispiel das generieren von Maschinencode zu einer "Linker"aufgabe erklärt. In der Praxis wird das für LTCG ohnehin schon teilweise so gemacht. Vielleicht überraschend ist, dass dies nicht das nicht so kritisch in der Performance wie man vielleicht annehmen könnte wenn diese Arbeit immer wieder gemacht wird. Das kann man in der Praxis deutlich erkennen, das insbesonderei n C++ andere Abschnitte dominieren. Um außerdem nochmal zu den Templates zurück zu kommen. Wenn die Templates nicht erst im "Linker" instanziert werden sondern vom Compiler wird auch diese Arbeit doppelt gemacht und teilweise wieder verworfen werden.

Damit verschiebt man das Problem nur in den Linker. Man braucht trotzdem die Informationen aus allen Headern, die irgendwo inkludiert wurden. Der Linker ist allerdings heute schon bei vielen großen Projekten ein echtes Problem, was die Memory Use betrifft. Meist kommt die Peak Memory Usage beim Linken zu stande (siehe z.B. Firefox oder Chrome, welche man auf einem 32-bit Windows-System nicht mehr bauen kann, weil der Linker mehr als 2 GB RAM⁽¹⁾ braucht).

OpenglerF hat geschrieben:
PS: Als Beispiel in D nenne ich zum Beispiel mal Compile Time fähige Strings, "Static If" oder auch Mixins. In C++ geht das so gut wie nicht. :P
StaticIf: Kann man problemlos mit einem Template implementieren:
Code:
  1. #include <type_traits>
  2.  
  3. template <typename value1_t, typename value2_t>
  4. constexpr typename std::common_type<value1_t, value2_t>::type static_if(
  5.     bool cond,
  6.     value1_t value1,
  7.     value2_t value2)
  8. {
  9.     return (cond ? value1 : value2);
  10. }

Das zwingt den Compiler noch nicht dazu, das zur Compile Time zu evaluieren, aber er wird es tun, sobald optimierungen angeschaltet sind, bzw. es erforderlich ist (z.B. weil es als Templateargument verwendet wird). Will man die Evaluation erzwingen, ist es trivial ein Wrappertemplate zu schreiben. Man kanns sicher auch anders implementieren, sodass immer zur Compile Time evaluiert wird, aber das war die lösung off the top of my head.

Bei Compile-Time fähigen Strings kann ich nur sagen Point taken. Man kanns zwar mit der Templatesprache implementieren (sie ist Turing-Complete, after all), aber das wäre frickelig und kaum usable.


1: Windows reserviert die Hälfte des 32-bit Adressraums für sich, daher bekommt man auf 32-bit nur 2 GB pro Anwendung. Irgendwie sowas war da. Vielleicht brauchen die auch inzwischen 4 GB RAM.

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ein paar Fragen zu C++11
BeitragVerfasst: Fr Jun 06, 2014 17:22 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Zitat:
Das dokumentiert den Code, man hat das Interface an einer Stelle vollständig zusammengefasst.

Dafür hat meine IDE Codefaltung. :wink:

Zitat:
Was dein Problem mit Forward declarations ist, versteh ich nicht.

Das Problem was ich damit habe ist, das es inkonsistent ist. Es gibt zwei eigentlich widersprüchliche Weisen sich Zugriff zu Funktionen/Klassen zu verschaffen. Außerdem ist mein Problem mit Forward-Deklaration das die Dinge damit nicht definiert sind und damit der Zugriff nur sehr eingeschränkt möglich ist. Zwei Templateklassen die aufeinander zugreifen sind damit grundsätzlich nicht möglich. Nested Classes lassen sich auch nicht Forward deklarieren. Außerdem nervt es mich das ich immer nach möglicher Forward-Deklaration ausschau halten muss um die Includeketten zu durchbrechen. Und manchmal habe ich mich sogar schon dazu durchgerungen, deshalb eine zusätzliche Indirektion(Pointer) einzubauen nur damit der Header nur in der Quelldatei inkludiert werden muss.

Zitat:
Damit verschiebt man das Problem nur in den Linker. Man braucht trotzdem die Informationen aus allen Headern, die irgendwo inkludiert wurden.

Jaein. Verabschiede dich für den Gedanken mal gedanklich von den Headern. Das ist eine Eigenheit aus der Historie von C++. Das Problem entsteht nicht dadurch das alle Dateien benötigt werden(Das ist automatisch so) sondern das alle Dateien für jede einzelne Datei verarbeitet werden müssen. Bein n Dateien die jeweils m Header inkludieren ist es ein O(n*m) Problem, weil jede Datei jede ihre eingebundenen Header auswerten muss. Wenn alle Dateien nur einmal ausgewertet werden ist es ein O(n+m) Problem. Der Linker wertet alle Dateien aus und wendet sie dann auf alle anderen an, ohne das irgendeine Datei mehrmals ausgelesen wurde.

Zitat:
Meist kommt die Peak Memory Usage beim Linken zu stande.

Das kann sein. Nichtsdestotrotz würde man auch wieder Speicher sparen weil keine Templates mehrfach für den selben Typ ausgewertet würden oder komplexes Namemangeling vorher statt findet. Der Speicherverbrauch würde vielleicht leicht steigen, ich sehe jedoch keinen Grund für einen wirklich drastischen Anstieg. Wie gesagt, wie eh bereits teilweise vollkommen im Linker kompiliert. Beim LLVM/Clang zum Beispiel besonders offensichtlich. Dort schickt man den IL-Code direkt in den Linker für LTCG. Und er ist für seine schnelle Kompiliergeschwindigkeit und geringen Speicherverbrauch bekannt. Die aller meiste Zeit geht einfach für das Einlesen, Parsen und so weiter drauf. Das ist nicht abzustreiten und das daher mehrfach zu machen ist daher ineffizient und ein anderes System effizienter wäre.

Zitat:
StaticIf: Kann man problemlos mit einem Template implementieren: [..]

Ähm, ne nicht ganz. Das wäre eher ein "static choose". Etwas Ähnliches wie static_if geht zwar teilweise auch in C++, aber nicht immer und weniger praktisch. Wenn dann sollte man das mit Template-Spezialisierung oder "std::enable_if" machen. "static_if" kannst du beliebige Codeteile verzweigen. Variablen erstellen oder nicht. Klassen oder nicht. Auch wenn der nicht angewendete Zweig der Verzweigung einen Compilerfehler auslösen würde, es spielt keine Rolle.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ein paar Fragen zu C++11
BeitragVerfasst: So Jun 08, 2014 11:53 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
mathias hat geschrieben:
Da habe ich mir gestern den Kopf zerbrochen, ich habe anstelle endl end geschrieben.
Anstelle einer kurzen Fehlermeldung, kommt ein riessen Block mit Meldungen, die mir wenig sagten.
Code:
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7.     cout << "Hello World" << end;
  8. } 

Ich habe mit Code::Block kompiliert.
Bei Eclipse sieht man den Fehler sofort.


was gibt es denn für Fehlermeldungen?
Endl steht für end-of-line und ist einfach nur dein "\n". End hingegen ist eine Funktion.

@Header

Ihr solltet nicht immer so kompliziert denken ;)
Die Problematik ist einfach der Tatsache geschuldet, dass ,genau wie bei zum Beispiel Pascal, alle Symbole vor der Verwendung deklariert werden müssen. in C gibt es hier nur die spezielle Ausnahme das undeklarierte Funktionen und unvollständige Typen verwendet werden dürfen.
Gäbe es zum Beispiel keine vorgezogenen Deklarationen müsste man mehrere Durchläufe machen um die gegenseitige Rekursion hinzubekommen. Das es hier Nachteile gibt ist klar, dafür haben aber Sprachen wie Java und co. ganz andere Nachteile, wie zum Beispiel die von OpenglerF angesprochene Performance.

Das ist übrigens einer der Gründe für Header und Include, und nicht die Auslieferung von binären Modulen. Fragt euch einfach mal warum eine ganze Reihe von älteren interpretierten Sprachen auch auf solche Systeme setzen.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ein paar Fragen zu C++11
BeitragVerfasst: So Jun 08, 2014 15:56 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
was gibt es denn für Fehlermeldungen?
Endl steht für end-of-line und ist einfach nur dein "\n". End hingegen ist eine Funktion.

Es war ein Tipp-Fehler, das gemeine, end und endl habe die gleiche Syntaxvorhebung.

Die Fehlermeldung:
Code:
  1. V:\DATEN\Programmierung\C++\test\Hello World.cpp||In function 'int main()':|
  2. V:\DATEN\Programmierung\C++\test\Hello World.cpp|7|error: no match for 'operator<<' (operand types are 'std::basic_ostream<char>' and '<unresolved overloaded function type>')|
  3. V:\DATEN\Programmierung\C++\test\Hello World.cpp|7|note: candidates are:|
  4. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|108|note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>::__ostream_type& (*)(std::basic_ostream<_CharT, _Traits>::__ostream_type&)) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]|
  5. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|108|note:   no known conversion for argument 1 from '<unresolved overloaded function type>' to 'std::basic_ostream<char>::__ostream_type& (*)(std::basic_ostream<char>::__ostream_type&) {aka std::basic_ostream<char>& (*)(std::basic_ostream<char>&)}'|
  6. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|117|note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>::__ios_type& (*)(std::basic_ostream<_CharT, _Traits>::__ios_type&)) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>; std::basic_ostream<_CharT, _Traits>::__ios_type = std::basic_ios<char>]|
  7. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|117|note:   no known conversion for argument 1 from '<unresolved overloaded function type>' to 'std::basic_ostream<char>::__ios_type& (*)(std::basic_ostream<char>::__ios_type&) {aka std::basic_ios<char>& (*)(std::basic_ios<char>&)}'|
  8. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|127|note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(std::ios_base& (*)(std::ios_base&)) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]|
  9. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|127|note:   no known conversion for argument 1 from '<unresolved overloaded function type>' to 'std::ios_base& (*)(std::ios_base&)'|
  10. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|166|note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(long int) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]|
  11. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|166|note:   no known conversion for argument 1 from '<unresolved overloaded function type>' to 'long int'|
  12. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|170|note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(long unsigned int) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]|
  13. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|170|note:   no known conversion for argument 1 from '<unresolved overloaded function type>' to 'long unsigned int'|
  14. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|174|note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(bool) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]|
  15. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|174|note:   no known conversion for argument 1 from '<unresolved overloaded function type>' to 'bool'|
  16. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\ostream.tcc|91|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short int) [with _CharT = char; _Traits = std::char_traits<char>]|
  17. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\ostream.tcc|91|note:   no known conversion for argument 1 from '<unresolved overloaded function type>' to 'short int'|
  18. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|181|note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(short unsigned int) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]|
  19. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|181|note:   no known conversion for argument 1 from '<unresolved overloaded function type>' to 'short unsigned int'|
  20. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\ostream.tcc|105|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _CharT = char; _Traits = std::char_traits<char>]|
  21. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\ostream.tcc|105|note:   no known conversion for argument 1 from '<unresolved overloaded function type>' to 'int'|
  22. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|192|note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(unsigned int) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]|
  23. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|192|note:   no known conversion for argument 1 from '<unresolved overloaded function type>' to 'unsigned int'|
  24. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|201|note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(long long int) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]|
  25. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|201|note:   no known conversion for argument 1 from '<unresolved overloaded function type>' to 'long long int'|
  26. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|205|note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(long long unsigned int) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]|
  27. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|205|note:   no known conversion for argument 1 from '<unresolved overloaded function type>' to 'long long unsigned int'|
  28. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|220|note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(double) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]|
  29. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|220|note:   no known conversion for argument 1 from '<unresolved overloaded function type>' to 'double'|
  30. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|224|note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(float) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]|
  31. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|224|note:   no known conversion for argument 1 from '<unresolved overloaded function type>' to 'float'|
  32. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|232|note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(long double) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]|
  33. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|232|note:   no known conversion for argument 1 from '<unresolved overloaded function type>' to 'long double'|
  34. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|245|note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(const void*) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]|
  35. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|245|note:   no known conversion for argument 1 from '<unresolved overloaded function type>' to 'const void*'|
  36. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\ostream.tcc|119|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>::__streambuf_type*) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__streambuf_type = std::basic_streambuf<char>]|
  37. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\ostream.tcc|119|note:   no known conversion for argument 1 from '<unresolved overloaded function type>' to 'std::basic_ostream<char>::__streambuf_type* {aka std::basic_streambuf<char>*}'|
  38. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\basic_string.h|2753|note: template<class _CharT, class _Traits, class _Alloc> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const std::basic_string<_CharT, _Traits, _Alloc>&)|
  39. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\basic_string.h|2753|note:   template argument deduction/substitution failed:|
  40. V:\DATEN\Programmierung\C++\test\Hello World.cpp|7|note:   couldn't deduce template parameter '_Alloc'|
  41. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|471|note: std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, _CharT) [with _CharT = char; _Traits = std::char_traits<char>]|
  42. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|471|note:   no known conversion for argument 2 from '<unresolved overloaded function type>' to 'char'|
  43. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|476|note: template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, char)|
  44. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|476|note:   template argument deduction/substitution failed:|
  45. V:\DATEN\Programmierung\C++\test\Hello World.cpp|7|note:   cannot convert 'std::end' (type '<unresolved overloaded function type>') to type 'char'|
  46. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|482|note: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, char)|
  47. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|482|note:   template argument deduction/substitution failed:|
  48. V:\DATEN\Programmierung\C++\test\Hello World.cpp|7|note:   cannot convert 'std::end' (type '<unresolved overloaded function type>') to type 'char'|
  49. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|488|note: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, signed char)|
  50. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|488|note:   template argument deduction/substitution failed:|
  51. V:\DATEN\Programmierung\C++\test\Hello World.cpp|7|note:   cannot convert 'std::end' (type '<unresolved overloaded function type>') to type 'signed char'|
  52. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|493|note: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, unsigned char)|
  53. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|493|note:   template argument deduction/substitution failed:|
  54. V:\DATEN\Programmierung\C++\test\Hello World.cpp|7|note:   cannot convert 'std::end' (type '<unresolved overloaded function type>') to type 'unsigned char'|
  55. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|513|note: std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const _CharT*) [with _CharT = char; _Traits = std::char_traits<char>]|
  56. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|513|note:   no known conversion for argument 2 from '<unresolved overloaded function type>' to 'const char*'|
  57. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\ostream.tcc|321|note: template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const char*)|
  58. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\ostream.tcc|321|note:   template argument deduction/substitution failed:|
  59. V:\DATEN\Programmierung\C++\test\Hello World.cpp|7|note:   cannot convert 'std::end' (type '<unresolved overloaded function type>') to type 'const char*'|
  60. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|530|note: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, const char*)|
  61. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|530|note:   template argument deduction/substitution failed:|
  62. V:\DATEN\Programmierung\C++\test\Hello World.cpp|7|note:   cannot convert 'std::end' (type '<unresolved overloaded function type>') to type 'const char*'|
  63. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|543|note: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, const signed char*)|
  64. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|543|note:   template argument deduction/substitution failed:|
  65. V:\DATEN\Programmierung\C++\test\Hello World.cpp|7|note:   cannot convert 'std::end' (type '<unresolved overloaded function type>') to type 'const signed char*'|
  66. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|548|note: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, const unsigned char*)|
  67. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|548|note:   template argument deduction/substitution failed:|
  68. V:\DATEN\Programmierung\C++\test\Hello World.cpp|7|note:   cannot convert 'std::end' (type '<unresolved overloaded function type>') to type 'const unsigned char*'|
  69. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|602|note: template<class _CharT, class _Traits, class _Tp> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&)|
  70. c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream|602|note:   template argument deduction/substitution failed:|
  71. V:\DATEN\Programmierung\C++\test\Hello World.cpp|7|note:   couldn't deduce template parameter '_Tp'|
  72. ||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 1 second(s)) ===|
  73.  

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ein paar Fragen zu C++11
BeitragVerfasst: So Jun 08, 2014 20:08 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Der sehr kleine aber feine Unterschied zwischen "std::endl" und "\n" ist, dass Zweiteres nur ein Zeilenumbruch ist und Ersteres ein Zeilenumbruch und einen augenblicklichen Flush des Ausgabestreams auslöst. Ich würde in praktisch allen Fällen einfach "\n" verwenden, ist schneller und kompakter.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ein paar Fragen zu C++11
BeitragVerfasst: So Jun 08, 2014 23:02 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Diese beiden Zeilen machen das Gleiche.
Code:
  1.     std::cout << "test" <<  '\n' << "test";
  2.     std::cout << "test" <<  char(13) << char(10) << "test";


Unten Pascal geht \n nicht. Anscheinend wird '\n' direkt vom C-Compiler abgefangen.

Code:
  1.   Write('test', '\n', 'test');
  2.   Write('test', #10#13, 'test');

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ein paar Fragen zu C++11
BeitragVerfasst: Mo Jun 09, 2014 11:20 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
ja, Pascal unterstützt, soweit ich weiß, keine Escape Sequenzen. Das ist allerdings soweit verbreitet das hier Pascal eher der Sonderling ist :)

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ein paar Fragen zu C++11
BeitragVerfasst: Mo Jun 09, 2014 16:25 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
ja, Pascal unterstützt, soweit ich weiß, keine Escape Sequenzen.

Ich hatte diese nie vermisst, auch als ich noch unter DOS programmierte.

Da einzige was mir unter Escape-Sequenzen bekanntwar, waren die Funktionen in ANSI.SYS.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ein paar Fragen zu C++11
BeitragVerfasst: Mo Jun 09, 2014 19:45 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
\n ist nicht das gleiche wie #13#10, sondern nur #10.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ein paar Fragen zu C++11
BeitragVerfasst: Mo Jun 09, 2014 21:20 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Lord Horazont hat geschrieben:
\n ist nicht das gleiche wie #13#10, sondern nur #10.

grüße

Stimmt #10 reicht für die Windows-Konsole, aber notepad.exe hat Probleme, wen #13 fehlt, obwohl beides von m$ kommt.

Code:
  1. Showmessage('Hello World'#10'Hello World');
  2. Showmessage('Hello World'#13'Hello World');
  3. Showmessage('Hello World'#13#10'Hello World');
  4. Showmessage('Hello World'#10#13'Hello World');
Interessanterweisse machen alle 4 Zeilen das Gleiche. :shock:

Unter Linux macht die 3. Zeile eine Leerzeile in der Mesagebox.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ein paar Fragen zu C++11
BeitragVerfasst: Mo Jun 09, 2014 22:08 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Sicher das endl immer das gleiche ist wie #13#10? Ich dachte immer auf Linux Systemen macht das ein #13 und auf Windows Systemen ein #13#10. Halt jenachdem was fur das System ein gültiger Zeilenumbruch ist...

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 70 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4, 5  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 25 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.015s | 14 Queries | GZIP : On ]