Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

28.04.2014, 23:04

Problem beim "Herumexperimentieren" mit Strukturen und Arrays

Hallo,

ich bin gerade dabei, weiter an der Aufgabe des fünften Kapitels Von "C++ für Spieleprogrammierer" zu arbeiten und habe ein bisschen experimentiert.
Dabei stolpere ich jedoch über einen Fehler, den ich mir nicht erklären kann.
Zum Verständnis:
Ich habe ein 2d- Spielfeld mittels eines eines Arrays mit 2 Werten angelegt, Karte[5][5].
Dann habe ich eine Struktur geschrieben, um dann von jedem einzelnem Feld der 2d-Karte eine Instanz zu erzeugen.
Um nun zu überpüfen (ich bin Neuling und doch noch sehr unsicher) ob auch alles so läuft wie es laufen soll, habe ich nun einem char-Wert der 2d-Karte einen Namen gegeben. Jedoch bekomme ich Probleme beim kompilieren und es wird eine Fehlermeldung C2440 ausgespuckt, welche mir nicht wirklich weiterhilft.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Karte_anzeigen()
{
    
    struct S_Werte
    {
        bool Belegung;
        char Name [30];
    };

    S_Werte Karte[5][5]; //Jedem Wert der Karte Belegung und Namen verpassen
    
    Karte[0][1].Name = 'Berg'; //Hier bekomme ich folgenden Fehler: error C2440: '=': 'int' kann nicht in 'char [30]' konvertiert werden
    cout << Karte[0][1].Name;
    
}


Wenn ich einen Wert mit cin.get vom Benutzer abfragen lasse, läuft alles einwandfrei, jedoch möchte ich es auch mit einer "normalen" Zuweisung zum Laufen bringen.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »hpxkrass« (28.04.2014, 23:40)


2

28.04.2014, 23:21

Mit einfachen Anführungszeichen (') drückst du nur einen einzelnen Wert aus.
Nutze doppelte (") Anführungszeichen, um strings (Arrays aus zeichen) darzustellen

Mehrere Zeichen zwischen einfachen Anführungszeichen nennt man multi-character literals. Beim Kompilieren werden die Hex Werte aneinander gesetzt und es ergibt sich eine Zahl mit der Anzahl der Zeichen im Multi-Character Literal als Bytelänge:

C-/C++-Quelltext

1
2
'Berg' = 0x42h, 0x65h, 0x72h, 0x67h (4 Bytes = 32bit) => 0x42657267h (hex) = 1113944679 (dezimal)
'BergBerg' = (8 Bytes = 64bit) // nur mit long-Datentyp darstellbar
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »iSmokiieZz« (28.04.2014, 23:45) aus folgendem Grund: Testbeispiel an OP's Beispiel angepasst.


3

28.04.2014, 23:39

Mhmm, danke die für die Hilfe, werde ich morgen sofort ausprobieren!

Fireball

Alter Hase

Beiträge: 415

Wohnort: Werne

Beruf: Dipl. Inf.

  • Private Nachricht senden

4

29.04.2014, 14:48

Na so einfach ist es glaube ich nicht. Wir programmieren ja kein Java. ;-)


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string.h>
using namespace std;

int main(){

    struct S_Werte
    {
        bool Belegung;
        char Name [30];
    };

    S_Werte Karte[5][5]; //Jedem Wert der Karte Belegung und Namen verpassen

    strcpy( Karte[0][1].Name, "Berg" );

    cout << Karte[0][1].Name;

    return 0;
}


Aber ich glaube, dass du eher so etwas haben willst.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string.h>
using namespace std;

int main(){

    struct S_Werte
    {
        bool Belegung;
        string Name;
    };

    S_Werte Karte[5][5]; //Jedem Wert der Karte Belegung und Namen verpassen

    Karte[0][1].Name = "Berg";

    cout << Karte[0][1].Name;

    return 0;
}


Gruß

fb

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

5

29.04.2014, 15:03

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>

int main(){

    struct S_Werte
    {
        bool Belegung;
        char* Name;
    };

    S_Werte Karte[5][5]; //Jedem Wert der Karte Belegung und Namen verpassen

    Karte[0][1].Name = "Berg";

    cout << Karte[0][1].Name;

    return 0;
}


Muhahaha, ja ich gebe den Pointer nicht wieder frei!

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

6

29.04.2014, 15:04

Klar ist es so einfach, der ideale Weg ist es jedoch höchst wahrscheinlich nicht.
Aber wenn es schondarum geht, könnte man auch einfach den Namen in "char const*" ändern und direkt zuweisen.
Übrigens wäre es dann notwendig "string" einzubinden. "string.h" ist C. Wenn man die Funktionalität doch mal unter C++ brauchen solltest, verwendet man besser "cstring".

EDIT:
@DeKugelschieber
Da gibt es ein Problemchen mit Const-Correctness, ansonsten wäre das genau meine Empfehlung weil am Einfachsten.

7

29.04.2014, 15:05

@fireballs erstes beispiel:

Die Verwendung von strcpy ist deprecated und löst seit vc 2013 Build Fehler aus. Die Verwendung von strcpy_s ist stattdessen zu bevorzugen. ;)

Zitat

"string.h" ist C. Wenn man die Funktionalität doch mal unter C++ brauchen solltest, verwendet man besser "cstring"

Tatsächlich gibt es keinen Vorteil von cstring . http://stackoverflow.com/questions/83808…g-h-and-cstring
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »iSmokiieZz« (29.04.2014, 15:23)


Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

8

29.04.2014, 15:13

"strcpy_s" ist irgendeine obskure Microsoft Erweiterung.
Wenn es da Buildfehler gibt dann ist irgendwas falsch konfiguriert bzw. sollte es maximal eine Warnung geben die man für dieses Beispiel auch getrost unterdrücken kann.

Unabhänig davon würde ich in einer Produktivumgebung in diesem Kontext von "strcpy" abraten. Entweder die Strings "const" direkt verwenden oder wenn das nicht sinnvoll geht eben eine Stringklasse zb. so wie vorgeschlagen.

EDIT:
Es gibt einen entscheidenden Vorteil das man dann alle C-Funktionen konsequenterweise aus dem "std"-Namensraum nutzen kann.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Spiele Programmierer« (29.04.2014, 15:21)


9

29.04.2014, 15:21

Zitat

Wenn es da Buildfehler gibt dann ist irgendwas falsch konfiguriert bzw. sollte es maximal eine Warnung geben die man für dieses Beispiel auch getrost unterdrücken kann.

Soso ;)
http://social.msdn.microsoft.com/Forums/…forum=vcgeneral
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

10

29.04.2014, 15:29

Also bei mir gibt es da keinen Fehler.
Möglicherweise ist da aktiviert, das Warnungen als Fehler behandelt werden oder Ähnliches.
Ob diese Einstellung sinnvoll ist, darüber kann man sich streiten.
In dem Kontext des Threads wäre "strcpy_n" auf jeden Fall ohne Mehrwert, wenn man denn C-Array-Strings einsetzen wollte, warum auch immer, bzw. in einer richtigen Anwendung häufig kaum ohne weiteres einsetzbar weil Microsoft-spezifisch.

Werbeanzeige