Forum: Mikrocontroller und Digitale Elektronik c code struct von struct ableiten und elemente mindern


von c schüler (Gast)


Lesenswert?

hi,

bevor ich die verketteten listen angehe, habe ich noch eine 
verständisfrage zu struct, da mir das thema anscheinend nicht in meinen
büchern vorkommt, aber mich interessieren würde, ob das möglich ist und 
wie der ansatz wäre:
1
// basis struct;
2
3
struct buch {
4
  int nr;
5
  unsigned char titel[31]={0};
6
  int ablage;
7
8
};
9
10
11
// explizite definition
12
// neue struct aber ohne element ablage
13
14
struct heft {
15
  int nr;
16
  unsigned char titel[31]={0};
17
};

kann man die neue struct von der basis auch ableiten und um das element 
ablage mindern oder geht das nur mit der expliziten definition.

danke!

von Bibliothekar (Gast)


Lesenswert?

Das Thema kommt in den C++ Büchern vor.

von Karl H. (kbuchegg)


Lesenswert?

c schüler schrieb:

> kann man die neue struct von der basis auch ableiten

in C kannst du nichts 'ableiten'.

Maximal kannst du sowas machen
1
struct heft {
2
  int nr;
3
  unsigned char titel[31]={0};
4
};
5
6
struct buch {
7
  struct heft basis;
8
  int         ablage;
9
10
};

ein Buch enthält dann ein Heft als eigenen Member und ergänzt das dann 
um weitere Elemente.

von c schüler (Gast)


Lesenswert?

Karl H. schrieb:
> c schüler schrieb:
>
>> kann man die neue struct von der basis auch ableiten
>
> in C kannst du nichts 'ableiten'.
>
> Maximal kannst du sowas machen

vielen dank Karl Heinz, soetwas hab ich mir gedacht, ich wollte sicher
gehen. jetzt gehts an die listen - bin schon richtig 'wild' drauf das 
thema
endlich angehen zu können, basis und string funktionen sitzen
einigermassen, ich freu mich schon richtig drauf ;-)

von Karl H. (kbuchegg)


Lesenswert?

c schüler schrieb:
> Karl H. schrieb:
>> c schüler schrieb:
>>
>>> kann man die neue struct von der basis auch ableiten
>>
>> in C kannst du nichts 'ableiten'.
>>
>> Maximal kannst du sowas machen
>
> vielen dank Karl Heinz, soetwas hab ich mir gedacht, ich wollte sicher
> gehen. jetzt gehts an die listen - bin schon richtig 'wild' drauf das
> thema

viel Erfolg.

Fang mit der Funktion an, die eine Liste ausgeben kann. Die wirst du 
ständig brauchen um zu kontrollieren, ob das was du geschrieben hast 
auch ein korrektes Ergebnis bringt.

von c schüler (Gast)


Lesenswert?

Karl H. schrieb:
> viel Erfolg.

danke, ich werde mich bemühen!

>
> Fang mit der Funktion an, die eine Liste ausgeben kann.

oki, hab mein taschenbuch und recherchen hier aus dem forum dabei und 
hab mir das thema für heute abend und das ganze wochenende eingeplant.
ich rühr mich wieder ;-) danke!!

von c-hater (Gast)


Lesenswert?

Karl H. schrieb:

> in C kannst du nichts 'ableiten'.

Naja, es heißt dort nicht so, macht aber im Prinzip bezüglich der Felder 
letztlich natürlich ganz genau das Gleiche. Der Unterschied ist rein 
syntaktisch. Und natürlich der, daß richtige Sprachen typischerweise 
dann die Zuweisungskompatibilität zwischen solchen Dingern automatisch 
prüfen können.

Der springende Punkt ist meiner Ansicht nach aber sowieso eher, daß der 
TO auch OO nicht beherrscht, sonst wäre er wenigstens auf den 
naheliegenden Ansatz gekommen, sein Problem mal "umzudrehen" und wäre 
dann in der Folge vielleicht sogar allein auf die Idee gekommen, wie man 
den Sachverhalt in C hätte abbilden können...

von c schüler (Gast)


Lesenswert?

