Forum: PC-Programmierung Compiler lässt verzweifeln


von Nick S. (c0re)


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 User
von jz23 (Gast)


Lesenswert?

Nick S. schrieb:
> Was will er mir damit sagen?

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

von Nick S. (c0re)


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)


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)


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)


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)


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)


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)


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)


Lesenswert?

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

Allerdings

von Dr. Sommer (Gast)


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...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.