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
structbuch{
4
intnr;
5
unsignedchartitel[31]={0};
6
intablage;
7
8
};
9
10
11
// explizite definition
12
// neue struct aber ohne element ablage
13
14
structheft{
15
intnr;
16
unsignedchartitel[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!
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 ;-)
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.
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!!
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...
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!
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.
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!
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.
;-)
- 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.
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?
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?
;-)
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.
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.
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...
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.
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 ...
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?"
..
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 ?
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
structdaten{
3
intid;
4
..
5
}
6
7
// struct für das erfassen, löschen, editieren, einfügen, ergänzen..
8
9
structterminal{
10
structdatenwork;
11
structterminal*prev;
12
structterminal*next;
13
structterminal*fisrt;// muss ich noch mal überlegen sinn, unsinn
14
structterminal*last;// "
15
}
16
17
18
typedefstructterminalTerminal_t;
19
typedefstructterminal*TerminalPtr_t;
20
TerminalPtr_tstartpoint=NULL;
21
22
..
23
..
24
25
voidneuTerminal(TerminalPtr_tneu){
26
27
TerminalPtr_thelpPtr;
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
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.
;-)
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::
...
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!
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
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
typedefstruct
2
{
3
void*this;
4
intiVal;
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.
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.