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

Korowai

unregistriert

1

28.07.2015, 16:39

Zeiger

Hallo,

ich bleibe leider im Thema Zeiger hängen. Die Beispiele in dem einen Buch sind zu simpel und die im anderen viel zu kompliziert. Alles, was ich machen möchte, ist in einer Funktion eine bool Variable einer Klasse abfragen. Ich möchte diesen Wert noch nicht mal ändern, nur abfragen.
Je nach true/ false soll die Funktion einen int WErt an eine andere Funktion zurück liefern.

Auch in google-Welt finde ich nix, was mich wirklich weiter bringt.

Könnte sich jemand die Zeit nehmen, mir zu erläutern, wann ich wie wo was initialisieren muss um den *p zu setzen, der diese Variable abfragt.

Beispiel:

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
...
class Basis
{bool Basisaktiv;}
...
int Basisabfrage (int Basisnummer)

{
   char Basiswahl;
  cout << "In welche Basis? "<<endl;
  cin >> Basiswahl;
 if ("Zeiger auf Basisaktiv"=false)  {überspringe Basisnummer der aktiven Basis}
   if (("Zeiger auf Basisaktiv"=true) && (Basiswahl= "Nummer der gewählten Basis)) {Setze Wert für Basisnummer}  
   return Basisnummer;
}


...
int main

{
Basis NewYork;
Basis Bottrop;
Basis Stuttgart;
Stuttgart.Basisaktiv=true;
Bottrop.Basisaktiv=true;
NewYork.Basisaktiv=true; // Alle drei Basen sind bspw. vorhanden, was sich in der while SChleife jedoch ändern kann 


while (true)
{

...
Basisabfrage (Basisnummer);

if (Basisnummer = "Wert für Stuttgart") {cout << "Du bist in Stuttgart" << endl;}
...
}
return 0;
}

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

28.07.2015, 16:44

Also zunächst mal: Vergleiche mit "if" verwenden kein "=", sondern ein "==". Ohne das wird's so oder so nix. Zweitens kennt Deine Funktion keine Basis. Also entweder Du übergibst alle drei oder machst sie für die Funktion zugreifbar - z.B. durch unschöne globale Variablen.
Ganz verstanden habe ich jetzt allerdings nicht wofür Du genau den Pointer brauchst/willst und wofür die Basisnummer da sein soll.
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]

Korowai

unregistriert

3

28.07.2015, 17:04

SOrry,

ich habe das eben schnell runter geschrieben, FEhler inklusive.

Genau, ich muss alle drei per Zeiger übergeben.

Muss ich diese in der Funktionsdeklaration mit einbinden. Oder reicht der Zeiger innerhalb der Funktion. Mir fehlt da einfach ein Ansatz.

GLobal möchte ich die Klasse nicht machen.

Ich versuche mit diesem ersten längeren Programm, alle Grundlagen besser zu lernen und zu verstehen.

Wäre toll, jemand nimmt sich die Zeit, um mir auf die Sprünge zu helfen.

Die Basisnummer ist eine integer, deren Wert von 1-20 anderen Funktionen und der main angibt, welche Basis aktiv ist und wie andere WErte dann interagieren.
Im Hauptmenü kann der SPieler wählen, welche Basis er steuert (er hat mehrere), somit sind alle Hauptmenüpunkte mit dieser VAriable verknüpft, so auch das Marktsystem etc...

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

28.07.2015, 17:09

Als Parameter klingt schon sinnvoll, meinst Du nicht? Wobei es vielleicht sogar noch sinnvoller wäre einen std::vector<Base*> zu übergeben. Oder einen std::vector<Base>&
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]

5

28.07.2015, 18:10

Wobei es vielleicht sogar noch sinnvoller wäre einen std::vector<Base*> zu übergeben. Oder einen std::vector<Base>&

Vielleicht etwas viel wenn er den "normal" pointer mal verstehen will, wenn auch Sinnvoll.

Ich habe dein Problem noch nicht wirklich Verstanden, happert es an dem Verständnis wann oder wie man ein Pointer anwendet.

