Forum: PC-Programmierung Datenbank in C erstellen


von Thomas O. (osti93)


Lesenswert?

Hallo,

Ich möchte eine Datenbank rein in C erstellen. Ich habe ein 
Evaluation-board (lm3s6918) und mochte eine Datenbank erstellen, ohne 
mySQL oder ähnliches, habe auch keine Internetverbindung mit diesem 
Mikrocontroller.

Ich möchte wissen, ob ich einfach in C eine Datenbank erstellen kann, 
die man von außen (lm3s6918 hat touchdisplay) einfach umschreiben kann 
und die ich dann für das eigentliche Programm weiterverwenden kann.


Danke schon im voraus ;)

Mfg. Thomas

von Εrnst B. (ernst)


Lesenswert?

Ja, aber je nach geforderten Funktionen/Performance/Datensicherheit/... 
ist "einfach" relativ.

von Marius W. (mw1987)


Lesenswert?

Was hast du denn für Anforderungen?

Eigentlich kannst du jede Datenstruktur irgendwie zu einer Datenbank 
formen. Der einfachste Fall wäre zum Beispiel ein Array von structs in 
C. Die kannst du dann im Speicher ablegen und via Index darauf 
zugreifen. Da fehlt dir dann natürlich eine komfortable Abfragesprache, 
wie SQL. Das ist auf einem µC aber sowieo overkill...

Gruß
Marius

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Zur Not könnte man SQLite verwenden. Ist reines C und eigentlich
überall einbindbar.

von whose93 (Gast)


Lesenswert?


von MaWin (Gast)


Lesenswert?

> Ich möchte wissen, ob ich ... in C eine Datenbank erstellen kann,

Sicher, was meinst du, in was Datenbanken geschrieben wurden

> einfach

Alles ist relativ.

Ich meine, wenn man schon so fragt, ist es wohl zu schwer,
daber vermutlich brauchst du gar keine ganze Datenbank,
sondern nur eine Datenstruktur, bei der sogar fraglich ist,
ob du sie überhaupt persistent abspeichern können musst.

Kurz gesagt: Millionen Programmeirer auf aller Welt können das.

von Robert L. (lrlr)


Lesenswert?

ich würd eher sagen, es geht hier um ein (statisches?) config-file

dass per ethernet (ab und zu) mal updated werden soll ??

von Thomas O. (osti93)


Lesenswert?

Ich soll den Microcontroller LM3S6918 programmieren.

Dieser soll funktionieren, ohne dass entweder PC oder sonstiges 
angeschlossen ist.

Die Datenbank soll persistent abgespeichert werden und sollte von außen 
über Touchscreen verändert werden können.

Und das Programm selber soll auch auf die Datenbank zugreifen können und 
die Werte auslesen.

von Robert L. (lrlr)


Lesenswert?

ist das eine Hausaufgabe?

von Thomas O. (osti93)


Lesenswert?

Nein, ein kleiner Teil von meiner Diplomarbeit ;)

von Patrick (Gast)


Lesenswert?

Thomas O. schrieb:
> Ich soll den Microcontroller LM3S6918 programmieren.

Ja, sowas soll vorkommen... Zumindest kenne ich jemanden, der behauptet, 
jemanden zu kennen, der auch schon mal sowas machen musste.

> Dieser soll funktionieren, ohne dass entweder PC oder sonstiges
> angeschlossen ist.

Hm, ist das nicht die Natur eines Mikrocontrollers? - Zumindest die 
Typen, die ich so kenne, brauchen eigentlich nur eine Betriebsspannung 
und maximal noch einen Oszillator oder sowas...

> Die Datenbank soll persistent abgespeichert werden und sollte von außen
> über Touchscreen verändert werden können.

Soso... Eine Datenbank mit Touch-Interface? - Also... Die Datenbanken, 
die ich so kenne, kommunizieren in der Regel via TCP... Darauf hat's in 
der Regel einen SQL-Dialekt oder (z. B. bei diversen NoSQL-DBs) eine 
HTTP-API. Es gibt natürlich auch Varianten mit z. B. nativem C-API...

> Und das Programm selber soll auch auf die Datenbank zugreifen können und
> die Werte auslesen.

Ja, das macht Sinn. Zumindest fällt mir spontan kein Anwendungsfall ein, 
bei dem es Sinn macht, die Daten so abzulegen, dass sie nicht gelesen 
und/oder darauf zugegriffen werden kann.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Patrick schrieb:
> Ja, das macht Sinn. Zumindest fällt mir spontan kein Anwendungsfall ein,
> bei dem es Sinn macht, die Daten so abzulegen, dass sie nicht gelesen
> und/oder darauf zugegriffen werden kann.

Nie vom WOM gehört ? (Write Only Memory. 8 Dioden auf einen C ;))

von Thomas O. (osti93)


Lesenswert?

Patrick schrieb:

> Soso... Eine Datenbank mit Touch-Interface? - Also... Die Datenbanken,
> die ich so kenne, kommunizieren in der Regel via TCP... Darauf hat's in
> der Regel einen SQL-Dialekt oder (z. B. bei diversen NoSQL-DBs) eine
> HTTP-API. Es gibt natürlich auch Varianten mit z. B. nativem C-API...

das wesentliche ist, dass ich keine andere Verbindung habe, mit der ich 
auf eine Datenbank zugreifen kann.

