Du bist nicht angemeldet.

Werbeanzeige

shade1990

Frischling

  • »shade1990« ist der Autor dieses Themas

Beiträge: 31

Beruf: Junior Developer

  • Private Nachricht senden

1

14.10.2016, 10:26

Static wchar_t*

Ich habe da mal eine blöde Frage.

Kann man einer

C-/C++-Quelltext

1
static wchar_t* test;
eine

C-/C++-Quelltext

1
wchar_t *hallo = L"hallo";
zuweisen?
Ich möchte gerne wissen, ob man einer static wchar_t* den "Wert" von wchar_t* zuweisen kann.

Bevor einer fragt: NEIN, die zweite (wchar_t* hallo) darf nicht static sein/werden.

Schorsch

Supermoderator

Beiträge: 5 198

Wohnort: Wickede

Beruf: Student

  • Private Nachricht senden

2

14.10.2016, 10:38

Hast du das mal einfach ausprobiert um zu gucken was der Compiler sagt?
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

David Scherfgen

Administrator

Beiträge: 10 248

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

14.10.2016, 10:41

Wieso sollte man das nicht können? Wahrscheinlich möchtest du aber lieber std::string bzw. std::wstring benutzen.

shade1990

Frischling

  • »shade1990« ist der Autor dieses Themas

Beiträge: 31

Beruf: Junior Developer

  • Private Nachricht senden

4

14.10.2016, 10:50

An David Scherfgen:
Nein, ich möchte nicht std::string nutzen! Ich möchte nur wissen, wie man einer static wchar_t* den "Wet" von hallo zuweisen kann.

An Schorsch:
error LNK2001: Nicht aufgelöstes externes Symbo
fatal error LNK1120: 1 nicht aufgelöste externe Verweise.

Schorsch

Supermoderator

Beiträge: 5 198

Wohnort: Wickede

Beruf: Student

  • Private Nachricht senden

5

14.10.2016, 10:53

An Schorsch:
error LNK2001: Nicht aufgelöstes externes Symbo
fatal error LNK1120: 1 nicht aufgelöste externe Verweise.

Und du bist sicher dass die Fehler nicht kommen wenn du deinen wchar_t Code weg lässt? Die haben damit nämlich nichts zutun.
http://cpp.sh/5xe7
Hier klappt alles.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

shade1990

Frischling

  • »shade1990« ist der Autor dieses Themas

Beiträge: 31

Beruf: Junior Developer

  • Private Nachricht senden

6

14.10.2016, 11:06

Ich glaube ich sollte etwas konkreter werden.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
//Inhalt version.h

class Version
{
  
  public:
  void setVersion(const CHAR *version);
  wchar_t* Version::charToWChar(const char* text);
  static wchar_t* test;
};


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Inhalt der cpp
void Version::setVersion(const CHAR *version)
{
    wchar_t *hallo = new wchar_t[10];
    hallo = L"";
    hallo = charToWChar(version);
    test = hallo;
}

wchar_t* Version::charToWChar(const char* text)
{
    const size_t size = strlen(text) + 1;
    wchar_t* wText = new wchar_t[size];
    mbstowcs(wText, text, size);
    return wText;
}


So habe ich das und da kommst dann immer dieser LinkerFehler LNK2001/LNK1120

dot

Supermoderator

Beiträge: 9 855

Wohnort: Graz

  • Private Nachricht senden

7

14.10.2016, 11:16

Dein static wchar_t* ist nirgendwo definiert.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//Inhalt der cpp

wchar_t* Version::test;  // <--  !!!

void Version::setVersion(const CHAR *version)
{
    wchar_t *hallo = new wchar_t[10];
    hallo = L"";
    hallo = charToWChar(version);
    test = hallo;
}

wchar_t* Version::charToWChar(const char* text)
{
    const size_t size = strlen(text) + 1;
    wchar_t* wText = new wchar_t[size];
    mbstowcs(wText, text, size);
    return wText;
}


Abgesehen davon, solltest du wohl den Abschnitt über die Bedeutung von static in deinem C++ Buch nochmal durchgehen... ;)


Außerdem sei angemerkt, dass der ganze Multibyte String Kram ein Relikt aus längst vergangenen Tagen ist und besser gemieden werden sollte...

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (14.10.2016, 11:21)


shade1990

Frischling

  • »shade1990« ist der Autor dieses Themas

Beiträge: 31

Beruf: Junior Developer

  • Private Nachricht senden

8

14.10.2016, 11:23

Danke, Ich Idiot! :dash: Variable definieren! Wie kann man nur so was vergessen??? :dash:

David Scherfgen

Administrator

Beiträge: 10 248

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

14.10.2016, 11:32

C-/C++-Quelltext

1
2
3
    wchar_t *hallo = new wchar_t[10];
    hallo = L"";
    hallo = charToWChar(version);

Ist dir bewusst, dass du hier ein Speicherleck verursachst und dass die ersten beiden Zuweisungen unnötig sind? Generell ist es eine ganz schlechte Idee, Strings mit Zeigern zu handlen. Da ist nie klar, wer dafür verantwortlich ist, den Speicher wieder freizugeben. Zudem musst du dich schon vorher auf eine maximale Länge festlegen, da du später nicht mehr nachprüfen kannst, wie viel Speicher eigentlich reserviert wurde. Darum gibt es wie schon erwähnt std::string, und das solltest du wirklich benutzen.

Beiträge: 1 237

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

10

14.10.2016, 13:13

Das ursprünhliche Beispiel hat ein noch ein anderes Problem: Const.
L"hallo" ist vom Typ wchar_t const*, nicht wchar_t*.
Die Zuweisung ist deshalb nicht erlaubt.
Manche Compiler akzeptieren das zwar trotzdem, allerdings ist es trotzdem falsch.

Werbeanzeige