c-hater schrieb:
> Der springende Punkt ist meiner Ansicht nach aber sowieso eher, daß der
> TO auch OO nicht beherrscht, ..

da muss ich dir aber 'vielversprechend' widersprechen,
da ich dabei bin c ( ohne OO ) mir beizubringen und ich es nicht sicher 
wusste, wollte ich lediglich sicher gehen, ob man eben das in reinen c 
nicht kann, nicht mehr und nicht weniger. jetzt bin ich mir sicher und 
ich kann weitermachen ;-) nice weekend!

von c schüler (Gast)


Lesenswert?

btw:
für den fall, dass ich oder andere oder du c-hater auch c mit OO lernen 
will, dann habe ich den tip : http://www.cs.rit.edu/~ats/books/ooc.pdf
Oh Oh -

ich habe meine antwort erhalten. ein 'überladen' ist in reinem c nicht 
möglich. das wollte ich wissen.

von c-hater (Gast)


Lesenswert?

c schüler schrieb:

> da muss ich dir aber 'vielversprechend' widersprechen,

Ach ja? Wie versteckst du denn in meinetwegen Java, C# ,VB.net ,Delphi 
(oder was auch immer) Felder von Vorfahr-Klassen (respektive 
-Strukturen) beim Erben?

Bitte konkretes Beispiel!

von c schüler (Gast)


Lesenswert?

c-hater schrieb:
> Ach ja? Wie versteckst du denn in meinetwegen Java, C# ,VB.net ,Delphi
> (oder was auch immer) Felder von Vorfahr-Klassen (respektive
> -Strukturen) beim Erben?
>
> Bitte konkretes Beispiel!

neue frage - neuer thread ;-)
ich helf dir dann gerne wenn du nicht weiterkommst.
;-)

von c schüler (Gast)


Lesenswert?

c-hater schrieb:
> Bitte konkretes Beispiel!

obs was bringt?
;-)
1
type
2
 TForummitglied = class(TMensch) 
3
private
4
   Fnervig: Boolean;
5
   Fhelfend: Boolean;
6
 public
7
   procedure LobPunkte;
8
 end;
9
10
 TCHater = class(TForummitglied)
11
 private
12
   FPunktestand: integer; // reicht vollkommend
13
 public
14
   procedure LobPunkte;
15
 end;

- die deklaration von LobPunkte class TCHater verbirgt die der 
TForummitglieder..
- aufruf der instanz in TCHater wird anstatt der TForummitglieder die 
des TCHater ausgeführt
- die gilt auch nur für TChater und deren 'ableitungen'
btw:
namen müssen gleich sein, die paras unterschiedlich

was jetzt in der expliziten procedure für TCHater steht kannst dir ja 
ausmalen - nur punkteabzuege ;-)

falls man TCHater 'begnadigt' und keine andere punktebewertungen die nur 
negative abzüge machen, kann man ausnahmsweise auch mal punkte vergeben 
mit
1
inherited LobPunkte;

das hebt dann die 'negative' vergaben auf. sozusagen:
wird 'inherited' in der 'neuen' dann eingesetzt, 'versteckte'  geerbte 
auszuführen..

alles klar?
;-)

..und weg.

von c-hater (Gast)


Lesenswert?

c schüler schrieb:

> [code]
>
> type
>  TForummitglied = class(TMensch)

Aha, Delphi, respective Turbo-Pascal. Kann ich auch.

> private
>    Fnervig: Boolean;
>    Fhelfend: Boolean;
>  public
>    procedure LobPunkte;
>  end;

>  TCHater = class(TForummitglied)
>  private
>    FPunktestand: integer; // reicht vollkommend
>  public
>    procedure LobPunkte;
>  end;

Völliger Schwachsinn, weit weg vom Thema, denn keine der beiden Klassen 
erbt von der anderen.

Du bist definitiv ein völlig unwissender Vollidiot. Aber das jetzt 
wenigstens nachgewiesenermaßen. Du selbst hast es öffentlich gemacht. 
Soll ich dir ein Diplom ausstellen?

von c schüler (Gast)


Lesenswert?

c-hater schrieb:

> Aha, Delphi, respective Turbo-Pascal. Kann ich auch.

sieht nicht anscheinend nicht so aus.