Deshalb denke ich mir, dass SQL nicht funktionieren wird oder?

von Εrnst B. (ernst)


Lesenswert?

Thomas O. schrieb:
> Deshalb denke ich mir, dass SQL nicht funktionieren wird oder?

Warum? Mit sqlite hast du ein Datenbank-File auf dem Board, keinen 
Serverdienst oder Netzwerk.
Dein Programm öffnet (mit Hilfe der SQLite-Library) einfach das File und 
kann darauf SQL-Kommandos ausführen.

Das File kannst du zum Bearbeiten einfach auf den PC kopieren, und dort 
mit den SQLite-Tools, ODBC-Treiber usw. verändern und zurückkopieren.

Aber, je nachdem was du wirklich brauchst: Vielleicht reicht auch ein 
simples Textfile mit linearer Suche?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Thomas O. schrieb:
> Deshalb denke ich mir, dass SQL nicht funktionieren wird oder?

Doch, und zwar in Form von SQLite. Das ist eine in reinem C geschriebene 
SQL-Datenbank, die ihre Daten wahlweise in einem Dateisystem oder aber 
eben auch im Arbeitsspeicher ablegen kann. Da sind keine eigenständigen 
Datenbankprozesse, keine Interprozesskommunikation und erst recht 
keinerlei Netzwerkzugriffe erforderlich.

SQLite braucht sehr wenig Code und ist vorzüglich für den Einsatz in 
Embedded Systems geeignet.

von Thomas O. (osti93)


Lesenswert?

Dann werde ich das mal mit SQLite versuchen :)

Danke an alle für die tolle Hilfe :)


Wenn ich dann noch fragen hab, meld ich mich dann einfach nochmal ;)


Mfg. Thomas

von Grml (Gast)


Lesenswert?

Thomas O. schrieb:
> Nein, ein kleiner Teil von meiner Diplomarbeit ;)

Studiengang? Das hört sich ja alles sehr erschreckend an. Von 
Datenbanken oder Informatik an sich scheinst du im Studium nicht viel 
mitbekommen zu haben. Darum würde mich dein Studiengang schon 
interessieren.

von heins (Gast)


Lesenswert?

hallo, lern' doch einfach erstmal Programmieren.
Wenn Du C lernen willst, nimm "The C Programming Language"
von Brian W. Kernighan, Dennis M. Ritchie
zum lernen von algorithmen und datenstrukturen nimm
http://mitpress.mit.edu/algorithms/
zum arm coden guck dir hier die tutorials an.
naja, egal

von Robert L. (lrlr)


Lesenswert?

>Studiengang?

mit 19

das ist eine HTL!

von Sven H. (dsb_sven)


Lesenswert?

Was für Daten sollten denn überhaupt gespeichert werden?
Irgendwie erscheint mir der Begriff "Datenbank" fehl am Platze...

von Karl H. (kbuchegg)


Lesenswert?

Robert L. schrieb:
>>Studiengang?
>
> mit 19
>
> das ist eine HTL!

Und ich wünschte sie würden aufhören das ganze 'Diplomarbeit' zu nennen.

Aber abgesehen davon hatten wir hier auch schon Diplomanden und sogar 
Doktoranden, die sich auch nicht besser angestellt haben.

Die Frage, die sich mir so stellt, lautet: Braucht es überhaupt eine 
relationale Datenbank? Ich werde das Gefühl nicht los, dass hier (aus 
Unkentniss seitens des Fragestellers) versucht wird, mit Kanonen auf 
Spatzen zu schiessen.

von whose 93 (Gast)


Lesenswert?

Sry das ich mich auch ins Gespräch einklinke, aber ich arbeite mit 
Thomas O. zusammen:

Es geht darum einfachen Haushalts-Geräten Prioritäten zuzuordnen, mit 
denen dann unser main-Programm arbeiten soll.
Wir brauchen eine Datenbank, um neue Geräte ein oder austragen zu 
können, bzw. Prioritäten zu änder.

z.B.: Waschmaschine 50;
      E-Herd        20;

von Karl H. (kbuchegg)


Lesenswert?

whose 93 schrieb:
> Sry das ich mich auch ins Gespräch einklinke, aber ich arbeite mit
> Thomas O. zusammen:
>
> Es geht darum einfachen Haushalts-Geräten Prioritäten zuzuordnen, mit
> denen dann unser main-Programm arbeiten soll.
> Wir brauchen eine Datenbank, um neue Geräte ein oder austragen zu
> können, bzw. Prioritäten zu änder.

Dazu braucht man eine Datenbank?

Das ist eine simple lineare Liste oder Array, wenns hochkommt ein 
binärer Baum, damit man bei 10000 Geräten schneller suchen kann.

Da habt ihr mit der Portierung von SQLite mehr Arbeit, als wenn ihr 
einfach eure Kentnisse von Datenstukturen auspackt.

von MaWin (Gast)


Lesenswert?

> Wir brauchen eine Datenbank, um neue Geräte ein oder
> austragen zu können, bzw. Prioritäten zu änder.
> z.B.: Waschmaschine 50;       E-Herd        20;


Nein,
ich braucht erst mal Grundlagenkenntisse.

Für ein paar Zahlen und Namen braucht man keine Datenbank,
sondern eine Liste.

