Autor Beitrag
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Di 06.06.17 21:58 
Hallo Programmierfreunde!

Zur Zeit versuche ich mich an meinem nächsten C++-Projekt (Anhang). Es geht darum, einen Sortieralgorithmus aufzurufen; seine Quelle ist diese. Dort steht "This library is compatible with C++98". Ich konnte nicht genau erfahren, ab welchem Visual Studio C++98 unterstützt wird, allerdings suggeriert "98" eine Jahreszahl, und 10 Jahre später wurde hoffentlich wenistens das eingearbeitet, was in dem Projekt verwandt wird.

Wie man Arrays initialisiert und bestückt, wurde mir ja schon an anderer Stelle dankenswerterweise beigebracht.

Die eingebundene Datei "timsort.hpp" wird anscheinend korrekt erkannt, denn ändere ich darin etwas wahllos, compiliert es nicht mehr. Ansonsten habe ich versucht, mich streng an das unter "Synopsis" angegebene Beispiel obiger Internetseite zu halten. Das Projekt compiliert, solang ich den Sortieralgorithmus nicht aufzurufen versuche. Nehme ich die Zeile

ausblenden Quelltext
1:
gfx::timsort(a.begin(), a.end(), std::less<string>());					


hinzu, kann ich auch über "Gehe zur Definition" oder "Gehe zur Deklaration" nach bzw. in die "timsort.hpp" wechseln und zu timsort springen. Bis dahin ist also noch alles in Ordnung. Versuche ich jedoch auch noch das Compilieren, hagelt es (eigentlich nur 2) Fehlermeldungen:

Zitat:
1>------ Erstellen gestartet: Projekt: benchmarking, Konfiguration: Debug Win32 ------
1>Kompilieren...
1>main.cpp
1>c:\Dokumente und Einstellungen\Admin\Desktop\Benchmarking\benchmarking\inc\timsort.hpp(167) : error C2589: '(': Ungültiges Token auf der rechten Seite von '::'
1> c:\Dokumente und Einstellungen\Admin\Desktop\Benchmarking\benchmarking\inc\timsort.hpp(145): Bei der Kompilierung der Klassen-template der void gfx::TimSort<RandomAccessIterator,LessFunction>::sort(const std::_Vector_iterator<_Ty,_Alloc>,const std::_Vector_iterator<_Ty,_Alloc>,gfx::Compare<Value,LessFunction>)-Memberfunktion
1> with
1> [
1> RandomAccessIterator=std::_Vector_iterator<std::string,std::allocator<std::string>>,
1> LessFunction=std::less<std::string>,
1> _Ty=std::string,
1> _Alloc=std::allocator<std::string>,
1> Value=const std::basic_string<char,std::char_traits<char>,std::allocator<char>> &
1> ]
1> c:\Dokumente und Einstellungen\Admin\Desktop\Benchmarking\benchmarking\inc\timsort.hpp(679): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "gfx::TimSort<RandomAccessIterator,LessFunction>".
1> with
1> [
1> RandomAccessIterator=std::_Vector_iterator<std::string,std::allocator<std::string>>,
1> LessFunction=std::less<std::string>
1> ]
1> .\src\main.cpp(21): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void gfx::timsort<std::_Vector_iterator<_Ty,_Alloc>,std::less<_Ty>>(const RandomAccessIterator,const RandomAccessIterator,LessFunction)".
1> with
1> [
1> _Ty=std::string,
1> _Alloc=std::allocator<std::string>,
1> RandomAccessIterator=std::_Vector_iterator<std::string,std::allocator<std::string>>,
1> LessFunction=std::less<std::string>
1> ]
1>c:\Dokumente und Einstellungen\Admin\Desktop\Benchmarking\benchmarking\inc\timsort.hpp(167) : error C2059: Syntaxfehler: '::'
1>Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\Admin\Desktop\Benchmarking\benchmarking\Debug\BuildLog.htm" gespeichert.
1>benchmarking - 2 Fehler, 0 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========


Kann jemand mit vertretbarem (!) Aufwand überblicken, wo der Fehler stecken könnte, bitte?