Du schreibst die Beispiele im Buch sind zu Simple oder zu Kompliziert, und anscheinend weist du nicht wie man ein Pointer als Paramter übergibt.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Pointer erzeugen
int* IntPointer = new int; // steht wahrscheinlich irgendwo im Buch
int IntegerWert = 6;
// dem Inhalt des Pointer einen Wert zuweisen
*IntPointer = IntegerWert; // nennt man auch dereferenzieren
// dem Pointer eine Adresse zuweisen
IntPointer = &IntegerWert; // IntPointer zeigt jetzt auf die Adresse in der IntegerWert liegt
// Pointer als Parameter (Prototyp der Funktion)
void Funktion(int* IntPointer);
// Aufruf der Funktion
Funktion(&IntegerWert); // adresse von IntegerWert übergeben
// oder
Funktion(IntPointer); // IntPointer ist schon ein Pointer kann also ganz normal übergeben werden
// Pointer als Rückgabewert (Prototyp der Funktion)
Int* Funktion();
// Funktion
Int* Funktion()
{
     return &IntWert; // mal angenommen IntWert ist Global, mit Lokalen Variablen gehts nicht.
}


Ich hoffe ich habe auf die schnelle keine Groben Schnitzer reingebracht und es ist für dich Verständlich.

Edit: Habe gerade gemerkt das vielleicht noch bissi was als Erklärung fehlt.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
// Pointer erzeugen
int* IntPointer = new int; // hier wird speicher Reserviert der Später auch wieder Freigegeben werden muss
// reservierten Speicher wieder Freigeben
delete IntPointer; // Ansonsten hat man ein Speicherleck (memory leak)
// Bsp. für ein Speicher leck 
int* IntPointer = new int;
IntPointer = &IntegerWert; // hier wird dem Pointer eine neue Adresse zu gewiesen ohne das die alte im speicher wieder frei gegeben wurde
// Richtig wäre es so
int* IntPointer = new int;
delete IntPointer; // Speicher wieder Freigegeben
IntPointer = 0; // So kann man sicher gehen das er nicht auf irgendwas zeigt
if(IntPointer == 0)
    IntPointer = &IntegerWert; // kein Speicherleck da IntPointer auf keine Adresse mehr zeigt.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Koschi« (28.07.2015, 18:37)


Korowai

unregistriert

6

29.07.2015, 07:49

Vielen DAnk für den post. Das zeigt mir schon mal, wie das ungefähr abläuft.

Ich hingegen muss mein Problem mehr präzisieren.

Ich möchte innerhalb einer Funktion auf eine per header erzeugte Klasse zugreifen, auf eine Variable, die ich im Bereich public: erzeuge.

DEr COmpiler meldet mir natürlicherweise, dass die Klasse in der Funktion nicht bekannt ist. Anstatt die komplette Klasse einzubinden, möchte ich nur dieses eine Element in der Klasse abfragen, genauer gesagt in den jeweiligen Instanzen der Klasse.

Also:

Klasse blabla (mit Element bool Basis) mit vier in main() erzeugten Instanzen.

Funktion, die int Basisnummer zurück liefert (soll auf blabla.Basis auf true oder false prüfen, das für vier Instanzen, und die jeweilig in der Funktion erzeugte Basisnummer zurückgeben)

Problem:
Wo initialisiere ich den Pointer?
Welche SChritte braucht es, um einen Pointer auf blabla.Basis auszurichten? WIe liefert der Pointer den Wert?

EIne Menge Unwissenheit grinst EUch entgegen ;)

Ich habe versucht, den pointer in der Funktion zu erstellen, aber die Instanzen wurden in main() erzeugt. WAs muss wo wie initialisiert werden?

Tobiking

1x Rätselkönig

  • Private Nachricht senden

7

29.07.2015, 08:35

Um auf einen Member innerhalb eines Objekts zuzugreifen brauchst du doch nur objekt.member. Mir ist nicht klar warum du einen Pointer darauf ausrichten möchtest. Wenn du ein Objekt als Parameter an eine Funktion übergeben möchtest, ohne das eine Kopie erzeugt wird, benutzt man besser eine Referenz (außer null soll erlaubt sein). Dafür brauchst du aber auch nur beim Typ des Parameter ein & anhängen. Deine Funktion könnte dann als Beispiel so aussehen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void Basisnummer(Basis& basis)
{
    basis.Basisnummer = 5;
}

void main()
{
    Basis Stuttgart;
    Stuttgart.Basisnummer = 3; 
    // Basisnummer von Stuttgart ist 3
    ...
    Basisnummer(Stuttgart);
    // Basisnummer von Stuttgart ist 5    
}

