none
Fehlermeldung bei vector.reserve RRS feed

  • Frage

  • Hallo,

    versuche gerade in einer Consolenanwendung einen vector mittels reserve zu definieren.

    struct fli_t {
      int Feld;
      int Fig;
    };

    ...

    vector<fli_t> FigList;
    FigList.reserve(32);

    Leider lässt sich das in VS 2017 nicht übersetzen. Komme trotz eifrigen Suchens nicht hinter den Fehler. Bin für jeden Tip dankbar.

    Gruß Horst

    • Verschoben Stefan Falz Montag, 26. November 2018 07:11 C++ Frage
    Sonntag, 25. November 2018 12:53

Antworten

  • Möchte mich doch noch einmal für Deine Geduld und Hilfe bedanken. Ich kam da einfach nicht weiter.

    Gruß Horst

    • Als Antwort markiert hgroe Freitag, 30. November 2018 10:55
    Freitag, 30. November 2018 10:54

Alle Antworten

  • Hi Horst,
    was ist bei Dir die generische vector-Klasse?

    Üblicherweise ist ein Vector eine Struktur mit 2 Gleitkommawerten.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks

    Sonntag, 25. November 2018 16:38
  • Hallo Peter,

    Danke für Deine Antwort. Zu meiner Schande muss ich aber gestehen, ich verstehe sie nicht.

    Habe übrigens das Programm etwas geändert:

    der struct entfällt,

    vector<int> FigList;
    FigList.reserve(32);

    später soll auf diesen vector durch

    int tmpFl;

    for (auto &FigList : tmpFl){

    jede Menge Aktionen mit tmpFl ...

    zugegriffen werden. Leider funktioniert das auch nicht. Ich verstehe es einfach nicht. Jn der Hilfe, Literatur etc. wird ein vector doch genauso definiert.

    Gruß Horst

    Sonntag, 25. November 2018 17:06
  • Hi Horst,
    was soll bei Dir der Typ "vector" sein? 

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks

    Sonntag, 25. November 2018 17:13
  • ein std::vector

    habe natürlich ein #include <vector> sowie using namespace std
    • Bearbeitet hgroe Sonntag, 25. November 2018 17:17
    Sonntag, 25. November 2018 17:16
  • Hi,
    ok, da muss ich passen, da das kein Frage zu den Themen der Newsgroup ist (Visual Studio Community). Das scheint eine Frage zu C zu sein.

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks

    Sonntag, 25. November 2018 17:51
  • Ok, trotzdem vielen Danle für Deine Mühe. Hast Du vielleicht einen Tip fürs richtige Forum ?
    Sonntag, 25. November 2018 17:55
  • -> Programmiersprachen -> C++ usw.

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks

    Sonntag, 25. November 2018 17:58
  • Danke
    Sonntag, 25. November 2018 18:13
  • Hallo

    versuche gerade in einer Consolenanwendung einen vector mittels reserve zu definieren.

    struct fli_t {
      int Feld;
      int Fig;
    };

    ...

    vector<fli_t> FigList;
    FigList.reserve(32);

    Leider lässt sich das in VS 2017 nicht übersetzen. Komme trotz eifrigen Suchens nicht hinter den Fehler. Bin für jeden Tip dankbar.


    Ich kann da keinen Fehler erkennen, sofern das #include <vector> und using std enthalten ist, was Du ja so schreibst. Kompiliert bei mir unter VS2017 auch ohne Fehlermeldung. Ich schätze der Fehler liegt woanders.


    - Gruß Florian


    • Bearbeitet Florian Haupt Montag, 26. November 2018 09:26
    • Als Antwort vorgeschlagen Florian Haupt Freitag, 30. November 2018 07:48
    Montag, 26. November 2018 09:26
  • Hallo Florian,

    das sehe ich genauso, vielleicht eine Einstellung im VS? Habe zur Verdeutlichung den Code etwas vereinfacht (was aber auch nichts nutzt). Vielleicht wird es etwas deutlicher wenn ich die Fehlermeldungen angebe. Zeile 60 und 61 beziehen sich auf

    vector<int> FigList;
    FigList.reserve(32);

    Zeile 1176 auf

    for (auto &FigList : tmpFl){

    1>c:\users\hgr\source\repos\hgrmax\hgrmax\hgrmax.cpp(61): error C3927: "->": Ein nachstehender Rückgabetyp ist nach einem Nichtfunktionsdeklarator nicht zulässig.
    1>c:\users\hgr\source\repos\hgrmax\hgrmax\hgrmax.cpp(61): error C3484: Syntaxfehler: "->" wird vor dem Rückgabetyp erwartet.
    1>c:\users\hgr\source\repos\hgrmax\hgrmax\hgrmax.cpp(61): error C3613: Rückgabetyp nach '"->" (Annahme: "int") fehlt
    1>c:\users\hgr\source\repos\hgrmax\hgrmax\hgrmax.cpp(61): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
    1>c:\users\hgr\source\repos\hgrmax\hgrmax\hgrmax.cpp(61): error C2371: "FigList": Neudefinition; unterschiedliche Basistypen
    1>c:\users\hgr\source\repos\hgrmax\hgrmax\hgrmax.cpp(60): note: Siehe Deklaration von "FigList"
    1>c:\users\hgr\source\repos\hgrmax\hgrmax\hgrmax.cpp(61): error C2146: Syntaxfehler: Fehlendes ";" vor Bezeichner "reserve"
    1>c:\users\hgr\source\repos\hgrmax\hgrmax\hgrmax.cpp(1176): error C3312: no callable 'begin' function found for type 'int'
    1>c:\users\hgr\source\repos\hgrmax\hgrmax\hgrmax.cpp(1176): error C3312: no callable 'end' function found for type 'int'
    1>Die Erstellung des Projekts "hgrMax.vcxproj" ist abgeschlossen -- FEHLER.

    Die Datei beginnt mit

    ...

    #include <vector>
    #include "hgrmax.h"

    using namespace std;
    ...

    Darauf folgen etliche Konstanten- und Variablendefinitionen, die aber schon unzählige Male ohne Probleme kompiliert wurden. Der Vollständigkeit halber führe ich sie hier - gekürzt um die Kommentare - an. Der Fehler kann also nur hier oder halt in eine VS Einstellung liegen:

    // Definition von globalen Variablen und Tabellen
    array<int, BRETT_DIM> Brett;
    int Ep_Feld[MAX_TIEFE]{};
    array<zug_t, ZSTACK_DIM + 1> ZugStack;

    array<int, H8 + 1> Bewegt;
    array<bool, 3> Rochade;
    int Idx{};
    int StackLim[MAX_TIEFE]{};
    vonto_t HVar[MAX_TIEFE][MAX_TIEFE];
    killer_t KillerTab[MAX_TIEFE]{};

    // Tabellen für Bewertungsfunktion
    bothcolor_t BControl[BRETT_DIM];
    bothcolor_t Bauern[H_LINIE + 2];
    bothcolor_t Tuerme[H_LINIE + 2];
    int Mobility[MAX_TIEFE]{};
    int ToFeld[MAX_TIEFE]{};
    int wKing{};
    int sKing{};
    int Farbe{};
    int SollTiefe{};
    int MaxDeepening{};    
    int Tiefe{};
    long NodeCnt{};
    int LastZug{};
    bool InSchach{};
    int ZugNr{};
    int Rule50{};

    constexpr int FigMat[FIGTYPEN]{0, MAT_B, MAT_T, MAT_L, MAT_S, MAT_D, MAT_K};
    constexpr char FigSymbol[FIGTYPEN]{'.', 'B', 'T', 'L', 'S', 'D', 'K'};
    int MatBilanz[MAX_TIEFE]{};
    int MatSum[MAX_TIEFE]{};

    Vorab schon mal vielen Dank für Deine Unterstützug, das Problem raubt mir den letzten Nerv, zumal ich erst kürzlich von DevC++ auf VS umgestiegen bin.

    Gruß Horst

    Montag, 26. November 2018 10:20
  • vector<int> FigList;

    FigList.reserve(32);

    Zeile 1176 auf

    for (auto &FigList : tmpFl){

    Du hast FigList als vector<int> definiert, daher verstehe ich das "auto" in der for Schleife nicht, könnte es sein, dass genau dies vom Compiler bemängelt wird?


    - Gruß Florian

    Montag, 26. November 2018 10:35
  • Nein, das ist es auch nicht. Er bemängelt, dass nur ein int vorliegt und für dieses kein Begin() End() definiert ist. Das ist aber das Problem. In Zeile 60 soll kein int definiert werden sondern ein vector mit int. Ein solcher hätte das angegebene Problem nicht.

    Gruß Horst

    Montag, 26. November 2018 10:43
  • Nein, das ist es auch nicht. Er bemängelt, dass nur ein int vorliegt und für dieses kein Begin() End() definiert ist. Das ist aber das Problem. In Zeile 60 soll kein int definiert werden sondern ein vector mit int. Ein solcher hätte das angegebene Problem nicht.

    Hatte überlesen das Du den Typ von tmpFL bereits genannt hattest, auf einem int kannst Du kein ranged based for anwenden, denn dieses hat tatsächlich kein Begin() und End().

    Statt:

    for (auto &FigList : tmpFl){
    ...
    }
    solltes es:
    for (auto &tmpFL: FigList ){
    ...
    }
    tmpFL wäre dann gerade ein Element aus dem Vector, vom Typ int. Bin mir allerdings nicht sicher ob das die Intention war, denn dies macht erst Sinn, wenn FigList auch befüllt ist, scheint mir aber das schlüssigste zu sein.


    - Gruß Florian

    Montag, 26. November 2018 11:35
  • Hallo Förian,

    wir kommen der Sache näher. Meine bereichsbasierte For-Schleife in Zeile 1176 war einfach falsch. Nachdem ich sie durch Deinen Änderungsvorschlag ersetzte war der Compiler zufrieden. Danke für den Hinweis. Nun werden nur noch wie gehabt die Zeilen 60 und 61 bemängelt. Aber das schaffen wir auch noch. Nochmals Danke.

    Gruß Horst

    Montag, 26. November 2018 17:32
  • Nachtrag:

    genauer gesagt bemängelt er nur noch Zeile 61 mit folgenden Fehlermeldungen:

    1>c:\users\hgr\source\repos\hgrmax\hgrmax\hgrmax.cpp(61): error C3927: "->": Ein nachstehender Rückgabetyp ist nach einem Nichtfunktionsdeklarator nicht zulässig.
    1>c:\users\hgr\source\repos\hgrmax\hgrmax\hgrmax.cpp(61): error C3484: Syntaxfehler: "->" wird vor dem Rückgabetyp erwartet.
    1>c:\users\hgr\source\repos\hgrmax\hgrmax\hgrmax.cpp(61): error C3613: Rückgabetyp nach '"->" (Annahme: "int") fehlt
    1>c:\users\hgr\source\repos\hgrmax\hgrmax\hgrmax.cpp(61): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
    1>c:\users\hgr\source\repos\hgrmax\hgrmax\hgrmax.cpp(61): error C2371: "FigList": Neudefinition; unterschiedliche Basistypen
    1>c:\users\hgr\source\repos\hgrmax\hgrmax\hgrmax.cpp(60): note: Siehe Deklaration von "FigList"
    1>c:\users\hgr\source\repos\hgrmax\hgrmax\hgrmax.cpp(61): error C2146: Syntaxfehler: Fehlendes ";" vor Bezeichner "reserve"

    Habe dann die Zeile auskommentiert, die nur aus Performance Gründen enthalten ist, und siehe da, es läuft. Zwar nicht ganz so wie von mir erwartet, aber das ist ein anderes Thema.

    Montag, 26. November 2018 19:23
  • Hi,

    und was steht in Zeile 61?

    Für mich sieht es aber eher so aus als wären das Folgefehler eines vorhergehenden Problems (fehlendes Semikolon oder ähnliches)


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Dienstag, 27. November 2018 10:13
  • Hallo Stefan,

    Zeile 60: vector<int> FigList;
    Zeile 61: FigList.reserve(32);

    den vorhergehenden Code habe ich weiter oben schon mal gepostet. Bisher hat dort niemand einen Fehler gefunden. Übrigens habe ich mal versucht das Ganze mit dem gcc zu übersetzen. Der mochte die Zeile 61 auch nicht und meinte FigList würde keinen Typ bezeichnen. Bin einfach nur ratlos.

    Gruß Horst

    Dienstag, 27. November 2018 10:35
  • Es wird ein Folgefehler sein, der entsprechende Code ist hier nicht dargestellt.

    Die Beurteilung welcher der Compilerfehler relevant ist, ist ohne den entsprechenden Quelltext nicht wirklich möglich. C2371 deutet unter anderem an, dass deine FigList zuvor anders definiert wurde, ob dies zutrifft oder nur die Folge eines anderen Fehlers ist kann ich so aber nicht beurteilen -> Eine Suche nach dem Bezeichner wird hier vielleicht helfen. Es kann auch eine falsch gesetzte Klammer, ein Tippfehler oder eine ähnliche Kleinigkeit sein.


    - Gruß Florian

    Dienstag, 27. November 2018 10:53
  • Hallo

    einen Versuch möchte ich noch starten. Poste deshalb einmal den gesamten relevanten Teil meines Codes. Habe den Code leicht umgestell um die Suche nach vorhergehenden Fehlern zu vereinfachen

    #include "pch.h"
    #include <iostream>
    #include <array>
    #include <chrono>
    #include <iomanip>  // std::setprecision
    #include <string>
    #include <vector>
    #include "hgrmax.h"

    using namespace std;

    // Definition von globalen Variablen und Tabellen. Zeilen 13 und 14
    vector<int> FigList;
    FigList.reserve(32);...

    Der einzige Codeabschnitt der noch einen Fehler enthalten könnte ist hgrmax.h.  Hier ist er:

    #ifndef HGRMAX_H
    #define HGRMAX_H

    const std::string EngineID = "HGRMAX 0.02 von H. G. Roessner\n";
    const std::string Zugstack_Fehler = "FEHLER: Zugstapel Ueberlauf\n";

    // Definition von symbolischen Konstanten.
    constexpr int BRETT_DIM = 120;   // Dimension des 10x12 Schachbrettes
    constexpr int MAX_TIEFE = 20;     // Maximale Suchtiefe
    constexpr int ZUGRICHTUNGEN = 16; // Anzahl der Zugrichtungen für alle Fig.
    constexpr int FIGTYPEN = 7;       // Anzahl der Figurtypen - Bezogen auf
                                      // Zugrichtungen. (wDame == sDame)
    constexpr int ZSTACK_DIM = 1000;  // Dimension des Zugstapels

    // Figuren. Schema: <Farbe>_<Figur>
    enum {
        S_K= -6, // Kennung für sw Figuren
        S_D,
        S_S,
        S_L,
        S_T,
        S_B,
        LEER,    // Leeres Feld ist 0
        W_B,     // Kennung für ws Figuren
        W_T,
        W_L,
        W_S,
        W_D,
        W_K,
        RAND=100
    };

    // Material-Wert der Figuren
    constexpr int MAT_B = 100;
    constexpr int MAT_T = 500;
    constexpr int MAT_L = 350;
    constexpr int MAT_S = 340;//325;
    constexpr int MAT_D = 900;
    constexpr int MAT_K = 0;
    constexpr int MATTVAL = 32000; // Bewertung für Matt
    constexpr int MAX_POS = MAT_L; // Maximum der Positionsbewertung

    // Bonus für Hauptvariante und Killezüge. Für Zugsortierung verwendet.
    constexpr int HVARBONUS    = 500;
    constexpr int KILLER1BONUS = 250;
    constexpr int KILLER2BONUS = 150;

    // Gesamtmaterial in der Grundstellung.
    constexpr int MAT_TOTAL    = ((4*(MAT_T+MAT_L+MAT_S))+(2*MAT_D));
    constexpr int ENDSPIEL_MAT = (4*MAT_T+(2*MAT_L));

    // Feldnummer für häufig verwendete Felder
    enum {
        A1=21, B1, C1, D1, E1, F1, G1, H1,
        H2=38,
        A3=41, C3=43, D3, E3,
        A6=71, C6=73, D6, E6,
        A7=81, C7=83, H7=88,
        A8=91, B8, C8, D8, E8, F8, G8, H8
    };

    // Werte der Reihen und Linien
    enum {
        A_LINIE=1,
        B_LINIE,
        C_LINIE,
        D_LINIE,
        E_LINIE,
        F_LINIE,
        G_LINIE,
        H_LINIE
    };

    enum {
        REIHE_1=2,
        REIHE_2,
        REIHE_3,
        REIHE_4,
        REIHE_5,
        REIHE_6,
        REIHE_7,
        REIHE_8
    };

    // Rochade Typ (Liefert Index für Rochade Array) bzw. Info dass Zug keine
    // Rochade ist.
    enum {
        KEINEROCHADE,
        KURZEROCHADE,
        LANGEROCHADE
    };

    // Farbe, die am Zug ist
    constexpr int WS = 1;
    constexpr int SW = -1;

    // Symbolische Konstanten fÜr logische Zustände/Abfragen.
    enum {
        ILLEGAL,
        LEGAL
    };

    // Information für einen Zug. Datentyp des Zugstacks.
    struct zug_t{
        int von;        // Von-Feld
        int zu;         // Nach-Feld
        int geschl_fig; // geschlagene Figur
        int promo_fig;  // umgewandelte Figur
        int rochade_t;  // Art der Rochade
        int ep_feld;    // Enpassant Feld
        int val;        // Bewertung für Zugsortierung
    };

    // Index der Figuren in Offset-Liste und Lang/Kurzschritt Kennung.
    struct figoffset_t {
        int  anfang;
        int  ende;
        bool langzug;
    };

    // Information über von/nachfeld (Zug ohne zugehörige Information)
    struct vonzu_t {
        int von;
        int zu;
    };

    // Struct zur Speicherung von 'Killer' Zügen.
    struct killer_t {
      vonzu_t killer1;
      vonzu_t killer2;
    };

    // Information über Bauern/Figuren Konstellationen.
    struct bothcolor_t {
      int ws;
      int sw;
      void clear() {
        ws = 0;
        sw = 0;
      }
    };

    #endif  // #ifndef HGRMAX_H

    Folgende Fehlermeldungen werden vom Compiler erzeugt:

    1>hgrMax.cpp
    1>c:\users\hgr\source\repos\hgrmax\hgrmax\hgrmax.cpp(14): error C3927: "->": Ein nachstehender Rückgabetyp ist nach einem Nichtfunktionsdeklarator nicht zulässig.
    1>c:\users\hgr\source\repos\hgrmax\hgrmax\hgrmax.cpp(14): error C3484: Syntaxfehler: "->" wird vor dem Rückgabetyp erwartet.
    1>c:\users\hgr\source\repos\hgrmax\hgrmax\hgrmax.cpp(14): error C3613: Rückgabetyp nach '"->" (Annahme: "int") fehlt
    1>c:\users\hgr\source\repos\hgrmax\hgrmax\hgrmax.cpp(14): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
    1>c:\users\hgr\source\repos\hgrmax\hgrmax\hgrmax.cpp(14): error C2371: "FigList": Neudefinition; unterschiedliche Basistypen
    1>c:\users\hgr\source\repos\hgrmax\hgrmax\hgrmax.cpp(13): note: Siehe Deklaration von "FigList"
    1>c:\users\hgr\source\repos\hgrmax\hgrmax\hgrmax.cpp(14): error C2146: Syntaxfehler: Fehlendes ";" vor Bezeichner "reserve"

    Die Compilierung klappt, wie schon mal erwähnt, wenn ich die Zeile 14 (FigList.reserve(32);) auskommentiere.

    Nochmals vielen, vielen Dank für jede Antwort.

    Gruß Horst


    • Bearbeitet hgroe Freitag, 30. November 2018 09:05
    Freitag, 30. November 2018 09:02
  • Hallo,

    verstehe ich das richtig, dass Du

    FigList.reserve(32);

    außerhalb einer Methode oder Funktion aufrufst?

    Falls ja, verschiebe es in eine Methode oder Funktion.


    - Gruß Florian

    Freitag, 30. November 2018 09:25
  • Hallo Florian,

    das verstehst Du richtig. Habe daraufhin FigList.reserve(32); in eine Init() Funktion, diese wird direkt zu Programmbegin in main aber auch von anderen Programmteilen aufgerufen, verschoben und es läuft. Allerdings ist das Laufzeitverhalten praktisch identisch mit der Version bei der ich diese Zeile einfach nur auskommentiert habe. Gibt es dafüreine Erklärung ? Und noch eine letzte Frage: In den unzähligen Literaturbeispielen zum Thema vector bin ich nirgends über die Notwendigkeit gestolpert FigList.reserve(32); nur in einer Funktion verwenden zu können. Hast Du einen Tip wo ich mich hierzu schlauer machen kann ?

    Nochmals, vielen vielen Dank.

    Gruß Horst

    Freitag, 30. November 2018 10:27
  • ...das Laufzeitverhalten praktisch identisch mit der Version bei der ich diese Zeile einfach nur auskommentiert habe. Gibt es dafüreine Erklärung ?

    Was heißt praktisch identisch? Die Laufzeit für 32 integer Werte schätze ich als sehr klein ein, würde daher keinen praktisch bemerkbaren Unterschied erwarten.

    Und noch eine letzte Frage: In den unzähligen Literaturbeispielen zum Thema vector bin ich nirgends über die Notwendigkeit gestolpert FigList.reserve(32); nur in einer Funktion verwenden zu können. Hast Du einen Tip wo ich mich hierzu schlauer machen kann ?

    Dies ist in keiner Weise spezifisch für reserve(..). Du kannst Methoden eines Objektes erst verwenden wenn dieses Objekt existiert, d. h. zur Laufzeit.


    - Gruß Florian

    • Als Antwort markiert hgroe Freitag, 30. November 2018 10:49
    • Tag als Antwort aufgehoben hgroe Freitag, 30. November 2018 10:51
    Freitag, 30. November 2018 10:41
  • Möchte mich doch noch einmal für Deine Geduld und Hilfe bedanken. Ich kam da einfach nicht weiter.

    Gruß Horst

    • Als Antwort markiert hgroe Freitag, 30. November 2018 10:55
    Freitag, 30. November 2018 10:54