Auch mit den auf o.g. Internetseite enthaltenen Beispielen "example", "test" und "valgrind" war ich nicht erfolgreich.

Vielen Dank im voraus und Gruß

Delphi-Laie
Einloggen, um Attachments anzusehen!
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 07.06.17 01:48 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: Delphi-Laie
Delphi-Laie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mi 07.06.17 12:33 
Besten Dank, Frühlingsrolle!

Natürlich ist es ein VS-2008-Projekt, das müßte aus meinem ersten Beitrag implizit hervorgehen.

Wenn C++98 dem Visual C++ 6.0 entspricht, ist rätselhaft, warum Visual C++ 9.0 damit schon nicht mehr klarkommt, das Visual C++ der Nachfolgegeneration jedoch, wie Du schriebst, es problemlos compilieren kann.

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Dein Dateianhang entspricht der Version 9, also muss es vorhin mit VS2008 erstellt worden sein, sofern es nicht von dir kompiliert worden ist?!


Das verstehe ich leider nicht. Das Erstellen eines Projektes ist doch zunächst einmal vom Compilieren unabhängig?!

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Die .SLN Datei ändert beim Kompilieren ihre Versionsnummer.


Das verstehe ich ebenfalls nicht. Wird in die .SLN-Datei beim Compilieren - und etwa erst dann? - die Versionsnummer des Compilers eingetragen? Was ist im Zeitraum zwischen Projekterstellung und erstmaliger Compilierung?

9.0 steht in meiner .SLN-Datei jedenfalls nicht drin, sondern:

Zitat:
Microsoft Visual Studio Solution File, Format Version 10.00
# Visual C++ Express 2008


user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Mit VS2012 (C++11) lässt es sich problemlos kompilieren.


Danke, das läßt hoffen, und das behalte ich als Option im Hinterkopf.

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Kommentier' bei dir in der timsort.hpp die inkludierten Headerdateien aus, bis auf: #include <vector> und versuch es zu kompilieren.


Das war leider nicht erfolgreich.

Dank und beste Grüße

Delphi-Laie
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 07.06.17 12:52 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: Delphi-Laie
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 07.06.17 13:13 
Warum hast du überhaupt
ausblenden C++
1:
#include <windows.h>					

bei dir drin?

Wenn du es wirklich (noch für andere Sachen benötigst), dann schreibe vorher
ausblenden C++
1:
#define NOMINMAX					

(s.a. The min/max problem in C++ and Windows)

Für diesen Beitrag haben gedankt: Delphi-Laie
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Mi 07.06.17 14:03 
TH69 hat es ja schon erwähnt. Der Grund warum du nicht kompilieren kannst liegt an den Makros min und max die in "windows.h" definiert sind. Wenn du den Header nicht benötigst, solltest du ihn nicht einbinden. Du kannst natürlich auch das Makro #define NOMINMAX benutzen. Dabei ist es aber wichtig, dass du die Definition vor die erste Einbindung von "windows.h" schreibst, da sie sonst ignoriert wird.

Noch ein paar kleine Anmerkungen zu deinem Code generell:

1. Wenn du using namespace xyz; benutzt, brauchst du den namespace qualifier später nicht mehr verwenden, d.h. du kannst aus std::vector ein vector machen

2. Ich bin mir nicht sicher ob das Folgende für C++98 gilt, aber du kannst den Vektor auch mit einer initializer_list initialisieren vector<string> a({ "3""2""1" }); dadurch sparst du dir die Definition des Arrays.

3. Du kannst auch Iteratoren auf Arrays erstellen (nicht sicher ob die Funktion schon in C++98 existiert): gfx::timsort(std::begin(init_values), std::end(init_values), std::less<string>()); dadurch sparst du dir den Vektor (dafür musst du aber das const in der Arraydefinition entfernen).

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler

