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

Sc4v

Alter Hase

  • »Sc4v« ist der Autor dieses Themas

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

1

27.05.2010, 15:54

Allgemeine Fragen zum Buch: Die C++ Programmiersprache

Hallo zusammen,

ich habe seit ein paar Tagen das Buch "Die C++ Programmiersprache" von Bjarne Stroustrup. Komme gut zurecht damit. Vorher habe ich Kalistas Buch erfolgreich gelesen.
Sobald Fragen zu diesem Buch auftauchen schaue ich in die MSDN und befrage Google nach Lösungen. Wenn das alles nichts bringt melde ich mich hier :-)

Der Thread hat natürlich auch zu diesem Zeitpunkt einen Sinn denn ich habe ein Problem mit einer Übungsaufgabe. Für eingeweihte Kapitel 5.9 Übung 10.

Hier mein kurzer Quellcode:

C-/C++-Quelltext

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

using namespace std;

void printMonth(string* pMonths[])
{
    for (int i = 0; i<11; i++)
        cout << *pMonths[i];
}

int main()
{
    string Months[] = {"Januar", "Februar", "Maerz", 
                            "April", "Mai", "Juni", "Juli", "August", 
                            "September", "Oktober", "November", "Dezember"};

    printMonth(&Months);
}


Meine Fehlermeldung sieht folgendermaßen aus:

C-/C++-Quelltext

1
2
error C2664: 'printMonth': Konvertierung des Parameters 1 von 'std::string (*)[11]' in 'std::string *[]' nicht möglich
Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.


Soweit verstehe ich was die Meldung mir sagen will, doch ich erkenne nicht meinen Fehler.
Zuerst wollte ich als Funktionsparameter eine Referenz verwenden, doch dies scheint aus mir nicht erklärlichen Gründen grundsätzlich bei Arrays nicht zu gehen.

Ich wende mich daher an euch! Ich bitte mir zu helfen und auch um Verbesserungen zum Code.
Lg
Sc4v

2

27.05.2010, 16:22

Entweder:

C-/C++-Quelltext

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

using namespace std;

void printMonth(string* pMonths)
{
    for (int i = 0; i<11; i++)
        cout << *pMonths[i];
}

int main()
{
    string Months[] = {"Januar", "Februar", "Maerz", 
                            "April", "Mai", "Juni", "Juli", "August", 
                            "September", "Oktober", "November", "Dezember"};

    printMonth(&Months);
}


Oder:

C-/C++-Quelltext

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

using namespace std;

void printMonth(string pMonths[])
{
    for (int i = 0; i<11; i++)
        cout << pMonths[i];
}

int main()
{
    string Months[] = {"Januar", "Februar", "Maerz", 
                            "April", "Mai", "Juni", "Juli", "August", 
                            "September", "Oktober", "November", "Dezember"};

    printMonth(Months);
}


Würdest du ein char Array anlegen, wäre deine Lösung richtig, aber du benutzt ja ein Array von Strings. Deshalb entweder einen Pointer oder ein Array als Parameter, aber nicht beides zusammen.
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

3

27.05.2010, 16:37

Hi,

Da

C-/C++-Quelltext

1
void printMonth(string* pMonths[])

musst du entweder * oder [] entfernen.

Außerdem musst du in der Schleife entweder das < durch ein <= ersetzen oder die 11 durch eine 12. (Sonst ist ja der letzte Wert für i 10...)

Hier

C-/C++-Quelltext

1
cout << *pMonths[i];

Ist ebenfalls ein * zuviel

Und beim Funktionsaufruf musst du das & vor Months entfernen.

Schau dir mal Abschnitt 7.2.1 an.

Zitat

Zuerst wollte ich als Funktionsparameter eine Referenz verwenden, doch dies scheint aus mir nicht erklärlichen Gründen grundsätzlich bei Arrays nicht zu gehen.

Das liegt daran, dass Arrays zusammenhängende Speicherblöcke sind. Das "Months" in deinem Code ist ein Zeiger auf das erste Element dieses Speicherblockes. Der []-Operator ist nur eine vereinfachte Schreibweise für *(Months+i).
Referenzen verweisen auf eine Variable, Zeiger auf Speicherbereiche. Dadurch stärken Referenzen die Typsicherheit und verringern die Fehleranfälligkeit, verlieren aber die Möglichkeit direkt auf Speicherbereiche zuzugreifen. Das können nur Zeiger.

Ich hoffe ich habe mich verständlich genung ausgedrückt.
cu
Signaturen werden überbewertet

Sc4v

Alter Hase

  • »Sc4v« ist der Autor dieses Themas

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

4

27.05.2010, 16:45

Hi,
danke für die antwort!

@insane
Deine 2te Lösung funktioniert wie gewünscht, allerdings trichtert mir jedes Buch zurecht ein, dass man möglichst keinen größeren Datentyp wie ein String-Array per call by value übergibt.
Deswegen will ich das Problem mit einem Zeiger lösen.

