Matrix übergeben
-
SeppJ schrieb:
Mach aus "SpielField" "SpielFeld". Oder programmier auf Englisch, wie es die Mehrheit tut.
So doof bin ich nun wieder auch nicht
Es ist mir schon klar das, das das Spielfeld sein soll
Ich meine den Hintergrund warum da ein sf steht und ein SpielField.Und das Programm geht auch nicht. Ich habe es nun weiter probiert bekomme es aber nicht hin.
-
Fensterscheibe schrieb:
Und das Programm geht auch nicht.
Gewöhn dir das gleich wieder ab. Auf "Programm geht nicht" kriegst du nur Müllantworten wenn überhaupt. Minimalen Programmcode zeigen, schreiben was du erwartest, was stattdessen passiert (inklusive Fehlermeldung hier reinkopiert) und was du eigentlich machen willst.
Fensterscheibe schrieb:
Und noch eine Frage:
void ausgabe_spielfeld(SpielField& sf)
wieso SpielField sf
Wieso nicht? SpielField ist der Typ und sf der Name. DocShoe ist eben kein besserer Name eingefallen, mir fällt auch keiner ein.
-
Wir wissen nicht, wie doof du bist . Über kurze Textnachrichten kann man nur sehr schwer Ironie übertragen. Wir können daher nur Fragen beantworten, die du stellst; und Probleme lösen, die du beschreibst. "Und das Programm geht auch nicht." ist beispielsweise keine Problembeschreibung.
Jedenfalls sind in deinem Programm die Bezeichner kreuz und quer vermischt. Mal SpielFeld, mal SpielField. Mal sf, mal feld. Ob dir das klar ist oder ob du doch "so doof" bist, können wir nicht wissen, wir können dich bloß darauf aufmerksam machen, dass es ein Kuddelmuddel ist.
-
Vor allen Dingen ist das so trivial, dass es schwierig ist, dir zu helfen. Wenn du mit dem o.g. Dreizeiler Probleme hast ist es höchste Zeit, sich die entsprechenden Grundlagen anzueignen, bevor man weitermacht.
Ich habe in meinem Quelltext einen Fehler, stattSpielField
muss esSpielFeld
heißen. In den 16 Zeilen kommt vier malSpielFeld
vor, und ein malSpielField
. Wir reden hier die ganzen Zeit von einem Spielfeld und dein Compiler nennt dir als Fehlermeldung (sinngemäß)Unbekannter Typ 'SpielField'
. Dass man dir da noch Hilfestellung geben muss lässt vermuten, dass die einfachsten Grundlagen und Verständnis für´s Programmieren generell fehlen.
Am besten schnappst du dir dein C++ Lehrbuch und arbeitest das Kapitel Klassen und Strukturen (oder ähnlich) inklusive aller Übungsaufgaben noch ein mal durch.Ergänzung:
Wenn man wüsste, waschar Feld[10][10]
eigentlich ausdrücken soll könnte man es anders benennen, z.B. Position. Aber ohne Genaueres bleibt das wieder ein Ratespiel.
-
Meine eigendliche Frage war es wie ich einen Array (zweidimensional) einer Funktion übergeben kann. Dann habt ihr gesagt ich sollte besser class oder strcut benutzen. Da DocShoe das mit strcut gezeigt hatte, habe ich das auch genommen. Ich habe das nun in meinen Code eingebaut.
main.cpp
int main(){ ausgabe spielfeld; ausgabe_spielfeld(spielfeld); }
funktionen.cpp
void ausgabe_spielfeld(ausgabe &feld){ int x=5; for(unsigned int y=0;y<10;y++){ //Gibt das Spielfeld aus 0-9 if(y==0){ } else{ cout << "\n"; } for(unsigned int x=0;x<10;x++){ cout << feld[y][x]; // Hier } } }
funktionen.h
struct ausgabe{ char feld[10][10]; }; void ausgabe_spielfeld(ausgabe &feld);
Nun bekomme ich in der funktionen.cpp eine Fehlermeldung (makiert im code), unzwar : [b] no match for operator[] in feld[y]
[quote=SeppJ]Mach aus "SpielField" "SpielFeld". Oder programmier auf Englisch, wie es die Mehrheit tut.[/quote] Gut ich bin wirklich so doof ich habe nicht auf die Namenunterschiede geachtet.
-
Deine Variable feld in der Funktion ist ja nun vom Typ ausgabe. Dementsprechend musst Du sie auch behandeln:
cout << feld.feld[y][x]; // Hier
-
Danke es geht.
Nun habe ich noch ein paar Fragen, damit ich das auch verstehe was ihr mir da jedzt geschrieben habt.1. In der main steht ja ausgabe_spielfeld(spielfeld); warum ist spielfeld in den klammern, obwohl die Variable im struct feld heißt? Angenommen ich habe im struct mehrere Variablen wie will man die den Unterscheiden?
2. Warum cout << feld.feld[y][x]; und nicht cout << ausgabe.feld[y][x];Sonst ist alles soweit klar
-
1. Du hast vorher eine Variable namens spielfeld angelegt.
Mitausgabe spielfeld;
hast Du gesagt, Du möchtest eine Variable namens spielfeld haben. Typ der Variablen ist der von Dir vorher definierte Typ ausgabe.
Du kannst die in Deiner struct definierten Variablen ansprechen, wie ich es Dir in meinem letzten Posting gezeigt habe, zB.struct ausgabe { int eins; int zwei; char drei; }; ... ausgabe variablenName; variablenName.eins = 1; variablenName.zwei = 2; variablenName.drei = 'c'; ...
2. In Deinem Funktionskopf definierst Du, welche Variablen Deine Funktion übergeben bekommen soll, und von welchem Typ sie sind.
Ansprechen musst Du in der Funktion die konkrete Variable. In Deinem Fall ist ausgabe& der Typ (Referenz auf ausgabe) und feld der Name der Variablen.
-
Danke an allen!!
Hat lange gedauert aber ich habe nun noch ein wenig damit experimentiert und nun ist es mir hoffentlich klar.
-
So hier bin ich wieder
Ich würde nun gerne eine Funktion in einer Funktion aufrufen.Funktionsprototypen
void ausgabe_spielfeld(daten &spielfeld, daten &x, daten &auswertung); void x_berechnen(daten &x, daten &auswertung);
Funktionen
void ausgabe_spielfeld(daten &spielfeld, daten &x, daten &auswertung){ //... x_berechnen(daten &x, daten &auswertung); //Hier die Fehlermeldung //... } void x_berechnen(daten &x, daten &auswertung){ //... }
Nun bekomme ich die Fehlermeldung (Stelle makiert):
expected primary-expression befor & token[/code]
-
Das Problem ist, dass du anscheinend vergessen hast, wie man überhaupt Funktionen aufruft.
Hier mal ein Beispiel. In der Standardbibliothek ist der Sinus deklariert als:
double sin(double x);
Wie würdest du diese Funktion aufrufen?
~An all die Klugscheißer, die sich gerade die Finger wund tippen, dass da nur "double sin(double)" vorgegeben wäre: Falsch! Es wird auf den C-Standard verwiesen und der definiert "double sin(double x)". Bloß die Zusatzüberladungen im C++-Standard lassen den Parameter unbenannt. Ätsch! :p~
-
SeppJ schrieb:
double sin(double x);
Wie würdest du diese Funktion aufrufen?
Ich würde sie so aufrufen
sin(x)
Aber x kann ja auch haus heißen.
Also ich habe gestern abend noch mal überlegt und habe es geschafft unzwar so:x_berechnen(x, auswertung);
, aber warum so?
Weil in der Funktionvoid ausgabe_spielfeld(daten &spielfeld, daten &x, daten &auswertung)
werden die Variablen x & auswertung so angesprochen x.x & auswertung.auswertung. Es wäre nett wenn mir das einer nochmal genauer erklären könnte.
-
Fensterscheibe schrieb:
Ich würde sie so aufrufen
sin(x)
Aber x kann ja auch haus heißen.
Völlig richtig.
double sin(double x); void foo(){ double haus = 3.14; double sh = sin(haus); double x = 2.71; double sh2 = sin(x); double sh3 = sin(double haus); //syntax error double sh4 = sin(double x); //syntax error } void bla(){ x_berechnen(daten &x, daten &auswertung); //syntax error x_berechnen(x, auswertung); }
Beim Funktionsaufruf werden die Typen der Argumente nicht nochmal hingeschrieben. Soweit klar? Dass manchmal Funktionsargumente genauso heißen wie in der Funktionsdeklaration hat nichts zu sagen.
Fensterscheibe schrieb:
Weil in der Funktion
void ausgabe_spielfeld(daten &spielfeld, daten &x, daten &auswertung)
werden die Variablen x & auswertung so angesprochen x.x & auswertung.auswertung. Es wäre nett wenn mir das einer nochmal genauer erklären könnte.
Kommt drauf an wie daten definiert ist.
struct daten{ int x; int auswertung; }; struct daten x; x.x; x.auswertung; struct daten auswertung; auswertung.x; auswertung.auswertung; struct daten sonstwas; sonstwas.x; sonstwas.auswertung; sonstwas.sonstwas; //error: struct daten hat kein member "sonstwas"
Hier ist es wieder Zufall, dass die Variablen genauso heißen wie ihre Member. Kann so sein, muss nicht, hat nichts zu sagen.