Warum endet dieses Programm nicht?
-
Also wie du vielleicht der Aufgabenstellung entnimmst, ist _eine_ separate c Datei gefragt. Die Strukturierung sieht dann in etwa so aus:
draw.h
-------
Funktionsprototypen für rectFill und rectFramedraw.c
--------
draw.h inkludieren
Deklaration beider Funktionenhauptprogramm.c
----------------
draw.h inkludieren, dann kannst du auf die Funktionen zugreifen.
Vergiss dann aber nicht, deinem linker zu sagen, dass er die "draw" objektfile zu linken hat
-
In die Header-Dateien gehören die Deklarationen, in die Source-Dateien die Definitionen. Nicht so wie leche es sagt.
-
Also würden meine Dateien so aussehen:
#include <stdio.h> #include "draw.h" int h, b, i, j; int main(){ int c; printf("Druecken Sie 1 fuer ein ausgefuelltes Rechteck.\n"); printf("Druecken Sie 2 fuer ein umrahmtes Rechteck.\n"); scanf("%i", &c); switch(c){ case 1: printf("Geben Sie die Hoehe des Rechtecks ein: "); scanf("%i", &h); printf("Geben Sie die Breite des Rechtecks ein: "); scanf("%i", &b); rectFill(h, b); break; case 2: printf("Geben Sie die Hoehe des Rechtecks ein: "); scanf("%i", &h); printf("Geben Sie die Breite des Rechtecks ein: "); scanf("%i", &b); rectFrame(h, b); break; default: printf("Das war weder 1 noch 2!"); } }
draw.h:
int rectFill( int, int); int rectFrame( int, int);
draw.c:
#include <stdio.h> #include "draw.h" int i, j; int rectFill(int d, int e){ printf("\n\n"); for (i=0; i<d; i++){ for (j=0; j<e; j++){ printf("*"); } printf("\n"); } printf("\n\n"); system("Pause"); return 0; } //================================================ int rectFrame(int d, int e){ int i, j; printf("\n\n"); for (j=0; j<d; j++){ printf("*"); } printf("\n"); for (i=1; i<e-1; i++){ for (j=0; j<d; j++){ printf("*"); for (j=1; j<d-1; j++){ printf(" "); } printf("*\n"); } } for (j=0; j<d; j++){ printf("*"); } printf("\n\n"); system("Pause"); return 0; }
Woher weiß dann aber main.c überhaupt von draw.c??
-
bastardbychoice schrieb:
Woher weiß dann aber main.c überhaupt von draw.c??
Gar nicht, muß sie auch nicht. Sie "sieht" über das Include die "draw.h" und weiß somit, da gibt es ein paar externe Funktionen, die sehen so und so aus (Rückgabetyp, Parametersatz), mehr braucht sie nicht.
Das macht der Linker, der in einer Steuerdatei findet, welche Objekte er zusammenbasteln darf. Wenn er eine compilerte draw.c und main.c da drin hat, findet er schon die Funktionen. Der gesamte Vorgang wird zumeist über ein automatisiert erstelltes Makefile gesteuert.Alle Klarheiten beseitigt?
-
Weiß er nicht, soll er auch gar nicht wissen. Wichtig für ihn sind die Signaturen der deklarierten Elemente. Dann weiß er genau, wie er sie zu verwenden hat. Was die Funktionen genau machen, braucht er nicht zu wissen. Er weiß also, dass er 2 Funktionen hat, denen er ein "int" übergeben soll und die ein "int" zurückgeben. Die Implementierung ist ihm egal.
-
Danke, Prinzip verstanden. Aber dev-c++ offensichtlich nicht...;-)
Werd jetzt, auch wenns unsauber ist, die draw.c includen. So gehts zumindest.
-
bastardbychoice schrieb:
Werd jetzt, auch wenns unsauber ist, die draw.c includen. So gehts zumindest.
Nicht nur unsauber, sondern verrückt.
bastardbychoice schrieb:
Danke, Prinzip verstanden. Aber dev-c++ offensichtlich nicht...;-)
Na dann geh mal in das Verzeichnis und sag
> gcc main.c draw.c > a.exe
Btw ist Dev-C...
http://www.c-plusplus.net/forum/viewtopic-var-t-is-237002.html
-
-
$ gcc main.c draw.c $ ./a.out Druecken Sie 1 fuer ein ausgefuelltes Rechteck. Druecken Sie 2 fuer ein umrahmtes Rechteck. 1 Geben Sie die Hoehe des Rechtecks ein: 5 Geben Sie die Breite des Rechtecks ein: 5 ***** ***** ***** ***** ***** sh: Pause: not found $
Das
Pause: not found
ist übrigens nicht nett.
-
bastardbychoice schrieb:
Danke, Prinzip verstanden. Aber dev-c++ offensichtlich nicht...;-)
Werd jetzt, auch wenns unsauber ist, die draw.c includen. So gehts zumindest.
Gewöhn' Dir sowas besser gar nicht erst an, Du vertagst nur Dein Problem - es wird Dich einholen, wenn Du's gar nicht brauchen kannst. Ich erinnere mich an ein etwas älteres make-make- Tool, das bei seltsamen include- Schachtelungen die Projektdatei geschrottet hat.
Hatte noch nie dev-c++, dürfte aber auch eine IDE sein, wo man Projekte per wizard anlegen lassen kann. Dann die main.c und die draw.c zum Projektbaum hinzufügen. Meist gibt es einen Menüpunkt, über den man alle Abhängigkeiten prüfen lassen kann, dann sollten auch die .h- Dateien gefunden werden. Wenn nicht, sind die Verzeichnispfade zu überprüfen.Mach's einmal richtig, dann weißt Du, wie's geht!
Edit: Probier's mal mit Pelles C, IDE/Debugger sind fast so gut wie die vom VS, dafür fühlt sich das Paket nicht so träge an wie 'ne Sumpfkuh auf Gras.
-
Janjan schrieb:
In die Header-Dateien gehören die Deklarationen, in die Source-Dateien die Definitionen. Nicht so wie leche es sagt.
Weia, ja natürlich..