Forum: PC-Programmierung C und int main();!


von Tanja (Gast)


Lesenswert?

Das ich bislang mit Pascal programmiert habe...ist ja jetzt nicht so 
wichtig..nur hatte ich da irgendwie weniger fragen...

Wieso lautet es bei Visual C
1
 int _tmain(int argc, _TCHAR* argv[])
2
{
3
  return 0;

heißt es bei den unzähligen anderen Kompilern auch wieder andauernd 
anders?!
Nutze ich das übliche int main();
 stimmt der Exitcode nicht...zumindest ist er nicht 0...

: Verschoben durch User
von M. K. (sylaina)


Lesenswert?

Poste den vollständigen Code oder besser, hänge das C-File hier an.

von Tanja (Gast)


Lesenswert?

hmm..merkwürdig..irgendwie zeigt er jetzt auch immr 0 an mit int 
main()...
aus C soll einer schlau werden...

von Peter II (Gast)


Lesenswert?

Tanja schrieb:
> heißt es bei den unzähligen anderen Kompilern auch wieder andauernd
> anders?!
eigentlich nicht.

> Nutze ich das übliche int main();
ist auch ok, beides ist zulässsig

>  stimmt der Exitcode nicht...zumindest ist er nicht 0...
was meinst du damit?

von devel (Gast)


Lesenswert?

Dann nimm halt den GCC.

von pelzfrucht (Gast)


Lesenswert?

Tanja schrieb:
> Das ich bislang mit Pascal programmiert habe...ist ja jetzt nicht
> so
> wichtig..nur hatte ich da irgendwie weniger fragen...
>
> Wieso lautet es bei Visual C int _tmain(int argc, _TCHAR* argv[])
> {
>   return 0;
>
> heißt es bei den unzähligen anderen Kompilern auch wieder andauernd
> anders?!
> Nutze ich das übliche int main();
>  stimmt der Exitcode nicht...zumindest ist er nicht 0...

Ich versteh dein Problem nicht so ganz.
Ein C Programm ist normalerweise so aufgebaut:
1
int main () {   // () Deklariert nichts.
2
3
   printf("\nHallo Welt!\n");
4
   return 0;     // Return Anweisung beendet das Programm (0 = Return Wert)
5
6
}

Wenn du Kommandozeilen Parameter nutzen magst:
1
int main (int argc, char *argv[]) {   // int argc enthält die Anzahl der vom Betriebssystem übergebenen Parameter (Erster Parameter ist immer der Programmpfad! ; Der Pointer argv enthält die Parameter als string.
2
3
int x = 1;
4
5
   printf("\nProgrammpfad: %s\n", argv[0]);
6
7
      for (x = 1; x <= argc; x++) {
8
      printf("\n%d. Parameter:  %s", x, argv[x]);
9
      }
10
11
   return 0;
12
}

Beachte: Visual C ist kein C! Visual C ist eine proprietäre Microsoft 
Erweiterung von C++. C++ ist eine sehr weit verbreitete 
Programmiersprache die auf der ebenfalls sehr weit verbreiteten 
Programmiersprache C aufsetzt.

C und C++ sind der quasi Standard in der Entwicklung von Hardware Nahen 
Programmen, aber auch super für die Entwicklung von normalen 
Betriebssystemanwendungen.

Visual C ist eine erweiterte Form von C++ und basiert auf dem .NET 
Framework.

Ich empfehle dir erst C und bei Bedarf C++ zu lernen.

Viele Grüße
pelzfrucht

von Peter II (Gast)


Lesenswert?

pelzfrucht schrieb:
> Visual C ist eine erweiterte Form von C++ und basiert auf dem .NET
> Framework.

das ist Unsinn. Du meinst vermutlich Visual C++.

Visual C ist einfach C mit dem Visual Studio. Es ist also normales C. 
Bei CLI/C++ gibt es so merkwürdige ^ statt den Stern. So sieht der code 
meines Wissens nicht aus.

von Tanja (Gast)


Lesenswert?

ok..warum geht das jetzt wieder nicht?!?
[coder]#include "stdafx.h"
#include "stdio.h"

char antwort[20];
int zahl1, zahl2;

int main()
{
  puts("Hallo Sven");
  printf("gib bitte die erste zu addierende Zahl ein: ");
  scanf("%i",&zahl1);
  printf("nun die zweite zu addierende Zahl: ");
  scanf("%i",&zahl2);
  printf("Das Ergebnis lautet %i",&zahl1 + &zahl2);
  getchar();getchar();
  return 0;
}[/code]

er fasselt was von, ich könnte keine zwei Zeiger addieren?!?!
Warum sind denn zahl1 und 2 jetzt Zeiger?!

von M. K. (sylaina)


Lesenswert?

Weil du beim printf das "&" davor gesetzt hast, das brauchst du nur beim 
scanf ;)

von Peter II (Gast)


Lesenswert?

Tanja schrieb:
> Warum sind denn zahl1 und 2 jetzt Zeiger?!

weil ein & davor steht!

von Tanja (Gast)


Lesenswert?

ach hat sich erledigt..& darf nicht vor zahl1 stehen..hmpf

von Tanja (Gast)


Lesenswert?

ja danke,...hab ich jetzt auch gerafft :-(

von M. K. (sylaina)


Lesenswert?

Tanja schrieb:
> ach hat sich erledigt..& darf nicht vor zahl1 stehen..hmpf

Im printf darf das auch nicht vor zahl2 stehen, sonst addierst du zahl1 
zur Adresse von zahl2 und das ist ja nicht das, was du machen willst. 
Mit dem & greifst du nicht auf den Speicherinhalt zu sondern auf die 
Speicheradresse. ;)

von Christian Erker (Gast)


Lesenswert?

Tanja schrieb:
> Warum sind denn zahl1 und 2 jetzt Zeiger?!

zahl1 und zahl2 sind keine.
&zahl1 und &zahl2 schon.

Gruß,
Christian

von Axel (Gast)


Lesenswert?

Tanja schrieb:
> er fasselt was von, ich könnte keine zwei Zeiger addieren?!?!
> Warum sind denn zahl1 und 2 jetzt Zeiger?!

printf("Das Ergebnis lautet %i",&zahl1 + &zahl2);

muss heißen

printf("Das Ergebnis lautet %i",(zahl1 + zahl2));

Andererseits gibt es auch einen Überlauf, wenn zahl1 + zahl2 den 
Wertebereich von int übersteigen. %i bezeichnet einen int, somit wird
printf nicht richtig funktionieren.

Du liest vielleicht besser erstmal ein C Buch.

von Christian Erker (Gast)


Lesenswert?

Sorry .. man sollte den Post doch gleich absenden..

von Alexander (Gast)


Lesenswert?

Peter II schrieb:
> das ist Unsinn. Du meinst vermutlich Visual C++.
>
> Visual C ist einfach C mit dem Visual Studio. Es ist also normales C.
> Bei CLI/C++ gibt es so merkwürdige ^ statt den Stern.

Sorry. Kann sein. Dann hab ich mich getäuscht..
Eherlich gesagt hab ich von Visual C noch nie gehört. Hatte die Info 
deshalb gegoogelt.

Ist Visual C nur ein Eigenname von Microsoft für C?
Ist mir so noch nie aufgefallen. Allerdings les ich mir das auch nicht 
soo genau durch beim Projekt erstellen. Ich füll aus was er wissen will 
und damit bin ich durch.

Naja. Auf alle Fälle ist verwirrend was Sie schreibt.
Im Titel redet Sie von normalen C, im Text erwähnt Sie seltsamerweise 
(das mir unbekannte) Visual C. Dann schreibt Sie eine (für Anfänger in 
C) verzogene main Deklaration die zwar beginnt ({) aber nicht mehr endet 
( } fehlt)

> So sieht der code meines Wissens nicht aus.
C sieht eindeutig so aus wie ich es schrieb.
Visual C dann höchstwahrscheinlich anders.

Da Sie schreibt
> Wieso lautet es bei Visual C [...]
> heißt es bei den unzähligen anderen Kompilern [...]
Vermute ich eher dass Sie verschiedene Sprach Syntax vertauscht.

Ob ich GCC, den Visual Studio Compiler oder meine Kristallkugel 
verwende.
Bei der gleichen Sprache kommt (sofern ich mich im standardisierten 
Bereich bewege) überall das selbe raus.

Viele Grüße
Alexander

PS: Sorry. Hatte einen falschen Nutzernamen verwendet. pelzfrucht ist 
ein anderes Forum ;)