> Du bist definitiv ein völlig unwissender Vollidiot.

den geb ich dir dir gerne wieder zurück und kannst dir dann einrahmen.

> Soll ich dir ein Diplom ausstellen?

daszu fehlt dir der titel,

soll ich dir eins ausstellen?

;-)

von c schüler (Gast)


Lesenswert?

zur info:

deine class wird von der mitglieder class abgeleitet
deine lobpunkte prozedure wird aber nicht mitgeerbt
und hat eine eigene. genau wie deine eigenheit.
jedem das seine.

setz dich lieber noch mal hin und überlege
die paar zeilen, bevor du dich zum affen machst.
soviel code ist das nicht.

von c schüler (Gast)


Lesenswert?

c schüler schrieb:
> c-hater schrieb:
>> Bitte konkretes Beispiel!
>
> obs was bringt?

nein bei dir hat es leider nichts gebracht.
daher bleibts bei deiner eigenen proc.
und inherited wird gelöscht.

von c-hater (Gast)


Lesenswert?

c schüler schrieb:

> deine lobpunkte prozedure wird aber nicht mitgeerbt

Nur ist eine procedure kein Feld. Und du hast außerdem nicht gezeigt, 
wie du einen Member versteckst, du hast ihn nur durch einen anderen, 
gleichnamigen ersetzt und das auch nur dann, wenn man explizit auf den 
Erben zugreift. Aber dank der Zuweisungskompatibilität kann ich auch auf 
den Vorfahren von außen zugreifen, sogar ein laufzeitgeprüftes 
"(TForumsmitglied-instance as TMensch).Lobpunkte" liefert dann den 
wahren Kern der Sache.

Übrigens hast du ein Schlüsselwort vergessen, um die Compilerwarnung ob 
des dem OO-Paradigma widersprechenden Codierstils zu unterdrücken, bei 
Delphi wäre das übrigens 'reintroduce' gewesen...

von c schüler (Gast)


Lesenswert?

c-hater schrieb:
> c schüler schrieb:
>

ha ha ha
google und dein freund und helfer
erinnerungen jetzt wach? doch kein käse mehr?

lies mal deinen beitrag zuvor
da warst dir noch sicher dass ich ein unwissender vollidiot bin
und nichts geerbt wird ;-)

da hast dich jetzt schon selber öffentlcih bekanntgemacht ;-)

ha ha ha .

hab ich dich jetzt auf meinem 'niveau'
und kann dich mit meiner 'dummheit' erschlagen?
oder warum kommunizierst du mit einem 'vollidioten'
wenn es käse ist?

das beispiel kannst du sowohl in proc, fkt und var anwenden,
wenn namensgleichheit gilt die neue - ansonsten kannst du auf die 
geerbte zugreifen ...

dann greif mal von aussen zu und erhöhe deinen punktestand- der steht 
bei
-254 und denk dran ist nur integer ;-)


c-hater, ich hab für den schwachsinn keine zeit, wenn du ernsthaft 
nichts weisst wie du das machen musst, dann frage halt im forum konkret.
meine frage wurde beantwortet. alles gute beim weitergooglen.

von Fischer (Gast)


Lesenswert?

Hab ich noch über:
<°))))))))<

Zur eigentlichen Frage:
Hast Du denn schon pointer in C verwendet ?
Wie verkettest Du denn Deine Liste ?
Pseudoerben via struct hat ja KH schon gezeigt, nur gibt's in C keine 
container oder classes ...

von c schüler (Gast)


Lesenswert?

c-hater schrieb:
> c schüler schrieb:

..
> "(TForumsmitglied-instance as TMensch).Lobpunkte" liefert dann ..

hinweis:

LobPunkte ist eine prozedure und kann nichts liefern
es führt etwas aus - liefert aber nicht.

Fischer schrieb:

> Zur eigentlichen Frage:
> Hast Du denn schon pointer in C verwendet ?
denke

> Wie verkettest Du denn Deine Liste ?
wohl mit einem pointer

bevor die frage aufkommt Fischer :

wie gebe ich die liste aus?
mit einem hilfspointer.
warum?
das kannnst dir ja mal überlegen.

