Structur übergabe aus header.h an die main.c und an andere .c dateien
-
Guten Tag.
Ich habe ein Problem mit den übergaben einer Structur in die main oder in amdere .c Dateien.Meine Aufgabe ein kleines Lagerprogramm in der Artikel aus einer Datei in die Baum Strucktur eingelesen werden, neue Art. eingefügt, gesucht und der bestand geändert werden kann.
*Genauen Aufg. Stellung.
Schreiben Sie ein Programm mit folgenden Eigenschaften und Funktionalitäten:Die Artikeldaten werden in einem sortierten Binären Baum gehalten
Beim Start werden die Daten der Datei Artikel.txt eingelesen und in
den Binären Baum einsortiert. uswWichtig: Implementieren Sie Ihr Programm modular. Trennen Sie die Baum
basierte Datenhaltung vom Hauptprogramm, indem Sie ein separates Modul
erstellen. Dieses soll folgende Funktionalitäten zur Verfügung stellen:Datentyp: ArtikelBaum
Prozedur: ArtikelEinfuegen
Funktion: ArtikelSuchen
Prozedur: ArtikelBestandÄndern*Nun ich habe versucht die struckturen Artikel & Baum an die main zu übergeben dort die Datei zu öffnen und den Baum zu füllen.
Leider scheitere ich da auf voller Distanz.
Ich verstehe einfach nicht wie die Structuren aus der header.h in die main.c eingebunden bzw. bekannt gemacht werden.Dann ist da auch noch die Baum.c in der die subroutinen
Baum init und int einfuegen
Fehler melden obwohl die doch in der header.h schon bekanntgegeben sind.
Die letzten zwei Tage habe ich die Suchmaschinen zum Glühen gebracht, Skripte und Bücher gewälzt um etwas zu finden.
Leider vergebens, nichts was mir wirklich weiter hilft oder ich verstehe es einfach nicht.Könnt ihr mir bitte zeigen bzw erklären wie ich die Structuren übergebe und wie man die Daten aus der Datei am einfachsten einlesen kann.
In der main habe ich nichts mehr stehen weil ich nicht mehr weiter weiß und nur noch Confused bin.Wäre für jede Hilfe sehr dnkbar.
PS:
Ich hab zwar einen code zum einlesen in eine Structur gefunden.
Aber in diesem wird keine header.h verwendet.
Daher wollte ich diesen als "Leitfaden" benutzen.http://forum.chip.de/c-c/datei-struktur-einlesen-928991.html
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "baum.c" #include "header.h" int main() { return 0; }
Header.h
#ifndef HEADER_H_ #define HEADER_H_ typedef struct ArtikelBaum { unsigned int ArtNo; char Name [21]; int Bestand; struct ArtikelBaum *links; struct ArtikelBaum *rechts; } Artikel; typedef struct Baum { unsigned int size; Artikel *pRoot; }Baum; Baum init(unsigned int ArtNo, char Name[21], int Bestand); int einfuegen(Baum *pTree, unsigned int ArtNo, char Name[21], int Bestand, unsigned int links, unsigned int rechts); Artikel suchen(Baum Tree, unsigned int ArtNo); void loeschen(Baum *pTree); #endif /*HEADER_H_*/
Baum.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "header.h" Baum init(unsigned int ArtNo, char Name[21], int Bestand) {//Multiple markers at this line - multiple definition of `init' - first defined here Baum tree = {0,NULL}; tree.pRoot = (Artikel*) malloc(sizeof(Artikel)); if(tree.pRoot != NULL) { strcpy(tree.pRoot-> Name, Name); tree.pRoot->Bestand = Bestand; tree.size = 1; } else printf("Fehler bei init!\n"); return tree; } int einfuegen(Baum *pTree, unsigned int ArtNo, char Name[21], int Bestand, unsigned int links, unsigned int rechts) {//Multiple markers at this line - multiple definition of `einfuegen' - first defined here Artikel *pNeu = NULL; if(ArtNo < pTree->pRoot->ArtNo) { if(pNeu->links != NULL) return -1; pTree->pRoot->links = (Artikel*) malloc(sizeof(Artikel)); pTree->pRoot->ArtNo = ArtNo; strcpy(pTree->pRoot->Name, Name); pTree->pRoot->Bestand = Bestand; } return 1; }
Edit: der Fehlercode steht jetzt genau in der Zeile (7&24) in der es mir Wascana(Eclipse mit gcc) anzeigt.
Die datei die eich einlesen will sieht so aus
Inhalt der Datei
Art.Nr. Name Anzahl (<--ist nur für den Kontext steht nicht in der Dat.)
13456 TestArt 10
12456 TestArt 1
12356 TestArt 2
12346 TestArt 3
12345 TestArt 12Mein Problem ist dass ich nicht ferstehe wie ich mit den Structuren umgehen soll um die Daten in den Baum einzulesen.
Wie übergebe ich die Struct an die main, wie verknüpfe ich diese um die Dat in richtiger reihnfolge in den Artikelbaum zu schreiben?
-
#include "baum.c"
ist unsinnig - .c Dateien werden nicht per #include eingebunden, sondern jeweils für sich alleine compiliert und anschließend gelinkt.
-
Bei solchen Lager-Geschichten sehe ich meist ganz gern etwas visuell.
Siehst du eine Möglichkeit die eingegebenen Daten auf dem Bildschirm darzustellen oder im eine Datei zu schreiben? Ich denke das du da Daten eingeben möchtestDen Quellcode, der den Fehler verursacht wäre auch eine Idee. So können wir nur raten wo dein Problem ist
MfG f.-th.
-
Bei den Fehlermeldungen stehen auch immer Zahlen dabei.
Einmal der Fehlercode und auch noch die Zeilennummer in der der Fehler aufgetreten ist. (Sonst hätte das "this Line" auch wenig Zweck).Da du gerade diese Nummern weg gelassen hast, weiß auch keiner wo der Fehler auftritt.
-
Alex4nder schrieb:
Ich verstehe einfach nicht wie die Structuren aus der header.h in die main.c eingebunden bzw. bekannt gemacht werden.
Alles was Code erzeugt oder Speicher belegt, gehört üblicherweise in eine .c Datei (z.B. Funktionsimplementierungen, Variablendefinitionen), alles andere gehört in eine .h Datei (alle Deklarationen (Funktionsprototypen, "extern" Variablen), sowie Typ- und Makrodefinitionen o.ä.). Das heißt nicht, dass nicht auch Profis, wie Compilerbauer, dies auch mal anders machen.
Mache dir dazu den Unterschied zwischen Deklaration und Definition klar.Alex4nder schrieb:
Die letzten zwei Tage habe ich die Suchmaschinen zum Glühen gebracht, Skripte und Bücher gewälzt um etwas zu finden.
Leider vergebens, nichts was mir wirklich weiter hilft oder ich verstehe es einfach nicht.Das sind die üblichen Quasiargumente, wenn man nichts Brauchbares findet, landet man im Forum. Obwohl ich zugebe, dass auch viel Schrott durch die Suchmaschinen gefunden wird.
Könnt ihr mir bitte zeigen bzw erklären wie ich die Structuren übergebe und wie man die Daten aus der Datei am einfachsten einlesen kann.
typedef struct { int i; char s[21]; } Bla; int schreibe(Bla *bla,FILE *f) { /* schreibt ab aktueller Dateiposition */ return fwrite(bla,sizeof*bla,1,f)==1; } int lese(Bla *bla,FILE *f) { /* liest ab aktueller Dateiposition */ return fread(bla,sizeof*bla,1,f)==1; } ... Bla bla[]={{1,"bla"},{2,"fasel"}}; FILE *f; f=fopen("bla","wb"); if( f ) { if( schreibe(&bla[0],f) ) puts("schreiben ok"); if( schreibe(&bla[1],f) ) puts("schreiben ok"); fclose(f); } f=fopen("bla","rb"); if( f ) { if( lese(&bla[0],f) ) printf("lesen ok, %d, %s",bla[0].i,bla[0].s); if( lese(&bla[1],f) ) printf("lesen ok, %d, %s",bla[1].i,bla[1].s); fclose(f); }
Daher wollte ich diesen als "Leitfaden" benutzen.
http://forum.chip.de/c-c/datei-struktur-einlesen-928991.htmlWie kommst du darauf, dass dieses ein Leitfaden ist? Ist Schrott.
-
Danke für die Hilfe.
Habs hinbekommen.