Zu deiner 2ten Lösung als Verständins:

Ich übergebe an meine Funktion printMonth() die Adresse eines Arrays. Der Zeiger als Parameter zeigt dann nur auf die Adresse des Arrays. Nach deiner Lösung kommt es zu einer "ungültigen Dereferenzierung" bei

C-/C++-Quelltext

1
cout << *pMonths[i];


Wie kann ich denn jetzt auf den Indexs des Arrays zugreifen? Ist das überhaupt möglich?

Lg

//EDIT

@ GR-PA

Zitat

musst du entweder * oder [] entfernen.
Ok das gibt Sinn!

Zitat

Außerdem musst du in der Schleife entweder das < durch ein <= ersetzen oder die 11 durch eine 12. (Sonst ist ja der letzte Wert für i 10...)
Das fällt wohl in die Kategorie Flüchtigkeitsfehler --> Vollkommen logisch!

Zitat

Hier


C-/C++-Quelltext
1

cout << *pMonths;


Ist ebenfalls ein * zuviel

Und beim Funktionsaufruf musst du das & vor Months entfernen.
Das würde mir einleuchten wenn ich keinen Zeiger als Parameter sondern per call by value übergebe.
Aber wenn ich doch

C-/C++-Quelltext

1
void printMonth(string* pMonths)


schreibe, dann muss ich diesem Zeiger doch die Adresse des Arrays mit & übergeben?
und das * als Dereferenzierungsoperator ist doch "eigentlich" nötig um den Wert und nicht die Adresse auszugeben oder verwechsel ich grad was. Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
int a = 3;
int* b;
b = &a;

cout << b;  //Adresse von b
cout << *b;   //3


//Edit2Hab gerade Kapitel 7.2.1 gelesen
wenn ich das richtig verstehe, dann übergibt man generell keine Adresse eines Arrays right?

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Sc4v« (27.05.2010, 17:01)


Nexxtron

Alter Hase

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

5

27.05.2010, 16:53

hä, ich hab gedacht man kann keine Arrays übergeben oder hab ich da was falsch verstanden?
New Project: Operation CityRacer

Sc4v

Alter Hase

  • »Sc4v« ist der Autor dieses Themas

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

6

27.05.2010, 16:57

um einen Doppelpost zu vermeiden steht meine Antwort für GR-PA im vorherigem Post

TSS

Frischling

  • Private Nachricht senden

7

27.05.2010, 17:10

Das liegt daran, dass Arrays zusammenhängende Speicherblöcke sind. Das "Months" in deinem Code ist ein Zeiger auf das erste Element dieses Speicherblockes. Der []-Operator ist nur eine vereinfachte Schreibweise für *(Months+i).
Wie also schon gesagt wurde:

C-/C++-Quelltext

1
2
3
string Months[] = {"Januar", "Februar", "Maerz", 
                            "April", "Mai", "Juni", "Juli", "August", 
                            "September", "Oktober", "November", "Dezember"};

bedeutet, dass Months ein Zeiger auf dieses Array ist. Das heißt du übergibst in deinem Code einen Zeiger auf einen Zeiger, was dann doch zu viel des Guten ist.

8

27.05.2010, 18:28

hä, ich hab gedacht man kann keine Arrays übergeben oder hab ich da was falsch verstanden?
Man kann Arrays nur nicht als Value übergeben. Es wird immer nur der Zeiger übergeben.

Sc4v

Alter Hase

  • »Sc4v« ist der Autor dieses Themas

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

9

27.05.2010, 18:34

ok funktioniert soweit wie es soll. Ich spiel mit dem Thema einfach nochn bissle rum ums zu festigen. Falls weitere Fragen auftauchen (bestimmt xD) melde ich mich hier wieder.
Lg und danke
Sc4v

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

10

27.05.2010, 18:50

um einen Doppelpost zu vermeiden steht meine Antwort für GR-PA im vorherigem Post

Du scheinst eine Menge Angst zu haben 2x zu posten. ;)

Dir sei gesagt, dass es kein Problem ist. Was einfach nicht gerne gesehen ist, wenn jemand alle 5 Minuten postet, ob das denn jetzt niemand weiss oder ein "push" macht. Solange du solche Sachen vermeidest dürfen es auch mal 2,3 Posts hintereinander sein, weil das besser lesbar ist, als wenn du irgendwo oben antwort gibst auf etwas weiter oben gibst.

Zitat

wenn ich das richtig verstehe, dann übergibt man generell keine Adresse eines Arrays right?

Prinzipiell werden bei Arrays nur Adressen übergeben. ;)
Wenn du Kopiersemantik wünscht, dann solltest du die Standardbibliothek nehmen (std::vector z.B. oder wenn allenfalls boost::array, was eher einem nativen Array entspricht).

Werbeanzeige