Für diesen Beitrag haben gedankt: Delphi-Laie
Delphi-Laie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mi 07.06.17 15:32 
Liebe Leute, vielen Dank für Eure Hilfsbereitschaft! Ich werde mich erst heute abend eingehender damit beschäftigen (können), vorher werde ich nicht dazu kommen. Fragen á la "Warum hast Du dies und das drin?" kann ich kaum beantworten, lieber zuviel als zuwenig, solang ich nicht weiß, warum es zickt. Bei Delphi ist es ja auch kein Frevel, überflüssige Units in die Uses-Klausel aufzunehmen.

Ich versuchte es vorhin, für VS 2005 flottzubekommen. In der sln-Datei muß man "Format Version 9.00" auf eben 9.00 ändern (um 1 reduzieren), in der vcproj-Datei hingegen auf "Version="8,00" ändern (auch um 1 vermindern). Was für ein Versionsnummernchaos! Danachläßt sich das Projekt abe fehlerfrei laden - compilieren natürlich ebenfalls nicht. Warum MS es nicht hinbekommen hat, das in einem älteren Format abspeichern zu lassen - zumindest in Mikroprojekten sind die Änderungen nur minimal - ist mir rätselhaft (bei Delphi gibt es das allerdings leider auch nicht).
Delphi-Laie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mi 07.06.17 22:47 
So, zunächst gehe ich auf Deine Hilfe, Frühlingsrolles, ein: Mir ist nicht ganz klar, was die Gegenüberstellung der beiden Symbole - das für VS 2008 und das für 2012 - bezwecken soll. Daß ein Nachfolge-VS das Projekt erfolgreich laden und in sein aktuelles Format konvertieren kann, ist anzunehmen.

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Sind nun mehr Fehler dazu gekommen, oder ist es noch beim alten?


Vermutlich bezog sich Deine Frage darauf, in timsort.hpp die Bibliotheken außer #include <vector> auszukommentieren. Getan, und es bleiben tatsächlich weiterhin zwei Fehler übrig.

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Dem Fehler aus Zeile 167 kannst du direkt entgegenwirken, wenn du vor dem std::min(), #undef min schreibtst.


Wenn ich Deinen Hinweis genau nehme, dann müßte ich demnach schreiben:

ausblenden Quelltext
1:
diff_t const force  = #undef min std::min(nRemaining, minRun);					


Das bewirkt die Compiler-Fehlermeldung:

Zitat:
1>------ Erstellen gestartet: Projekt: benchmarking, Konfiguration: Debug Win32 ------
1>Kompilieren...
1>main.cpp
1>c:\Dokumente und Einstellungen\Admin\Desktop\Benchmarking\benchmarking\inc\timsort.hpp(167) : error C2014: Präprozessorbefehl muss mit dem ersten Zeichen in der Zeile beginnen.
1>Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\Admin\Desktop\Benchmarking\benchmarking\Debug\BuildLog.htm" gespeichert.
1>benchmarking - 1 Fehler, 0 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========


Setze ich es weiter vorn, z.B. ganz oben noch vor die anderen Definitionen:

ausblenden Quelltext
1:
2:
3:
#undef min
#ifndef GFX_TIMSORT_HPP
#define GFX_TIMSORT_HPP


erscheinen die beiden üblichen Fehlermeldungen:

