ich möchte ein Programm erstellen womit ich mein Lager verwalten kann ! Bin noch Anfänger in C ich habe hier schonmal geschrieben wie mein Programm aufgebaut werden soll, aber der Compiler gibt mir immer einen Fehler beim struct ein. hier mein Code: #include <stdio.h> const int NAMELENGTH = 100; typedef strcut Artikel{ char artikel[Namelength]; int anzahl: }Artikel; void ArtikelZufuegen(){ } void ArtikelAnzahl(){ } void tabelle(){ } int main(){ }
:
Gesperrt durch Moderator
Lass das zweite "Artikel" weg. Ansonsten steht das in jedem C-Buch. Google könnte das auch finden. UNd das "strcut" schreibt sich ein wenig anders. Unerheblich.
Beitrag #6518933 wurde von einem Moderator gelöscht.
Hallo Taw U Mit welchem Compiler arbeitest Du? Lass Dir die Fehler und Warnungen ausgeben mit z.B. gcc -ansi -pedantic -Wall -o Test xyz.c Dann müsste man erkennen können wo es hakt
Beitrag #6518966 wurde von einem Moderator gelöscht.
Beitrag #6518970 wurde von einem Moderator gelöscht.
Taw U. schrieb: > ich möchte ein Programm erstellen womit ich mein Lager verwalten kann ! Sorry für Offtopic aber: Würde ich mit einem Konzept anfangen. Auswahl von Datenbank und Programmiersprache sind da wichtige Punkte. C ist eine super Sprache, aber imo so ziemlich die am wenigsten geeignete Sprache für Datenbanken. Das ist ein besserer Makroassmbler mit dem man wunderbar hardwarenahes proggen kann. Meine Wenigkeit würde mit SQlite und "alles ausser C" (z.B. Python) anfangen. Wenn du C lernen willst gibt es bessere Projekte. >ich habe hier schonmal geschrieben wie mein Programm aufgebaut werden >soll, aber der Compiler gibt mir immer einen Fehler beim struct ein. Da geht das schon los, simpler Schreibfehler und du hast keinen Hinweis was falsch ist. Dann hats du einen gefunden, da ist aber noch ein zweiter. Bei C kämpft man den ganzen Tag mit so was. Bitte um Verzeihung das es die Frage nicht beantwortet, aber ich fand das wichtig in Sachen Anfänger und C. Heiner schrieb im Beitrag #6518970: > Nicht zu Dir! Er liegt aber genau so richtig wie du ;-)
Ich würde dazu eine Entwicklungsumgebung wie Qt Creator empfehlen. Deren Editoren zeigen viele Fehler schon während der Eingabe an und mit etwas Glück sogar besser verständlich, als die Fehlermeldungen des Compilers.
Beitrag #6518975 wurde von einem Moderator gelöscht.
Beitrag #6518979 wurde von einem Moderator gelöscht.
So zeigt Qt Creator die Fehler an. Merke dir dazu eins: Wenn die Stelle mit der Fehlermeldung gut aussieht, dann ist der Fehler meistens in der Zeile darüber. Und wenn die auch gut aussieht, dann sind meistens Klammern falsch gesetzt. Dabei hilft wiederum die Automatische Einrückung der IDE. Ab der Fehlerhaften Stelle rückt sie ganz anders ein, als man erwarten würde.
Beitrag #6518986 wurde von einem Moderator gelöscht.
Nochwas: Im Gegensatz zu vielen anderen Programmiersprachen bricht der C Compiler nicht beim ersten Fehler ab, sondern versucht sich irgendwie weiter durch zu wursteln. Dabei kommen dann oft ganz seltsame falsche Fehlermeldungen zustande. Also immer erst den obersten Fehler korrigieren und dann schauen, was noch übrig bleibt.
Beitrag #6518990 wurde von einem Moderator gelöscht.
So wäre es compilierbar:
1 | const int NAMELENGTH = 100; |
2 | |
3 | typedef struct { |
4 | char artikel[NAMELENGTH]; |
5 | int anzahl; |
6 | } Artikel; |
Offenbar hast du aber noch kein Konzept über deine Objekte. Weil a) Ein Artikel hat in der Regel keine Anzahl, wohl aber andere Attribute wie Artikelnummer, Titel, Beschreibung, Preis b) Eine Position in einer Bestellung würde auf einen Artikel verweisen und hätte eine Anzahl
Gruss In dem Buch Programmieren in C Esperanto der Software von H.D. Litke u.a. Decker's Verlag älteres Semester vielleicht noch erhältlich Ist der Umgang damit sehr gut dargestellt. Dirk St.
Hab mal nach geschaut " Programmiersprache C" sorry nicht "Programmieren in C" In dem Buch ist die der Umgang mit der Anwendung von struct zur Archivierung dargestellt. Dirk St.
Stefan ⛄ F. schrieb: > Offenbar hast du aber noch kein Konzept über deine Objekte. Sorry, aber dein Vorschlag ist auch Bloedsinn. Es braucht: - Artikel: fasst dessen Eigenschaften zusammen, Index ID - Lager: zaehlt Anzahl, offene Zu- und Abgaenge, Mindestbestand - Bestellung: wird Lager erhoehen - Auftrag: vermindert Lagerstand leo
leo schrieb: > Sorry, aber dein Vorschlag ist auch Bloedsinn. Es braucht: Sorry, aber dein Vorschlag ist auch komplett falsch: Wenn er eine Datenbank entwickeln will, dann ist der C-Code der allerletzte Schritt. Es fängt an mit einem ERD. Und damit ist das alles schon gestorben. Der TO soll sich erst mal mit C beschäftigen. Wenn er jetzt noch mit Datenbank-Design anfängt ist er komplett überfordert. Ausser er kann schon die Normalformen im Schlaf aufsagen. Ich würde sowas mit mySQL entwerfen und das UI mit Tcl/Tk dazu machen. Das mit C zu machen käme mir nicht mal im Traum.
Nö. Stefan hat schon Recht. Man braucht ein Konzept. Gerade als Anfänger. Was soll denn nen Lagerprogramm verwalten? Richtig den Lagerbestand. 3 Schrauben? 2 Transistoren? Nö. Hunderte, wenn nicht tausende Artikel. Deshalb würd ich auf SQLite aufbauen. Diese Datenbank ist Opensource und macht dann die Speicherung der Objekte. Man braucht sich da nich um Baume, Indexierung und so weiter zu kümmern. Als Anfänger hat man schon mit der Logik und den Masken des Lagerprogrammes genug zu tun. mfg
Also wenn dein Ziel "ich möchte ein Programm erstellen womit ich mein Lager verwalten kann" ist, dann würde ich ebenfalls dringend dazu raten, die Wahl der Programmiersprache zu überdenken. C ist für solche Aufgaben heute nicht mehr zeitgemäß. Du arbeitest in C oft an der Lösung von Problemen, die es in anderen Programmiersprachen gar nicht erst gibt. Siehe z.B. Zeichenketten. Wie wäre es z.B. mit Python, C# oder Kotlin/Java?
Nick M. schrieb: > Ich würde sowas mit mySQL entwerfen und das UI mit Tcl/Tk dazu machen. Sicher brauchts hinter den genannten Datenstrukturen eine DB. Tcl/Tk wird den TO bei C aber definitiv nicht helfen. leo
~Mercedes~ . schrieb: > Nö. > Stefan hat schon Recht. Man braucht ein Konzept. > Gerade als Anfänger. Und in so einem Konzept kommt C nicht vor. Der erste Schritt wäre eine Datenbank zu entwerfen. Der Rest kommt bei dem Wissensstand des TO garantiert erst nächstes Jahr. :-)
leo schrieb: > Tcl/Tk wird den TO bei C aber definitiv nicht helfen. C wird ihm überhaupt nicht helfen. Oder schlägst du vor, er soll ein GUI zu einer DB in C programmieren? Auf welcher Plattform? Windows? ***Hahahaha*** Ich glaub, du bist Sadist.
Ich würd erstmal ein Konzept erstellen, was möchte ich überhaupt speichern. Dann mit nem grafischen Tool die Tabelle(n) entwerfen. dann die Masken mit den entsprechenden Schnittstellen zur Bank. Dann die Logic, debuggen,debuggen,debuggen... :-P mfg
~Mercedes~ . schrieb: > Was soll denn nen Lagerprogramm verwalten? > Richtig den Lagerbestand. > 3 Schrauben? 2 Transistoren? > Nö. > Hunderte, wenn nicht tausende Artikel. > Deshalb würd ich auf SQLite aufbauen Was für ein Konzept. Der Mann kriegt nichtmal eine Strukturdeklaration in C hin. Der ist froh, wenn etwas wie ein BASIC-Programm bei rauskommt. Auch tausende Artikel sind bei heutigen Hauptspeichergrößen kein Problem. Du steckst mit deinen Konzepten noch im vorherigen Jahrtausend fest. Lass ihn sein Array aufbauen.
Mawin meinte:
> Lass ihn sein Array aufbauen.
Und dann darin mit linearer Suche suchen...
mfg
Nick M. schrieb: > C wird ihm überhaupt nicht helfen. Oder schlägst du vor, er soll ein GUI > zu einer DB in C programmieren? Habe ich mal gemacht, ja. Verkauft und gelebt davon auch. > Auf welcher Plattform? > Windows? ***Hahahaha*** Naja, das hat mit MSDOS angefangen, dann DosBox. > Ich glaub, du bist Sadist. Nein, warum? GUI-Bibliotheken die unter C benutzt werden, gibt es viele. Der TO braucht halt Konzept, GUI und DB. Das ist zum C lernen viel zu viel. leo
Warum nicht direkt die komplette Frühzeit überspringen und das Ganze in C# oder so machen? Dort ist die Einbindung von SQLite über NuGet und das Anbinden an die üblichen Controls nun wirklich keine Hexerei...
~Mercedes~ . schrieb: > Und dann darin mit linearer Suche suchen... Nein, der TO darf nach bsearch() fragen. Also echt, die Tips hier sind schon haarsträubend! Und wer erklärt dem TO wie er seine Datensätze streamt? So frägt der noch in hundert Jahren hier.
leo schrieb: > Naja, das hat mit MSDOS angefangen, dann DosBox. Das war mir klar. Versuch doch heute mal in C eine GUI für Windows zusammenzuklempern. Und dann komm wieder mit solchen "Tips".
Nick M. schrieb: > Versuch doch heute mal in C eine GUI für Windows zusammenzuklempern. Mit e.g. fltk ist das nicht schwer. leo
leo schrieb: > Mit e.g. fltk ist das nicht schwer. Ich kannte das nicht. Sieht nett aus. Braucht aber C++
1 | int main(int argc, char *argv[]) { |
2 | Fl_Double_Window *w = new Fl_Double_Window(330, 190); |
3 | Fl_Button *b = new Fl_Button(110, 130, 100, 35, "Okay"); |
4 | b->callback(ok_callback); |
5 | w->end(); |
6 | w->show(argc, argv); |
7 | return Fl::run(); |
8 | }
|
Nick M. meinte. > Nein, der TO darf nach bsearch() fragen. Nö. Das ist Staatsräson. Teile und herrsche! :-O Wo kommen wir da hin. > Also echt, die Tips hier sind schon haarsträubend! Hab ich nicht gemerkt. Ich bin ja schon ne Weile hier. Da wird frau abgehärtet. :-P mfg
~Mercedes~ . schrieb: > Kannst du bitte mal kompilieren? Ich kann lesen! > Wie groß ist die Exe? 100 k. Was hat das mit dem Thema zu tun?
leo schrieb: > Nick M. schrieb: >> Ich würde sowas mit mySQL entwerfen und das UI mit >> Tcl/Tk dazu machen. > > Sicher brauchts hinter den genannten Datenstrukturen > eine DB. Tcl/Tk wird den TO bei C aber definitiv nicht > helfen. Tcl/Tk würde ihm DEFINITIV helfen: 1. Kleine (!!) Datenbankprobleme erschlägt man direkt mit Tcl. 2. Als Nachbrenner kann man bei Bedarf sqlite verwenden. 3. Falls das noch nicht genügt, kann man aus Tcl auf diverse Datenbanken zugreifen. Visualisierung geht dann über Tk. 4. Wenn es unbedingt C sein muss: Man kan Tcl-Erweiterungen in C schreiben. 5. Zu guter Letzt: Wer erst Tcl lernt und dann C, macht sich m.E. das Leben deutlich angenehmer -- er kennt dann nämlich schon einen Großteil der C-Syntax, ohne ohne sich mit dem kranken Typsystem von C oder wildem Herumgepointere befassen zu müssen. Das kommt dann erst im zweiten Anlauf, beim Lernen von C.
Egon D. schrieb: > Tcl/Tk würde ihm DEFINITIV helfen: Das ginge auch mit Python. Oder mit Perl. Oder mit OCaml. Oder ... Ist aber völlig egal: Der TO kann nicht mal einen 20-Zeiler in C kompilieren, ist nicht in der Lage Fehlermeldungen zu lesen, antwortet hier schon nicht mehr, hat keinen Schimmer von Datenbanken und braucht weder das dumme Dahergerede derer die sich inzwischen durch Löschungen hier verewigt haben noch andere Tips die seinem derzeitigen Wissensstand gefühlte 30 Jahre voraus sind.
Taw U. schrieb: > ich möchte ein Programm erstellen womit ich mein Lager verwalten kann ! > Bin noch Anfänger in C Warum willst du dir das an tun. Was hast du überhaupt für Anvorderungen an eine Lagerverwaltung. Schau dir z.B. mal EleLa an. Link zum Artikel hier im Forum: Beitrag "EleLa - Elektronik Lagerverwaltung V3.1" Link zur Web-Seite des Programmierers: http://www.mmvisual.de/elela/
Nick M. schrieb: > ~Mercedes~ . schrieb: >> Kannst du bitte mal kompilieren? > > Ich kann lesen! > >> Wie groß ist die Exe? > > 100 k. > > Was hat das mit dem Thema zu tun? Ich such immernoch ne GUI für kleine Tools, das ists dann interessant. mfg
leo schrieb: > Nein, warum? GUI-Bibliotheken die unter C benutzt werden, gibt es viele. das ist richtig - nur davon haben die wenigsten überhaupt eine Ahnung. > Der TO braucht halt Konzept, GUI und DB. Das ist zum C lernen viel zu > viel. Der TO wird hier keine weiterführenden Antworten bekommen ... die muß er schon selbst finden und das wird dauern.
Es fibt noch solche Sachen wie Listen. Und wenn man wirklich so ein Programm braucht, dann muss man ja das Ganze noch speichern.
1 | #include <stdio.h> |
2 | #include <string.h> |
3 | |
4 | #define MAX_NUM_PRODUCTS 512
|
5 | #define MAX_NAME_LEN 128
|
6 | |
7 | int last_pos = 0; |
8 | |
9 | typedef struct product { |
10 | char product_name[MAX_NAME_LEN]; |
11 | int num_product; |
12 | } product_s; |
13 | |
14 | product_s product[MAX_NUM_PRODUCTS]; |
15 | |
16 | void
|
17 | add_product (const char* name, const int num) |
18 | {
|
19 | if (last_pos >= MAX_NUM_PRODUCTS) { |
20 | fprintf (stderr, |
21 | "ERROR: max number of products has been "
|
22 | "reached\n"); |
23 | return; |
24 | }
|
25 | |
26 | strcpy (product[last_pos].product_name, name); |
27 | product[last_pos].num_product = num; |
28 | |
29 | last_pos++; |
30 | }
|
31 | |
32 | int
|
33 | get_num_of_products (void) |
34 | {
|
35 | return last_pos; |
36 | }
|
37 | |
38 | void
|
39 | list_products (void) |
40 | {
|
41 | int last = get_num_of_products(); |
42 | |
43 | for (int i = 0; i < last; i++) { |
44 | printf ("\npos:\t%d\nproduct:\t%s\navailable:\t%d\n", |
45 | i, |
46 | product[i].product_name, |
47 | product[i].num_product); |
48 | }
|
49 | }
|
50 | |
51 | int
|
52 | main (void) |
53 | {
|
54 | add_product ("apple", 10); |
55 | add_product ("banana", 20); |
56 | add_product ("tomato", 30); |
57 | |
58 | list_products(); |
59 | |
60 | return 0; |
61 | }
|
Tim T. schrieb: > Und jetzt bitte mal eine "banana" hinzufügen... Hab ich gemacht. Und dann den Rechner ausgeschaltet und in die Mittagspause gegangen.
leo schrieb: > Sorry, aber dein Vorschlag ist auch Bloedsinn. Ich wollte auch kein komplettes Konzept liefern, sondern nur klarstellen, wie ich zu der Aussage gekommen bin, das da ein Konzept fehlt.
Nick M. schrieb: > Hab ich gemacht. Und dann den Rechner ausgeschaltet und in die > Mittagspause gegangen. So, und nach der Pause ist die Banane die ich eingegeben habe weg! Womit wir wieder am Anfang sind: Der TO meldet sich nicht mehr, bekommt keine 20 Zeilen code zusammengeklimpert die sich compilieren lassen, hat keinen Schimmer von Normalformen von Datenbanken, ist nicht in der Lage event-driven zu programmieren, hat keinen Schimmer wie er die Daten von und in die DB bekommt, ...
Der TO macht wohl eine Übung zu Stack und muss push- und pop-Funktionen nachbilden. Er programmiert doch kein Datenbanksystem nach.
leo schrieb: > - Artikel............. > - Lager............. > - Bestellung.......... > - Auftrag......... Dazu braucht es eine Datenbank. Da ist C sicher nicht das richtige.
Leute Leute, der TO hat um Hilfe für sein Stück C Quelltext gebeten. Dass andere Programmiersprachen für ein DBMS besser geeignet sein könnten und eine fertige Datenbank Software für so etwas erfunden wurde, ist jetzt oft gesagt worden. Solange er auf diesen Zug nicht aufspringt, bleibt doch bitte beim Thema des Threads. Und das sind die paar Zeilen Code, deren Fehler längst geklärt wurden. Wir brauchen momentan auch nicht klären, welche Betriebssystem und Filesystem besser ist oder ob Ökostrom schneller ist und warum meine Schwiegermutter immer mit zu viel Sahne kocht. Danach hat der TO nicht gefragt.
Stefan ⛄ F. schrieb: > Leute Leute, > > der TO hat um Hilfe für sein Stück C Quelltext gebeten. > > Dass andere Programmiersprachen für ein DBMS besser geeignet sein > könnten und eine fertige Datenbank Software für so etwas erfunden wurde, > ist jetzt oft gesagt worden. Solange er auf diesen Zug nicht aufspringt, > bleibt doch bitte beim Thema des Threads. Und das sind die paar Zeilen > Code, deren Fehler längst geklärt wurden. > > Wir brauchen momentan auch nicht klären, welche Betriebssystem und > Filesystem besser ist oder ob Ökostrom schneller ist und warum meine > Schwiegermutter immer mit zu viel Sahne kocht. > > Danach hat der TO nicht gefragt. Aber genau da liegt das Problem. Der TO stellt die falschen Fragen. Sind wir doch mal ehrlich, für das was er offensichtlich vor hat, ist C nicht unbedingt geeignet. Sobald er weit genug fortgeschritten ist um seine Probleme selber zu lösen, wird er auch erkennen das C dafür der falsche Weg ist. Also welchen Vorteil hat es jetzt dem TO seine Frage zu beantworten und ihn NICHT auf einen sinnvolleren Lösungsansatz zu stoßen?
Tim T. schrieb: > Also welchen Vorteil hat es jetzt dem TO seine Frage zu > beantworten und ihn NICHT auf einen sinnvolleren Lösungsansatz zu > stoßen? Dann starte halt du einen eigenen thread der genau die Antworten liefert die du haben willst. Sollte doch nicht so schwer sein.
Tim T. schrieb: > Aber genau da liegt das Problem. Der TO stellt die falschen Fragen. Sind > wir doch mal ehrlich, für das was er offensichtlich vor hat, ist C nicht > unbedingt geeignet. Für mich sieht das nach einer Übungsaufgabe für C aus. Die Aufgabe soll in C gelöst werden ohne externe Hilfsprogramme/Datenbanken. Nachdem er eine einfache DB in C programmiert hat, wird er den Sinn und Nutzen einer MariaDB viel besser verstehen. heute haben wir eher das Problem, dass Leute hoch komplexe Sache benutzen, ohne sich dessen bewusst zu sein. Und dann wundern sie sich am Ende, wenn sie sich total verzetteln und nichts mehr durchblicken oder die Performance nicht im Griff haben.
Bin Anfänger in C Wollte hier einen Programm zur LAgerverwaltung schreiben kriege aber bei meinen struct immer ein Fehler. Hier mein Code: #include <stdio.h> const int NAMELENGTH = 100; typedef strcut Artikel{ char artikel[Namelength]; int anzahl: }Artikel; void ArtikelHinzufuegen(){ } void ArtikelAnzahl(){ } void tabelle(){ } int main(){ }
:
Wiederhergestellt durch Moderator
Besorge Dir ein gutes Buch über die Programmiersprache C - oder lass es Dir zu Weihnachten schenken. Der Versuch diese alte Sprache ohne entsprechende Literatur zu lernen wird fehlschlagen - C ist NICHT einsteigerfreundlich. Ich sehe da oben etlich Tippfehler, da spuckt der Compiler gleich ein Dutzend Fehler aus.
Wenn man programmiertechnisch auf dem Niveau ist, dann sollte man doch lieber ein günstiges Programm kaufen. Ansonsten erlebt man den Betrieb gar nicht mehr vor der Rente.
An den TO: Glaubst du ernsthaft, dass du mit solchen Aktionen die Motivation dir zu helfen förderst? Ich bin jedenfalls raus! Es bleibt nur noch der Tip ein Buch zu kaufen und durchzuarbeiten. K.A. wie viele Programmiersprachen ich gelernt hab, aber jedesmal hat mindestens ein Buch geholfen. Und kapiert hab ich keine einzige Sprache innerhalb von 2 Wochen. Es braucht einfach Übung, Übung, Übung. Und der Wille Probleme selbst zu lösen. Hauptsächlich durch Lesen.
Taw U. schrieb: > ich möchte ein Programm erstellen womit ich mein Lager verwalten kann ! > Bin noch Anfänger in C Wenn es darum geht, eine Programmiersprache zu erlernen, dann hilft Dir ein gutes Buch und/oder ein Tutorial zu dieser Sprache weiter. Man fängt mit einfachen, kleinen Beispielen an wie dem berühmten "Hello World" und arbeitet sich langsam voran. Da man beim Programmieren lernen unweigerlich Fehler macht und aus diesen lernt, ist es nicht ratsam sofort mit einer komplexen Anwendung zu beginnen. Sonst ist die Lernkurve derart steil, dass einem die Lust an der Sache vergeht.
:
Bearbeitet durch User
Sicher das der OP nicht einfach nur ein Troll ist? Ich meine mit seinen paar daher geworfenen Brocken C ähnlichem Versatz, hat er ein vielfaches an Antwortzeilen bekommen und sein Input geht auch ansonsten gegen Null.
Er hat seien Frage ohne jegliche Begründung wiederholt. Ich denke es ist klar, dass er uns entweder verarscht oder von den nötigen Qualifikationen so weit entfernt ist, dass wir ihm hier nicht helfen können. Wer so unfähig ist, Fragen zu stellen, der kann auch nicht programmieren. Da sind Hopfen und Malz verloren.
Stefan ⛄ F. schrieb: > Wer so unfähig ist, Fragen zu stellen, der kann auch nicht > programmieren. Da sind Hopfen und Malz verloren. Zumindest konnten einige wieder nicht die Gelegenheit auslassen sich selbst zu blamieren. Das ist schon mal ein Teilerfolg!
wegen einer Mini-"Datenbank", mit vielleicht 10.000 Einträge sich den Ärger mit einer SQL-Datenbank etc. antun? Wozu? Einfach mal nachrechnen: Gute 100 Bytes pro Artikel man 10.000 sind gerade 1 Megabyte! Heute hat jeder vergessen, dass man ein paar Daten auch einfach komplett in den RAM laden kann. Das ist hochperformant und effizient. Aber darum geht es ja hier ja gar nicht. 30 Minuten Arbeit und das Problem vom Eingangspost ist gelöst:
1 | #include <stdio.h> |
2 | #include <stdlib.h> |
3 | #include <string.h> |
4 | |
5 | #define NAMELENGTH 100
|
6 | #define DBSIZE 1000
|
7 | #define DBNAME "database.bin"
|
8 | |
9 | struct Artikel |
10 | {
|
11 | char artikel[NAMELENGTH + 1]; |
12 | int anzahl; |
13 | };
|
14 | |
15 | struct Artikel db[DBSIZE]; |
16 | |
17 | void fehler(const char *text) |
18 | {
|
19 | fprintf(stderr, "Fehler: %s!\n", text); |
20 | exit(1); |
21 | }
|
22 | |
23 | void check_artikel(char *artikel) |
24 | {
|
25 | if (!artikel || strlen(artikel) > NAMELENGTH) |
26 | fehler("Artikel zu lang"); |
27 | }
|
28 | |
29 | void db_load() |
30 | {
|
31 | FILE *input = fopen(DBNAME, "rb"); |
32 | if (!input) |
33 | fehler("Datenbank zum Lesen öffnen fehlgeschlagen"); |
34 | |
35 | size_t size = fread(db, 1, sizeof(db), input); |
36 | if (size != sizeof(db)) |
37 | fehler("Datenbank nicht komplett geladen"); |
38 | |
39 | fclose(input); |
40 | }
|
41 | |
42 | void db_save() |
43 | {
|
44 | FILE *output = fopen(DBNAME, "wb"); |
45 | if (!output) |
46 | fehler("Datenbank zum Schreiben öffnen fehlgelschlagen"); |
47 | |
48 | size_t size = fwrite(db, 1, sizeof(db), output); |
49 | if (size != sizeof(db)) |
50 | fehler("Datenbank nicht komplett geschrieben"); |
51 | |
52 | fclose(output); |
53 | }
|
54 | |
55 | void db_clear() |
56 | {
|
57 | for (int i = 0; i < DBSIZE; i++) |
58 | {
|
59 | db[i].anzahl = 0; |
60 | }
|
61 | }
|
62 | |
63 | int db_size() |
64 | {
|
65 | int size = 0; |
66 | for (int i = 0; i < DBSIZE; i++) |
67 | size += db[i].anzahl ? 1 : 0; |
68 | return size; |
69 | }
|
70 | |
71 | int db_find(char *artikel) |
72 | {
|
73 | for (int i = 0; i < DBSIZE; i++) |
74 | if (db[i].anzahl > 0 && !strcasecmp(db[i].artikel, artikel)) |
75 | return i; |
76 | |
77 | return -1; |
78 | }
|
79 | |
80 | void db_add(char *artikel, int anzahl) |
81 | {
|
82 | int found = db_find(artikel); |
83 | if (found >= 0) |
84 | {
|
85 | db[found].anzahl += anzahl; |
86 | return; |
87 | }
|
88 | |
89 | for (int i = 0; i < DBSIZE; i++) |
90 | if (db[i].anzahl == 0) |
91 | {
|
92 | strcpy(db[i].artikel, artikel); |
93 | db[i].anzahl = anzahl; |
94 | return; |
95 | }
|
96 | |
97 | fprintf(stderr, "Datenbank voll!\n"); |
98 | }
|
99 | |
100 | void db_list() |
101 | {
|
102 | if (db_size() == 0) |
103 | {
|
104 | printf("Datenbank ist leer.\n"); |
105 | return; |
106 | }
|
107 | |
108 | printf("Anzahl : Artikel\n"); |
109 | printf("--------:-------------------------------------------------------------\n"); |
110 | |
111 | for (int i = 0; i < DBSIZE; i++) |
112 | if (db[i].anzahl > 0) |
113 | {
|
114 | printf(" %5d : %s\n", db[i].anzahl, db[i].artikel); |
115 | }
|
116 | }
|
117 | |
118 | int main(int argc, char **argv) |
119 | {
|
120 | if (argc < 2) |
121 | fehler("Kein Kommando angegeben!\nGültige Kommandos: init, add ANZAHL ARTIKEL, list"); |
122 | |
123 | const char *cmd = argv[1]; |
124 | |
125 | if (!strcmp(cmd, "init")) |
126 | {
|
127 | db_clear(); |
128 | db_save(); |
129 | printf("Datenbank initialisiert.\n"); |
130 | }
|
131 | else if (!strcmp(cmd, "list")) |
132 | {
|
133 | db_load(); |
134 | db_list(); |
135 | }
|
136 | else if (!strcmp(cmd, "add")) |
137 | {
|
138 | if (argc < 3) |
139 | fehler("Keine Artikelanzahl angegeben"); |
140 | |
141 | int anzahl = atoi(argv[2]); |
142 | |
143 | if (anzahl <= 0) |
144 | fehler("Artikelanzahl zu klein"); |
145 | |
146 | if (argc < 4) |
147 | fehler("Kein Artikel angegeben"); |
148 | |
149 | char *artikel = argv[3]; |
150 | |
151 | check_artikel(artikel); |
152 | |
153 | if (argc > 4) |
154 | fehler("Zu viele Eingaben"); |
155 | |
156 | db_load(); |
157 | db_add(artikel, anzahl); |
158 | db_save(); |
159 | printf("Artikel hinzugefügt.\n"); |
160 | }
|
161 | else
|
162 | {
|
163 | fprintf(stderr, "Unbekanntes Kommando!\n"); |
164 | |
165 | return 1; |
166 | }
|
167 | |
168 | return 0; |
169 | }
|
Viel Spaß!
MosFeratu schrieb: > C ist eine super Sprache, aber imo so ziemlich die am wenigsten > geeignete Sprache für Datenbanken. Blödsinn. Schau dir mal libgda an: https://gitlab.gnome.org/GNOME/libgda https://gist.github.com/bert/1090657/f37533bdd0f90d79ccef39f0631b0e03c475f615
Merkwürdig. Hier wird am eigentlichen Problem des Fragenden völlig vorbeigeschrieben: Taw U. schrieb: > const int NAMELENGTH = 100; > > typedef strcut Artikel{ > char artikel[Namelength]; > int anzahl: > }Artikel; Diese große Menge an Schreibfehlern in so wenig Zeilen deutet für mich auf Legasthenie hin. Es gibt aber keine Programmiersprache, die Flüchtigkeitsfehler in der Dichte verzeiht. Ich habe 5 Jahre an der Uni C-Programmierung unterrichtet und mußte dabei selber lernen, dass es Teilnehmer gibt, die nunmal einfach keine Programmiersprache erlernen können. Sie kommen über ein gewisses Stadium nicht hinaus. Als versierter Programmierer muss man lernen, dass auch diese Tätigkeit eben nicht von JEDEM zu erlernen ist. So wie eben auch nicht jeder das perfekte Kalkputzen erlernen kann oder 6 Sprachen fließend erlernen kann, sondern jeweils ein angeborenes Talent mitbringen muss. Beim Programmieren z.B. ist es eine extreme akribische Genauigkeit bereits auf Zeichenebene gepaart mit der Fähigkeit, große Probleme in seine kleinsten Teilprobleme zu zerlegen und diese dann Stück für Stück fehlerfrei zu lösen.
Experte schrieb: > wegen einer Mini-"Datenbank", mit vielleicht 10.000 Einträge sich den > Ärger mit einer SQL-Datenbank etc. antun? Wozu? Einfach mal nachrechnen: > Gute 100 Bytes pro Artikel man 10.000 sind gerade 1 Megabyte! Welchen Ärger? SQLite existiert und gut ist. Sobald man aber dann später noch extra Wünsche hat, ist man mit SQL deutlich besser aufgehoben. > Heute hat jeder vergessen, dass man ein paar Daten auch einfach komplett > in den RAM laden kann. Das ist hochperformant und effizient. Soso, lineare Suche und feste Datenfeldgröße aber trotzdem hochperformant und effizient?!? Also wenn man es schon direkt in C macht, kann man auch eben die paar Minuten für eine Baumstruktur und dynamische Felder investieren. > Aber darum geht es ja hier ja gar nicht. 30 Minuten Arbeit und das > Problem vom Eingangspost ist gelöst: Ganz großes Kino, also 30 Minuten Arbeit und dann den Bedienkomfort von 1990. In 30 Minuten hat man auch eine entsprechende Anwendung in C# mit SQLite zusammengeknüppelt.
Tim T. schrieb: > In 30 Minuten hat man auch eine entsprechende Anwendung in C# mit SQLite > zusammengeknüppelt. Als erfahrener Entwickler vielleicht. Der Themenersteller ist aber keiner.
Mark B. schrieb: > Tim T. schrieb: >> In 30 Minuten hat man auch eine entsprechende Anwendung in C# mit SQLite >> zusammengeknüppelt. > > Als erfahrener Entwickler vielleicht. Der Themenersteller ist aber > keiner. Glaube ich nicht, wenn ich mir ansehe wie einfach es mittlerweile ist mal eben eine Komponente wie SQLite anzubinden und mit entsprechenden Steuerelementen zu verknüpfen, ist da wirklich nicht viel Können erforderlich. Ok, minimales Einarbeiten in SQL wäre notwendig, aber auch das dauert nicht lange. Denke aber der TO ist eh ein hoffnungsloser Fall, bescheidene bis nicht vorhandene C Kenntnisse gepaart mit fehlender Eigeninitiative, Genauigkeit und schriftlicher Ausdrucksfähigkeit.
Experte schrieb: > Aber darum geht es ja hier ja gar nicht. 30 Minuten Arbeit und das > Problem vom Eingangspost ist gelöst gut :-) von mir gab's eine positive Lese-Wertung; wie man hier negativ werten kann, bleibt mir ein Rätsel. Das Programm kann man auch anderweitig nutzen; besten Dank an dieser Stelle von mir ... vom TO hört man ja leider nichts mehr.
Ich hab gard mal deinen Code getestet und bemerkt dass bei dir die Eingabe des Kommandos fehlt. Beim complimieren erscheint direkt "Fehler: Kein Kommando angegeben!", da man nicht eingeben kann:) btw glaube nicht dass der/die T O deinen Code ohne Kommentare versteht.
:
Bearbeitet durch User
Experte schrieb: > > Aber darum geht es ja hier ja gar nicht. 30 Minuten Arbeit und das > Problem vom Eingangspost ist gelöst: > > int main(int argc, char **argv) > { > ...//Kann nicht alles markieren//... } Ich hab gard mal deinen Code getestet und bemerkt dass bei dir die Eingabe des Kommandos fehlt. Beim complimieren erscheint direkt "Fehler: Kein Kommando angegeben!", da man nichts eingeben kann:) btw glaube nicht dass der/die Taw deinen Code ohne Kommentare versteht.
:
Bearbeitet durch User
Luyin D. schrieb: > btw glaube nicht dass der/die Taw deinen Code ohne Kommentare versteht. Bei dir ist es jedenfalls nachweislich so. Tip: Schau dir mal main an und überleg was argc bedeutet.
achsoo stimmt hab es übersehen und hatte es mit einem online c compiler getestet.
Luyin D. schrieb: > Ich hab gard mal deinen Code getestet und bemerkt dass bei dir die > Eingabe des Kommandos fehlt. Beim complimieren erscheint direkt "Fehler: > Kein Kommando angegeben!", da man nichts eingeben kann:) > > btw glaube nicht dass der/die Taw deinen Code ohne Kommentare versteht. bei mir funktioniert das Programm von 'Experte' bestens - ein wenig Ahnung sollte man natürlich schon haben. Mir hat das Programm genutzt, dafür nochmals vielen Dank an Experte :-)
Stefan ⛄ F. schrieb: > Er hat seien Frage ohne jegliche Begründung wiederholt du weisst doch mit dem Fuss aufstampfen und schreien "ich will" ist eine erlernte Übung!
Also bei mir funktioniert das Programm von 'Experte' auch nicht, kann vielleicht jemand helfen ? Also doch das Funktioniert ich kann aber kein Kommando auswählen. Es erscheint immer : Fehler: Kein Kommando angegeben! Gültige Kommandos: init, add ANZAHL ARTIKEL, list!
Wado U. schrieb: > ich kann aber kein Kommando auswählen. Das Programm erwartet das Kommando als Aufrufparameter, nicht als interaktive Eingabe. Also gibst du z.B. im CMD Fenster ein: meinprogramm.exe init
Wado U. schrieb: > Es erscheint immer : > Fehler: Kein Kommando angegeben! Das dient dann als Beweis dafür, dass du die Antworten hier nicht mal liest. Kein C können ist das Eine. Nicht lesen wollen das Andere. Ich steh also zu dem Posting von mir: Beitrag "Re: Fehlersuche in C" Und zu allen Anderen natürlich auch. Komisch, aber man kann an der Art und Weise wie eine Fragestellung aufbereitet wird erkennen ob es pure Zeitverschwendung wird dem TO zu antworten. Wenn jeder nur ein wenig über 1 Minute verschwendet hat hier zu antworten, dann sind wir schon bei 1 1/2 Stunden. Der TO konnte das Urspungsposting in 30 Sekunden hinrotzen.
@Taw alias Wado alias Luyin: Nach den Nutzungsbedingungen ist die Beteiligung an einer Diskussion unter verschiedenen Namen nicht zulässig, schon gar nicht in der Weise, wie du es hier tust. Außerdem: Du hast in den letzten Tagen mindestens 11 Threads mit Anfängerfragen zu C gestartet. Einige davon scheinst du bereits vergessen zuhaben. Wenn du wirklich die Absicht hast, C zu lernen (was ich mittlerweile stark bezweifle), dann konzentriere dich auf ein einzelnes Problem, versuche dieses (ggf. mit Hilfe des Forums) zu lösen, gib eine positive Rückmeldung, sobald du erfolgreich bist und starte erst dann deinen nächsten Thread.