Hallo!
Ich habe mir als C- Programmiereinstieg das Buch "C Programmieren von
Anfang an" von Helmut Erlenkötter gekauft, und bin begeistert. Nun habe
ich mir den kostenlosen Visual C++ Express - Compiler von Microsoft
runtergeladen. Dann hab ich neues Projekt/ Win32 / Win32-
Konsolenanwendung / Name: Hallo Welt / Anwendungstyp: Windows- Anwendung
/ Fertig Stellen gemacht, und dann kommt im Programmfenster schon ein
wenig Code.
Anschliessend hab ich meinen eigenen Hallo Welt Code:
#include <stdio.h>
main() {
printf("\nHallo Welt!")
}
ans Ende des schon existierenden Codes geschrieben, und dann auf das
kleine, grüne Dreieck geklickt. Es kam ein kleines Fenster mit Code
veraltet - Erstellen?, welches ich mit Ja beantwortet habe. Nun kam eine
Fehlermeldung, und Visual C++ wollte, dass ich vor main noch ein int
hinschreibe. Hab ich dann auch gemacht, wieder aufs Dreieck geklickt,
und diesmal hats geklappt. Dann wollte ich das exe- Programm starten,
was auch geklappt hat, aber es kam nur ein weißes Programmfenster ohne
den Text "Hallo Welt".
Nun meine Frage: Was hab ich falsch gemacht???
Ich weiß nicht mehr weiter.......
Vielen Dank schon einmal im Voraus.
Grüße, Steffen
Der Anwendungstyp "Windows-Anwendung" ist mit hoher Wahrscheinlichkeit nicht korrekt. Das ist eine "Konsolenanwendung" (oder wie auch immer das im eingedeutschten Tool heißen mag).
Hallo,
wenn ich anstatt Windows- Anwendung Konsolenanwendung einstelle, und
alles mache wie vorhin, dann erscheint kurz die Kommandozeile auf dem
Bildschirm, verschwindet allerdings sofort wieder.
Ich hab noch einen Fehler in meinem Programm gefunden. So muss es
aussehen:
#include <stdio.h>
main() {
printf("\nHallo Welt!");
}
Hab das Semikolon nach der printf- Anweisung vergessen........
Grüße, Steffen
Steffen O. wrote: > wenn ich anstatt Windows- Anwendung Konsolenanwendung einstelle, und > alles mache wie vorhin, dann erscheint kurz die Kommandozeile auf dem > Bildschirm, verschwindet allerdings sofort wieder. > Ich hab noch einen Fehler in meinem Programm gefunden. So muss es > aussehen: > > #include <stdio.h> > main() { > printf("\nHallo Welt!"); > } > > Hab das Semikolon nach der printf- Anweisung vergessen........ ... und das int vor main. Die Funktion main muss immer einen int retournieren. Immer! Zu deinem Problem: Du kannst das Programm von der Command Line starten (DOS Box), dann siehst du die Ausgabe. Oder aber du kannst in das Programm dazu zwingen auf etwas zu warten, was du steuern kannst, zb. irgendeine Eingabe
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
Jetzt wartet das Programm am Ende drauf, dass du ein Zeichen eingibst (plus Return drückst).
Hallo, wie kann ich aus der Kommandozeile (cmd) mein geschriebenes Programm starten? Wenn ich einfach den Pfad eingeb, wo mein Programm ist, dann kommt immer ne Fehlermeldung..... Grüße, Steffen
Steffen O. wrote: > Hallo, > wie kann ich aus der Kommandozeile (cmd) mein geschriebenes Programm > starten? > Wenn ich einfach den Pfad eingeb, wo mein Programm ist, dann kommt immer > ne Fehlermeldung..... > Grüße, Steffen Du startest als erstes mal die DOS Box, bei neueren Windowsen heist das dann Command Line oder Eingabeaufforderung. Die findest du normalerweise unter Start - Alle Programme - Zubehör - Eingabeaufforderung Dadurch kriegst du ein Fenster, in dem eine ganz normale DOS Command Line arbeitet, so wie man das vor Windows benutzt hat um einen DOS-Computer zu steuern. Diese Command Line versteht ein paar Befehle. Gib einfach mal 'Help' ein. Ein Befehl ist zb 'cd' (wie change directory) cd \ bringt dich ins Wurzelverzeichnis deiner Festplatte. Dort navigierst du mit weiteren cd's zu dem Verzeichnis in dem dein Programm liegt. Liegt dein Programm zb im Verzeichnis \Test\Debug dann gibst du ein cd \test\debug mit einem 'dir' (wie Directory) kannst du überprüfen ob du im richtigen Verzeichnis bist. Dein EXE müsste dort auftauchen. Um ein Programm zu starten gibst du einfach am richtigen Verzeichnis den Namen des Programms ein. Heißt dein EXE also ERSTES.EXE dann gibst du einfach ERSTES ein
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
> Wenn ich einfach den Pfad eingeb, wo mein Programm ist, dann kommt > immer ne Fehlermeldung..... Und bitte gewöhn dir solche Aussagen ab. Die sind nicht hilfreich. Die Fehlermeldung hat ja einen Zweck, der im Text der Fehlermeldung steckt. Entweder der Text sagt dir selbst schon, was faul ist oder du kommst nicht dahinter, was dir die Command Line sagen will. Dann hilft es aber auch nichts, wenn du uns erzählst dass es eine Fehler- meldung gibt. Denn wir können auch nicht hellsehen und die Fehler- meldung erraten.
Hallo, Vielen Dank für den Tip!!!!! Ich hab jetzt das erste Programm in der Kommandozeile zum Laufen gebracht!!!! Wie kann man das ganze jetzt noch als Windows- Fenster realisieren?? Ist nicht unbedingt wichtig, aber mich würde es noch interessieren. Vielen Dank schon einmal im Voraus. Grüße, Steffen
Steffen O. wrote: > Hallo, > Vielen Dank für den Tip!!!!! > Ich hab jetzt das erste Programm in der Kommandozeile zum Laufen > gebracht!!!! > Wie kann man das ganze jetzt noch als Windows- Fenster realisieren?? > Ist nicht unbedingt wichtig, aber mich würde es noch interessieren. Das erfordert schon einiges mehr an Arbeit. Die einfachste Variante ist immer noch, wenn du deiner IDE eine Konsolenanwendung aufträgst und am Ende des Programmes vom Benutzer eine Engabe einforderst, dass jetzt dieses Fenster zu schliessen sei. Alles andere ist mit C oder C++ deutlich mehr Aufwand. In C: Da muss zunächst mal eine Fensterklasse registriert werden. Dann braucht man eine sog. Window-Procedure, die von Windows aufgerufen über die Message-Pump aufgerufen wird, wenn es etwas im Fenster zu tun gibt, wie zb. das Fenster neu zu zeichnen. Innerhalb dieser Window-Procedure wird dann an ein Device Context angefordert, der der Zeichenfläche entspricht. Dann benötigt man noch einen Font, der in den Device Context selektiert wird um dann schlussendlich mit der Text Funktion den eigentlichen Text im gewählten Font auf dem Device Context rendern zu lassen. Auch ist dann noch eine zumindest rudimentäre Benutzerinteraktion erforderlich, denn das Fenster soll sich ja auch schließen, wenn der Benutzer auf das X klickt. In C++ mit der MFC erzeugt zwar der Wizard das vollständige Grundgerüst dafür, ohne aber zu verstehen, was da abgeht ist es nicht sinnvoll damit seine ersten Programmierschritte zu machen. Mit dem neuen .NET Forms Geraffer ist es im Grunde ähnlich: Das vom Wizard vordefinierte Framework geht über zig-Stufen um die gleichen Aktionen auszuführen. Wenn du gerade erst mit der Programmierung an sich angefangen hast, dann bleib bei Konsolenanwendgunen. Damit bist du das nächste halbe Jahr genug beschäftigt um die Grundlagen der Programmierung zu erlernen, ohne dich in Fenstern zu verzetteln.
Gast
#823543
Sonst halt die üblichen Verdächtigen mal ausprobieren: Visual Basic (ok, ich nehms zurück), oder Borland Delphi (bzw. Lazarus) und Borland C++ Builder, den es ja mittlerweile auch kostenlos gibt.
Hallo, Vielen Dank erstmal. Dann reicht mir die Konsole bis jetzt, und ich werde jetzt weiter C- Bücher wälzen..... Grüße, Steffen
Gast
#823683
Du kannst natürlich auch aus der WinMain sukzessive die MessageBox aufrufen. Dann hast dus "graphisch" ohne zuviel Aufwand
Hallo,
ich hab jetzt das mit dem Kommandofenster und so alles gemacht, und
jetzt mein erstes kleines Programm zum ausrechnen des tagenauen Alters
in Visual C++ geschrieben:
------------------------------------------------------------------------
-----
// Altersrechner.cpp : Definiert den Einstiegspunkt für die
Konsolenanwendung.
//
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
#include <stdio.h>
int rechner(int gebtag, int gebmonat, int gebjahr, int alterstage, int
monat, int tag, int jahr, int differenztage) {
gebjahr=gebjahr-1900;
alterstage=gebjahr*365;
alterstage=alterstage+gebmonat*30,5;
alterstage=alterstage+gebtag;
jahr=jahr-1900;
differenztage=jahr*365;
differenztage=differenztage+monat*30,5;
differenztage=differenztage+tag;
alterstage=differenztage-alterstage;
}
int main () {
int
tag,monat,jahr,wahl,gebtag,gebmonat,gebjahr,alterstage,differenztage;
printf ("\n Altersrechner");
printf ("\nBitte auswaehlen:");
printf ("\n 1.Person");
printf ("\n 2.Person");
printf ("\n 3.Person");
printf ("\n 4.Person");
printf ("\n 5.Person");
printf ("\n 6.Person");
printf ("\n 7.Person");
printf ("\n 8.Person");
printf ("\n 9.Person");
printf ("\n Nun gewuenschte Zahl eingeben: ");
scanf_s ("%i",&wahl);
printf ("\nBitte heutiger Tag eingeben: ");
scanf_s ("%i",&tag);
printf ("\nBitte jetziger Monat eingeben: ");
scanf_s ("%i",&monat);
printf ("\nBitte jetziges Jahr eingeben: ");
scanf_s ("%i",&jahr);
switch (wahl) {
case 1:
gebtag=2,
gebmonat=7,
gebjahr=1993;
printf("\nDiese Person ist %i Tage alt",rechner(alterstage));
break;
case 2:
gebtag=1,
gebmonat=6,
gebjahr=1995;
printf("nDiese Person ist %i Tage alt",rechner(alterstage));
break;
}
}
------------------------------------------------------------------------
---
Ich hab jetzt als Beispiel einfach mal in case 1 und 2 ein paar mögliche
Geburtsdaten eingetragen. Mit dem Programm kann man z.B. von seiner
ganzen Familie das Alter ausrechnen. Die cases habe ich noch nicht
fertig geführt, aber das kann man ja leicht eintragen.
Wenn ich das ganze nun kompilieren möchte kommt folgende Fehlermeldung:
------------------------------------------------------------------------
---
------ Erstellen gestartet: Projekt: Altersrechner, Konfiguration: Debug
Win32 ------
Kompilieren...
Altersrechner.cpp
c:\dokumente und einstellungen\steffen oesterwind\eigene dateien\visual
studio 2008\projects\altersrechner\altersrechner\altersrechner.cpp(52) :
error C2660: 'rechner': Funktion akzeptiert keine 1 Argumente
c:\dokumente und einstellungen\steffen oesterwind\eigene dateien\visual
studio 2008\projects\altersrechner\altersrechner\altersrechner.cpp(58) :
error C2660: 'rechner': Funktion akzeptiert keine 1 Argumente
Das Buildprotokoll wurde unter "file://c:\Dokumente und
Einstellungen\Steffen Oesterwind\Eigene Dateien\Visual Studio
2008\Projects\Altersrechner\Altersrechner\Debug\BuildLog.htm"
gespeichert.
Altersrechner - 2 Fehler, 0 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0
übersprungen ==========
------------------------------------------------------------------------
---
Was hab ich da falschgemacht???
Vielen Dank schon einmal im Voraus.
Grüße, Steffen
Gast
#823823
da: > rechner(alterstage) sind nicht genug Argumente zwischen den Klammern um > int rechner(int gebtag, int gebmonat, int gebjahr, int alterstage, int > monat, int tag, int jahr, int differenztage) { aufrufen zu können.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
Die Kommata nach den Zuweisungen gebtag=2, etc. passen wohl auch nicht!
Hallo, wie muss ich das dann schreiben, damit genügend Argumente in den Klammern stehen??? Es soll ja ber so sein, dass später nur anstatt von dem %i die alterstage stehen. Ich kann da ja nicht alle Sachen aufzählen, die ich oben initialisiert habe, oder??? Vielen Dank scjon einmal im Voraus, Steffen
Hallo, weiß keiner wie ich das Problem beheben kann??? Vielen Dank schon einmal im Voraus. Grüße, Steffen
Steffen O. wrote: > Hallo, > weiß keiner wie ich das Problem beheben kann??? > Vielen Dank schon einmal im Voraus. > Grüße, Steffen Wenn du eine Funktion definierst, die Argumente benötigt, dann musst du schon auch die Argumente beim Aufruf bedienen. Die Funktion kann sich ja nicht einfach irgendwelche Werte aus den Fingern saugen. Das ist wie in einem Amt: Wenn auf dem Formular 5 Felder einzutragen sind, dann musst du auch 5 Werte in die Felder eintragen, ansonsten akzeptiert der Beamte das Formular nicht und schmeist es dir zurück, damit du es vollständig ausfüllst. Das ist deine Funktion int rechner( int gebtag, int gebmonat, int gebjahr, int alterstage, int monat, int tag, int jahr, int differenztage ) Deine Funktion möchste von dir haben: * den Geburtstag, in Form von 3 Zahlenwerten, jeweils eine für Tag, Monat und Jar * Eine Angabe, die sich Alterstage nennt, keine Ahnung was das sein soll. Ist aber auch egal, die Funktion will sie haben * Ein weiteres Datum, wieder in Form von 3 Zahlen für Tag, Monat und Jahr * Und irgendwelche Differenztage. Summa summarum, will die Funktion also beim Aufruf 8 Zahlen vom Aufrufer wissen. -> Daher kann ein Aufruf ala rechner(alterstage) wohl nicht ganz richtig sein. Anstatt der geforderten 8 Werte, wird nur einer übergeben. PS: Mir ist schon klar, was du mit Alterstagen und Differenztagen bezwecken willst. Diese Werte soll wahrscheinlich dir Funktion berechnen. Das funktioniert aber so nicht. Backe kleine Brötchen. Fang mit kleineren Funktionen an, die weniger Argumente übernehmen. Wenn ich deinen Zeitplan so bedenke, dann machst du im Moment den Über-Übernächsten Schritt vor dem Zweiten. Lass dir mehr Zeit. In deinem Buch gibt es sicher auch genügend Beispielaufgaben für einfachere Dinge.
Gast
#824258
Du hast ne ganze Menge noch falsch gemacht. Die Rückgabe in C über die Argumentliste geht nur über Pointer. Schau dir das erst morgen oder übermorgen an. Bei Funktionen, die nur einen Wert berechnen, wird dies einfacherweise dem Funktionsrückgabewert zugewiesen, so wie in meiner Modifikation. (Deine Mathe dahinter hab ich nicht angeschaut).
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
Die Variable alterstag in der Funktion 'rechner' kann beliebig heißen, hat also nichts mit der Variablen in main() zu tun. Und, 'differenztage' braucht man in main() nicht.
Hallo, Vielen Dank für die Hilfe!!! Ich habe das jetzt umgeändert, und siehe da: ES GEHT!!!!! Das Programm läuft genauso, wie ich es mir vorgestellt hatte. Grüße, Steffen
Hallo, Ich hab lediglich den Tip von Karl Heinz umgesetzt, und das hingeschrieben, was die Funktion von mir will. Nun geht es wunderbar, und die Angaben sind auch ziemlich genau. Wie ich das sehe, hab ich gar nichts mit einem Pointer gemacht............. Grüße, Steffen
Steffen O. wrote: > Hallo, > Ich hab lediglich den Tip von Karl Heinz umgesetzt, und das > hingeschrieben, was die Funktion von mir will. Nun geht es wunderbar, > und die Angaben sind auch ziemlich genau. Wie ich das sehe, hab ich gar > nichts mit einem Pointer gemacht............. Das brauchst du auch nicht. Allerdings solltest du dir das Konzept der 'lokalen Variablen' in den nächsten Tagen ansehen. Es macht keinen Sinn jede Variable, die in einer Funktion nur lokal benötigt wird, in die Argumentliste mit aufzunehmen. Man kann und soll solche Variablen lokal in der Funktion definieren.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
Noch was: Kommazahlen schreiben sich in praktisch allen Programmier- sprachen mit einem . und nicht mit einem , Das hier differenztage = differenztage + monat * 30,5; kompiliert zwar, macht aber etwas anderes als das hier differenztage = differenztage + monat * 30.5;
Gast
#824313
>Ich hab lediglich den Tip von Karl Heinz umgesetzt, und das >hingeschrieben, was die Funktion von mir will. Nun geht es wunderbar, >und die Angaben sind auch ziemlich genau. Wie ich das sehe, hab ich gar >nichts mit einem Pointer gemacht............. Mich würde jetzt aber trotzdem interessiern, wie du den Wert 'alterstage' ohne 'return alterstage' oder ohne Pointer zurückbekommen hast. Eines von beiden braucht man oder ich steh gerade auf dem Schlauch :-). Karl Heinz hatte noch nichts vom 'return' erzählt ... Deine (usprünglicher) Funktion mit dem Funktionsaufruf
1 | |
2 | |
3 | |
gibt so weder 'alterstage' noch 'differnztage' zurück - du kannst diese Werte nur in die Funktion übernehmen.
Hallo, ich habe dann nochmal in meinem Buch geschaut, und da stand dann drin, dass ich noch den return befehl einbauen muss. Das mit den Kommas hab ich verbessert, vielen Dank für den Tip. Grüße, Steffen
Gast
#829388
du kannst auch ein "void" vor das "main" schreiben.
Rüdiger wrote:
> du kannst auch ein "void" vor das "main" schreiben.
Können tust du schon. Der Editor kann sich schliesslich nicht
wehren.
Richtig ist es dennoch nicht. main liefert einen int. Per Defintion
und immer.
Hallo, das Programm, und auch noch ein paar andere selber geschriebene laufen jetzt alle, und ich kann sie auch per Kommandozeile starten und so..... Eins würde mich jetzt aber doch interressieren: Man kann bei Visual C++ am Anfang, wo man festlegt für was das Programm ist, auch Windows- Applikation einstellen. Wenn ich das mache, kommt am im Programmfenster ein schon geschriebener Code. Wenn ich da nun einen einfaches Hello World Programm drunterschreib, und es compilier (und linke), dann kommt auch ein normales Windows- Fenster, aber das Fenster ist weiss, d.h. es erscheint nicht der Hello World text. Wie kann ich nun dort einen Text erscheinen lassen??? Brauch ich da irgendwelche C++ Befehle, oder was??? Vielen Dank schon einmal im Voraus. Grüße, Steffen
Steffen O. wrote: > am Anfang, wo man festlegt für was das Programm ist, auch Windows- > Applikation einstellen. Wenn ich das mache, kommt am im Programmfenster > ein schon geschriebener Code. Wenn ich da nun einen einfaches Hello > World Programm drunterschreib, und es compilier (und linke), dann kommt > auch ein normales Windows- Fenster, aber das Fenster ist weiss, d.h. es > erscheint nicht der Hello World text. > Wie kann ich nun dort einen Text erscheinen lassen??? > Brauch ich da irgendwelche C++ Befehle, oder was??? Jede Menge. Beim VC6.0 Wizard gibt es die Möglichkeit, dass man sich eine Windows Applikation erzeugen lassen kann, wobei der Wizard eine 'Typical Hello World Application' erzeugen kann. Dann klappts auch mit der Ausgabe. Hinweis: Die Ausgabe erfolgt in der Funktion WndProc und dort in der switch-case Leiste unter WM_PAINT
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
Zuständig ist die Funktion DrawText Aber ehrlich: Diese Art der Windows Programmierung, indem man direkt auf das C-API zugreift, ist heutzutage nur noch was für Masochisten.
Gast
#1938535
#include<stdio.h>
int main (void)
{
printf("Hello Wolrd\n");
getchar();
return(1);
}
Gast
#1938552
Leichenschänder!
Gast
#3162104
Tim T. schrieb: > Leichenschänder! was soll der Mist? (sorry) Ich habe den Thread gerade komplett durchgelesen und genau nach so einer Antwort gesucht in C++ bin ich blutiger Anfänger, somit brauchte ich genau diesen Lückenfüller. Ich weiß nicht was das immer soll, denken alle die dass ein Thread nur korrigiert werden darf solange dran geschrieben wird? Über Google findet man alte Threads/ Foren besser als neue und wenn man dann einen Kommentar dazugeben kann was den Thread vervollständigt sollte man das machen! solche Kommentare wie
1 | |
schrecken neue Mitglieder unter Umständen zurück, genau gesagt ist es eine Beleidigung. Es sei den ihr wollt keine neuen Mitglieder?
Es geht nicht um "neue Mitglieder", es geht darum, daß die Unsitte, alte Threads zu kapern, hier sehr verbreitet ist. Und nur zu oft hat derjenige, der einen alten Thread exhumiert, ein Problem, das nur seiner Vorstellung nach irgendwas mit dem Threadthema zu tun hat. Und wenn ein Thread -- wie dieser hier -- im Grunde genommen *fünf Jahre* alt ist, dann kann man den ruhen lassen, und seine Frage in einem frischen, neuen Thread stellen. Schlussendlich ist davon auszugehen, daß der "C++-Anfänger", der sich als nächster mit dem Thema beschäftigt, weder Visual Studio 6.0 verwendet, noch die von ihm verwendete Version zu dieser bedienkompatibel ist und obendrein wahrscheintlich gar keine C++, sondern die Microsoft-Perversion namens "C++/CLI" gemeint ist. Immerhin hast auch Du fast drei Jahre gebraucht, um Deine "Kritik" zu formulieren.