von Alexander (Gast)


Lesenswert?

Ich denke du wärst mit einem Buch gut bedient.

Ich würde dir "C von Anfang an - Helmut Erlenkötter" empfehlen.
https://www.amazon.de/C-Programmieren-Anfang-Helmut-Erlenk%C3%B6tter/dp/3499600749

Ist das Buch aus welchem Ich auch gelernt habe.

Viele Grüße

von Peter II (Gast)


Lesenswert?

Alexander schrieb:
> Ist Visual C nur ein Eigenname von Microsoft für C?

mehr oder weniger, es gibt halt eine GUI Editor womit man "Visuell" eine 
GUI erstellen kann. Das geht dann mit MFC.

von Jim M. (turboj)


Lesenswert?

Tanja schrieb:
> ach hat sich erledigt..& darf nicht vor zahl1 stehen..hmpf

Bitte besorge Dir ein gutes Buch über die Programmiersprache "C". Die 
ist nicht selbsterklärend.

von Tanja (Gast)


Lesenswert?

lol..wie fertig seit ihr eigentlich...was meint ihr wohl warum ich 
frage..weil ich das Buch gerade durcharbeite und ein Forum als Hilfe 
dazu nutze....
solche dämlichen Kommentare sind echt fürn Arsch gute Nacht