jungs ich hab für eure "h"[w]itzigkeit keine zeit.
ehrlich -

> Pseudoerben via struct hat ja KH schon gezeigt, nur gibt's in C keine
> container oder classes ...

und "whats the point of this?"

..

von Fischer (Gast)


Lesenswert?

c schüler schrieb:
> jungs ich hab für eure "h"[w]itzigkeit keine zeit.
> ehrlich -
>

Dafür antwortest Du aber brav :-P

>> Pseudoerben via struct hat ja KH schon gezeigt, nur gibt's in C keine
>> container oder classes ...
>
> und "whats the point of this?"
>
> ..

Ja dann überlege mal selber was einfacher ist std::irgendwas zu nehmen 
oder selber festzustellen das NULL-Pointer schon problematisch werden 
können ...
Und wie machst Du das mit dem Hilfspointer ?

von c schüler (Gast)


Lesenswert?

tut leid Fischer, hab deine fragen falsch interpretiert,

listen sind soweit klar, die frage war deswegen, ob ich für die ausgabe 
'später' dann eine eigene func schreiben soll, die eine 'stringliste' 
bearbeitet, dann stören die pointer in der späteren datei, ( struct 
speichern ) oder ob ich einfach eine neue struct aus der alten anlege 
und die pointer lösche, das geht ja nicht.
daher wird dann die datei über ein struct array dynamisch zur laufzeit 
erzeugt und nur die daten darin vom terminal übertragen und 
abgespeichert, später dann auch eingelesen über den gleichen weg.

mein ansatz in etwa : ( ungeprüft )
1
// struct zum späteren speichern und lesen in eine datei
2
struct daten {
3
 int id;
4
 ..
5
}
6
7
// struct für das erfassen, löschen, editieren, einfügen, ergänzen..
8
9
struct terminal {
10
struct daten work;
11
 struct terminal *prev;
12
 struct terminal *next;
13
 struct terminal *fisrt; // muss ich noch mal überlegen sinn, unsinn
14
 struct terminal *last;  //  "
15
}
16
17
18
typedef struct terminal Terminal_t;
19
typedef struct terminal* TerminalPtr_t;
20
TerminalPtr_t startpoint = NULL;
21
22
..
23
..
24
25
void neuTerminal( TerminalPtr_t neu ) {
26
27
TerminalPtr_t helpPtr;
28
if( startpoint == NULL ) {
29
  startpoint = neu;
30
  neu->next  = Null;
31
  ..
32
  }
33
  else {
34
  helpPtr = startpoint;
35
  while( helpPtr->next != NULL ) {
36
    helpPtr = helpPtr->next;
37
    }
38
  helpPtr->next = neu;
39
  neu->next = NULL;
40
  }
41
}
42
43
..
44
// usw

denke ich bekomme das hin, wenn nicht, weiss ich ja wo ich fragen werde 
;-)
txs

von c schüler (Gast)


Lesenswert?

alles klar?

;-)

Karl Heinz ist der teacher!
und für mich der allerbeste!

wegen hilfspointer,weil du das nicht weisst
oder wolltest du das wissen wie ich das mache?
hoffe der ansatz passt in etwa mal.
ich will noch eine idx in den daten haben
aber über eine weitere datei, mit fremdschlüssel
denke dann kann ich die suche auf ein minimum
reduzieren und das resultat direkt über die
datei abrufen.

nein- sqlite kommt nicht in die tüte.
selbst gemacht schmeckt besser und
deckt sich mit der anforderung.

;-)

von Fischer (Gast)


Lesenswert?

Hab mal kurz gesucht und empfehle Dir das mal durchzulesen:
http://perlgeek.de/de/artikel/doppelt-verkettete-listen
Ob das Datum innerhalb Deiner Liste ein int ist oder ein struct bleibt 
sich gleich.
Wenn Du schon "first" und "last" definieren willst kannst Du auch gleich 
einen Baum nehmen der sich selber verwaltet, B-Baum oder B+-Baum.
Das sind die Strukturen die idR bei Filesystemen zum Einsatz kommen da 
der Suchpfad genormt ist.
Ich hab hier im Regal noch den alten "Ottmann/Widmayer: Algorithmen und 
Datenstrukturen" rumstehen da sind einige Dinge gut erklärt, B-Bäume 
gehören dazu.
Du kannst aber auch eine einfach verkettete Liste nehmen und da dann 
"first" und "last" definieren um nicht im Nirvana zu landen.
C++ ist allerdings mächtiger und hat schon passende Container in std:: 
...