Und niemand hat in überhaupt einem Gebäude irgendwelche Lust
irgendwas irgendwo einzutragen, und dann noch mit Nummern.
Geräte werden eingesteckt, das war's, gehen auch manchmal
kaputt, sind also nicht so wie die Liste glaubt daß sie wären.

Völlig falscher Ansatz, das Problem, das übrigens 100%
aller Totgeburten trifft. Eure Lehranstalt hat euch also
offenbar auch nicht beigebracht, sinnvoll zu denken.

von Karl H. (kbuchegg)


Lesenswert?

Hinweis:

In der Programmierung bezeichnet man oft etwas hochtrabend als 
"Datenbank", was in Wirklichkeit einfach nur eine Sammlung von Daten 
darstellt. Datenbank ist hier (sofern der Begriff in der 
Aufgabenstellung vorkommt) als mehr als die Sammlung der Nutzdaten zu 
sehen.

struct Person
{
  char Vorname[50];
  char Nachname[100];
}

struct Person Belegsschaft[2000];

ist so gesehen schon eine "Datenbank". Es ist die Sammlung der Daten der 
Belegschaft einer Firma.

An das, was Hr. Müller da draussen aber als "Datenbank" (zb Access, zb 
SQL) kennt, werden zusätzlich noch ganz andere Anforderungen gestellt. 
Das hat mit der einfachen Datensammlung von da oben nur sehr wenig zu 
tun, auch wenn man natürlich den Aufwand treiben kann, eine SQL 
Datenbank nur zur Speicherung dieser Daten einzusetzen (was manchmal 
sogar tatsächlich Sinn machen kann).

Aber wie sinnvoll es ist, erst mal Tage damit zu verbringen, eine echte 
relationale Datenbank auf ein System zu portieren, nur um dann 
festzustellen, dass man die Anpassung ans Filesystem sowieso wieder 
selber machen muss, anstatt so ein Array einzusetzen und das von einem 
File zu lesen und zu schreiben (oder in Form eines Cache immer nur Teile 
im Speicher zu haben), das möchte ich jetzt erst mal in Frage stellen.

von whose 93 (Gast)


Lesenswert?

Danke für die Info :)

von Thomas O. (osti93)


Lesenswert?

Ich habe jetzt einfach eine Struktur erstellt, dass mit dem umschreiben 
in der Struktur von außen mach ich später noch, aber das habe ich 
einmal:


  struct Geraete *G
  {
     int Geraetenummer;
    char Name[50];
    unsigned char Geraetleistung[20];
  };

  struct Geraete Geraet1 =
  {
    0,
    "Testgeraet1",
    "50"
  };

  struct Geraete Geraet2 =
  {
    1,
    "Testgeraet2",
    "100"
  };

Aber mein Problem ist jetzt der Zeiger..

Ich möchte mit meinem Programm alle Gerätenummern durchlaufen lassen, um 
zu  sehen ob irgendein Gerät weniger Leistung benötigt als ich momentan 
zur Verfügung habe, damit ich dieses dann einschalten kann. Und das 
solange ich mehr Leistung zur Verfügung habe, als das Gerät verbraucht.


Wenn ich das mit dem Zeiger so mache:

G->Geraetenummer = 0;

kommt der Fehler:

ILOGS.c(348): error:  #132: expression must have 
pointer-to-struct-or-union type


Wahrscheinlich ist der Fehler für ein paar von euch eh offensichtlich, 
aber ich habe vorher eigentlich nie programmiert und bin noch relativ 
unerfahren darin ;)

Hoffe, dass ihr mir helfen könnt..

Mfg.Thomas

von Dominik S. (dasd)


Lesenswert?

Du musst wie es oben schon steht ein Array deiner Struktur anlegen.
Über dieses kannst du dann iterieren.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Thomas O. schrieb:
> Wahrscheinlich ist der Fehler für ein paar von euch eh offensichtlich,
> aber ich habe vorher eigentlich nie programmiert und bin noch relativ
> unerfahren darin ;)

Ja.

G zeigt auf nichts. Du solltest Geraete als Array definieren, in
etwa so:
1
 struct Geraete Ger[] =
2
  { 0, "Testgeraet1",  "50",
3
    1, "Testgeraet2", "100",
4
    0, NULL, 0
5
  };

dann geht auch G = Ger[0].

von Thomas O. (osti93)


Lesenswert?

Danke :)

Werd ich gleich mal ausprobieren ;)

von Thomas O. (osti93)


Lesenswert?

Joachim Drechsel schrieb:
>
1
>  struct Geraete Ger[] =
2
>   { 0, "Testgeraet1",  "50",
3
>     1, "Testgeraet2", "100",
4
>     0, NULL, 0
5
>   };
6
>
>
> dann geht auch G = Ger[0].

und wie kann ich dann auf die Leistung zugreifen?

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

'tschullung, Tippfehler.

Es muß heißen: G = &Ger[0].

Zugriff: Ger[0].Geraetleistung

zB strcpy( Ger[0].Geraetleistung, "lau");

von Thomas O. (osti93)


Lesenswert?

Wenn ich dass jz so schreibe:

  struct Geraete
  {
     int Geraetenummer;
    char Name[50];
    unsigned char Geraetleistung[20];
  };

  struct Geraete Ger[] =
    {
    0, "Testgeraet1",  "50",
              1, "Testgeraet2", "100",
->(83)           0, NULL, 0
    };

