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

Azasel

unregistriert

1

30.04.2017, 20:47

Probleme mit struct Initialisierung in C

Guten Abend,

Ich habe folgendes vor:
Ich möchte eine Lebewesen Struktur erstellen, also mit Werten wie 'Lebenspunkte' die jedes Lebewesen besitzt.
Ich möchte eine Struktur für den Spieler erstellen, die soll sozusagen die Elemente vom Strukt Lebewesen übernehmen und es sollen noch andere Elemente hinzu kommen, die nur der Spieler besitzt, z.B. ein Inventar.

Problem:
Ich weiss nicht so genau, wie ich das genau anstellen soll.
So zumindest mein Versuch:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//...
    struct entity_def{
    char name[15];
    short level;
    int hp;
    int strength;
    int crit;
};

    //Ab hier bekomme ich Probleme beim Kompilieren
struct player_def(int hp, int strength, int crit){
    struct entity_def entity;
    //Hier bekomme ich Probleme
    entity.hp = hp;
    //...
    int alive = true;
    char waffe[15] = "Keine";
};

int main(){
    struct player_def(100, 10, 12) player;
    
    return 0;
//...
}

Für einen unkomplizierten und verständlichen Lösungsvorschlag wäre ich sehr dankbar.

Danke und bis bald ^^

Wirago

Alter Hase

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

2

30.04.2017, 22:21

Da C keine Vererbung unterstützt musst du dir ein wenig anders helfen.
Hier -> http://stackoverflow.com/questions/11143…nheritance-in-c gibt es unterschiedliche Lösungsansätze.

Ich bin jetzt nicht so fit in C, kann mir aber nicht vorstellen, dass du so Parameter an ein struct übergeben kannst?

3

01.05.2017, 10:37

Ein struct kannst du behandeln wie eine Klasse!

In deinem Fall solltest du einen Konstruktor schreiben, der deine Werte an das entity-struct weiter gibt.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
struct base
{
    int life;
}

struct player
{
    base stEntity;
    player(int _live)
    {
        stEntity.life = _live;
    }
}
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

01.05.2017, 10:51

Ein struct kannst du behandeln wie eine Klasse!

In C++ ja, in C gibt's keine Klassen...

In deinem Fall solltest du einen Konstruktor schreiben, der deine Werte an das entity-struct weiter gibt.

In C gibt's keine Konstruktoren... ;)

5

01.05.2017, 11:41

Ein struct kannst du behandeln wie eine Klasse!

In C++ ja, in C gibt's keine Klassen...

In deinem Fall solltest du einen Konstruktor schreiben, der deine Werte an das entity-struct weiter gibt.

In C gibt's keine Konstruktoren... ;)

Stimmt habe das bisher nur in c++ verwendet, habe gar nicht drüber nachgedacht, das es ja Unterschiede geben könnte.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Azasel

unregistriert

6

01.05.2017, 12:12

Da C keine Vererbung unterstützt musst du dir ein wenig anders helfen.
Hier -> http://stackoverflow.com/questions/11143…nheritance-in-c gibt es unterschiedliche Lösungsansätze.


Danke für den Link, das Problem habe ich jetzt folgender Masen gelöst:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//...
    typedef struct{
    int hp;
    //...
} _entity;

typedef struct{
    _entity entity;
    char waffe[15];
    int opt;
} _player;

_player player;

int main(){
    init_player();

    return 0;
}

void init_player(){
    player.entity.hp = 10;
    //..
    strcpy(player.waffe,"Keine");
}
//...


Ich bin jetzt nicht so fit in C, kann mir aber nicht vorstellen, dass du so Parameter an ein struct übergeben kannst?


Das soll aber gehen :D

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//...
    typedef struct character{

    int hp;
    int dmg;
    char *name;
    bool alive;
} character;



character init_character(int HP, int DMG, char* NAME)
{
    character result;
    result.hp = HP;
    result.dmg = DMG;
    result.name = strcpy(malloc(256 * sizeof(char)), NAME);
    result.alive = true;

    return result;
}

int main(void)
{
    int progress = 0;
    character enemies[3];
    character player = init_character(100, 10, "Player 1");
    int command;

    enemies[0] = init_character(40, 10, "Creeper");
    enemies[1] = init_character(40, 10, "Zombie");
    enemies[2] = init_character(40, 10, "Skeleton");
//...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

01.05.2017, 12:15

Wenn du den Speicher für result.name schon dynamisch allokierst, dann könntest du ihn eigentlich doch auch gleich in der richtigen Größe anlegen!? ;)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

01.05.2017, 12:16

result.name = strcpy(malloc(256 * sizeof(char)), NAME);
Wieso 256? Wenn NAME jetzt nur 20 Zeichen hat, sind ziemlich viele verschwendet. Wenn es 300 hat, hast du ein sogar noch schlimmeres Problem.

Edit: :ninja:
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige