Forum: Compiler & IDEs Problem mit 'String st'


von Lötkolben-Benutzer (Gast)


Lesenswert?

Hab hier zwei Deklarationen innerhalb einer Klasse die ich woanders 
weiterverwenden möchte.
1
void  print(char *st, int x, int y, int deg=0);
2
void  print(String st, int x, int y, int deg=0); // String <-- Problem
Ein Workaround mit typedef schlug leider fehl.
Wie kann ich beide Funktionen benutzen?
Ist 'String' ein Objekt?
Was muß ich inkludieren damit's geht?

von Sebastian V. (sebi_s)


Lesenswert?

Ich nehme an du benutzt C++? Dort gibt es keine Klasse die String heißt 
sondern höchstens std::string. Gibts im Header <string>.

von Lötkolben-Benutzer (Gast)


Lesenswert?

>Ich nehme an du benutzt C++?
Ja. Aber ich habe wenig Erfahrung damit. Im Grunde möchte ich "nur ein 
paar" Zeilen Code anpassen. Eigentlich will ich bei diesem Projekt 
innerhalb von C++ bleiben.

>Dort gibt es keine Klasse die String heißt
>sondern höchstens std::string. Gibts im Header <string>.
Danke, aber das hilft mir leider nicht weiter. Hab jetzt per Trial&Error 
rumgepopelt, aber bei meinen rudimentären Kentnissen wird das grad' 
nix...

von Sebastian V. (sebi_s)


Lesenswert?

Wenn du in einem fremden Projekt rumspielst wäre es praktisch zu wissen 
welches Projekt das ist, falls das nicht geheim ist. Dann könnte String 
eine selbst definierte Klasse in diesem Projekt sein oder es gibt auch 
diverse Libraries die ihre eigene String Klassen mitbringen.

von Kaj (Gast)


Lesenswert?

Lötkolben-Benutzer schrieb:
>>Dort gibt es keine Klasse die String heißt
>>sondern höchstens std::string. Gibts im Header <string>.
> Danke, aber das hilft mir leider nicht weiter. Hab jetzt per Trial&Error
> rumgepopelt, aber bei meinen rudimentären Kentnissen wird das grad'
> nix...
Was ist dein Problem? was sagt der Compiler?