kommt der Error:

ILOGS.c(83): error:  #144: a value of type "void *" cannot be used to 
initialize an entity of type "char"
ILOGS.c(83): error:  #29: expected an expression


und wenn ich das schreibe:

  G = &Ger[0];

kommt der Error:

ILOGS.c(370): error:  #513: a value of type "struct Geraete *" cannot be 
assigned to an entity of type "int *"


und wenn ich das mache:

}while (Leistung >= Ger[0].Geraeteleistung);

ILOGS.c(376): error:  #136: struct "Geraete" has no field 
"Geraeteleistung"

von pFFTh (Gast)


Lesenswert?

Thomas O. schrieb:
> unsigned char Geraetleistung[20];

Thomas O. schrieb:
> ILOGS.c(376): error:  #136: struct "Geraete" has no field
> "Geraeteleistung"

Jeder Buchstabe zählt.

von Thomas O. (osti93)


Lesenswert?

ah, danke ;)

von Karl H. (kbuchegg)


Lesenswert?

Was mir hier nicht gefällt
1
  struct Geraet
2
  {
3
     int Geraetenummer;
4
    char Name[50];
5
    unsigned char Geraetleistung[20];
6
  };

diese Struktur beschreibt nicht mehrere GeräteE, sondern 1 Gerät. Daher 
sollte man die Struktur auch so benennen!

Das mag dir jetzt lächerlich vorkommen, bei komplexeren Programmen sind 
solche Kleinigkeiten aber wichtige Hilfen, die dir dabei helfen, den 
Programmtext zu überblicken.

Ein Gerät hat eine Nummer - die Gerätenummer. Das es sich dabei um die 
Gerätenummer handelt ist implizit schon dadurch gegeben, dass die Nummer 
eben zu einem Gerät gehört. Du brauchst daher die Variable nicht 
Geraetenummer oder Geraeteleistung nennen. Der Namensteil "Geraet" ist 
schon dadurch ausgedrückt, dass beides Teil der Struktur "Geraet" sind.

1
struct Geraete
2
{
3
  int           Nummer;
4
  char          Name[50];
5
  unsigned char Leistung[20];
6
};

das reicht völlig. Denn wenn du ein konkretes Gerät hast

  struct Geraet Staubsauger;

dann hat dieser Staubsauger eine Nummer und eine Leistung

  Staubsauger.Nummer = 234;
  strcpy( Staubsauger.Leistung, "800 Watt" );

und du befreist dich damit von vieler Tipparbeit, die im Grunde nichts 
bringt.

(Und warum die Leistung ein Array of unsigned char sein soll, musst du 
mir auch erst mal erklären. Wenn etwas zumindest im Prinzip ein 
Zahlenwert ist, dann speichere den auch als Zahlenwert).

von Thomas O. (osti93)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Was mir hier nicht gefällt
>
>
1
> 
2
>   struct Geraete
3
>   {
4
>      int Geraetenummer;
5
>     char Name[50];
6
>     unsigned char Geraetleistung[20];
7
>   };
8
> 
9
>
>
> diese Struktur beschreibt nicht mehrere GeräteE, sondern 1 Gerät. Daher
> sollte man die Struktur auch so benennen!

ist schon umbenannt ;)

Danke

Könntest du mir vielleicht mit den anderen Errors auch helfen? ;)

von Karl H. (kbuchegg)


Lesenswert?

struct Geraete Ger[] =
    {
    0, "Testgeraet1",  "50",
              1, "Testgeraet2", "100",
->(83)           0, NULL, 0
    };


Du kannst hier nicht NULL nehmen!
Ein Array kann nicht NULL sein. Aber ein String kann leer sein


struct Geraet Geraete[] =
{
  {  0, "Testgeraet1",  "50" },
  {  1, "Testgeraet2", "100", },
  {  0, "", "" }
};

von Thomas O. (osti93)


Lesenswert?

Danke, jz is der Error auch weg ;)

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Du kannst hier nicht NULL nehmen!
> Ein Array kann nicht NULL sein. Aber ein String kann leer sein

Strenggenommen ja ...

Ich verwende solche Strukturen etwas anders.
1
struct Geraete
2
{
3
  int           Nummer;
4
  char          *Name;
5
  char          *Leistung;
6
};

Die Reservierung von Speicher in Form eines Array macht nur Sinn
wenn sich dessen Größe ändert.

von Thomas O. (osti93)


Lesenswert?

Das mit der Struktur dürfte bei mir jetzt passen:

  struct Geraet
  {
     int Geraetenummer;
    char Name[50];
    unsigned char Geraeteleistung[20];
  };

  struct Geraet Ger[] =
    {
    0, "Testgeraet1",  "50",
      1, "Testgeraet2", "100",
      0, "", ""
    };

Aber..

wenn ich das dann schreibe:

         G=&Ger[0].Geraetenummer;
->(371)  L=&Ger[0].Geraeteleistung;

         do{

         G++;

->(377)  }while (Leistung >= L);

kommt dieser Error:

ILOGS.c(371): error:  #513: a value of type "unsigned char (*)[20]" 
cannot be assigned to an entity of type "unsigned char *"
ILOGS.c(377): error:  #42: operand types are incompatible ("unsigned 
char" and "unsigned char *")


was ist der Unterschied überhaupt zwischen unsigned char und unsigned 
char *?

von Karl H. (kbuchegg)


Lesenswert?

Joachim Drechsel schrieb:

> Ich verwende solche Strukturen etwas anders.
>
>
1
> struct Geraete
2
> {
3
>   int           Nummer;
4
>   char          *Name;
5
>   char          *Leistung;
6
> };
7
>

Sreng genommen hast du hier aber auch kein Array mehr, sondern einen 
Ankerpunkt (den Pointer) an den du ein Array anhängen kannst.
(Im Sinne der Fähigkeiten des TO würde ich ihm allerdings davon abraten. 
Er hat schon genug mit anderen Dingen zu tun)

von Karl H. (kbuchegg)


Lesenswert?

Thomas O. schrieb:

> was ist der Unterschied überhaupt zwischen unsigned char und unsigned
> char *?


* Warum verwendest du Pointer, wenn du nicht weißt wie man mit ihnen
  arbeitet

* denkst du nicht, dass bei einer Abschlussarbeit für die du einen
  Befähigungsnachweis bekommst, es schon ein bischen spät ist, sich
  in die Grundlagen einzuarbeiten?



wenn du ein Array hast

  double  a[10];

und eine einzelne Variable;

  double k;

dann kannst du mit

  k = a[3];

dir eine Kopie des Wertes aus a (von einem bestimmten Element aus dem 
Arrays) nach k holen.

Das ist bei einer Struktur bzw. einem Array aus Strukturelementen auch 
nicht anders.

struct xy
{
  double x;
  double y;
}

struct xy Punkte[10];


Punkte ist ein komplettes Array von xy-Objekten. Ein einzelnes Element 
aus diesem kompletten Arrray wäre

   Punkte[3]

Das beschreibt also 1 Element aus den 10. Dieses 1 Element ist ein 
struct xy Objekt. Und als solches verfügt dieses eine xy-Objekt 
natürlich über einen x Member und einen y Member. Der x Member ist ein 
double und der y Member ist ein double.

D.h. man kann schreiben

  struct xy Mittelpunkt;     // ein komplettes xy Objekt

  xy = Punkte[3];     // Kopie des kompletten xy Objektes in
                      // die Variable Mittelpunkt ablegen

oder auch

  double mx;
  double my;

  mx = Punkte[3].x;
  my = Punkte[3].y;


Ist alles völlig logisch und folgt daraus, wenn man sich überlegt, was 
man durch die Schreibweise beschrieben hat
1
  Punkte         ist ein komplettes Array von xy Objekten
2
  Punkte[3]      ist ein spezifisches Objekt aus diesem Array
3
  Punkte[3].x    ist ein Member eines spezifischen Objektes aus dem Array

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:

> wenn du ein Array hast
>
>   double  a[10];
>
> und eine einzelne Variable;
>
>   double k;
>
> dann kannst du mit
>
>   k = a[3];
>
> dir eine Kopie des Wertes aus a (von einem bestimmten Element aus dem
> Arrays) nach k holen.

Der Adress Of Operator, liefert dir die Speicheradresse eines Objektes.

Wenn also
  a[3]
ein Element eines Array darstellt, dann ist

  &a[3]

die Adresse des Objektes, wo es im Speicher liegt.

DIese Adresse kann man nun hernehmen und in einer Variablen ablegen, die 
dazu geschaffen ist, Speicheradressen zu speichern - ein sog. Pointer

  double * AdrOfElement = &a[3];

Zusätzlich zu der Information, dass es sich bei AdrOfElement um eine 
Variable handelt, die eine Speicheradresse beinhaltet (ausgedrückt durch 
den *), hält AdrOfElement noch eine weitere Information. Nämlich, dass 
an dieser Stelle im Speicher in double Wert liegt.


Folgerichtig, kann man sich mittels

  struct xy * pMittelPkt;

eine Pointervariable einrichten, die auf ein struct xy Objekt zeigen 
kann.

  Punkte[3];

wäre so ein Objekt. Es besitzt, wie alles, eine Adresse im Speicher, 
welche man mittels

  &Punkte[3]

bekommt.
Und diese Adresse kann man in pMittelPkt ablegen lassen.

 pMittelPkt = &Punkte[3];


Man hat also so etwas gebaut

  pMittelPkt
  +------+                  Punkte
  |  o--------------+       +--------------+
  +------+          |       | x:           |
                    |       | y:           |
                    |       +--------------+
                    |       | x:           |
                    |       | y:           |
                    +------>+--------------+
                            | x:           |
                            | y:           |
                            +--------------+
                            | x:           |
                            .              .
                            .              .

pMittelPkt ist NICHT das struct xy Objekt selber. Es ist ein Verweis auf 
ein struct xy Objekt. Und dieses Objekt steckt seinerseits im Array.

Die Adressierung zb des x Members über diesen Pointer würde so aussehen


  pMittelPkt                der Pointer
  *pMittelPkt               das Objekt, auf welches pMittelPkt zeigt
                            also das struct xy Objekt
  (*pMittelPkt).x           von diesem Objekt der x Member

Da man diese Operation aber häufig braucht und die Schriebweise mit den 
Klammern Tippaufwand bedeutet, gibt es eine alternative Syntax

  pMittelPkt->x             der x Member des Objektes, auf welches
                            pMittelPkt zeigt.

Sieh es im Kontext der Zeichnung so an

  pMittelPkt               suche das Kästchen über dem pMittelPkt steht
  pMittelPkt->             von dort geht ein Pfeil aus, folge dem Pfeil
  pMittelPkt->y            der Pfeil endet bei einem Kästchen, in dem
                           es einen y Member geben muss. Nimm den Wert
                           von diesem y Member.

von meine fresse (Gast)


Lesenswert?

Hat da vielleicht jemand darüber nachgedacht, zunächst die Anforderungen 
an das "Werk" zu formulieren? Und zwar möglichst genau, damit die 
Kollegen zumindest selbst begreifen, WAS sie erreichen wollen. Dann 
könnte man nämlich bei WIE helfen. Einzelne Kompilerfehler zu 
"unterdrücken" hilft da recht wenig.

von Karl H. (kbuchegg)


Lesenswert?

meine fresse schrieb:
> Hat da vielleicht jemand darüber nachgedacht, zunächst die Anforderungen
> an das "Werk" zu formulieren?

Ich denke, so weit sind sie noch lange nicht.

Es ist das klassische 'Ich hab mich in meinen Fähigkeiten übernommen' 
Syndrom.
Warum man sich das immer wieder antut, eine Abschlussarbeit in einem 
Themenkreis zu suchen, von dem man wenig bis keine Ahnung hat und erst 
mal Grundagen durcharbeiten müsste, wird mir auf ewig ein Rätsel 
bleiben. Ich wähl mir für einen Abschluss ja auch kein Thema, welches 
die fehlerfreie Ausführung einer Blinddarm Operation erfordert, wenn ich 
noch nie ein Skalpell in der Hand hatte und ich mit Ach und Krach gerade 
mal ein Pflaster richtig anbringen kann.

Was das alles mit einer richtigen relationalen Datenbank geworden wäre, 
darüber will ich lieber erst gar nicht nachdenken. Da ist sicherer 
Umgang mit Pointern und/oder Strings mehr oder weniger Pflicht. Sonst 
kannst du dir gleich die Kugel geben.

So haben sie wenigstens die Chance etwa funktionierendes auf die Beine 
zu stellen, wenn auch die Performance leiden wird. Aber lieber ein 
langsameres Programm das funktioniert, als ein Superschnelles welches 
falsche Ergebnisse bringt.

> Einzelne Kompilerfehler zu "unterdrücken" hilft da recht wenig.

Dem stimme ich allerdings uneingeschränkt zu.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Zu wissen an welchem Ende des Schraubenziehers es weh tut, reicht
auch nicht, einen Motor instandzusetzen.

Ohne irgendwelche Grundlagen und einiges an Erfahrung kann das nichts
werden, schom gar keine Abschlußarbeit.

von Sven H. (dsb_sven)


Lesenswert?

Irgendwann, während meines Studiums, haben wir auch mal verkettete 
Listen in C programmiert. Wenn du also nicht weißt, wieviele Geräte es 
mal gibt und das dynamisch handhaben möchtest, solltest du mal Google 
nach "c list" (oder äahnlich) befragen.

btw.: Was macht eigentlich der Gerät?

von Robert L. (lrlr)


Lesenswert?


von meine fresse (Gast)


Lesenswert?

Ich befürchte, dass die eigentliche Herausforderung in einer anderen 
Dimension liegt. Noch vor den Grundlagen fehlt die Methode! Das ist doch 
völlig unerheblich, was genau für ein Problem zu lösen gilt... sei es 
auch "Ausführung einer Blinddarm Operation" :) Die Entwicklung bewegt 
sich noch auf dem Niveau "ich möchte einem Patienten Blinddarm rein 
laparoskopisch übers Ohr entfernen... bin aber unentschieden, ob ich 
übers linke oder rechte Ohr gehen soll!" Bei der Absurdität der 
Fragestellung haben sie keine Chance, egal wie fleißig geholfen wird.

Man fängt am besten klein an, nämlich die exakte Bedeutung der Begriffe 
zu lernen und die Zusammenhänge zu merken... Das absolute Minimum für 
die ursprüngliche Fragestellung wäre:

Programmiersprachen
- Was ist eine imperative Sprache (wie z.B. assembler oder C)? Welche 
Sprachen gibt es noch und wofür sie gut/schlecht sind? (Da kommt die 
erste Überraschung: obwohl SQL tatsächlich meistens in C implementiert 
wird, verhalten sich diese Sprachen zueinander etwas anderes, als z.B. C 
zum assembler... :)
- Was ist / wie funktioniert ein Prozessor?
- Welche Speicherarten gibt es / wie sie funktionieren?
- Was sind (in einer imperativen highlevel-Sprache wie C) eine Variable, 
eine Struktur und ein Zeiger? Was bedeutet zuweisen - referenzieren - 
dereferenzieren - vergleichen?
- Was bedeutet char[] (wie genau funktionieren die Zeichenketten)?
- Was ist ein Aufruf, eine Routine? Wie Funktioniert das?

Algorithmen und Datenstrukturen
- Was ist eine Datenstruktur? Welche Datenstrukturen gibt es und wofür 
sie geeignet/ungeeignet sind? Wie und wofür platziert man die 
Daten(strukturen) im Speicher?
- Wie / mit welchen Algorithmen verwaltet man die Daten im Speicher 
(einfügen/entfernen/suchen)?
- Was ist eine Datenbank und insb. eine relationale Datenbank?
- Was ist *QL (z.B. SQL)? Was ist DDL?
- Was ist eine DB-Engine / ein DB-Server (z.B. SQLite oder mySQL)? Wie 
funktioniert das? Was bedeutet "eine Verbindung erstellen", "eine 
Datenbank erstellen" etc. pp.?
- Was sind: Mengen/Relationen, was sind: Tabellen  Schlüssel  Indexe / 
Sequenzen, was sind: Queries  Resultsets  Views?

Elektronik
- Was ist eine Anzeige?
- Was ist ein Touchscreen? Wie funktioniert das?
- Wie wird es angesteuert / ausgewertet?
(Bloß damit man versteht, was bedeutet "die Datenbank wird vom 
Touchscreen umgeschrieben")

(Software)entwicklung allgemein
- Was ist ein System / Subsystem?
- Was ist eine funktionale / nichtfunktionale Anforderung? Wie und wofür 
erhebt / systematisiert man die Anforderungen?
- Was sind die Spezifikationen / Randbedingungen?
- Wie konzipiert man die Systeme, wie geht man mit der Komplexität um?
- Was ist ein Interface (eine Konvention  ein Protokoll  API)?
- Wie teilt man die Entwicklung einzelner Teile zwischen mehreren 
Entwickler auf?

Ich nehme an, man sollte zumindest davon mal gehört haben, bevor man 
eine solche Abschlussarbeit schreibt, oder?.. Und das macht auch extrem 
viel Sinn, da erst wenn man mit den "Kleinigkeiten" soweit ist, kann man 
das Problem überhaupt analysieren (in die Einzelteile zerlegen) und 
reflektieren (was davon habe/kenne/kann ich, und was nicht). Erst dann 
ist einer in der Lage Fragen zu stellen, die ihn tatsächlich weiter (zur 
Synthese der Lösung) bringen.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Ohne diese Grundkenntnisse reicht das bestenfalls für ein Diplom in Jura 
...

Ich kann nur aus eigener Erfahrung sagen, man lernt C nicht in 2 Wochen.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

meine fresse schrieb:
> "ich möchte einem Patienten Blinddarm rein
> laparoskopisch übers Ohr entfernen... bin aber unentschieden, ob ich
> übers linke oder rechte Ohr gehen soll!"

ist auf jeden Fall mal ein innovativer Ansatz, das sollte man 
konzeptionell weiter ausarbeiten ;-)

von guenther (Gast)


Lesenswert?

meine fresse schrieb:
> Ich befürchte, dass die eigentliche Herausforderung in einer anderen
> Dimension liegt. Noch vor den Grundlagen fehlt die Methode! ...
>
> ... Ich nehme an, man sollte zumindest davon mal gehört haben, bevor man
> eine solche Abschlussarbeit schreibt, oder?.. Und das macht auch extrem
> viel Sinn, da erst wenn man mit den "Kleinigkeiten" soweit ist, kann man
> das Problem überhaupt analysieren (in die Einzelteile zerlegen) und
> reflektieren (was davon habe/kenne/kann ich, und was nicht). Erst dann
> ist einer in der Lage Fragen zu stellen, die ihn tatsächlich weiter (zur
> Synthese der Lösung) bringen.

Ja, traurig und wahr. Aber heutzutage gibt es doch für alles 
Codeschnipsel "in Google". Also schnell den ganzen Schund 
"zusammenguttenbergen", den eigenen Namen reinschreiben und ein Diplom 
dafür kassieren.

Am erschreckensten empfinde ich jedoch den Umstand, das diese 
"Möchtegern-1337-programmierer" tatsächlich in der freien Wirtschaft 
unterkommen und es oftmals Jahre dauert, bis das gesamte Ausmass deren 
Unfähigkeit "demaskiert" wird. Vermutlich weil Personaler und 
Vorgesetzte auf ähnliche Weise an ihre "Qualifikation" gelangt sind.

Etwas Gutes hat die Situation jedoch: Der auf vielen Dingen angebrachte 
Hinweis "Made in Germany" erfüllt nunmehr wieder die ihm damals von den 
Inselbewohnern zugedachte Funktion als Warnung vor von hirnentkernten 
Diplomdeppen zusammengeschlonztes Bastelkram, garantiert unausgegoren, 
unerprobt, ständig funktionsgestört, mit idiotischen Bedienkonzept, ... 
aber dafür hoffnungslos überteuert!

Gruß,
Günni

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

guenther schrieb:
> Etwas Gutes hat die Situation jedoch: Der auf vielen Dingen angebrachte
> Hinweis "Made in Germany" erfüllt nunmehr wieder die ihm damals von den
> Inselbewohnern zugedachte Funktion als Warnung vor von hirnentkernten
> Diplomdeppen zusammengeschlonztes Bastelkram, garantiert unausgegoren,
> unerprobt, ständig funktionsgestört, mit idiotischen Bedienkonzept, ...
> aber dafür hoffnungslos überteuert!

Daseinszweck einer Firma ist Geld verdienen, nicht technischer
Fortschritt. Zumindest mittlerweile ...

von Robert L. (lrlr)


Lesenswert?

