NetzUnity und Informatik-forum wurden zusammengelegt. Eine entsprechende Ankündigung wird demnächst noch folgen. Für 2025 ist hier einiges geplant! Bei Fragen bitte per DM an Maximilian Rupp wenden.
playlist_container ist ein pointer auf char der gerade auf irgendeine adresse zeigt die du nicht kennst weil du keinen speicherplatz reserviert hast. dann rufst du strcat auf und das versucht in genau diesen speicherplatz zu schreiben.
Das wesentliche steckt natürlich im get_next_playlist_name(). Da muss ich mit popen oder dem umweg über eine Datei (ls *lst>playlisten.txt) die namen nacheinander einlesen. Eleganterweise aus dem wirklichen Namen und Listenlänge die Größen der Arrays ableiten oder dynamisch anpassen.
da gibt es mehrere moeglichkeiten.
1. so wie du das gesagt hast: fork, umbiegen von stdout in eine pipe, exec des programms (zb ls) lesen aus der pipe. oefnnen der files und einlesen.
2. dein programm mit commandline parametern aufrufen: dein_programm *.lst => sie shell expandet *.lst auf alle files und du hast sie alle in argv[1...] ... oeffnen der files, einlesen der files ...
also erst mal folgendes: du hast dein prog. mit "return(0);" beendet ...das funktionniert zwar, aber return ist KEINE funktion -> du solltest "return 0;" schreiben...ich habe in der htl den selben fehler gemacht worauf mich dann mein info-prof aufmerksam gemacht hat...
das ist eine ziemlich irrelevante stilfrage. es hat ja auch niemand behauptet dass return eine funktion waere. die klammerung hier ist zwar nicht noetig, man findet diesen stil aber oefters.
Zitat von marX
NEIN in c/c++ funktioniert das logischerweise nicht... in c wird zb. "a^2" in "a*a" umgewandelt...also einfach ausmultipliziert ...wie soll der compiler das aber mit 0.5 machen ?
entschuldige bitte den rueden ton, aber dein htl lehrer haette dir lieber beibringen sollen, dass der binaere operator ^ sowohl in c als auch in c++ eine bitweise exclusiv-or verknuepfung durchfuehrt und nichts ausmultipliziert oder umwandelt.
Zitat von marX
NEIN in c/c++ funktioniert das logischerweise nicht... .... -> 2 möglichkeiten: 1. du verwendest sqrt (egal ob's in dem buch schon erklärt wurde oder nich) 2. du schreibst dir selbst eine wurzel(a, b) fkt.
contradictio sine qua non! wenn sich der OP selber eine funktion schreiben kann -- und das will er offensichtlich -- geht es natuerlich.
Es muss noch einen anderen Weg geben. Ohne irgendwelche Includes..also denk dir das cmath mal weg...:D
Dann verweise ich dich auf die Lva's fuer Numerische Mathematik sowie das exzelente Buch: [2002] William H. Press, Saul A. Teukolsky, William T. Vettering, Brian P. Flannery; Nummerical Recipies in C++; Cambridge University Press
soweit ich mich noch aus meinen c++ zeiten erinnere fehlt mir ein void main() der sogenannte programmeinsprungspunkt
nein. void main() wuerde den standard verletzen. der OP hat es richtig gemacht und int main() verwendet. im geposteten code fehlt lediglich die '}' am ende.
das problem liegt in den while scheifen. dort bleibt das programm je nach eingabe in einer endlosschleife haengen. ueberleg mal warum.
ein weiteres problem sind die berechnungen der 5 2 und 1 cent muenzen. diese stimmen ueberhaupt nicht. schau dir an wie du es bei den 50, 20 und 10 cent muenzen gemacht hast.
noch ein tip zum code:
Code
std::cout << anzahl_1 << " 1er.\n";
wuerde ich mit:
Code
std::cout << anzahl_1 << " 1er." << std::endl;
tauschen. das '\n' in einem string literal ist nicht so leserlich und der stream-manipulator std::endl flushed auch gleich den output.
Mit #define definierte Konstanten sind global was meistens zu vermeiden ist!! Mit const definierte Konstanten gehorchen den gewöhnlichen Sichtbarkeitsregeln und sind daher in den meisten Fällen zu bevorzugen.
nein. mit define definierte macros sind weder konstanten noch haben sie einen sope (koennen deshalb auch nicht global sein). die macros werden vor dem compilieren durch den praeprocessor ab der sichbarkeit des macros bis zum ende des programmcodes oder eines #undef dieses macros ersetzt.
macros haben keinen typ und sind deshalb auch nicht typsicher. diese typsicherheit kann durch verwenden von user-defined constanten erreicht werden. das schluesselwort const definiert dabei nicht notwendigerweise eine konstante sondern gibt den compiler lediglich den hint, dass dieses speicherobjekt als read-only zu betrachten ist. es ist syntaktisch kein konstanter ausdruck und kann durch cast auch veraendert werden. /edit: was unter umstaenden undefined behaviour ausloest.
das schluesselwort const macht also nicht genau das was man denken koennte
die moeglichkeit die dem, was der OP machen will, am ehesten entspricht sind enums.
die frage, wann was verwendet werden soll haengt stark vom problem ab, das man loesen will. wenn man typsicherheit erzwingen will so kommt man an einer user-defined constant oder eine enum nicht vorbei.
#include <iostream.h>
int main();
int main()
{
cout << "Hello World!\n";
return 0;
}
wäre das "richtiger"? - sofern es sowas bei Programmiersprachen überhaupt gibt?
es ist zumindest strict ansi conform obwohl auch hier die alten header verwendet werdn (was nicht verboten ist aber langsam und sicher aus neuem codeverschwinden wird). die definition von main vor der declaration main ist in diesem beispiel sinnlos.
Zitat von iveo
4. Ich würde eigentlich gerne mit dem Galilieobuch weiterarbeiten - möchte jedoch auch nichts falsches einstudieren - sollte ich es beiseite legen und mir ein anderes Lehrbuch suchen oder kann ich dabei bleiben? (Ich meine das ist jetzt bestimmt schwer kalkulierbar für euch, da ihr das Buch wahrscheinlich nicht kennt - doch wenn zu grobe Fehler drin sind, dann leg ichs lieber weg!)
wenn dir das buch gefaellt und du damit gute fortschritte machst, lerne ruhig damit weiter. du solltest dir aber bewusst sein dass du spaeter c++ code sehen wirst, der ganz anders aussieht bzw. deine programme mit unterschiedlichen compilern nicht ohne probleme compilierbar sein werden.
das ist als anfaenger kein problem. wenn du allerdings ernsthaft projekte in c++ realisieren willst solltest du dich mit literatur befassen, die sich standardkonformer und penibler mit der sprache auseinander setzt.
Wenn ich eine weitere Ausgabe hab und dann eine Eingabe nach zum Beispiel "Y" für yes fordere - dann funktioniert das - aber das muss doch auch irgendwie anders gehn - oder?
dein problem liegt _nicht_ im bereich deines programmes. dein programm wird ausgefuehrt und beendet sich. dann schaltet sich windows ein und fragt nach einer taste um das terminal zu schliessen (siehe wolfmanns posting).
irgendwo in den tiefen der windows configurationsdialoge kann man dieses verhalten sicher mit einem hakerl abschalten
Zitat von iveo
Das hier wäre zum Beispiel der erste Übungsquellcode aus meinem Buch:
dein buch scheint nicht das neueste zu sein und nebenbei nicht besonders viel vom c++ standard zu halten.
Code
// das sind die alten c++ header in denen die classen und funktionen nicht
// in die namespaces gemapt werden. man sollte sich von ihnen verabschieden
// und statt dessen die neuen verwenden.
// #include <iostream>
#include <iostream.h>
// der standard erlaubt keine funktionsdeclarationen ohne typ
// mehr (im gegensatz zum c standard)
// int main()
main()
{
int Zahleingabe;
int Doppel;
int Enter;
// wegen den neuen headern brauchen wir auch namespaces
// std::cout << .... << std::endl;
// ...
cout << "Bitte geben Sie eine Zahl ein!" << endl;
cin >> Zahleingabe;
Doppel = Zahleingabe * 2;
cout << "Das Doppelte dieser Zahl ist " << Doppel << endl;
// jetzt muessen wir natuerlich auch ein integer zurueckgeben
// return 0;
}
Ja da hast du recht aber es ändert nichts an der Tatsache das er trotzdem den Email Client öffnet und es nicht direkt verschickt.
ja, das von dir gewuenschte verhalten ist browserabhaengig (netscape irgend a 3er version machte genau das was du willst).
zitiert aus partels einfuehrung:
Manche (wenige) Web-Browser bieten die Möglichkeit, Formulare per E-Mail zu verarbeiten. Dazu würden Sie im Formular mit <form action="mailto:user@host.domain" enctype="text/plain"> Ihre eigene Mail-Adresse angeben, und jedesmal, wenn ein Leser dann den Submit-Knopf "drückt", bekommen Sie den Formularinhalt als lesbaren Text per E-Mail in Ihre Mailbox gesendet und können ihn dann händisch oder mit einem auf Ihrem Computer laufenden Programm verarbeiten.
Allerdings werden solche Mailto-Formulare von sehr vielen Web-Browsern nicht unterstützt. Diese Methode kann daher nur innerhalb von kleinen, geschlossenen Benutzergruppen eingesetzt werden, bei denen man sicher ist, dass sie alle eine dafür geeignete Browser-Version verwenden, abe nicht für allgemein verwendbare Anwendungen.
Ich habe jetzt vor <body> die Zeile eingefügt und nach </body> beendet mit </form>
wuerde dir empfehlen das <form> tag auch dort zu verwenden wo es hingehoert, naemlich _in_ den <body> part. desweiteren solltest du dir vielleicht einen html einfuehrungstext zu gemuete fuehren. zb: den etwas aelteren aber leicht verstaendlichen text von hubert partl unter http://www.boku.ac.at/htmleinf/hein.html
... aber zur Einführung hat mir das Buch "OpenGL Game Programming" von David Astle & Kevin Hawkins (ISBN 0761533303) ganz gut gefallen.
ich wuerde von den game programming buechern von prima tech abraten. sie bieten weder im bereich spiele programmierung noch im grafik bereich mehr als eine oberflaechliche einfuehrung.
fuer opengl empfehle ich 'Woo, Neider, Davis, Shreiner; OpenGL Programming Guide, Fourth Edition; Addison Wesley'. dieses buch wird dir auch in den computergrafik lvs wertvolle dienste leisten (als ergaenzung zu 'hearn, baker; computer graphics; prentice hall' die in der dritten edition uebrigens auch opengl beispiele enthalten).
Dann kann es dir nämlich nicht mehr passieren, dass der Linker sich über Nameclashes bei den globalen Variablen aufregt.
auch auf die gefahr hin, paedantisch zu wirken, muss ich doch einwenden, dass du im code beispiel durch die verwendung des identifiers _COLPRINTF_H einen schlechten tip gibst.
der standard reserviert die nutzung von identifieren die mit _<grossbuchstabe> sowie __ beginnen (ISO/IEC 9899:1999 7.1.3). auch wenn es hier in diesem fall keine gefahr ist sollte man genau sowas nicht verwenden um nameclashes mit zukuenftigen library versionen zu verhindern.
colprintf.o(.data+0x0): In function `colprintf':
/home/mj/programming/c/colprintf/colprintf.c:7: multiple definition of `COLOR_SPECIAL_RESET'
.
. (das gleiche für jede Konstante)
.
test.o(.data+0x0):/home/mj/programming/c/colprintf/test.c:4: first defined here
collect2: ld returned 1 exit status
make: *** [all] Error 1
ohne den code zu kennen wird dir wohl niemand etwas konkreteres sagen koennen als der compiler. du hast diese konstanten oefters definiert.