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
#include<stdio.h>
2
3
intmain()
4
{
5
charc;
6
7
printf("Halle World\n");
8
9
c=getchar();
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
C:\>
2
C:\> cd \test\debug
3
C:\test\debug> dir
4
Volume in Laufwerk C: hat keine Bezeichnung
5
Volumeseriennummer: 4D01-1EEB
6
7
Verzeichnis von C:\test\debug
8
9
26.03.2008 13:36 1.234 ERSTES.EXE
10
1 Datei(en) 1.234 Bytes
11
12
C:\test\debug> erstes
13
Hallo World
14
C:\test\debug>
> 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.
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,
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
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.
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
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.
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).
printf("\nDiese Person ist %i Tage alt",alterstage);
22
//oder direkt:
23
printf("\nDiese Person ist %i Tage alt",rechner(gebtag,gebmonat,gebjahr,monat,tag,jahr));
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
intrechner(intgebtag,intgebmonat,intgebjahr,
2
intmonat,inttag,intjahr)
3
{
4
intalterstage;
5
intdifferenztage;
6
7
gebjahr=gebjahr-1900;
8
alterstage=gebjahr*365;
9
alterstage=alterstage+gebmonat*30.5;
10
alterstage=alterstage+gebtag;
11
12
jahr=jahr-1900;
13
differenztage=jahr*365;
14
differenztage=differenztage+monat*30.5;
15
differenztage=differenztage+tag;
16
17
alterstage=differenztage-alterstage;
18
19
returnalterstage;
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;
>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
intrechner(intgebtag,intgebmonat,intgebjahr,
2
intalterstage,
3
intmonat,inttag,intjahr,intdifferenztage)
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
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
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.
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
Leichenschänder!
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.