>ob ich
>übers linke oder rechte Ohr gehen soll!"


das trifft es zu 110% ...


dazu kommt dann noch, dass sie bereits das Skalpell in der Hand haben, 
und schon mal ein paar Probeschnitte gemacht haben..

von Thomas (Gast)


Lesenswert?

Joachim Drechsel schrieb:
> Ich kann nur aus eigener Erfahrung sagen, man lernt C nicht in 2 Wochen.

"Lernen" geht sich schon aus. Beherrschen braucht ein wenig länger...
Auf Pointerarithmetik sollte man zu Beginn eher verzichten.

Im Allgemeinen bin ich positiv überrascht wie hilfreich hier geantwortet 
wird. Ich wäre schon ein wenig stinkig, wenn hier jemand C vorgekaut 
haben will anstatt dass er sich selbst ein wenig einliest, oder gar im 
Unterricht besser aufpasst.

Das erinnert mich an meine HTL-Zeit wo im Zweig "Betriebsinformatik" 
nach der Matura gerade einmal 15% ein Programm schreiben konnten das 
etwas über "Hello World" hinausging.

von Seltener Gast (Gast)


Lesenswert?

meine fresse schrieb

> Ich befürchte, dass die eigentliche Herausforderung in einer anderen
> Dimension liegt.

Vielen Dank für diese ausführliche Abhandlung! Du sprichst mir aus der 
Seele.

Ich persönlich beschäftige mich seit meiner Jugend (ursprünglich nur 
hobbymäßig) mit Elektronik und Hard-/Softwareentwicklung. Ich habe in 
diesen Bereichen keinerlei Ausbildungen absolviert.

Dennoch ergaben sich im Laufe meiner "Arbeit" die von dir beschriebenen 
Dinge wie von selbst. Ich programmierte z.B. meine erste verkettete 
Liste für einen Z80-Prozessor zu einer Zeit, als ich den Begriff 
"verkettete Liste" noch gar nicht kannte - das Prinzip ergab sich 
einfach aus meiner Aufgabenstellung.

Natürlich kam ich auch damals schon von selbst auf die Idee, mir das 
eine oder andere Fachbuch zuzulegen - auch wenn das für mich ein 
ziemlich teurer Spaß war und sich einmal sogar ein Buchhändler sehr 
darüber wunderte, warum sich so ein Jüngling wie ich (ich war da wohl 
ca. 13 Jahre alt) ein (nicht gerade billiges) Buch über 
Zeitzeichen-Empfänger zulegte.

Mir ist bis heute immer klar, welche Art von Mitteln für einen gegebenen 
Zweck geeignet ist, und ich schieße nie "mit Kanonen auf Spatzen".

Daher wundere ich mich, warum heute viele Menschen, welche eine passende 
Ausbildung abschließen oder abgeschlossen haben, diese Fähigkeiten, die 
ich ganz ohne Ausbildung besitze, nicht haben.

Ein Aspekt dieser Tatsache ist auch, dass heutzutage offenbar sogar 
Technikstudenten Nachhilfeunterricht benötigen, den sie dann unter 
anderem von mir (für ziemlich viel Geld) bekommen. Es ist doch irgendwie 
witzig, dass ich (ohne irgendeine technische Ausbildung zu haben) 
Studenten in vielen Bereichen der Elektronik, der Informatik und sogar 
der höheren Mathematik bestens unterstützen kann.

Auch wenn ich eine Menge Kritik an die Ausbildungsanstalten zu richten 
hätte (z.B. die extreme Praxisferne mancher Studiengänge), frage ich 
mich dennoch, nach welchen Kriterien Menschen heutzutage ihre 
Ausbildungen auswählen. Ich stelle nämlich immer wieder fest, dass sich 
selbst Studenten für die von ihnen gewählte Studienrichtung in Wahrheit 
gar nicht interessieren. Da ist doch irgendetwas faul ...

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Seltener Gast schrieb:
> Da ist doch irgendetwas faul ...

der Student?

von Thomas (Gast)


Lesenswert?

Seltener Gast schrieb:
> Ich persönlich beschäftige mich seit meiner Jugend (ursprünglich nur
> hobbymäßig) mit Elektronik und Hard-/Softwareentwicklung. Ich habe in
> diesen Bereichen keinerlei Ausbildungen absolviert.

Jeder kompetente Hard-/Softwareentwickler den ich kenne hat so 
angefangen und seine Fähigkeiten später mit entsprechender Ausbildung 
verfeinert. Ohne eigenen Interesse geht es nicht.

Man sollte ein vernünftiges Informatik-/Elektronikstudium nicht 
unterschätzen. Selbst wenn man vorher meint, schon recht gut unterwegs 
zu sein und auch ohne weiteres produktiv arbeiten kann, bekommt man doch 
einen ganz anderen Einblick in die Thematik die einem als Autodidakt nur 
sehr schwer zugänglich ist. ZB kenne ich keinen Analogdesigner für 
integrierte Schaltungen der ohne Studium ausgekommen ist. Wie auch, wenn 
die Tools im 6-stelligen Eurobereich anfangen?

Allerdings gibt es auch genügend Studenten die sich irgendwie 
durchmogeln. Da wundert es mich dann nicht, dass selbst jemand ohne 
entsprechende Ausbildung mehr Plan von der Materie hat.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.