# Fehler im Quellcode



## kuki122 (14. Juli 2010)

Hi.

Ich bin gerade dabei, C zu erlernen und wollte soeben mein erstes kleines Programm schreiben.

Visual C++ meldet allerdings nur:


```
1>------ Erstellen gestartet: Projekt: sdad, Konfiguration: Debug Win32 ------
1>  sdad.cpp
1>sdad.cpp(3): warning C4627: "#include <stdio.h>": Wird bei der Suche nach Verwendung des vorkompilierten Headers übersprungen.
1>          "StdAfx.h" Direktive hinzufügen oder vorkompilierten Header erneut erstellen
1>sdad.cpp(11): fatal error C1010: Unerwartetes Dateiende während der Suche nach dem vorkompilierten Header. Haben Sie möglicherweise vergessen, im Quellcode "#include "StdAfx.h"" einzufügen?
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
```

Bei folgendem Quelltext:


```
// sdad.c: Hauptprojektdatei.

#include <stdio.h>
main(){
	printf("\nDies ist ein erstes C-Programm.\n");
	printf("\nWie sie sehen, kann ´printf´ ");
	printf("nicht nur Texte drucken.\n");
	printf("sondern auch rechnen.\n\n");
	printf("13x7=%i \n",13 * 7); 
}
```

Sprich, ich kann es nicht kompilitieren.

Findet vielleicht jemand den Fehler?


----------



## boerigard (14. Juli 2010)

Ich hab seit Jahren nichts mehr mit dem VC++ zu tun gehabt, aber das Hauptproblem ist nicht der Quelltext, sondern die Compilereinstellungen. In diesem speziellen Fall die Angabe, dass vorkompilierte Header verwendet werden sollen.
Schau mal hier nach, wie du die Verwendung ausstellst:
Schwerwiegender Fehler C1010 (C++)

Es gibt im VC++ eine Vielzahl von Projekttypen, die man erstellen kann und die von Haus aus gleich mit einer Fülle an Einstellungen daherkommen. Vielleicht arbeitet hier jemand mit dem VC++ und kann dir sagen, welcher Projekttyp für einfache C und C++-Programme am besten geeignet ist.

VC++ ist eine mächtige IDE, aber das ist eben auch mit vielen Fallstricken verbunden. Und viele Kleinigkeiten, die man lernen muss.

Noch zum Quelltext. main gibt immer int zurück, also

```
int main()
{
   ....
    return 0;
}
```
Je eher man das lernt, um so besser .


----------



## Iifrit Tambuur-san (14. Juli 2010)

Das beste, um diese vorkompilierten Header zu vermeiden, ist im Anwendungs-Assistenten für neue Projekte von Visual unter Anwendungseinstellungen das Häkchen bei vorkompilierte Header rauszunehmen.

Die beste Einstellung ist Konsolenanwendung als leeres Projekt. Da entscheidet man selbst, welche Dateien man in das Projekt reinladen möchte.


----------



## kuki122 (14. Juli 2010)

Vielen  Dank.

Ich habe einen Versuch mit gleichem Quelltext in Dev - C++ gestartet, wo es auf Anhieb kompilitiert wurde und lief.

Hier eine neue Anwendung, welche ich schreiben wollte.


```
// Beispiel 10005-c 
#include <stdio.h>
main (){
     int x,y;
     pintf("\n\t1 . R e c h e n p r o g r a m m\n");
     printf ("\nBitte x eingeben :");
     scanf("%i", &x);
     printf ("Bitte y eingeben :");
     scanf ("%i", &y);
     printf("\n %i + %i ist %i" ,x,y,x+y);
     printf("\n %i - %i ist %i" ,x,y,x-y);
     printf("\n %i * %i ist %i" ,x,y,x*y);
     printf("\n %i / %i ist %i" ,x,y,x/y);
     printf("\n %i %% %i ist %i",x,y,x%y); // Zeile 11 < { XYZ }

system:("pause");
}
```

Wie ihr seht, habe ich den Befehl:

```
system:("pause");
```
eingebaut, damit die Console auf bleibt wenn das Programm gestartet ist.

Und nun ganz einfach gesagt: Manchmal funktioniert dieser Befehl, manchmal nicht. 


Hier funktioniert er ohne weiteres:


```
/* bsp.10001.c */

#include <stdio.h>
main(){
	printf("\nDieser Text\nenthaelt\nviele\nZeilenumbrueche\n");
        printf("\n");
system("pause");
}
```

Allerdings in dem oben gezeigten Beispiel:


```
// Beispiel 10005-c 
#include <stdio.h>
main (){
     int x,y;
     pintf("\n\t1 . R e c h e n p r o g r a m m\n");
     printf ("\nBitte x eingeben :");
     scanf("%i", &x);
     printf ("Bitte y eingeben :");
     scanf ("%i", &y);
     printf("\n %i + %i ist %i" ,x,y,x+y);
     printf("\n %i - %i ist %i" ,x,y,x-y);
     printf("\n %i * %i ist %i" ,x,y,x*y);
     printf("\n %i / %i ist %i" ,x,y,x/y);
     printf("\n %i %% %i ist %i",x,y,x%y); // Zeile 11 < { XYZ }

system:("pause");
}
```

funktioniert er nicht - nichtmal der Quelltext wird kompilitiert.

weiß jemand warum das so ist? 





@boerigard

Danke, aber was genau bewirkt "return 0;" ? 

@Iifrit Tambuur-san