Noch mal zum verständnis:
In C++ gibt es keine Standardklasse die "String" heisst. Es gibt aber 
die Klasse "string", im Namensraum "std".
1
#include <string>
2
3
void foo(std::string st ...

von Lötkolben-Benutzer (Gast)


Lesenswert?

>Noch mal zum verständnis:
>In C++ gibt es keine Standardklasse die "String" heisst. Es gibt aber
>die Klasse "string", im Namensraum "std".
Schon klar. Aber wie passe ich das an, damit das Problem:
#include <string>
void  print(String st, int x, int y, int deg=0);

error: 'String' has not been declared

verschwindet? Mit 'namespace' habe ich ein bisschen rumexperimentiert, 
bin aber nicht weit gekommen.'

von Max H. (hartl192)


Lesenswert?

Lötkolben-Benutzer schrieb:
> Aber wie passe ich das an, damit das Problem:
> #include <string>
> void  print(String st, int x, int y, int deg=0);
>
> error: 'String' has not been declared
>
> verschwindet?
1
void  print(std::string st, int x, int y, int deg=0);
Das "sting" musst du klein schreiben und mit "std::" sagen, dass es aus 
dem std Namespace kommt.

von Sebastian V. (sebi_s)


Lesenswert?

Notfalls kannst du auch versuchen die zweite Funktion mit String einfach 
auszukommentieren. Solange niemand versucht die print Funktion mit einem 
String Objekt aufrufen will reicht auch die char* Version.

von R. Rebentrost (Gast)


Lesenswert?

1
void  print(std::string st, int x, int y, int deg=0);
> Das "sting" musst du klein schreiben und mit "std::" sagen, dass es aus
> dem std Namespace kommt.

Nicht die beste Idee, wenn man nicht einmal weiß, was "String" (genau) 
ist. Dann wird der Compiler evtl. als nächstes darüber meckern, dass 
Operation soundso nicht bekannt ist.
@TO: Entweder nicht verwenden (auskommentieren), falls sinnvoll oder 
nachsehen, was String ist und was davon benötigt wird.

von Lötkolben-Benutzer (Gast)


Lesenswert?

Grrr!
Eclipse findet den Pfad zu #include<string> nicht findet.
Gleicher Fall wie hier:
http://stackoverflow.com/questions/7905025/string-could-not-resolved-error-in-eclipse-for-c

So ist das halt mit der freien Software, die stets ohne 
Qualitätssicherung rausgehauen wird. Yoo, Hauptsache über den grünen 
Klee gelobt.


Jetzt hab ich aber noch ein zweites, viel merkwürdigeres Problem:
Angefangen habe ich dieses C++ Projekt mit einem Hallo-Welt Led-Blinker. 
Schon vor dem kompilieren kam der Fehler:
1
      blinkLed.turnOn();
2
      timer.sleep(BLINK_ON_TICKS);
3
4
      blinkLed.turnOff();
5
      timer.sleep(BLINK_OFF_TICKS);
Invalid arguments '
Candidates are:
void sleep()
'  main.cpp  /test_c++/src  line 82  Semantic Error

Wegbekommen habe ich ihn indem ich eine .h Datei in .hpp geändert habe. 
Zufall? Jetzt sehe ich den Fehler wieder.


Das hier steht in Timer.hpp:
1
#ifndef TIMER_H_
2
#define TIMER_H_
3
4
#include "cmsis_device.h"
5
6
// ----------------------------------------------------------------------------
7
8
class Timer
9
{
10
public:
11
  typedef uint32_t ticks_t;
12
  static constexpr ticks_t FREQUENCY_HZ = 1000u;
13
14
private:
15
  static volatile ticks_t ms_delayCount;
16
17
public:
18
  // Default constructor
19
  Timer() = default;
20
21
  inline void
22
  start(void)
23
  {
24
    // Use SysTick as reference for the delay loops.
25
    SysTick_Config(SystemCoreClock / FREQUENCY_HZ);
26
  }
27
28
  static void  sleep(ticks_t ticks);
29
30
  inline static void
31
  tick(void)
32
  {
33
    // Decrement to zero the counter used by the delay routine.
34
    if (ms_delayCount != 0u)
35
      {
36
        --ms_delayCount;
37
      }
38
  }
39
};
40
41
// ----------------------------------------------------------------------------
42
43
#endif // TIMER_H_

Und die Schalter:
-DDEBUG -DUSE_FULL_ASSERT -DSTM32F407xx -DUSE_HAL_DRIVER 
-DHSE_VALUE=8000000 -I"../include" -I"../system/include" 
-I"../system/include/cmsis" -I"../system/include/stm32f4-hal" 
-std=gnu++11 -fabi-version=0 -fno-exceptions -fno-rtti 
-fno-use-cxa-atexit -fno-threadsafe-statics

Hab eben -x ausprobiert, kein Erfolg.

Jemand ne Idee?

von Sebastian V. (sebi_s)


Lesenswert?

Lötkolben-Benutzer schrieb:
> Wegbekommen habe ich ihn indem ich eine .h Datei in .hpp geändert habe.
> Zufall? Jetzt sehe ich den Fehler wieder.

Ziemlich blöde Idee. Vermutlich findet ein #include die Datei jetzt 
nicht mehr und du kriegst möglicherweise eine andere Fehlermeldung. Am 
eigentlichen Problem hat das aber sicher nichts geändert.

Lötkolben-Benutzer schrieb:
> Invalid arguments '
> Candidates are:
> void sleep()
> '  main.cpp  /test_c++/src  line 82  Semantic Error

Invalid arguments hört sich fast so an als ob er die Defines 
BLINK_ON_TICKS/BLINK_OFF_TICKS nicht findet oder die irgendwie 
schwachsinnig definiert sind. Prüfe doch mal wo die definiert werden 
oder setze testweise direkt eine Zahl ein.

von Lötkolben-Benutzer (Gast)


Lesenswert?

>> Wegbekommen habe ich ihn indem ich eine .h Datei in .hpp geändert habe.
>> Zufall? Jetzt sehe ich den Fehler wieder.

>Ziemlich blöde Idee.
Kann man so nicht sagen. Der Fehler ging zunächst mal weg, weil - ich 
vermute stark - dies etwas mit dem Indexer von Eclipse zu tun hat.
Die notwendigen Änderungen zum kompilieren habe ich natürlich 
vorgenommen, man ist ja kein Irrenhäusler. Der Fehler kam durch die 
Projekteinstellungen. Nun habe ich die Einstellungen im Indexer geändert 
und es scheint zu gehen.

>Ziemlich blöde Idee.
Für eine blöde Idee halte ich eher, daß die die Klasse 'Timer' in einem 
.h file und nicht in einem .hpp file zu finden 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.