Compiler lässt verzweifeln

OP #5333526
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
}
Gast #5333552
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?
OP #5333572
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 ";"
OP #5333618
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.
Gast #5333623
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).
OP #5333630
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?

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.