Vielen dank, wo finde ich diesen assistent? 
So öffne ich die ganze Zeit ein neues Projekt welches bereits einige Befehle beinhaltet, welche ich Lösche - ein komplett neues wäre, wie du sagst, sicherlich um einiges besser.


----------



## boerigard (14. Juli 2010)

kuki122 schrieb:


> Wie ihr seht, habe ich den Befehl:
> 
> ```
> system:("pause");
> ...


In diesem Fall ist ein : (Doppelpunkt) zu viel. Jetzt sollte er kompilieren.



> Danke, aber was genau bewirkt "return 0;" ?


Das gibt eine 0 an den Aufrufer (das Betriebssystem) zurück, und sagt damit, dass das Programm ordnungsgemäß beendet wurde. Wenn du (wie in deinem Fall) gar nichts am Ende von main zurück gibst, dann erstellt der Compiler die return 0; Rückgabe implizit. Es kommt also schlussendlich aufs Gleiche raus, aber es ist kein schöner Stil.


----------



## kuki122 (14. Juli 2010)

Leider kompiliert er auch so nicht.


```
// Beispiel 10005-c 
#include <stdio.h>
main (){
     int x,y;
     pintf("\n\t1 . R e c h e n p r o g r a m m\n");
     printf ("\nBitte x eingeben :");
     scanf("%i", &x);
     printf ("Bitte y eingeben :");
     scanf ("%i", &y);
     printf("\n %i + %i ist %i" ,x,y,x+y);
     printf("\n %i - %i ist %i" ,x,y,x-y);
     printf("\n %i * %i ist %i" ,x,y,x*y);
     printf("\n %i / %i ist %i" ,x,y,x/y);
     printf("\n %i %% %i ist %i",x,y,x%y); 

system("pause");
}
```


----------



## boerigard (14. Juli 2010)

Beim ersten printf steht pintf (<- das 'r' fehlt).


----------



## Iifrit Tambuur-san (14. Juli 2010)

es fehlt immer noch ein int vor dem main() 

und ein return 0; nach dem system("pause");

Ansonsten diesen Assistenten bekommt man jedenfalls in der VSC++ 2008 Express Edition zu sehen, wenn man ein neues Projekt starten will nachdem man dem Projekt einen Namen gegeben hat und eine erste Auswahl getroffen hat und dann auf "Weiter" klickt.


----------



## Puepue (14. Juli 2010)

bei Visual Studio kann man sich pause oder getch(); am Ende sparen, wenn man Strg+F5 drückt

Der ursprüngliche Fehler liegt eigentlich immer daran, dass man das Häkchen bei vorkompilierter Header beim Erstellen des Projekt gesetzt hat (zumindest wenn man dann eine der benötigten Dateien löscht)


----------



## kuki122 (15. Juli 2010)

Also wenn ich ein neues Projekt (Win32 Consolenanwendung) öffne kommt dieser assistent, dort setze ich dann bei Zusätzliche Optionen einen Haken von vorkompilitierter Header auf Leeres Projekt.

Versuche ich jetzt aber den Quelltext zu compilen, meldet er wieder nur:


----------



## Iifrit Tambuur-san (15. Juli 2010)

er meldet nur das er system nicht kennt. 

Und halt, dass er die Funktion scanf direkt als unsicher erachtet. Aber die Warnungen kannst du erstmal ignorieren.


----------



## bingo88 (15. Juli 2010)

```
int main(int argc, char *argv[])
{
    return 0;
}
```
Das ist eine normale main-Funktion in C (so wie sie aussehen sollte).

und was dir fehlt ist #include <stdlib.h> oder <cstdlib> (c++ version). Dann klappt das auch mit dem System. Solche Aufrufe mittels System sollten allerdings vermieden werden (Sicherheit)... dann lieber ein Zeichen einlesen oder ähnliches um die Konsole offen zu halten.


----------



## kuki122 (15. Juli 2010)

Iifrit Tambuur-san schrieb:


> er meldet nur das er system nicht kennt.
> 
> Und halt, dass er die Funktion scanf direkt als unsicher erachtet. Aber die Warnungen kannst du erstmal ignorieren.



Aber dann kompiliert er ja nicht. 

Wie gesagt, mit DEV-C++ geht alles super. 
Aber ich möchte es gleich richtig lernen, und mich nicht in ein einfaches Programm einlernen, was später an seine Grenzen stößt. 

@bingo88

Ich lerne nach Buch -  da bringt ein vorzeitiges einsetzen für mich noch fremder Codes völlige Verwirrung.


----------



## Bauer87 (15. Juli 2010)

Steht „system(char*)“ nicht in windows.h? (Ist zumindest ein Windows-spezifischer Befehl?)


----------



## boerigard (15. Juli 2010)

Bauer87 schrieb:


> Steht „system(char*)“ nicht in windows.h? (Ist zumindest ein Windows-spezifischer Befehl?)


system gehört zum C-Standard (B.5 Hilfsfunktionen) und findet sich, wie bereits gesagt, in der stdlib.h (bzw cstdlib für C++).


----------



## Bauer87 (15. Juli 2010)

OK, gibts tatsächlich auf allen Plattformen und steht immer in der stdlib.h, allerdings sollte man es nicht nutzen, wenn man plattformunabhängig programmieren will: „The behavior and return value are platform-dependent.“


----------



## dot (15. Juli 2010)

Wenn man 


```
system("pause");
```

benutzt braucht man im Header noch ein


```
#include <stdlibs.h>
```


----------

