Forum: PC-Programmierung Compiler lässt verzweifeln


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Nick S. (c0re)


Bewertung
0 lesenswert
nicht lesenswert
VisualStudio 2017, der Comiler weist beim erstellen auf diese Zeile mit 
den untenstehenden Fehlern hin.

Es geht um ein Programm welches XLSX Dateien öffnen und auslesen kann.

Book.h:
1
Sheet * getSheet(int i);
1
Fehler  C2143  Syntaxfehler: Es fehlt ";" vor "*"    
2
Fehler  C4430  Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.  
3
Fehler  C2238  Unerwartete(s) Token vor ";"

Was will er mir damit sagen?

Book.cpp:
1
Sheet * Book::getSheet(int i) {
2
3
  Sheet * sheet =  new Sheet();
4
  sheet->setName(getSheetName(i));
5
6
7
  return *&sheet;
8
  
9
}

: Verschoben durch Moderator
von jz23 (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Nick S. schrieb:
> Was will er mir damit sagen?

Vermutlich, dass er den Typ "Sheet" nicht kennt.

von Nick S. (c0re)


Bewertung
0 lesenswert
nicht lesenswert
jz23 schrieb:
> Nick S. schrieb:
>> Was will er mir damit sagen?
>
> Vermutlich, dass er den Typ "Sheet" nicht kennt.

Müsste er es dann nicht schon anstreichen wenn ich es getippt habe?
Es gibt eine Klasse Sheet und deren Header File ist auch eingebunden.

von jz23 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Nick S. schrieb:
> Müsste er es dann nicht schon anstreichen wenn ich es getippt habe?
> Es gibt eine Klasse Sheet und deren Header File ist auch eingebunden.

Wo ist die Header-Datei eingebunden? In Book.cpp oder Book.h? Und in 
welchen Zeilen genau werden die Fehlermeldungen erzeugt?

von Nick S. (c0re)


Bewertung
0 lesenswert
nicht lesenswert
jz23 schrieb:
> Nick S. schrieb:
>> Müsste er es dann nicht schon anstreichen wenn ich es getippt habe?
>> Es gibt eine Klasse Sheet und deren Header File ist auch eingebunden.
>
> Wo ist die Header-Datei eingebunden? In Book.cpp oder Book.h? Und in
> welchen Zeilen genau werden die Fehlermeldungen erzeugt?

In Book.h

Und jetzt kommt das lustige:

Wenn ich es ändere

in Book.h:
1
int * getSheet(int i);

in Book.cpp das:
1
int* Book::getSheet(int i) {
2
3
  Sheet * sheet =  new Sheet();
4
  sheet->setName(getSheetName(i));
5
6
7
  return &i;
8
  
9
}

es kompiliere (keine Fehler und es funktioniert, gibt nur komische 
Sachen aus) und es dann wieder

in Book.h:
1
Sheet * getSheet(int i);

und in Book.cpp zurückändere:
1
Sheet * Book::getSheet(int i) {
2
3
  Sheet * sheet =  new Sheet();
4
  sheet->setName(getSheetName(i));
5
6
7
  return *&sheet;
8
  
9
}

dann kann ich es normal kompilieren OHNE Fehler!

Wenn ich das Projekt danach neu erstelle kommt wieder der Fehler!
1
Fehler  C2143  Syntaxfehler: Es fehlt ";" vor "*"    
2
Fehler  C4430  Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.  
3
Fehler  C2238  Unerwartete(s) Token vor ";"

: Bearbeitet durch User
von Dr. Sommer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Nick S. schrieb:
> return *&sheet;
Was soll das denn?!

Zeig mal wie "Sheet" definiert ist. Was kommt im Header vor getSheet? 
Zeig mal den ganzen Code...

von Nick S. (c0re)


Bewertung
-1 lesenswert
nicht lesenswert
Dr. Sommer schrieb:
> Nick S. schrieb:
>> return *&sheet;
> Was soll das denn?!

Das ist ein Pointer auf eine Referenz? Es funktioniert, wenn es nicht 
gerade eine Fehlermeldung wirft die manchmal nicht da ist...
>
> Zeig mal wie "Sheet" definiert ist. Was kommt im Header vor getSheet?
> Zeig mal den ganzen Code...

book.h
1
#pragma once
2
#include "../TinyXml/tinyxml/tinyxml2.h"
3
#include "sheet.h"
4
#include "unzip.h"
5
#include <vector>
6
7
8
class Book {
9
public:
10
  
11
  void setValue(int v);
12
  int getValue();
13
  int sheetCount();
14
  std::string getSheetName(int i);
15
  bool load(char * filename);
16
  bool setSheetCount();
17
  bool setSheetNames();
18
  Sheet *getSheet(int i);
19
  //std::string getFileContent();
20
private:
21
  Unzipper * Zippy;
22
  tinyxml2::XMLDocument app_xml;
23
  
24
  //std::string sheetcount;
25
  int sheetcount;
26
  int value;
27
28
  std::vector<std::string> sharedStrings;
29
  std::vector<std::string> sheetNames;
30
31
};

sheet.h
1
#pragma once
2
#include "unzip.h"
3
#include <stdlib.h>
4
5
class Sheet {
6
public:
7
  Sheet();
8
  void setName(std::string i);
9
  std::string name();
10
  std::string readStr(size_t col, size_t row);
11
private:
12
  int value;
13
  std::string sheetname;
14
};

Aber wie gesagt der Code funktioniert. Nur ab und zu kommt der Fehler
1
Fehler  C2143  Syntaxfehler: Es fehlt ";" vor "*"    
2
Fehler  C4430  Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.  
3
Fehler  C2238  Unerwartete(s) Token vor ";"

Dann einfach mal VS2017 schließen und ein bisschen warten, nach 10 min 
wieder öffnen, der Fehler kommt nicht mehr.

von Dr. Sommer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Nick S. schrieb:
> Das ist ein Pointer auf eine Referenz?

Nö, sheet ist bereits ein Pointer. &sheet erhält einen Pointer auf den 
Pointer (also Doppelpointer), und das "*" dereferenziert ihn sofort 
wieder. Ist also genau das gleiche wie einfach nur "return sheet;" - 
also sinnlos und verwirrend.

Nick S. schrieb:
> Dann einfach mal VS2017 schließen und ein bisschen warten, nach 10 min
> wieder öffnen, der Fehler kommt nicht mehr.
Prüfe mal deinen RAM (memtest).

von Nick S. (c0re)


Bewertung
0 lesenswert
nicht lesenswert
Dr. Sommer schrieb:
> Nö, sheet ist bereits ein Pointer. &sheet erhält einen Pointer auf den
> Pointer (also Doppelpointer), und das "*" dereferenziert ihn sofort
> wieder. Ist also genau das gleiche wie einfach nur "return sheet;" -
> also sinnlos und verwirrend.

Da sollte ich wohl mal wieder ins Buch schauen.. -.-

Dr. Sommer schrieb:
> Nick S. schrieb:
>> Dann einfach mal VS2017 schließen und ein bisschen warten, nach 10 min
>> wieder öffnen, der Fehler kommt nicht mehr.
> Prüfe mal deinen RAM (memtest)

Das werde ich wohl demnächst mal machen...


500 Fehler sind bei Memtest86 ein bisschen viel oder?

: Bearbeitet durch User
von jz23 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Nick S. schrieb:
> 500 Fehler sind bei Memtest86 ein bisschen viel oder?

Allerdings

von Dr. Sommer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Nick S. schrieb:
> 500 Fehler sind bei Memtest86 ein bisschen viel oder?

Auch ein Fehler ist schon zu viel ;-) kurioserweise machen sich RAM 
Fehler oft durch Compiler Fehler bemerkbar. Witzig dass das bei dir 
immer die gleiche Stelle ist...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.