wo ist der fehler?
-
Hilfe zur Selbsthilfe:
1. Minimalbeispiel erstellen:
Streiche solange unnötiges bis nix mehr überbleibt (wenn wirlich nix mehr da ist, haste was falsch gemacht).
struct BWV { int nr; char name[50]; char instrument[50]; char tonart[5]; // [snipp irrelevantes] //void ausgabe(struct BWV x) {} }; int main() { struct BWV liste[1] = { // [snipp irrelevantes] 1068, "Orchester-Suite No. 3", "Orchester", "D" // FEHLER: invalid conversion from const char to char }; // [snipp alles nach dem Fehler == irrelevantes] }
2. Volle Fehlermeldung haste ja
invalid conversion from const char to char3. Selber interpretieren und probieren .. das ist meist schneller als Forum
Meldung: invalid conversion from const char to charFrage: Wo könnte da ein const char sein?
Gucken:1068, "Orchester-Suite No. 3", "Orchester", "D"
Ergebnis: alles ausser 1068 könnte das seinFrage: wieso will der das überhaupt nach char konvertieren?
Gucken: struct BBMV ( int, char[], char[], char[] )Frage: Ist das mein Code oder steht das eisern fest?
Antwort: Jupp.Nö. (vermeide solche Fragen wenns verwirrt)
Also ändern wer mal:
struct BWV { int nr; const char name[50]; const char instrument[50]; const char tonart[5]; // [snipp irrelevantes] //void ausgabe(struct BWV x) {} // irrelevant für Fehler };
Testen ...
Alternativ: Antworten von Postern mit ~5000 Einträgen besser lesen UND nachdenken:
SeppJ schrieb:
Dein struct nimmt char[] auf, Sachen die zwischen doppelten Anführungszeichen stehen sind aber vom Typ const char[].
Damit kein Fehler kommt musste also entweder dein struct abändern ODER dem compiler beibringen das dein Text zwischen "" nicht const ist:
-
drakon schrieb:
(23:07:46 13.09.2010) @ padreigh: Warum zerstörst du die Objekte nicht mehr?
Schneller
(meins zuletzt bearbeitet von padreigh am 23:04:29 13.09.2010, insgesamt 6-mal bearbeitet)
SeppJ schrieb:
Das geht aber auch ein bisschen hübscher, allgemeiner und ohne Speicherlöcher. [snipp]
[viel ge-snipp-el] // member std::ostream& ausgabe(std::ostream &out) const { out<<"Nummer: \t" << nr << '\n' <<"Name: \t\t" << name << '\n' // Unschick, da doppeltes Trennzeichen. Dafür sieht es auf Konsolen mit der üblichen Tabbreite viel besser aus <<"Instrument: \t" << instrument << '\n' <<"Tonart: \t" << tonart; if (tonart.size() && std::isupper(tonart[0])) out << "-Dur"; if (tonart.size() && std::islower(tonart[0])) out << "-Mol"; out << '\n'; return out; } // free std::ostream& operator<<(std::ostream &out, const BWV &bwv) { return bwv.ausgabe(out); } int main() { std::vector<BWV> BWV_Liste; BWV_Liste.push_back(BWV( 48, "Ich elender Mensch, wer wird mich erloesen" , "Chor, Orchester" )); BWV_Liste.push_back(BWV( 186, "Aergere dich, o Seele, nicht" , "Chor, Orchester" )); { std::ostream_iterator<BWV> out_it (std::cout,"\n"); std::copy ( BWV_Liste.begin(), BWV_Liste.end(), out_it ); } }
Stimmt.
Ich könnte jetzt behaupten ich wollte den Threadsteller nicht überfordern.
Die Wahrheit ist eher das ich zwar mit stream's klar komme, dazu aber meist 1-2 ( dutzend
) mal die Referenz bemühen muss und es daher für so hingeklatschten Code vermeide. Vor allem die Member/Free Signaturen kann ich mir irgendwie nicht merken. Ich bewundere jedoch die Eleganz deines Codes, vor allem der gescopte Ausgabekonstrukt (habe glaube ich noch nie stream_iterator's bemüht
). Hat das scopen eine besondere Bewandnis oder Angewohnheit aus mehrzeiligeren Funktionen?). Mir fehlt bei der std::API ein wenig das interne Inhaltsverzeichnis um zu wissen wie man etwas elegant löst.
Aber dafür hätte ich
"Moll" statt
"Mol" drangehängt.
-
hadamar schrieb:
...jedoch kann ich nur das wissen anwenden, welches mir in meinen vorlesungen vermittelt wurde. wir sollen dort mit strukturen arbeiten und der aufbau entspricht genau dem, was unser professor von uns erwartet. die von euch einbezogenen bibliotheken sind mit vollkommen fremd, bis auf string und iostream....
Ich sehe nicht, wo die o.g. Implementierung deinen Vorgaben widerspräche.
Hier im Forum versammeln sich Leute, die in erster Linie guten Code produzieren wollen ... "mach irgendwie laufen" wird hier sehr selten bedient.Und vielleicht ist "guter Code" ja auch für einen Informatikstudenten auch gar kein soooo unerstrebenswertes Ziel.
Gruß,
Simon2.
-
padreigh schrieb:
Hat das scopen eine besondere Bewandnis oder Angewohnheit aus mehrzeiligeren Funktionen?).
Das ist, damit der Iterator den ich nach der Aktion nicht mehr brauche nach der Aktion auch zerstört wird. Ist hier zwar ziemlich sinnlos, da danach sowieso nichts mehr kommt, aber aus Gewohnheit schränke ich den Scope von Variablen immer so weit wie möglich ein. Streamiteratoren sind aber schon ziemlich unnormal. Ich benutze die jedenfalls sehr selten, da gewöhnliche Ausgabeaktionen genauso lang zu schreiben sind und keine wesentlichen Vorteile oder Nachteile haben. Ich wollte dem Threadersteller nur mal zeigen was so geht.
Mir fehlt bei der std::API ein wenig das interne Inhaltsverzeichnis um zu wissen wie man etwas elegant löst.
So groß ist die Standardbibliothek eigentlich gar nicht. Die Referenz auf cplusplus.com kann man recht bequem an ein paar Nachmittagen überfliegen. Anfangen kann man zum Beispiel mit den cool klingenden Headern wie "algorithm" oder "memory" und dort schon einige Schätzchen entdecken (z.B. auto_ptr). Dann weiter zu den ganzen Headern die man irgendwie schon kennt wie "iostream" und "string" und dort zum Beispiel merken, dass man string auch genauso wie vector benutzen kann, wenn man will. Danach dann exotisch klingende Header wie eben besagtes "iterator" oder "numeric", wo man dann wirklich gut versteckte Dinge wie accumulate findet, das man eher in "algorithm" vermutet hätte. Zum Schluss dann die C-Standardbibliothek. Das meiste davon braucht man zwar nicht mehr, aber wenn man gut hinguckt findet man ein paar Schätze die niemand anderes sonst kennt, zum Beispiel ldiv aus "cstdlib".
Guten, eleganten Stil kannst du aus fortgeschritteneren Büchern entnehmen, wie zum Beispiel die diversen "Effective XXX" Bücher von Scott Meyers. Auch ziemlich gut sind die C++ FAQ Lite, wo in recht lockerem Stil und auch für Anfänger verständlich Stilfragen und Techniken erläutert werden. Trotzdem wird dort nicht mit Hintergrundwissen und genauen Begründungen gegeizt.Dort findest du auch weitere Literaturhinweise (Eintrag 28), wenn dir das noch nicht ausreicht.
Aber dafür hätte ich
"Moll" statt
"Mol" drangehängt.
Ups, wie peinlich. Musikunterricht ist wohl schon zu lange her.
P.S.: Ich bin ja immer noch bei der Theorie, dass der Fragesteller einen C Kurs macht und nur versehentlich C++ in seinen Code aufgenommen hat, weil er versucht hat seine Hausaufgaben nach der guten alten Copy&Paste&"bloß nicht nachdenken"-Technik zu lösen. Die Aufgabenstellung ist derart C-ig (und für C gar nicht mal so schlechter Stil, wenn man ein paar Zugeständnisse an Anfänger erlaubt), das kann unmöglich ein C++ Kurs sein.
-
SeppJ schrieb:
Mögliche Antworten auf dein eigentliches Problem wurde dir am Anfang des Threads schon genannt. Sie sind nicht gut, aber besser geht es nicht, wenn man C mit C++ mischt. Der Rest des Threads danach war nur um dir zu zeigen, wie man das auch in gut machen kann.
Immerhin sind die Aufgaben in guter Absicht gestellt, auch wenn du absolut schrecklichen Stil beigebracht bekommst, den du nach der Prüfung besser sofort vergisst. Oder handelt es sich um einen C und nicht um einen C++ Kurs? Denn die einzigen C++ Sprachelemente die ich sehe sind dein
include<iostream>
(woraus du nichts benutzt), dasusing namespace std
(ebenfalls nicht benutzt) und deine Implementierung vonausgabe
als Member von BWV (was falsch ist, denn es soll laut Aufgabenstellung eine freie Funktion sein). In der Aufgabenstellung selbst ist jedenfalls alles reines C.also der erste teil der klausur, wozu diese aufgabe gehört, soll mit c und nicht mit c++ bearbeitet werden. also könnte ich im grunde das <iostream> weglassen. und nein, kein copy+paste. ich war mir nur am anfang der aufgabe noch nicht sicher, ob ich die ausgabe mit cout oder printf schreiben will. das ist uns nämlich frei überlassen. und es bringt im grunde doch auch keinen nachteil wenn man oben die ein oder andere bibliothek zu viel stehen hat oder?
also ich hab jetzt die main() funktion einfach mal aus der pdf rauskopiert und nicht selbst abgetippt und so funktioniert es jetzt auch.keine ahnung warum aber irgendwas muss ich beim abtippen falsch gemacht haben, wobei ich den fehler immernoch nicht gefunden habe. naja jedenfalls war mein programm, wenn auch kein guter c-stil ja scheinbar richtig und funktionsfähig.
Simon2 schrieb:
Und vielleicht ist "guter Code" ja auch für einen Informatikstudenten auch gar kein soooo unerstrebenswertes Ziel.
bin kein informatikstudent
eher ein halbwissender, der dort eine klausur über ein thema schreiben muss, mit dem er sich vorher noch nie wirklich beschäftigt hat.
-
hadamar schrieb:
also der erste teil der klausur, wozu diese aufgabe gehört, soll mit c und nicht mit c++ bearbeitet werden. also könnte ich im grunde das <iostream> weglassen. und nein, kein copy+paste. ich war mir nur am anfang der aufgabe noch nicht sicher, ob ich die ausgabe mit cout oder printf schreiben will. das ist uns nämlich frei überlassen. und es bringt im grunde doch auch keinen nachteil wenn man oben die ein oder andere bibliothek zu viel stehen hat oder?
Doch. Besonders wenn du dadurch die Sprache veränderst. Dein C lässt sich nämlich nicht mehr mit einem C Compiler übersetzen, dabei nutzt du gar kein C++.
also ich hab jetzt die main() funktion einfach mal aus der pdf rauskopiert und nicht selbst abgetippt und so funktioniert es jetzt auch.keine ahnung warum aber irgendwas muss ich beim abtippen falsch gemacht haben, wobei ich den fehler immernoch nicht gefunden habe.
Auch dies wurde dir schon gesagt. Lies die Antworten! Du hast ein Komma vergessen. Selber schuld, wenn du solchen Kram von Hand abtippst.
naja jedenfalls war mein programm, wenn auch kein guter c-stil ja scheinbar richtig und funktionsfähig.
Für C ist das gar nicht sooooo schlecht, bis auf fehlende innere Klammern bei der Initialisierung das Arrays. Das wichtigste ist aber, dass C entgegen landläufiger Meinung keine Untermenge von C++ ist! In C ist die Konvertierung von const char[] nach char[] legal. Soviel zum Thema, dass man ohne Bedenken weitere Bibliotheken einbinden kann.
-
hadamar schrieb:
...
bin kein informatikstudenteher ein halbwissender, der dort eine klausur über ein thema schreiben muss, mit dem er sich vorher noch nie wirklich beschäftigt hat.
Also entweder studierst du es oder nicht - im letzteren Fall brauchst du auch keine Klausur darüber zu schreiben.
Im Ersteren ist deine Aufgabe, die Wissen darüber anzueignen ... und "guter Code" ist beileibe kein Rand-, Spezial- oder Expertenthema beim Programmieren, sondern das A&O.Der Clou ist ja: Guter Code ist oftmals viel leichter (zu schreiben und zu verstehen) und gleichzeitig weniger fehleranfällig.
Ergo. Weniger Arbeit und mehr gelernt! Was will der (und sei es Nebenfach-)Student mehr?Gruß,
Simon2.
-
das stimmt.
aber ich hab jetzt die ganze zeit mit den vorlesungsunterlagen die programme geschrieben und fühle mich nicht dazu in der lage, mir bis übermorgen einen komplett neuen programmierstil anzueignen.klausur is übermorgen ;)erstes ziel:gute note!
-
Wenig Aufwand <-> gute Note funktioniert nur bei den wenigsten. Die anderen müssen sich ein wenig mehr reinhängen und früher anfangen.
Aber als kleiner Tipp: Das, was Simon2 sagt ist wahr und kann dir selbst in kurzer Zeit zu gutem Code helfen (ob das eine gute Note wird kann ich nicht sagen, weil ich die Bedingungen nicht kenne). Also benutze die Sprachmittel, auch wenn du da halt noch schnell was neues lernen musst, aber es ist es auf alle Fälle Wert 3-4 Stunden string und vector kennen zu lernen (was wirklich ausreichen sollte) und dann schreibst du dein Programm nochmal innert sehr kurzer Zeit einiges robuster neu.
@padreigh
Wenn du das erst im Nachhinein bemerkst und dann noch so implementierst, dann ist das nicht weniger fragwürdig.
-
drakon schrieb:
Aber als kleiner Tipp: Das, was Simon2 sagt ist wahr und kann dir selbst in kurzer Zeit zu gutem Code helfen (ob das eine gute Note wird kann ich nicht sagen, weil ich die Bedingungen nicht kenne). Also benutze die Sprachmittel, auch wenn du da halt noch schnell was neues lernen musst, aber es ist es auf alle Fälle Wert 3-4 Stunden string und vector kennen zu lernen (was wirklich ausreichen sollte) und dann schreibst du dein Programm nochmal innert sehr kurzer Zeit einiges robuster neu.
Die Frage ist, was der Prüfer davon hält. Insbesondere da wir ja inzwischen aus ihm rausgequetscht haben, dass hier tatsächlich nur nach C gefragt wurde. Da wären string und vector schlichtweg falsch. Das Pseudo-C++ welches der Fragesteller in seinem eigenem Ansatz benutzt hat, wäre natürlich ebenso falsch.
-
ich hab doch gar kein c++ benutzt. das war doch einfach nur die bibliothek <iostream>. versteh gar nicht wie man sich darüber so echauffieren kann. hab den zusatz einfach oben hingeschrieben und es gab auch in den anderen 20 aufgaben die ich so gelöst habe kein problem damit. in diesem ja, wie sich herausgestellt hat auch nicht.
und ja. ich könnte mich damit jetzt sicher beschäftigen, jedoch schreib ich noch zwei weitere klausuren die woche
-
hadamar schrieb:
ich hab doch gar kein c++ benutzt. das war doch einfach nur die bibliothek <iostream>.
Also C++. Außerdem hast du
ausgabe()
als Memberfunktion einer Klasse (struct sind in C++ auch Klassen) implementiert und sie auch als Memberfunktion aufgerufen.
-
hadamar schrieb:
ich hab doch gar kein c++ benutzt....
Nunja ... dass wir (im C++-Forum!) davon ausgehen, dass du C++ programmieren willst, finde ich jetzt gar nicht sooooo wild spekuliert.
(erst recht, wenn du noch 2 C++-Sprachmittel verwendest, die es in C nicht gibt)Aber egal: Wenn du wirklich in C programmieren willst/musst, kann ich dir leider (außer mit gedrückten Daumen) nicht helfen.
Gruß,
Simon2.
-
drakon schrieb:
Wenn du das erst im Nachhinein bemerkst
Schuldig.
drakon schrieb:
und dann noch so implementierst
was ist an der Implementation "fragwürdig" ?