von Alexander (Gast)


Lesenswert?

Tanja schrieb:
> lol..wie fertig seit ihr eigentlich...was meint ihr wohl warum ich
> frage..weil ich das Buch gerade durcharbeite und ein Forum als Hilfe
> dazu nutze....
> solche dämlichen Kommentare sind echt fürn Arsch gute Nacht

Kein Hallo,
Mal nicht so Frech.

Dein Kommentar ist für den Arsch.
Wir geben dir einen gut gemeinten Rat und du reagierst so.

Deine Fragestellung lässt keinesfalls dadrauf schließen dass du ein
Buch verwendet. Vorallem wenn du solch einen Humbug in deine Frage
schreibst (Die Sprache heißt C, nicht Visual C. Visual C ist (wie Peter 
II erklärte) ein Microsoft Name mit nem GUI Builder). Dann ist deine 
main Funktion für einen Anfänger ebenfalls völlig wirr, und das du 
nichtmal
weißt das & bei deinem aktuellen Kentnissstand nur bei scanf erfoderlich 
ist*

Das steht sogar in Kapitel 1 des von mir genannten Buch.
Darf ich fragen was für ein Kack Buch du verwendest das solche
Fragen auffwirft?

Keine Grüße.

* Solange du noch nicht bei den Pointern angekommen bist. (Für den 
Anfänger kann man das so stehen lassen, oder?)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Alexander schrieb:
> Ist Visual C nur ein Eigenname von Microsoft für C?

Nein. Das Produkt "Visual C++" ist eine Sammlung gleich mehrerer 
Compiler.

Enthalten ist ein C-Compiler (der allerdings "nur" C89 versteht), ein 
C++-Compiler (der dem jeweils aktuellen ISO-C++-Standard nur wenig 
hinterherhinkt und seit einigen Versionen als durchaus vorzüglich 
anzusehen ist) und ein Compiler für das .Net-Geraffel.

