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

J.M.K.

Alter Hase

  • »J.M.K.« ist der Autor dieses Themas

Beiträge: 500

Wohnort: BW Karlsruhe Ittersbach

Beruf: Schüler

  • Private Nachricht senden

1

24.07.2006, 23:45

Struktur als Rückgabewert einer Funktion?

Mir stellt sich mal wieder eine Frage, die mich aus reiner Neugier beschäftigt. Ist es möglich eine Struktur als Rückgabewert einer Funktion zu verwenden? Ich habe mir das wie folgt vorgestellt:

struct feld{};
feld spielfeld[][];
feld neu(feld spielfeld);

Leider funktioniert das auf diese art und weise nicht, da der compiler mosert, dass nach neu ein Semikolon fehlt. (Also nur eine neue Instanz erstellt werden würde.)
Vegetarier essen meinem Essen das Essen weg.

Chase

Alter Hase

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

2

25.07.2006, 02:37

Eigentlich schon aber ich wuerde intuitiv eher einen Pointer auf das Struct nehmen, da du es ja irgendwie anlegen musst, wenn du es zurueckgeben willst. Und dann ist es immer lokal. Aber ich bin mir nicht sicher, bin ein ziemlicher Cpp-noob :)
"Have you tried turning it off and on again?"

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

3

25.07.2006, 07:45

Wenn deine Struktur einfach genug ist, kann man das so machen. Man muss aber dedenken, dass dabei immer alles in der Struktur kopiert wird.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
struct feld { };
feld spielfeld[][]; // Das provoziert den Fehler, g++ meckert


feld neu (feld spielfeld);

int main ()
{
  return 0;
}


Zitat


feld.cpp:2: error: declaration of `spielfeld' as multidimensional array must have bounds for all dimensions except the first


Ergo: Das Problem liegt in der Deklaration deines Spielfeld. C/C++ unterstützt nativ eben keine 2-dimensionalen Arrays.

Gruss,
Rainer

PS: Ich bin mir auch nicht sicher, dass du später viel freude mit deiner "neu" Funktion haben würdest. 8) Mach das doch mal in OOP.
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

J.M.K.

Alter Hase

  • »J.M.K.« ist der Autor dieses Themas

Beiträge: 500

Wohnort: BW Karlsruhe Ittersbach

Beruf: Schüler

  • Private Nachricht senden

4

25.07.2006, 13:47

Hab mich etwas vertan bei meinem ersten Post. Tut mir Leid. War ein wenig zu hektisch.

Mit Zeigern kann man das Probelm lösen, ja aber in Java (das ich bald lernen muss), gibt es nun mal keine Zeiger.

Und hier noch mal der richtige Codeausschnitt:

C-/C++-Quelltext

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

feld neu(feld spielfeld);

int main(){
// Strukturen.

struct feld
{
    bool zustand;
    char name[10];
};

// Variablen.

const short breite = 5;
const short laenge = 5;

feld spielfeld[breite][laenge];

return 0;
}


Die Funktion an sich ist noch nicht geschrieben, da der Prototyp ja schon Fehler aufgibt:

error C2146: syntax error : missing ';' before identifier 'neu'
.\main.cpp(11) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
.\main.cpp(11) : error C2146: syntax error : missing ')' before identifier 'spielfeld'
.\main.cpp(11) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
.\main.cpp(11) : error C2059: syntax error : ')'
Vegetarier essen meinem Essen das Essen weg.

riCo

Treue Seele

Beiträge: 165

Beruf: Student

  • Private Nachricht senden

5

25.07.2006, 15:03

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

struct feld     {
    bool zustand;
    char name[10];
};


// Funktionsprototyp.

feld neu(feld *spielfeld)     {
    feld f1;
    
    strcpy(f1.name, "name");
    f1.zustand = false;
    
    return f1;
}


int main()
{
    feld temp;
    
    // Variablen.

    const short breite = 5;
    const short laenge = 5;

    feld spielfeld[breite][laenge]; // ??

    
    temp = neu(*spielfeld);

    return 0;
}



Kompilieren...
test.cpp
test - 0 Fehler


Definier die Struktur am Anfang der Datei oder besser in der Headerdatei. In der Funktion geht es nicht, da der Funktionsprototyp an dieser Stelle die Struktur nicht kennt(Abarbeitung von oben nach unten).
Wir leben alle unter dem Sternenhimmel, aber wir haben nicht alle den gleichen Horizont.

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

25.07.2006, 15:57

Zitat von »"J.M.K."«

Mit Zeigern kann man das Probelm lösen, ja aber in Java (das ich bald lernen muss), gibt es nun mal keine Zeiger.

Das ist so nicht ganz richtig. Korrekt ist, dass in Java nicht zwischen "normalen Instanzen" von Objekten (Stack) und Zeigern auf durch den new-Operator erzeugten Objekten (Heap) unterschieden wird.
Wenn du also deinen Code bald in Java umsetzen willst, solltest du Pointer verwenden, denn die sind der Java-Funktionalität viel ähnlicher als Instanzen auf'm Stack.
Kommen Sie nie mit einem Schwert zu einer Schießerei.

J.M.K.

Alter Hase

  • »J.M.K.« ist der Autor dieses Themas

Beiträge: 500

Wohnort: BW Karlsruhe Ittersbach

Beruf: Schüler

  • Private Nachricht senden

7

25.07.2006, 16:34

Ah jetzt funktionierts. Danke an alle. Aber ich dachte immer, dass alles globale böse ist. ;)
Vegetarier essen meinem Essen das Essen weg.

Anonymous

unregistriert

8

25.07.2006, 17:07

Zitat von »"J.M.K."«

Ah jetzt funktionierts. Danke an alle. Aber ich dachte immer, dass alles globale böse ist. ;)


Jo ist klar und Funktionen sind auch verboten, da sie global sind ;)
Ne es sind natürlich nur globale Variablen verboten :p

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

9

25.07.2006, 18:25

Zitat von »"DarkRaider"«

Zitat von »"J.M.K."«

Ah jetzt funktionierts. Danke an alle. Aber ich dachte immer, dass alles globale böse ist. ;)


Jo ist klar und Funktionen sind auch verboten, da sie global sind ;)
Ne es sind natürlich nur globale Variablen verboten :p


Wenn du wirklich objektorientiert programmieren willst, solltest du globale Variablen und auch Funktionen weitestgehend vermeiden. Auch static Methoden in Klassen sind zu vermeiden.

In deinem Fall könnte OOP so aussehen:

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class Spielfeld;
class Feld;

class Feld
{
public:

  Feld ();

  void initialisiere (Spielfeld* spielfeld, int x, int y);

private:

  Spielfeld* _spielfeld;
  int _x;
  int _y;
};

class Spielfeld
{
public:

  Spielfeld (int breite, int hoehe)
  {
    int feldanzahl = breite * hoehe;
    _felder = new Feld [feldanzahl];

    for (int y = 0; y < hoehe; ++y)
   {
      for (int x = 0; x < breite; ++x)
      {
        _felder[x + (y * breite)].initialisiere (this, x, y);
      }
    }
  }

  Feld* gibFeld (int x, int y)
  {
    return &(_felder[x + (y * _breite)]);
  }

private:

  int _breite;
  int _hoehe;
  Feld* _felder;
};


Wenn du das nicht machst, kannst du auch gleich weiter C oder FORTRAN programmieren.

Gruss,
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

Anonymous

unregistriert

10

25.07.2006, 18:41

Stimmt was hab ich denn da für nen Quatsch geredet? Oo Programmiere
selber nur mit Klassen und Namespaces...

Werbeanzeige