Forum: PC-Programmierung Fehlersuche in C


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Taw U. (tawo20)


Lesenswert?

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
von Nick M. (Gast)


Lesenswert?

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.

von tim (Gast)


Lesenswert?

Taw U. schrieb:
> strcut

Beitrag #6518933 wurde von einem Moderator gelöscht.
von Heiner (Gast)


Lesenswert?

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.
von MosFeratu (Gast)


Lesenswert?

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 ;-)

von Stefan ⛄ F. (stefanus)


Lesenswert?

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.
von Stefan ⛄ F. (stefanus)



Lesenswert?

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.

: Bearbeitet durch User
von MosFeratu (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> So zeigt Qt Creator die Fehler an

Wow, danke für den Tip.

Beitrag #6518986 wurde von einem Moderator gelöscht.
von Stefan ⛄ F. (stefanus)


Lesenswert?

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.
von Stefan ⛄ F. (stefanus)


Lesenswert?

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

von dirk (Gast)


Lesenswert?

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.

von dirk (Gast)


Lesenswert?

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.

von leo (Gast)


Lesenswert?

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

von Nick M. (Gast)


Lesenswert?

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.

von Lotta  . (mercedes)


Lesenswert?

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

von ... (Gast)


Lesenswert?

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?

von leo (Gast)


Lesenswert?

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

von Nick M. (Gast)


Lesenswert?

~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. :-)

von Nick M. (Gast)


Lesenswert?

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.

von Lotta  . (mercedes)


Lesenswert?

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

von MaWin (Gast)


Lesenswert?

~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.

von Lotta  . (mercedes)


Lesenswert?

Mawin meinte:

> Lass ihn sein Array aufbauen.

Und dann darin mit linearer Suche suchen...

mfg

von leo (Gast)


Lesenswert?

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

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

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...

von Nick M. (Gast)


Lesenswert?

~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.

von Nick M. (Gast)


Lesenswert?

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".

von leo (Gast)


Lesenswert?

Nick M. schrieb:
> Versuch doch heute mal in C eine GUI für Windows zusammenzuklempern.

Mit e.g. fltk ist das nicht schwer.

leo

von Nick M. (Gast)


Lesenswert?

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
}

von Lotta  . (mercedes)


Lesenswert?

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

von Lotta  . (mercedes)


Lesenswert?

geil!!

Nick  m:

Kannst du bitte mal kompilieren?
Wie groß ist die Exe?

mfg

von Nick M. (Gast)


Lesenswert?

~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?

von Egon D. (egon_d)


Lesenswert?

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.

von Nick M. (Gast)


Lesenswert?

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.

von GeraldB (Gast)


Lesenswert?

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/

von Lotta  . (mercedes)


Lesenswert?

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

von Robert K. (Firma: Zombieland) (rko)


Lesenswert?

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.

von Beispiel (Gast)


Lesenswert?

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
}

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Und jetzt bitte mal eine "banana" hinzufügen...

von Nick M. (Gast)


Lesenswert?

Tim T. schrieb:
> Und jetzt bitte mal eine "banana" hinzufügen...

Hab ich gemacht. Und dann den Rechner ausgeschaltet und in die 
Mittagspause gegangen.

von Stefan ⛄ F. (stefanus)


Lesenswert?

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.

von Nick M. (Gast)


Lesenswert?

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, ...

von Beispiel (Gast)


Lesenswert?

Der TO macht wohl eine Übung zu Stack und muss push- und pop-Funktionen 
nachbilden.

Er programmiert doch kein Datenbanksystem nach.

von ACDC (Gast)


Lesenswert?

leo schrieb:
> - Artikel.............
> - Lager.............
> - Bestellung..........
> - Auftrag.........

Dazu braucht es eine Datenbank.

Da ist C sicher nicht das richtige.

von Beispiel (Gast)


Lesenswert?

C ist für alles geeignet.

Aber nicht für jeden.

von Stefan ⛄ F. (stefanus)


Lesenswert?

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.

: Bearbeitet durch User
von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

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?

von Nick M. (Gast)


Lesenswert?

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.

von Stefan ⛄ F. (stefanus)


Lesenswert?

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.

: Bearbeitet durch User
von Taw U. (tawo20)


Lesenswert?

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
von Teo D. (teoderix)


Lesenswert?


von Jim M. (turboj)


Lesenswert?

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.

von PittyJ (Gast)


Lesenswert?

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.

von Yalu X. (yalu) (Moderator)


Lesenswert?

@Taw:

Ein (1) Thread zum Thema reicht.

von Nick M. (Gast)


Lesenswert?

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.

von Mark B. (markbrandis)


Lesenswert?

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
von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

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.

von Stefan ⛄ F. (stefanus)


Lesenswert?

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.

: Bearbeitet durch User
von Nick M. (Gast)


Lesenswert?

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!

von Experte (Gast)


Lesenswert?

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ß!

von 🐧 DPA 🐧 (Gast)


Lesenswert?

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

von Elektry (Gast)


Lesenswert?

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.

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

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.

von Mark B. (markbrandis)


Lesenswert?

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.

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

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.

von Robert K. (Firma: Zombieland) (rko)


Lesenswert?

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.

von Luyin D. (luyin)


Lesenswert?

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
von Luyin D. (luyin)


Lesenswert?

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
von Nick M. (Gast)


Lesenswert?

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.

von Luyin D. (luyin)


Lesenswert?

achsoo stimmt hab es übersehen
und hatte es mit einem online c compiler getestet.

von Robert K. (Firma: Zombieland) (rko)


Lesenswert?

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 :-)

von Luyin D. (luyin)


Lesenswert?

versuchs mal in nem online c compiler:) Da klappts nicht, aber 
verständlich

von Joachim B. (jar)


Lesenswert?

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!

von Wado U. (racole)


Lesenswert?

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!

von Stefan ⛄ F. (stefanus)


Lesenswert?

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

: Bearbeitet durch User
von Nick M. (Gast)


Lesenswert?

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.

von Yalu X. (yalu) (Moderator)


Lesenswert?

@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.

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.