Re: verknuepfte liste umdrehen



JURKSCH@xxxxxxxxxxxxxxx (Hermann Jurksch) writes:
rweikusat@xxxxxxxxxxx wrote:
Inwiefern das eine sinnvolle Entscheidung war, bzw (besser), welche
eher positiven und eher negative Folgen sie hatte, darueber laesst
sich sicher auch diskutieren.

Bist Du sicher, daß man überhaupt irgendwelche Folgen im Vergleich
zur Pascal-Syntax zu verzeichnen hat?

Im Vergleich zur Pascal-Syntax weiss ich das nicht mehr, denn ich habe
seit ungefaer vierzehhn Jahren nichts mehr mit Pascal
programmiert. Zwei Dinge die mehr eher nachteilig erscheinen waeren

- Die Syntax zum Deklarieren von Funktionszeigern:

int *(*func)(int);

deklariert einen Zeiger auf eine Funktion, die einen Zeiger
auf int zurueckgibt und ein int-Argument uebernimmt. Insofern
man func explizit dereferenzieren moechte, ist das konsistent
mit 'declaration resembles use', naemlich

(*func)(4);

fuer einen Aufruf. Die Klammern sind notwendig, weil () eine
hoehere 'precedence' hat, als *. Das die Operatorprioritaet
in einem Ausdruck die Deklarationssyntax beeinflusst, finde
ich nicht so geschickt, zumal die tatsaechliche Benutzung
eher so aussieht:

func(4)

weil die Derefenzierung nicht notwendig ist. Fuer ein
untrainiertes Auge ergeben sich auch schnell verwirrend
aussehende Kombination, aka 'the prototype is complicated by
the level of nested parentheses':

void signal(int, void (*handler)(int))

- Qualifier

const char *a;

deklariert einen Zeiger auf 'const char',

char const *a;

dasselbe und

const char * const a;

einen konstanten Zeiger auf 'const char', funtional identisch
zu

char const * const a;

Man kann das einheitlich machen, in dem man const immer rechts
dessen, worauf es sich beziehen soll schreibt, aber niemand
tut das (in mir bekanntem Code). Zu meiner Ueberraschung ging
der untenstehende Deklarationsblock ohne Beanstandungen durch
den Compiler:

void *ml_ht_find(struct ml_ht_top_dir const *top, void const *key)
{
struct ml_ht_2nd_dir const *dir;
struct ml_ht_chain *chain, * const *chains;

(chains wird einem Member von dir zugewiesen und alles
ausser den Strukuren, auf die die enthaltenen Zeiger
zeigen, soll konstant sein).

Anscheinend habe ich const und die * richtig sortiert, aber
das war auch dass erste Mal, dass ich das ueberhaupt nur
versucht habe, anstatt den Zeiger als **chains zu
deklarieren und den Compiler per cast ruhigzustellen. Ich
schreiben seit (ein paar) Jahren ziemlich viel C
(>> 20.000 Zeilen/ Jahr)

Die Aussage das 'Professor Nikolaus
Wirth es aber anders gemacht hat, also muss das falsch sein' ist zwar
sicher auf eine Mentalitaet gegruendet, die akademischen Karrieren
"vom Wassertraeger zum Vorschriftenmacher" sehr foerderlich ist, aber
fuer ernsthafte Beschaeftigung mit einem Sachthema doch etwas arg
schlicht.

Unterscheiden sich die Typsysteme wirklich signifikant? Eine Bijektion der
'eingebauten' Pascal- und C-Typen gibt es zwar nicht, es ist aber recht
einfach, mit unterstützenden Bibliotheken eine Bijektion zwischen den
Typsystemen herzustellen.

Das kaeme darauf an, was man genau mit 'signifikant' meint. Pascal hat
einen Datentyp 'Menge von etwas' (typischerweise mit 'irgendwelchen
undurchsichtigen Einschraenkungen' aufgrund der Eigenschaften der
Implementierung). Theoretisch unterstuetzt Pascal 'records', deren
Struktur sich in Abhaengigkeit des Inhalts bestimmter andere Felder
aendert, C bloss 'unions', dh Felder unterschiedlichen Typs mit
jeweils identischer Anfangsadresse (praktisch ist beides
dasselbe). Vor allem unterscheidet sich die 'Attituede' des
Typsystems: In C bestimmt der Typ eines Objektes, welche Werte in ihm
(verlustfrei) gespeichert werden koennen, in Pascal bestimmt der Typ
einer Variable, was mit ihrem Wert geschehen darf. Theoretisch ist das
eine Wichtige Eigenschaft Namens Typsicherheit, praktisch ist das eine
Notwendigkeit fuer 'wilde' cast-Konstruktionen, die man sich in C so
ersparen kann.
.



Relevant Pages

  • Re: verknuepfte liste umdrehen
    ... Die Syntax zum Deklarieren von Funktionszeigern: ... deklariert einen Zeiger auf eine Funktion, ... Per ISO ist in Pascal z.B. nur der Typ 'integer' garantiert, auch wenn Borland noch viel mehr Typen im Rennen hat. ...
    (de.comp.lang.c)
  • Re: Ein C-Aergernis
    ... zu deklarieren, die einen Zeiger auf eine Funktion gleichen Typs ... Der übliche Workaround sind Typ-Casts. ... Das deklariert eine Struktur, die ein Mitglied hat, dessen Typ 'Zeiger ... strukturlose Strukturen als 'workaround' fuer ...
    (de.comp.lang.c)
  • Re: C-Programmierung unter Mac OS X
    ... enthaltenen Zahlen werden im Schleifenkoerper fuer eine Berechnung ... falls der Zeiger gueltig ist. ... That sounds trivial, but look at the ... desselben Uebertragungskanals sowohl fuer Nutzdaten als auch (von ...
    (de.comp.lang.c)
  • Re: Ein praktische Demonstration [long]
    ... Programmierer mitzuteilen. ... um Zeiger auf Objekte unterschiedlicher aber kompatibler ... 'geht es' (dh kann ich das verwenden, wenn ich es fuer sinnvoll halte, ... Zweifel an seiner Kompetenz haben. ...
    (de.comp.lang.c)
  • Re: Ein praktische Demonstration [long]
    ... polymorpher Zeigertyp (jeder Zeiger auf ein Objekt kann als void * ... um Zeiger auf Objekte unterschiedlicher aber kompatibler ... Das halte ich fuer 'undurchsichtigen Code'. ... Kompetenz berechtigt in Zweifel ziehen und sollte gegebenenfalls ueber ...
    (de.comp.lang.c)