von c schüler (Gast)


Lesenswert?

Fischer schrieb:
> Hab mal kurz gesucht und empfehle Dir ..

vielen dank! das mache ich.

> Wenn Du schon "first" und "last" definieren willst kannst Du auch gleich
> einen Baum nehmen der sich selber verwaltet, B-Baum oder B+-Baum.

ok - bin aber ehrlich, soweit bin ich noch nicht in c das kommt später 
bei den algo 'binäre bäume' - hab mal vorgeblättert.

> C++ ist allerdings mächtiger und hat schon passende Container in std::
> ...

c++ ist aber kein c ;-) hust

damit hatte ich mal geliebäugelt:
http://www2.pmf.fh-goettingen.de/~isimon/OOPinC.php

ich schreib nochmal wenn ich den ersten testlauf gemacht habe.
eckt bestimmt noch hier und da  ;-)

danke dir!
nice weekend!

von Fischer (Gast)


Lesenswert?

c schüler schrieb:
> Fischer schrieb:
>> Hab mal kurz gesucht und empfehle Dir ..
>
> vielen dank! das mache ich.
>
>> Wenn Du schon "first" und "last" definieren willst kannst Du auch gleich
>> einen Baum nehmen der sich selber verwaltet, B-Baum oder B+-Baum.
>
> ok - bin aber ehrlich, soweit bin ich noch nicht in c das kommt später
> bei den algo 'binäre bäume' - hab mal vorgeblättert.
>
>> C++ ist allerdings mächtiger und hat schon passende Container in std::
>> ...
>
> c++ ist aber kein c ;-) *hust*
>
> damit hatte ich mal geliebäugelt:
> http://www2.pmf.fh-goettingen.de/~isimon/OOPinC.php
>
> ich schreib nochmal wenn ich den ersten testlauf gemacht habe.
> eckt bestimmt noch hier und da  ;-)
>
> danke dir!
> nice weekend!

Da im Grunde genommen Klassen in C++ nix anderes als Pointer sind kann 
man das so versuchen, in ObjectPascal wird das ja so auch gemacht.
Nur ist das kein C++ und Du hast nicht die ganze Mächtigkeit davon.
Bastel erstmal Deine LinkedList und dann kannst Du mit void pointern 
rumspielen.
Da gibt's aber noch das eine oder andere was zu beachten wäre bei void* 
o_O

von Rolf M. (rmagnus)


Lesenswert?

Fischer schrieb:
> Da im Grunde genommen Klassen in C++ nix anderes als Pointer sind

Äh, nein.
Und der Code aus dem Link oben ist furchtbar.
1
typedef struct
2
{
3
void* this;
4
int iVal;
5
void* (*pSetVal)(void*this, intiNewVal);
6
} tMyStruct;

Das erste Strukturelement ist also ein Zeiger, der auf sich selbst 
zeigt, also komplett überflüssig. Ensptrechend wird dieser Zeiger in dem 
Programm übrigens später auch nirgends verwendet.
1
void* SetVal(void* this, int iNewVal) { memset( this+4, iNewVal, 1); }

Ugh! Kopieren einer simplen Variable mit memset, dann auch noch von Hand 
hingeschriebene "magische" Offsets, die einem auf einem AVR oder auf 
einem 64-Bit-Prozessor um die Ohren fliegen, oder auch, wenn man nur die 
Reihenfolge der Members tauscht. Falsch ist es auch noch, weil nur ein 
Byte ins Ziel geschrieben wird. Überall werden die Typ-unsicheren void* 
verwendet und die dann eigentlich nötigen Casts kunstvoll umschifft.

Mit OOP hat das übrigens auch nichts zu tun. Es ist einfach nur eine 
Möglichkeit, etwas in C viel komplizierter und fehlerträchtiger 
hinzuschreiben, als man müßte.

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.