Zitat:
1>------ Erstellen gestartet: Projekt: benchmarking, Konfiguration: Debug Win32 ------
1>Kompilieren...
1>main.cpp
1>c:\Dokumente und Einstellungen\Admin\Desktop\Benchmarking\benchmarking\inc\timsort.hpp(198) : error C2039: 'upper_bound': Ist kein Element von 'std'
1> c:\Dokumente und Einstellungen\Admin\Desktop\Benchmarking\benchmarking\inc\timsort.hpp(189): Bei der Kompilierung der Klassen-template der void gfx::TimSort<RandomAccessIterator,LessFunction>::binarySort(const std::_Vector_iterator<_Ty,_Alloc>,const std::_Vector_iterator<_Ty,_Alloc>,std::_Vector_iterator<_Ty,_Alloc>,gfx::Compare<Value,LessFunction>)-Memberfunktion
1> with
1> [
1> RandomAccessIterator=std::_Vector_iterator<std::string,std::allocator<std::string>>,
1> LessFunction=std::less<std::string>,
1> _Ty=std::string,
1> _Alloc=std::allocator<std::string>,
1> Value=const std::basic_string<char,std::char_traits<char>,std::allocator<char>> &
1> ]
1> c:\Dokumente und Einstellungen\Admin\Desktop\Benchmarking\benchmarking\inc\timsort.hpp(681): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "gfx::TimSort<RandomAccessIterator,LessFunction>".
1> with
1> [
1> RandomAccessIterator=std::_Vector_iterator<std::string,std::allocator<std::string>>,
1> LessFunction=std::less<std::string>
1> ]
1> .\src\main.cpp(16): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void gfx::timsort<std::_Vector_iterator<_Ty,_Alloc>,std::less<_Ty>>(const RandomAccessIterator,const RandomAccessIterator,LessFunction)".
1> with
1> [
1> _Ty=std::string,
1> _Alloc=std::allocator<std::string>,
1> RandomAccessIterator=std::_Vector_iterator<std::string,std::allocator<std::string>>,
1> LessFunction=std::less<std::string>
1> ]
1>c:\Dokumente und Einstellungen\Admin\Desktop\Benchmarking\benchmarking\inc\timsort.hpp(198) : error C3861: "upper_bound": Bezeichner wurde nicht gefunden.
1>Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\Admin\Desktop\Benchmarking\benchmarking\Debug\BuildLog.htm" gespeichert.
1>benchmarking - 2 Fehler, 0 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========


So, ich habe es mit VS 2012 versucht. Das compiliert - oh Wunder - tatsächlich. Damit geht es zur Not auch. Allerdings hätte ich es lieber für 2008 und/oder 2005 lauffähig, weil VS 2012 leider nicht mehr auf meinem Laptop mit Windows XP läuft. Allerdings habe ich Eure Geduld schon genug strapaziert.

Denkste, es läuft auch nur, weil

ausblenden Quelltext
1:
gfx::timsort(a.begin(), a.end(), std::less<string>());					


in der hier veröffentlichten Version auskommentiert war. Nehme ich diese entscheidende Zeile wieder hinzu - und damit wird ja der Algorithmus aufgerufen - hagelt es wieder Fehlermeldungen.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 08.06.17 04:19 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: Delphi-Laie
Delphi-Laie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Do 08.06.17 07:48 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Den auskommentierten Zeilen im main.cpp hatte ich keine Beachtung geschenkt, aber nachträglich hat es mit dem Typ Integer funktioniert


Was genau hat mit dem Typ integer funktioniert?

Ändere ich die die Main-Prozedur nach

ausblenden xstddef
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
void main(void){
//const string init_values[] = { "3", "2", "1" };
//std::vector<string> a(init_values,init_values+3);
//gfx::timsort(a.begin(), a.end(), std::less<string>());

//hier der Versuch mit einem Integerarray
const int init_values[] = { 321 };
std::vector <int> values(init_values, init_values+3);
gfx::timsort(values.begin(), values.end(), std::less<int>());
}


bekomme ich jedenfalls nach wie vor die bekannten beiden Fehlermeldungen.
Delphi-Laie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Do 08.06.17 08:01 
So, ich habe mir jetzt das andere durchgelesen, vor allem das weiter oben von Th69 verlinkte. Mit Hinzunahme von

ausblenden Quelltext
1:
#include <algorithm>					


in der timsort.hpp sind tatsächlich sämtliche Fehlermeldungen Geschichte. Herrje, was für eine Zangengeburt!

Nochmals besten Dank an alle!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 08.06.17 09:01 
C++ ist nun mal keine Sprache, bei der man mittels Trial&Error zum Erfolg kommt. Man muß schon jede einzelne Zeile genau verstehen, denn die Sprache ist einfach zu komplex.
Und gerade die Fehlermeldungen bei Templates sind zurzeit wirklich häufig sehr kryptisch (mittels Concepts soll das dann irgendwann mal besser werden).

Für diesen Beitrag haben gedankt: Delphi-Laie