Compilieren will nicht
-
Hi,
ich bin gerade an einer Aufgabe wo es um das Thema verkettete Listen geht und modularisierung. Ich habe ein Programm von jemanden bekommen und ich weiß jetzt nicht wie ich es kompilieren soll. Es gibt eine listmain.c (das Hauptprogramm) eine elem.h und eine list.c die die verscheidenen Funktionen beinhaltet. Kann mir jemand sagen wie ich so einen Code kompiliere?
Hier der Code von der listmain.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include "elem.h" #include "liste1.c" int main(int argc,char *argr[]) { int wahl,i,k; int aus=1; double a=0.245727; for (i=1;i<argc;i++) { add_element_after(atof(argr[i])); } for (k=0;aus;k++) { if (pow(a ,(double) k)>0.01) add_element_before(pow(a ,(double) k)); else { aus=0; } } printf("Ausgabe von vorn nach hinten durchlaufen\n"); forward(anfang); printf("Ausgabe von hinten nach vorn durchlaufen\n"); backward(anfang); do { printf("1 : Eingabe\n"); printf("2 : Vorwätrs Ausgabe\n"); printf("3 : Rückwärts Ausgabe\n"); printf("6 : Eingabe\n"); printf("9 : Ende\n"); printf("Ihre Wahl : \n"); scanf("%d",&wahl); switch(wahl) { case 1 : add_element_after(eingabe()); break; case 2 : forward(anfang); break; case 3 : backward(anfang); break; case 6 : add_element_before(eingabe()); break; case 9 : return 0 ; break; default: printf("Falsche Eingabe!\n"); } }while(wahl != 9); return 0; }
Hier der Code von der elem.h:
typedef struct element { double zahl; struct element *next; }ELEMENT; ELEMENT *ende = NULL; ELEMENT *anfang=NULL; ELEMENT * create_list_element(ELEMENT *ptr); void add_element_after (double wert); void add_element_before (double wert); void forward(ELEMENT *aktuelles); void backward(ELEMENT *aktuelles);
und der Code der liste1.c:
ELEMENT * create_list_element(ELEMENT *ptr) { if((ptr =(ELEMENT *)malloc(sizeof(ELEMENT))) == NULL) { fprintf(stderr,"Kein Speicherplatzt vorhanden!\n"); exit ; } return (ptr); } void add_element_after (double wert) { ELEMENT *zeiger; if(anfang == NULL) { anfang=create_list_element(anfang); anfang->zahl=wert; anfang->next=NULL; } else { zeiger=anfang; // Das 1.Element wird gezeigt while(zeiger->next != NULL) { zeiger=zeiger->next; } ende=create_list_element(zeiger); zeiger->next=ende; // Zeiger auf dem neuen Speicherplatz ende->zahl=wert; ende->next=NULL; // Unsere Datenstrukur wird wieder terminiert } } void add_element_before (double wert) { ELEMENT *zeiger; if(anfang == NULL) { anfang=create_list_element(anfang); anfang->zahl=wert; anfang->next=NULL; } else { zeiger=anfang; // Das 1.Element wird gezeigt while(zeiger->next != NULL) { zeiger=zeiger->next; } ende=create_list_element(zeiger); ende->zahl=wert; ende->next=anfang; anfang=ende; } } void forward(ELEMENT *aktuelles) { if(aktuelles == NULL) { printf("Keine gültiges Element!\n"); return; } printf("%6.2f \n", aktuelles->zahl); if(aktuelles->next != NULL) { forward (aktuelles->next); } } void backward(ELEMENT *aktuelles) { if (aktuelles == NULL) { printf("Keine gültiges Element!\n"); return; } if (aktuelles->next != NULL) { backward (aktuelles->next); printf("%6.2f \n", aktuelles->zahl); } else printf("%6.2f \n", aktuelles->zahl); } double eingabe() { double zahl; fflush(stdin); printf("Zahl......................: "); scanf("%lf",&zahl); return (zahl); }
Wenn ich die Teile alle in ein Prog packe funzt alles aber so wenn ich das alles mit Dev-C++ kompilere dann geht nichts.
Helft mir bitte!!
-
Die beiden c-Files in ein Projekt.
#include "liste1.c" entfernen.
-
Geht auch nicht. Habe das #include "liste1.c" enfernt und die beiden in ein Projekt gesetzt und die elem.h in den selben Ordner...
Hat jemand noch eine Idee?
-
Kann das bitte einer mal für mich testen ich verstehe das nicht wieso funktioniert es wenn ich die Dateien in eine c-Datei schreibe und so nicht. Das ist doch der größte sche..
-
#include "elem.h" am Anfang der liste.c einfügen
BTW viel Glück, wenn du versuchst einen zu finden, der das für dich testet. Ich hab keine Lust dazu.
-
liste1.c C:\Dokumente und Einstellungen\Oliver Mladenovic\Desktop\liste1.o(.data+0x0)
multiple definition of `ende'da kommen lauter so sachen nach dem ich da die libs eingesetzt habe
-
ELEMENT *ende = NULL; ELEMENT *anfang=NULL;
Das ist eine Definition, die gehört da nicht hin. Das steht dann in beiden .c Dateien drin.
So muss das in elem.h stehen:
ELEMENT *ende; ELEMENT *anfang;
Und so wie oben in der list1.c
-
CarstenJ schrieb:
So muss das in elem.h stehen:
ELEMENT *ende; ELEMENT *anfang;
Das sind immer noch Definitionen. Schreib in beide Zeilen noch jeweils ein "extern", um reine Deklarationen daraus zu machen.
-
Ok Danke erstmal! ICh habe das so gemacht das ich die elem.h so verbessert habe:
ELEMENT *anfang;
ELEMENT *ende;und ganz am anfang in der liste1.c habe ich dann die Definition eingesetzt. Jetzt kopiliert er es aber wenn ich das Programm starte frist es den ganzen speicher auf 99 % Systemauslastung und ich sehe keine console wie es normaler weise ist.
Wie soll ich das mit extern machen?
-
Hat Bashar doch schon geschrieben. Wie du siehst keine Console? Was siehst du denn?
-
ich sehe alles so als ob ich nichts gestartet habe, wie soll ich das den mit extern machen etwa: extern ELEMENT *anfang; ?
-
Ja, genau so. Also bei mir läuft das Programm und ich benutze auch den Dev-Cpp.
-
Kansst du den Code mal Posten? Ich kriege es einfach nicht hin , hast du auch bei der liste1.c diese libs eingestzt?
#include "elem.h"
#include <stdio.h>
#include <stdlib.h>
-
Sag mir wenigstens was du alles gemacht hast... angefangen bei dem Quellcode oben.
-
listmain.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include "elem.h" int main(int argc,char *argr[]) { ...
elem.h
#ifndef ELEM_H #define ELEM_H typedef struct element { double zahl; struct element *next; }ELEMENT; extern ELEMENT *ende; extern ELEMENT *anfang; extern ELEMENT *create_list_element(ELEMENT *ptr); extern void add_element_after (double wert); extern void add_element_before (double wert); extern void forward(ELEMENT *aktuelles); extern void backward(ELEMENT *aktuelles); #endif
liste1.c
#include <stdio.h> #include "elem.h" ELEMENT *ende=NULL; ELEMENT *anfang=NULL; ELEMENT *create_list_element(ELEMENT *ptr) ...
So siehts aus, und es läuft.