Das nennt sich dann "C++/CLI" oder "Managed C++" und hat mit C++ vom 
Namen abgesehen nicht mehr viel zu tun. Das Ding lässt sich nur mit dem 
.Net-Kram verwenden.


Die beiden anderen Compiler aber sind brauchbare standardkonforme 
Werkzeuge. Probleme gibt es bei C, da der C-Compiler gegenüber dem 
C89-Standard nur sehr behutsam erweitert wurde und insbesondere kein 
C99 versteht.

Um C programmieren zu lernen, ist es aber auch nicht erforderlich, C99 
zu verwenden; C89 ist nicht falsch, es ist halt nur ein Subset von C99, 
und C89-Code compiliert auch mit C99-Compilern ohne größere Probleme.

Welcher Compiler verwendet wird, wird beim Erstellen eines Projektes 
festgelegt. Zwischen C und C++ wird durch den verwendeten Dateinamen der 
Quelltexte unterschieden - C++ verwendet ".cpp", C hingegen ".c".

von Mark B. (markbrandis)


Lesenswert?

Rufus Τ. F. schrieb:
> Um C programmieren zu lernen, ist es aber auch nicht erforderlich, C99
> zu verwenden; C89 ist nicht falsch, es ist halt nur ein Subset von C99,
> und C89-Code compiliert auch mit C99-Compilern ohne größere Probleme.

Das ist schon richtig. Nur sind mittlerweile seit dem C99-Standard so 
viele Jahre vergangen, dass es einfach nur peinlich ist dass Microsoft 
diesen nicht unterstützt.

von Tanja (Gast)


Lesenswert?

"Deine Fragestellung lässt keinesfalls dadrauf schließen dass du ein
Buch verwendet."

Du bist ja echt der Knaller!
Was spielt es denn für eine Rolle ob ich es aus einem Tutorial, durch 
probieren oder einem Buch lerne?!?
Muss ich das hier vorher bekannt geben?!?

ich bin hier raus

von Tanja (Gast)


Lesenswert?

vielen dank den anderen für die Hilfe :-)

von D. I. (Gast)


Lesenswert?

Tanja schrieb:
> Du bist ja echt der Knaller!
> Was spielt es denn für eine Rolle ob ich es aus einem Tutorial, durch
> probieren oder einem Buch lerne?!?
> Muss ich das hier vorher bekannt geben?!?

Ganz einfach, du stiehlst die Zeit der Leser, wenn keine adäquate 
Eigeninitiative gezeigt wird und da hilft es dir auch nichts dir einen 
weiblichen Nicknamen zu wählen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Mark B. schrieb:
> dass es einfach nur peinlich ist dass Microsoft diesen nicht
> unterstützt.

Ja. Ein bisschen haben sie sich in der Zwischenzeit bewegt, aber das 
generelle Statement ist, daß wer C99 will, doch einfach C++ verwenden 
soll.

Das ist auch eher peinlich.

von Nop (Gast)


Lesenswert?

Nun regt Euch doch mal nicht so auf. Natürlich ist für einen erfahrenen 
C-Programmierer der &-Operator völlig offensichtlich, aber das muß ein 
Anfänger auch erstmal verinnerlichen.

Zumal es auch zum Einstieg nicht offensichtlich ist, wieso die API für 
Ein- und Ausgabe da uneinheitlich ist. Der Grund ist natürlich, daß man 
bei einer Funktion ohne & sofort sieht, daß die Werte by value und nicht 
by reference übergeben werden und deswegen auch garantiert nicht 
verändert werden.

@ Tanja: Gewöhn Dich übrigens besser gar nicht erst zu sehr an scanf, 
das Ding ist eine tickende Zeitbombe. Ganz besonders beim Einlesen von 
Strings, weil Du scanf nicht sagen kannst, wie lang der Buffer des 
Strings eigentlich ist.