8

29.07.2015, 18:53

Sorry ich habe noch nicht Verstanden was du machen willst.

Ich möchte innerhalb einer Funktion auf eine per header erzeugte Klasse zugreifen, auf eine Variable, die ich im Bereich public: erzeuge.
Ist die Klasse schon ein Zeiger?

Anstatt die komplette Klasse einzubinden, möchte ich nur dieses eine Element in der Klasse abfragen, genauer gesagt in den jeweiligen Instanzen der Klasse.

ist das member Inerhalb der Klasse ein pointer?

Wo initialisiere ich den Pointer?

Ich weiß leider immer noch nicht wo sich dein Pointer versteckt.

Einfachh mal die Fragen Beantworten und dann geht es weiter :)
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Korowai

unregistriert

9

29.07.2015, 22:29

Hi Koschi,

zu Deinen Fragen:

1. Nein, die Klasse ist kein Zeiger

2. Nein, der member ist kein pointer

3. Es gibt noch keinen.

Lösung folgt gleich (also, meine Lösung ;))

Korowai

unregistriert

10

29.07.2015, 22:32

Referenz

Quellcode

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include <iostream>
#include <conio.h>
#include <iterator>
#include <list>
#include <vector>
#include <list>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string>
#include "Testheader.hpp"

using namespace std;

int Basisnummer0=13;
int Nummer0;

// Funktionsprototyp
void Basiswechsel(int &Basisnummer, CBasis &RestonaGuldon_Spieler, CBasis &KlendautKlendaut_Spieler,
                 CBasis &AbsariLumos_Spieler,
                 CBasis &HysskallMatras_Spieler)
{


    bool p0=false;
    bool p1=false;
    bool p2=false;
    bool p3=false;
    cout << endl;
    cout << "In welche Basis wollen Sie wechseln? " << endl;

    if (RestonaGuldon_Spieler.m_Basisaktiv==true && p0==false)
        {
        cout << "Restona Guldon - 1" << endl;
        p0=true;
        }
    if (KlendautKlendaut_Spieler.m_Basisaktiv==true && p1==false)
    {
        cout << "Klendaut Klendaut - 2" << endl;
        p1=true;
    }
    if (AbsariLumos_Spieler.m_Basisaktiv==true && p2==false)
    {
        cout << "Absari Lumos - 3" << endl;
        p2=true;
    }
    if (HysskallMatras_Spieler.m_Basisaktiv==true && p3==false)
    {
        cout << "Hysskall Matras - 4" << endl;
        p3=true;
    };
    while (true)
    {
        char hm=getch();

        if (hm=='1' && RestonaGuldon_Spieler.m_Basisaktiv==true)
        {
            Basisnummer0=13;

            break;
        }
        if (hm=='2'&& KlendautKlendaut_Spieler.m_Basisaktiv==true)
        {
            Basisnummer0=1;
            break;
        }
        if (hm=='3'&& AbsariLumos_Spieler.m_Basisaktiv==true)
        {
            Basisnummer0=9;
            break;
        }
        if (hm=='4' && HysskallMatras_Spieler.m_Basisaktiv==true)
        {
            Basisnummer0=21;
            break;
        }

            cout << "Falsche Eingabe"<< endl;


    }
return;
}




int main()


{
    CBasis RestonaGuldon_Spieler;
    CBasis KlendautKlendaut_Spieler;
    CBasis AbsariLumos_Spieler;
    CBasis HysskallMatras_Spieler;

    RestonaGuldon_Spieler.m_Basisaktiv=true;
    KlendautKlendaut_Spieler.m_Basisaktiv=true;

    cout << "Basis Nummer vor der Funktion: " << Basisnummer0 << endl;

    cout << "Funktion wird aufgerufen!" << endl;

    Basiswechsel(Basisnummer0, RestonaGuldon_Spieler,
                              KlendautKlendaut_Spieler,
                              AbsariLumos_Spieler,
                              HysskallMatras_Spieler);

    cout << "Basis Nummer: " << Basisnummer0 << " wurde gewaehlt." << endl;




    return 0;
}


So war es beabsichtigt. Würde mich jetzt interessieren, wie es mit Zeigern funzt

NACHTRAG: WIe geht das mit einem Array der Instanz der Klasse?

Werbeanzeige