Eine mögliche portable und sichere Methode geht so:
- den String mit getline einlesen. Da wird auch die Bufferlänge 
angegeben.
- danach mit sscanf (string scan formatted) den gerade eingelesenen 
String parsen.

von Herbert (Gast)


Lesenswert?

> Muss ich das hier vorher bekannt geben?!?
Nein, aber dann beschwer dich auch nicht wenn man dich auf ein Buch 
verweist.

von Rolf M. (rmagnus)


Lesenswert?

Rufus Τ. F. schrieb:
> Die beiden anderen Compiler aber sind brauchbare standardkonforme
> Werkzeuge. Probleme gibt es bei C, da der C-Compiler gegenüber dem
> C89-Standard nur sehr behutsam erweitert wurde und insbesondere kein
> C99 versteht.

C89 ist kein Standard. Es hat mit Erscheinen von C99 aufgehört, einer zu 
sein.
(genau genommen müßte es "Norm" heißen, nicht "Standard")

Tanja schrieb:
> "Deine Fragestellung lässt keinesfalls dadrauf schließen dass du ein
> Buch verwendet."
>
> Du bist ja echt der Knaller!
> Was spielt es denn für eine Rolle ob ich es aus einem Tutorial, durch
> probieren oder einem Buch lerne?!?

Das spielt eigentlich keine Rolle. Wenn das aber solche Fragen aufwirft, 
wie die, die du stellst, muss es schon selten schlecht sein. Also musst 
du dir ein besseres suchen. Die Fragen haben vermuten lassen, dass du 
gar keins verwendest.

> ich bin hier raus

Bei dem unfreundlichen Ton ist das vielleicht auch besser.

Nop schrieb:
> @ Tanja: Gewöhn Dich übrigens besser gar nicht erst zu sehr an scanf,
> das Ding ist eine tickende Zeitbombe. Ganz besonders beim Einlesen von
> Strings, weil Du scanf nicht sagen kannst, wie lang der Buffer des
> Strings eigentlich ist.

Doch, kann man. scanf bietet die Möglichkeit, die maximale Feldlänge 
beim Einlesen von Strings zu begrenzen.

von Carl D. (jcw2)


Lesenswert?

Tanja schrieb:
> Das ich bislang mit Pascal programmiert habe...ist ja jetzt nicht so
> wichtig..nur hatte ich da irgendwie weniger fragen...
>
> Wieso lautet es bei Visual C
>
1
>  int _tmain(int argc, _TCHAR* argv[])
2
> {
3
>   return 0;
4
>

Weil es in dieser Umgebung Programme mit ANSI- oder Unicode-Zeichen 
gibt.
Alle Funktionen mit "_t", Typen mit "_T" am Anfang, werden, abhängig von 
einem Define, in den Header-Files auf die entsprechende 
"Charactersize"-Version umbenannt. Aus _tmain() wird dann main(), aus 
_TCHAR wird CHAR (was wieder irgendwo zu char wird). Zumindest war das 
vor 15 Jahren so, alsich noch VC benutzte.
Damit kann man mit einer Source (ansatzweise) beide 
Character-Geschmacksrichtungen erzeugen. Borland hat das, glaube ich 
mich zu erinnern, genau so getan.

> heißt es bei den unzähligen anderen Kompilern auch wieder andauernd
> anders?!
> Nutze ich das übliche int main();
>  stimmt der Exitcode nicht...zumindest ist er nicht 0...

Na ja, wenn main() benutzt wird (warum auch immer die crt0 beide main's 
ruft), dann darf ein Unicode-Build sich komisch verhalten.

Also mein Tip: bleib bei dem, was in deinem Compiler-Handbuch steht.
Oder, wie schon mehrfach genannt: Mach einen Upgrade zu einem 
Vernünftigem.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.