Forum: PC-Programmierung for(;;) bedeutung?


von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

A. K. schrieb:
> Jörg W. schrieb:
>> kennt jemand heute noch Standleitungen mit Bitstrom-Protokollen? ;-)
>
> SDLC/HDLC? Das bildet die Basis des D-Kanal-Protokolls von ISDN.

Das ist mir schon klar, aber wer hat denn heutzutage noch eine
Mietleitung, die von A nach B führt und so ein Protokoll fährt?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg W. schrieb:
> Das ist mir schon klar, aber wer hat denn heutzutage noch eine
> Mietleitung, die von A nach B führt und so ein Protokoll fährt?

Diverse Unternehmen/Behörden, die Upstreams zu Satelliten angemietet 
haben. Okay, die "Mietleitung" besteht nicht aus Kupfer, aber es ist 
schon eine Leitung von A nach B. Ich habe da in den 90er Jahren 
Unix-Rechner über SDLC/HDLC über Uplinkschüsseln mit mehreren Metern 
Durchmesser an Satelliten angebunden. War ein sehr interessantes Projekt 
- auch wenn dann am anderen Ende kein Unix-Rechner, sondern ein IBM-Host 
stand.

: Bearbeitet durch Moderator
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Frank M. schrieb:
> Diverse Unternehmen/Behörden, die Upstreams zu Satelliten angemietet
> haben.

Ah OK.  Den Anwendungsfall kannte ich so nicht.

Aber als reine Internet-Links (wie vor 20+ Jahren) dürften sie
mittlerweile weitgehend verschwunden sein.

von Rolf Magnus (Gast)


Lesenswert?

Frank M. schrieb:
> A. K. schrieb:
>> Weshalb das auch D heisst, und nicht C(Version20xx).
>
> Mift. Also ist der Name D schon belegt. Mit unserer eigens neu zu
> schaffenden Programmiersprache müssen wir uns also zwischen C und D
> quetschen. C++ ist ebenso schon belegt, bleibt also noch D-- übrig :-)

Oder D♭ (des - auf Englisch "d flat"), analog zu C♯ (cis - auf Englisch 
C sharp).
https://en.wikipedia.org/wiki/D%E2%99%AD_(musical_note)

Nop schrieb:
> Wir werden uns darüber eher nicht einig werden, aber Du siehst hier ja
> zumindest, daß die Ansicht, Pascal sei eine Verbesserung im Vergleich zu
> C, offensichtlich kontrovers ist.

Ich vermute, dass er das bisher überhaupt nicht gesehen hat, da er seine 
eigene Meinung einfach zur unumstößlichen Tatsache und alle, die was 
anderes sagen, zu Idioten erklärt. Im übrigen ein Diskutierstil, der 
alles andere tut als den Fortschritt zu fördern.

von (prx) A. K. (prx)


Lesenswert?

Da wird grad bei D waren: Ich hatte mir das vor längerer Zeit mal 
angesehen, aber es hat sich seither weiter entwickelt. Es lohnt sich, da 
mal rein zu sehen:
http://dlang.org/spec/spec.html
https://en.wikipedia.org/wiki/D_(programming_language)

Um ein paar Dinge zu nennen:

So halte ich die Contracts für eine recht nette Idee. Klar, man kann 
(und sollte) das, was im Contract steht, sowieso in die Funktion packen. 
Aber man vergisst man das gerne und so ist es übersichtlicher.

Dann gibt es einen Subset SafeD, in dem der Compiler sicherstellt, dass 
dieser Code keine unsicheren Speicherzugriffe durchführen kann.

Die Deklarations-Syntax ist linear, nicht mehr anhand von Prioritäten 
verschachtelt. "int*[] a,b" statt "int *a[],*b[]" beispielsweise.

: Bearbeitet durch User
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

A. K. schrieb:
> Es lohnt sich, da mal rein zu sehen:
> http://dlang.org/spec/spec.html
> https://en.wikipedia.org/wiki/D_(programming_language)

Ich lese da auch schon seit einer guten Stunde drin rum, sehr 
interessant :-)

> So halte ich die Contracts für eine recht nette Idee.

Ja, sehr interessant - auch wenn man das klassisch ebenso formulieren 
könnte. Nur bei den Invariants habe ich noch Verständnisprobleme. Wann 
werden die Prüfungen durchgeführt? Ausschließlich im Constructor?

> Dann gibt es einen Subset SafeD, in dem der Compiler sicherstellt, dass
> dieser Code keine unsicheren Speicherzugriffe durchführen kann.

Was mich direkt zu den Arrays und den neuartigen Operatoren auf Arrays 
geführt hat, z.B. das Kopieren mittels:
1
s[1..2] = t[0..1];

Wenn man so überlappende Speicherbereiche kopiert, gibts einen Fehler. 
Sehr nett. :-)

Was ist mit Strings? Da ist zu lesen:

   "A string is an array of characters.".

Also doch alles wie in C, was Strings betrifft?

Weiter:

    "Since strings, however, are not 0 terminated in D, when
    transferring a pointer to a string to C, add a terminating 0"

Wohl nicht, das terminierende NUL gibt es nicht in D...

Zuletzt: "printf() is a C function and is not part of D."

Upps, kein printf() in D. Um es zu verwenden, muss der D-String mittels 
Terminierung in einen C-String umgewandelt werden:
1
  str ~= "\0";
2
  printf("the string is '%s'\n", cast(char*)str);

Finde ich nicht so gelungen.

> Die Deklarations-Syntax ist linear, nicht mehr anhand von Prioritäten
> verschachtelt. "int*[] a,b" statt "int *a[],*b[]" beispielsweise.

Multiple Definitionen von mehreren Variablen in einem Statement würde 
ich abschaffen. Finde ich überflüssig und unleserlich, egal ob jetzt in 
C oder in D.

: Bearbeitet durch Moderator
von Franz Ferkel (Gast)


Lesenswert?

Darf man fragen ob dieser Thread auch eine for(;;) ist ?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Franz Ferkel schrieb:
> Darf man fragen ob dieser Thread auch eine for(;;) ist ?

Och komm, eine Diskussion über for(;;) selbst ist doch totlangweilig... 
:-)

Außerdem ist heute Freitag.

Hab noch was gefunden:

"The best way is to use std.stdio.writefln, which can handle D strings:"

  import std.stdio;
  writefln("the string is '%s'", str);

Man braucht also gar kein C-printf() und damit auch keine Terminierung 
in D.

Ontopic: Eine Endlosschleife in D muss man wohl genau wie in C 
formulieren. Oh, watt is datt schlimm...

von Kaj (Gast)


Lesenswert?

Jörg W. schrieb:
> Mir ist so, als würde NetBSD „meine“ Implementierung nach wie vor
> für PPP-over-Ethernet benutzen.
Ist doch schoen, wenn es so ist, oder etwa nicht? :)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Kaj schrieb:
> Ist doch schoen, wenn es so ist, oder etwa nicht?

Yep, zumal das eine Anwendung ist, an die ich beim Erstellen der
Software nicht einmal hätte denken können. ;)

von Jobst Q. (joquis)


Lesenswert?

Frank M. schrieb:
> Was ist mit Strings? Da ist zu lesen:
>
>    "A string is an array of characters.".
>
> Also doch alles wie in C, was Strings betrifft?
>
> Weiter:
>
>     "Since strings, however, are not 0 terminated in D, when
>     transferring a pointer to a string to C, add a terminating 0"
>
> Wohl nicht, das terminierende NUL gibt es nicht in D...

Und wo ist da der Fortschritt von D gegenüber C?

Speicherblöcke, die '\0' enthalten können, kann man in C auch mit den 
mem... Funktionen behandeln. Innerhalb eines Strings hat ein Nullbyte 
keine sinnvolle Verwendung.

In C kann man wegen der Nullterminierung einen String sehr einfach und 
effizient ohne Rumkopieren in mehrere Teilstrings aufteilen, indem man 
Trennzeichen durch '\0' ersetzt. In D ginge das nicht mehr. Toller 
Fortschritt!

von (prx) A. K. (prx)


Lesenswert?

Jobst Q. schrieb:
> Speicherblöcke, die '\0' enthalten können, kann man in C auch mit den
> mem... Funktionen behandeln.

Es geht in D nicht darum, ob man damit etwas kann, was man in C nicht 
kann. Dem ist nicht so. Es geht um das wie, nicht um das ob.

C ist Turing-vollständig. Du solltest also auf die Turing-Maschine 
umsteigen. Die kann alles was Assembler kann, alles was C kann, alles 
was C++ kann, alles was Java kann, alles was ... Und ist zudem viel 
leichter verständlich. ;-)

von Nop (Gast)


Lesenswert?

Ok ok, aber die entscheidende Frage ist doch: Kann man denn auch in D 
wirklich Fortran programmieren? duck

von (prx) A. K. (prx)


Lesenswert?

Nop schrieb:
> Ok ok, aber die entscheidende Frage ist doch: Kann man denn auch in D
> wirklich Fortran programmieren? *duck*

Aber klar doch. Du kannst dir darin beispielsweise einen FORTRAN 
Compiler schreiben. Ist sogar leichter als umgekehrt. ;-)

von Nop (Gast)


Lesenswert?

A. K. schrieb:
> Du kannst dir darin beispielsweise einen FORTRAN
> Compiler schreiben.

Das kann man auch in Pascal, insofern wäre das Cheaten. ;-)

von (prx) A. K. (prx)


Lesenswert?

Ist eine Sprache besser, wenn man sich mit ihr leichter ins Knie 
schiessen kann? Oder führt das am Ende bloss zu lauter Gehbehinderten?

Es mag zwar vielen Schreinern gelingen, ein Bandsäge zu benutzen, ohne 
am Ende wie Monty Pythons Schwarzer Ritter auszusehen. Programmierern 
gelingt das jedoch nicht. Sie haben nur das Glück, dass es eher die 
anderen Leute sind, die dabei verlieren. Vielleicht wärs also besser, 
deren Alltagswerkzeuge etwas weniger gefährlich zu machen.

: Bearbeitet durch User
von Jobst Q. (joquis)


Lesenswert?

A. K. schrieb:
> Es geht in D nicht darum, ob man damit etwas kann, was man in C nicht
> kann. Dem ist nicht so. Es geht um das wie, nicht um das ob.

Umständlicher gehts immer. Das ist aber noch kein Fortschritt.

C ist ein Riesenfortschritt gegenüber Assembler, weil es von der 
Hardware abstrahiert und mit guten Compilern fast die gleiche Effizienz 
erreichen kann. C++ ist ein Fortschritt gegenüber C, weil es 
objektorientiertes Programmieren ermöglicht, aber es eben nicht 
erzwingt, sondern einfaches C mit umfasst.

D scheint da mehr ein C-- zu sein, da es die Möglichkeiten von C 
beschneidet und effiziente Funktionen durch umständlichere Methoden 
ersetzt.

von (prx) A. K. (prx)


Lesenswert?

Jobst Q. schrieb:
> D scheint da mehr ein C-- zu sein, da es die Möglichkeiten von C
> beschneidet und effiziente Funktionen durch umständlichere Methoden
> ersetzt.

Völlig richtig. Es wird deutlich umständlicher, sich ins Knie zu 
schiessen. Es mag dir seltsam vorkommen, aber ich sehe darin einen 
Fortschritt.

: Bearbeitet durch User
von Smarti (Gast)


Lesenswert?

Ich finde die entsprechende AN nicht aber von Atmel gibt es Tipps für 
Speicheroptimierung / Geschwindigkeit z.B.

Atmel AVR4027: Tips and Tricks to Optimize
Your C Code for 8-bit AVR Microcontrollers

Im Endeffekt was der Compiler aus dem C Code macht.

Sprich for (;;) wird vom Compiler "am Besten" umgesetzt.

von Nop (Gast)


Lesenswert?

Eine anfängertaugliche Programmiersprache gibt's doch schon seit 1964. 
Man muß keinen portablen Makroassembler nehmen, wenn man keine 
Performance haben will.

von Jobst Q. (joquis)


Lesenswert?

A. K. schrieb:
> Völlig richtig. Es wird deutlich umständlicher, sich ins Knie zu
> schiessen. Es mag dir seltsam vorkommen, aber ich sehe darin einen
> Fortschritt.

Mit einem Messer kann man sich erstechen, mit einem Gürtel kann man sich 
aufhängen. Aber warum sollte man das tun? Trotzdem möchte ich weder auf 
messer noch auf Gürtel verzichten. Und in so einer Pädagogenwelt, in der 
alles verboten ist, womit man sich schaden könnte, möchte ich nicht 
leben.

von (prx) A. K. (prx)


Lesenswert?

Jobst Q. schrieb:
> Mit einem Messer kann man sich erstechen, mit einem Gürtel kann man sich
> aufhängen.

Das ist wahr. Aber warum tun Programmierer das andauernd? Also warum 
erstechen Programmierer immer mal andere Leute oder erhängen sie? Denn 
das tun sie immer und immer wieder. Würden sie nicht andere Leute damit 
plagen, sondern sich selber, wärs schnell aus mit Gürtel und Messer. 
Oder mit dem Programmierer.

: Bearbeitet durch User
von Nop (Gast)


Lesenswert?

A. K. schrieb:
> Aber warum tun Programmierer das andauernd?

Tun sie nicht. Da, wo es geht, verwendet man heute kein C mehr. Und 
tunlichst auch kein C++. Server-Anwendungen im größeren Maßstab macht 
man nicht mehr in Lowlevelsprachen.

Aber Mikrocontroller sind kostensensitiv. Eine Bloatsprache mit allen 
Sicherheitsnetzen erzwingt nunmal einen größeren und damit teureren 
Controller. Bei entsprechenden Stückzahlen ist man damit aus dem Rennen 
gegenüber der Konkurrenz. Da kann man es sich nunmal nicht leisten, den 
halben Controller schon mit Müsli zu füllen.

von (prx) A. K. (prx)


Lesenswert?

Nop schrieb:
> Server-Anwendungen im größeren Maßstab macht
> man nicht mehr in Lowlevelsprachen.

Stimmt. Das macht man beispielsweise in PHP. ;-)

von (prx) A. K. (prx)


Lesenswert?

Nop schrieb:
> Da kann man es sich nunmal nicht leisten, den
> halben Controller schon mit Müsli zu füllen.

Stimmt. Man bewirft mit dem Mirai-Müsli statt dessen den Rest der Welt.

von Nop (Gast)


Lesenswert?

A. K. schrieb:
> Man bewirft mit dem Mirai-Müsli statt dessen den Rest der Welt.

Mag sein, aber wenn man es nicht tut, ist man pleite, und zwar deutlich 
bevor die Konkurrenz wegen Sicherheitslücken ein Update bringen muß.

Das ist ja auch der Grund für MISRA - daß man im Regelfall C auf sehr 
pascalhafte Weise programmiert. Nur, wenn es technisch begründbar 
angemessen ist, dann darf man auch davon abweichen. Man muß nur 
analysieren, daß das dann kein Problem ergibt.

von (prx) A. K. (prx)


Lesenswert?

Nop schrieb:
> Mag sein, aber wenn man es nicht tut, ist man pleite, und zwar deutlich
> bevor die Konkurrenz wegen Sicherheitslücken ein Update bringen muß.

Yep. Jetzt kommen wir langsam zum Punkt. Also weshalb beispielsweise 
manche Routerhersteller nicht schon längst pleite sind, obwohl sie 
zusammengeschluderte Firmware lange bekannten Exploits bringen und nie 
fixen, dafür aber vorsätzlich gleich mehrere Backdoors einbauen.

Tja, die Welt ist unfair. Hätte AVM nicht vorbildlich gehandelt - die 
wären jetzt wohl pleite. Die Konkurrenz aus Billigstan und 
Nochbilligerstan macht seelenruhig weiter und niemanden scheint es zu 
stören.

: Bearbeitet durch User
von Nop (Gast)


Lesenswert?

A. K. schrieb:
> Hätte AVM nicht vorbildlich gehandelt - die
> wären jetzt wohl pleite.

Soso. Die haben also ein Linux, was nicht in C programmiert ist. 
Interessant.

(Es ging hier nicht um die Frage, ob man Updates bringt, wenn Lücken da 
sind, sondern darum, daß man nicht in C programmieren sollte, damit 
weniger Lücken entstehen!)

von (prx) A. K. (prx)


Lesenswert?

Nop schrieb:
> Soso. Die haben also ein Linux, was nicht in C programmiert ist.
> Interessant.

Quark.

> (Es ging hier nicht um die Frage, ob man Updates bringt, wenn Lücken da
> sind, sondern darum, daß man nicht in C programmieren sollte, damit
> weniger Lücken entstehen!)

Meine Aussage war eine Reaktion auf die von dir genannten zutreffenden 
wirtschaftlichen Zwänge. Mit C hatte sie nichts zu tun. Das Problem 
liegt aber ähnlich.

Es ist oftmals erlaubt, billigst zu bauen und die Scheisse zum Himmel 
stinken zu lassen. Sorgfalt kostet, egal ob per Sprache, Hardware, Zeit 
fürs Programmieren etc. Das hast du selbst geschrieben, nur nicht so 
verallgemeinert.

Dort wo es nicht erlaubt ist, ist zumindest die Reaktion mitunter fixer.

: Bearbeitet durch User
von Klaus (Gast)


Lesenswert?

Nop schrieb:
> Aber Mikrocontroller sind kostensensitiv. Eine Bloatsprache mit allen
> Sicherheitsnetzen erzwingt nunmal einen größeren und damit teureren
> Controller. Bei entsprechenden Stückzahlen ist man damit aus dem Rennen
> gegenüber der Konkurrenz. Da kann man es sich nunmal nicht leisten, den
> halben Controller schon mit Müsli zu füllen.

Das ist Quatsch. Bei einem Chinamodul, daß portofrei fast nackt für < 2€ 
verkauft wird, mag das stimmen. Ansonsten kostet alleine das Schreiben 
des hier erforderlichen "Beipackzettels" in allen EU-Sprachen und alle 
anderen Posten wie Zulassung, Garantieabwicklung, Marketing ... bei 
einem Produkt viel, viel mehr, als die paar zusätzlichen Cent für einen 
größeren µC.

Nur der Einkauf, die Entwicklung rechnen sich da schön, für die Bilanz 
hat das keine Bedeutung.

MfG Klaus

von Nop (Gast)


Lesenswert?

A. K. schrieb:

> Quark.

War mir natürlich auch klar. ;-)

> Mit C hatte sie nichts zu tun

Eben.

> das Problem liegt aber ähnlich.

Stimmt.

> Es ist oftmals erlaubt, billigst zu bauen und die Scheisse zum Himmel
> stinken zu lassen.

Klar. Consumer kaufen alles. Hauptsache, der Schrott wird entweder mit 
entsprechendem Image beworben oder ist billig.

Aber, Fakt ist - wenn man ernsthaft Performance will, geht an C oder 
auch C++ wenig vorbei. Nehmen wir mal Schach-Engines. Die stärkste, die 
nicht in C/C++ geschrieben ist, liegt im Moment auf Platz 25 (Delphi). 
Mit einem Abstand von über 300 ELO auf die Spitze. Das ist anderthalb 
Klassen darunter.

von (prx) A. K. (prx)


Lesenswert?

Oftmals sind die Folgekosten von Produkten externalisiert. Der 
Hersteller verdient damit Geld, ist aber nicht für die Folgen 
verantwortlich. Die bleiben beim Kunden hängen.

Zwar kann niemand von Herstellern verlangen, perfekte Software zu bauen. 
Aber man sollte vielleicht verlangen können, kritische Probleme für 
einen Mindestzeitraum als vorgesehene Lebensdauer zeitnah zu fixen. Da 
diese Kosten eingepreist werden müssen, wird das Zeug natürlich teurer 
und so mancher IoT Hype verschwindet schneller wieder als er kommt.

Nur so kann eine Kultur entstehen, die Sorgfalt in der Herstellung 
lohnenswert macht. Ob das nun Werkzeuge oder Zeit betrifft. Und dann 
kann es für einen Hersteller auch lohnend sein, etwas Ressourcen für 
dein "bloat" einzurechnen.

von (prx) A. K. (prx)


Lesenswert?

Nop schrieb:
> Nehmen wir mal Schach-Engines.

Kein Problem damit. Die Folgen von Bugs sind da höchstens peinlich.

Aber wieviel Software des alltäglichen Lebens ist an der Grenze der gut 
verfügbaren Performance? Also wirklich, nicht bloss weil 25ct gespart 
für 64K statt 128K Flash. Und wieviel davon steckt an Stellen, an denen 
nicht bloss Elo-Punkte abgezogen werden, sondern ernsthaftere 
Konsequenzen drohen.

Und das betrifft nicht nur Banken und Gesundheit. Wenn 25% aller 
Kühlschränke gleichzeitig ausfallen, weil Bug oder Exploit im IoT-Modul, 
dann stinkt das ziemlich zum Himmel. Auch wörtlich.

Wie lange können wir angesichts der Durchdringung mit Software, 
besondern vernetzter Software, die bisherige Qualitätsunkultur 
durchhalten?

: Bearbeitet durch User
von Christopher C. (trihexagon)


Lesenswert?

Jobst Q. schrieb:
> A. K. schrieb:
>> Völlig richtig. Es wird deutlich umständlicher, sich ins Knie zu
>> schiessen. Es mag dir seltsam vorkommen, aber ich sehe darin einen
>> Fortschritt.
>
> Mit einem Messer kann man sich erstechen, mit einem Gürtel kann man sich
> aufhängen. Aber warum sollte man das tun? Trotzdem möchte ich weder auf
> messer noch auf Gürtel verzichten. Und in so einer Pädagogenwelt, in der
> alles verboten ist, womit man sich schaden könnte, möchte ich nicht
> leben.

Mit Schusswaffen kann man sich/jemand aus Versehen erschießen, deshalb 
gibts Sicherungen, um das zu verhindern. Und so gibt es Sprachen, die 
nach einem ähnlichen Prinzip funktionieren. Ein guter Mittelweg, wie ich 
finde.

Zeigerfrimeleien mach ich eher im Treibercode, dass ich mich damit auch 
im Code der Steuerungslogik ins Knie schießen kann, ist unnötig.

von Christopher C. (trihexagon)


Lesenswert?

Nop schrieb:
> Aber, Fakt ist - wenn man ernsthaft Performance will, geht an C oder
> auch C++ wenig vorbei. Nehmen wir mal Schach-Engines. Die stärkste, die
> nicht in C/C++ geschrieben ist, liegt im Moment auf Platz 25 (Delphi).
> Mit einem Abstand von über 300 ELO auf die Spitze. Das ist anderthalb
> Klassen darunter.

Ich bezweifle, dass das hauptsächlich an C/C++ liegt.

1. So hervorragende Kompiler (gcc, icc...), wie im C/C++ Umfeld, sind 
anderswo eher selten (wenn man mal bei den nativen Sprachen bleibt). Bei 
so viel Arbeit die da jeden Tag reingesteckt wird, ist es kein Wunder. 
Nutzt halt auch jeder, vor allem die Industrie. Das wirkt sich vor allem 
auf die Optimierung aus.

2. Wie viel Aufwand wurde denn in die Delphi-Variante im Vergleich zu 
den anderen Varianten reingesteckt? Wäre die Delphi-Variante genauso gut 
oder sogar besser als die C++-Variante auf Platz 1., wenn gleich viel 
Aufwand hineingesteckt werden würde?

3. Qualität Algorithmus? (Analog zu Punkt 2.)

Natürlich ist die Performance von C und C++ hervorragend, andere 
Sprachen könnten es aber genauso sein, wenn sie die gleiche 
Aufmerksamkeit bekommen würden.

von Roland F. (rhf)


Lesenswert?

> ...andere Sprachen könnten es aber genauso sein, wenn
> sie die gleiche Aufmerksamkeit bekommen würden.

Und warum bekommen sie die nicht? Warum floppen praktisch alle erdachten 
Sprachen, die die (vermeintlichen?) Schwächen von C und Konsorten 
abstellen wollen?

rhf

von (prx) A. K. (prx)


Lesenswert?

Roland F. schrieb:
> Warum floppen praktisch alle erdachten
> Sprachen, die die (vermeintlichen?) Schwächen von C und Konsorten
> abstellen wollen?

Mit der Qualität der Sprachen hat das nichts zu tun.

von Roland F. (rhf)


Lesenswert?

A. K. schrieb:
> Mit der Qualität der Sprachen hat das nichts zu tun.

Aber womit dann?

rhf

von Jobst Q. (joquis)


Lesenswert?

A. K. schrieb:
> Aber warum tun Programmierer das andauernd? Also warum
> erstechen Programmierer immer mal andere Leute oder erhängen sie? Denn
> das tun sie immer und immer wieder.

Echt? Ist das so? Der Mörder ist immer der Programmierer?

Na ein Glück, dass ich nur wenige Programmierer persönlich kenne. Obwohl 
ich auch Programmierer bin, verspür ich überhaupt kein Bedürfnis, 
jemanden zu erstechen oder aufzuhängen.

von Kaj (Gast)


Lesenswert?

Roland F. schrieb:
> Und warum bekommen sie die nicht? Warum floppen praktisch alle erdachten
> Sprachen, die die (vermeintlichen?) Schwächen von C und Konsorten
> abstellen wollen?
Ich denke Rust ist ein echter Kandidat, gibt es jetzt auch schon fuer 
AVR, bzw. man arbeitet dran.
https://github.com/avr-rust/rust

Warum sich gewisse Sprachen nicht durchsetzen ist einfach: Faulheit.
Die Faulheit des Menschen, sein gewohntes aufzugeben, etwas neues zu 
lernen, anders zu denken...

Schau dir doch nur mal die Disskusionen zu Python an, wie viele Leute 
sich an dem Syntaxtischen Whitespace stoeren.

Oder Rust:
Warum muss ich bei einer Variablen extra angeben, dass ich sie 
veraendern koennne moechte? (Also das gegenteil von const in C/C++)
Ist meiner Meinung nach voelliger Bloedsinn, da man in der Regel wohl > 
97% aller Variablen veraendern koennen moechte.

Und so faengt es an, mit den Vorurteilen und der Ablehnung. Obwohl ich 
die Sprache bisher nie benutzt habe, habe ich jetzt schon das Vorurteil, 
dass die Sprache mist ist, mag sie auch noch so gute Konzepte enthalten.

Und so duerfte es jeder neuen Sprache gehen.

Dazu kommt, dass fast monatlich eine neue Sprache geboren wird, die 
verspricht, das non plus ultra zu sein, und alles besser zu machen.

Wie soll ich mich aber mit einer Sprache hinreichend auseinander setzen, 
wenn es ja fast taeglich eine neue gibt? Bis ich mich mit einer Sprache 
ausreichend beschaeftigt habe, ist sie ja schon wieder veraltet, und die 
Disskusion geht von vorne los:
Warum nutzt du denn so einen alten, unsicheren Quark?
<Hier neue Sprache einfuegen> ist viel sicherer und besser weil: ...

Ich wuerde mir echt gerne Rust naeher anschauen, aber bei genauerer 
betrachtung, bringt es mir keinen grossen Mehrwert. Warum?
Rust ist wie C -> Alles muss man selber von Hand machen.
Wenn ich mir Python und C anschaue, dann hat Python einen echten 
Mehrwert, weil es eine unglaubliche maechtige Standard Lib gibt. Nahezu 
alles was man braucht bringt Python von Hause aus mit.
Deswegen beschaeftige ich mit C und Python, weil mir jede Sprache, der 
anderen gegenueber einen echten Mehrwert hat (Geschwindigkeit <==> 
Komfort). Rust und C sind fuer mich so, als wenn ich mir 2 Fahrraeder in 
den Keller Stelle: Ja, das eine ist neuer und bietet mir etwas mehr 
Sicherheit, aber der echte Mehrwert ist mMn relativ klein.

Ausserdem ist C als Sprache stabil, da tut sich nicht mehr viel.
Wenn ich mir z.B. Python anschaue, wo von Version 3.4 auf 3.5 Methoden 
umbenannt wurden (subprocess.call <==> subprocess.run), dann ist das 
doch irgendwie Mist. (Das Abschneiden von Zoepfen und aufraeumen der 
Std-Lib wie beim Sprung von 2 auf 3 finde ich ok!) Sprachen, die sich 
noch "aktiv in der Entstehung" sind, sind halt auch unbequem und machen 
Arbeit, weil der Code mit der naechsten oder uebernaechsten Version 
vielleicht nicht mehr laeuft.
Auch das ist ein Punkt, wo ich sage: Da nutze ich lieber C, anstatt 
Rust, Julia, Go, oder wie sie nicht alle heissen.
Python hat einen Release-Zyklus von (ich glaube) 18 Monaten. Das heisst, 
du musst im schlechtesten Falle, alle 18 Monate deinen Code 
ueberarbeiten, und dafuer Sorgen, dass er mit der Aktuellen Version und 
vielleicht noch mit den letzten beiden Versionen laeuft. (Uebertriebene 
Darstellung!)

Oder noch schlimmer:
Waehrend du an einem Projekt arbeitest aendert sich die Sprache so 
stark, dass man grosse Teile des Projektes wegwerfen und komplett neu 
machen muss.

Da stellt sich natuerlich auch die Frage, ob man sich sowas Leisten kann 
und ob man sich sowas Leisten will.

Darueberhinaus gibt es natuerlich das Problem des Wissens.
Wie viele C-Programmierer findet man?
Und wieviele Programmierer findet man zu Rust oder Julia?

In C sind praktisch alle Fallstricke bekannt (Overflows, Pointer, etc.), 
sie werden nur nicht beachtet, weshalb sie immer und immer wieder 
auftauchen.

Wie ist es um das Wissen und die Dokumentation der Fallstricke in Rust 
bestellt?

Das alles sind Gruende, weshalb es neue Sprachen so schwer haben, und 
weshalb sich alte Sprachen wie C so lange halten.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Kaj schrieb:
> Schau dir doch nur mal die Disskusionen zu Python an, wie viele Leute
> sich an dem Syntaxtischen Whitespace stoeren.

Der Unterschied zu vielen anderen Sprachen: Python wird trotzdem
benutzt, auch von denen, die sich (wie ich) über die
Whitespace-Sache ärgern.

von Christopher C. (trihexagon)


Lesenswert?

Roland F. schrieb:
> A. K. schrieb:
>> Mit der Qualität der Sprachen hat das nichts zu tun.
>
> Aber womit dann?

Menschen sind oft faul oder nehmen sich nicht mehr die Zeit, sich 
weiterzubilden. Ich bin viel zu vielen Menschen begegnet, die immer noch 
ungarische Notation einsetzten, keine Ahnung von C99 haben und seit dem 
Berufsleben technologisch stehen geblieben sind. (Einer davon ist sogar 
Professor und relativ jung). Oder schau mal ins Gnome/Gtk Lager, die 
machen 2016 GUI-Anwenungen immer noch in C (würg).

Ok und Toolchain/Bibliotheken, also das ganze außen rum, sind bei den 
etablierten Sprachen ziemlich gut. Das macht natürlich auch was aus.

Kaj schrieb:
> Roland F. schrieb:
>> Und warum bekommen sie die nicht? Warum floppen praktisch alle erdachten
>> Sprachen, die die (vermeintlichen?) Schwächen von C und Konsorten
>> abstellen wollen?
> Ich denke Rust ist ein echter Kandidat, gibt es jetzt auch schon fuer
> AVR, bzw. man arbeitet dran.
> https://github.com/avr-rust/rust

Ah sehr schön, kannte ich noch gar nicht.
ARM Cortex geht schon länger, eigentlich schon immer, da der Rust 
Kompiler auf llvm aufsetzt. Da werde ich die nächste Zeit mal was damit 
machen.
https://github.com/japaric/xargo
http://antoinealb.net/programming/2015/05/01/rust-on-arm-microcontroller.html

Kaj schrieb:
> Schau dir doch nur mal die Disskusionen zu Python an, wie viele Leute
> sich an dem Syntaxtischen Whitespace stoeren.

Sowas ist ja auch relativ diskussionswürdig. Das blöde ist, dass 
Leerzeichen und Tabulatoren nicht zu unterscheiden sind. Wie es ständig 
mit YAML Probleme gab oder letztens mit einem Makefile (bei einer Regel 
Leerzeichen statt Tabulator)...

Kaj schrieb:
> Oder Rust:
> Warum muss ich bei einer Variablen extra angeben, dass ich sie
> veraendern koennne moechte? (Also das gegenteil von const in C/C++)
> Ist meiner Meinung nach voelliger Bloedsinn, da man in der Regel wohl >
> 97% aller Variablen veraendern koennen moechte.
>
> Und so faengt es an, mit den Vorurteilen und der Ablehnung. Obwohl ich
> die Sprache bisher nie benutzt habe, habe ich jetzt schon das Vorurteil,
> dass die Sprache mist ist, mag sie auch noch so gute Konzepte enthalten.

Nur ist das, gerade bei Rust, kein Unsinn, sondern hat seine Gründe.
1. In C++ gibts zwar const-correctness, nur wird sie viel zu oft 
vergessen. Das sieht man oft bei fremden Code. Auch ich bekomme es nicht 
hin const-correctness komplett durchzuziehen, einfach weil man schnell 
das const vergisst. Bei Rust ist das nicht so, da bekomme ich es hin, 
weil Variablen automatisch immutable sind und ich sie explizit auf 
mutable setzen muss. Das empfinde ich als Vorteil.

2. Ist es wichtig const-correctness in Rust einzuhalten, da die Sprache 
Aliasing bei veränderbaren Variablen verbietet, um Raceconditions 
unmöglich zu machen (außer natürlich im unsafe Block). Bei Rust liegt 
der Fokus nämlich auch stark auf Nebenläufigkeit. Die Eliminierung von 
Aliasing hat aber auch den Vorteil, dass aggressiver vom Kompiler 
optimiert werden kann.

BTW. 97% sind echt stark übertreiben. Ich hab mal mein Programm 
analysiert, dass Dateien übers Netzwerk überträgt, eine kleine 
Fingerübung um in Rust reinzukommen. 27 Variablen sind immutable und 17 
mutable, also gerade mal ~39%. Viele Variablen sind nämlich nur da, um 
Ergebnisse (z.B. von aufgerufenen Methoden/Funktionen) 
zwischenzuspeichern und werden ausgewertet, aber nie wieder verändert.

Kaj schrieb:
> Dazu kommt, dass fast monatlich eine neue Sprache geboren wird, die
> verspricht, das non plus ultra zu sein, und alles besser zu machen.

Ja weil es unglaublich viele verschiedene Probleme gibt, die es mit 
Programmiersprachen zu lösen gilt. Wenn du aber anfängst zu filtern, 
also den Einsatzbereich einschränkst, fällt dir schnell auf, dass es gar 
nicht so viele sind. Ich meine, wie viele Sprachen sind rausgekommen, 
die sich für Lowlevel-Zeug wie Treiber-/Kernelentwicklung oder µC 
eignen? R nicht, Julia auch nicht. Auch nicht Go (Server), Nimrod? Ne 
auch nicht wirklich. Eigentlich nur Rust und D.

Kaj schrieb:
> Ich wuerde mir echt gerne Rust naeher anschauen, aber bei genauerer
> betrachtung, bringt es mir keinen grossen Mehrwert. Warum?
> Rust ist wie C -> Alles muss man selber von Hand machen.

Bitte was? Das muss dann für C++ ebenfalls gelten. Rust bietet sehr viel 
"zero cost abstraction" Sprachelemente. C hat ja nicht mal Referenzen. 
Speicherverwaltung geht in Rust auch viel komfortabler und vor allem 
sicher! Eine wesentlich mächtigere (optionale!) Standardbibliothek als 
die von C besitzt Rust auch. Also von dem her verstehe ich nicht was du 
damit meinst, dass sich Rust nicht wie Java anfühlt ist klar, aber zu 
Fuß ist was anderes.

Kaj schrieb:
> Auch das ist ein Punkt, wo ich sage: Da nutze ich lieber C, anstatt
> Rust, Julia, Go, oder wie sie nicht alle heissen.

Also Rust und Go sind schon ziemlich stabil. Seit Version 1.0 achten 
beide auf Abwärtskompatibilität und der Sprachkern wird höchstens 
erweitert. Wo es momentan ziemlich heftig ist, ist Swift von Apple.

: Bearbeitet durch User
von Nop (Gast)


Lesenswert?

Christopher C. schrieb:

> 1. So hervorragende Kompiler (gcc, icc...), wie im C/C++ Umfeld, sind
> anderswo eher selten (wenn man mal bei den nativen Sprachen bleibt).

a) Pascal sollte sich sogar noch effektiver compilieren lassen, weil man 
da von vornherein kein Problem mit Aliasing hat, denn Pascal hat eine 
strenge Typisierung. Genau das ist ja auch ein Grund, wieso bei Numerik 
Fortran immer noch überlegen ist.

b) und WARUM gibt es für andere Sprachen nicht so hervorrangende 
Compiler?

> 2. Wie viel Aufwand wurde denn in die Delphi-Variante im Vergleich zu
> den anderen Varianten reingesteckt?

Verkehrte Frage; es geht darum, wieso sich all die anderen, deren 
Engines besser sind, für C/C++ entscheiden haben. Oder man könnte gemein 
sein und folgern, daß C/C++-Programmierer am meisten Mühe in ihr Projekt 
stecken.

> 3. Qualität Algorithmus? (Analog zu Punkt 2.)

C/C++-Programmierer machen also die besten Algorithmen?


Zu der Sache mit syntaktischen Leerzeichen: Das war sinnvoll, als man 
noch mit Lochkarten gearbeitet hat, da kommt das nämlich her. Deswegen 
hat Fortran das, weil es aus dieser Zeit stammt. In Texteditoren ist das 
einfach nur dämlich, sowas zu einzuführen.

von Nop (Gast)


Lesenswert?

Kaj schrieb:

> Wie soll ich mich aber mit einer Sprache hinreichend auseinander setzen,
> wenn es ja fast taeglich eine neue gibt?

Eben.

> Auch das ist ein Punkt, wo ich sage: Da nutze ich lieber C, anstatt
> Rust, Julia, Go, oder wie sie nicht alle heissen.

Zumal, wenn man sich auf die neueste, hipste Modesprache einläßt: wer 
garantiert mir, daß es dafür in 10 Jahren überhaupt noch Compiler gibt? 
Und daß ich nicht am Ende mit dem Projekt in einer Sackgasse stecke? 
C-Compiler wird es auch in 30 Jahren noch geben.

> Darueberhinaus gibt es natuerlich das Problem des Wissens.
> Wie viele C-Programmierer findet man?
> Und wieviele Programmierer findet man zu Rust oder Julia?

Was insbesondere im gewerblichen Einsatz entscheidend ist, Stichwort 
Busfaktor. Es kommt hinzu, daß man als Programmierer weiß, daß es 
haufenweise Projekte gibt, die in C sind, so daß man damit auch gefragt 
ist. Mit der neuesten Modesprache kann man für Hobbies sicher arbeiten, 
aber beruflich?!

C hat noch einen Vorteil - die Sprache ist nicht an das Wohlergehen 
einer bestimmten Firma geknüpft. Insbesondere gibt es sehr gute Tools 
für diverse Plattformen unter Opensource-Lizenzen. Das hat zwei 
Konsequenzen:

a) man gerät nicht in einen vendor-lock-in wie z.B. bei sämtlichen 
Microsoft-Ausgeburten.
b) man wird nicht bleich, wenn die Firma strauchelt. Daß Embarcadero 
gerade dieses Jahr den spanischen Standort dichtgemacht und 80 Leute 
gefeuert hat, ist da ein unangenehmes Beispiel.
c) Oder daß man sich z.B. mit Java heutzutage eine Firma wie Oracle ins 
Boot holt, was man nicht wirklich will.

Zwar ist es embedded auch so, daß schon eine neue Windowsversion dafür 
sorgen kann, daß kommerzielle embedded-Compiler nicht mehr laufen. Vor 
allem wegen wegen Kopierschutzproblemen. Aber sofern man die 
compiler-spezifischen Erweiterungen sauber gekapselt hat, kann man 
notfalls auch auf GCC wechseln, wenn sonst gar nichts mehr geht.

Andere Sprachen mögen besser sein, aber solange ihr Mehrwert nicht die 
Opportunitätskosten für den Wechsel übersteigt, floppen sie. Das ist ein 
Faktor, der im akademischen Elfenbeinturm keine Rolle spielt, in der 
Realität schon. Das wird egerne als "Faulheit" abgetan - bevorzugt von 
denen, die die Opportunitätskosten nicht zu tragen hätten.

von (prx) A. K. (prx)


Lesenswert?

Jobst Q. schrieb:
> In C kann man wegen der Nullterminierung einen String sehr einfach und
> effizient ohne Rumkopieren in mehrere Teilstrings aufteilen, indem man
> Trennzeichen durch '\0' ersetzt. In D ginge das nicht mehr. Toller
> Fortschritt!

Es ist tatsächlich genau andersrum. ;-)

In C muss man umständlich den Originalstring manipulieren, um ihn in 
Teile zu zerlegen. Wenn man das Original nicht verändern darf, muss man 
es vorher kopieren.

In D kann man Substrings direkt als Strings weiterverwenden, ohne 
umständlich Nullen reinzuschreiben. Da dynamische Arrays aus 
Länge+Pointer bestehen, zeigt der Substring direkt in die Daten des 
ursprünglichen Strings.

http://dlang.org/spec/arrays.html

Slicing an array means to specify a subarray of it. An array slice does 
not copy the data, it is only another reference to it. For example:
1
int[10] a;   // declare array of 10 ints
2
int[] b;
3
4
b = a[1..3]; // a[1..3] is a 2 element array consisting of
5
             // a[1] and a[2]

: Bearbeitet durch User
von Carl D. (jcw2)


Lesenswert?

In C++ nennt sich das string_view.

Man darf in konkreten Fall C nicht ankreiden den Original-String zu 
beschädigen.
Das macht im D-Beispiel nämlich eine Änderung an b auch:
" b ist eine Referenz auf a[1..3] "

von (prx) A. K. (prx)


Lesenswert?

Carl D. schrieb:
> Das macht im D-Beispiel nämlich eine Änderung an b auch:

Aber eben erst eine nachträgliche Änderung von b, nicht schon die 
Zerlegung des Strings. In C ändert bereits die Zerlegung selbst den 
Inhalt.

: Bearbeitet durch User
von Carl D. (jcw2)


Lesenswert?

A. K. schrieb:
> Carl D. schrieb:
>> Das macht im D-Beispiel nämlich eine Änderung an b auch:
>
> Aber eben erst eine nachträgliche Änderung von b, nicht schon die
> Zerlegung des Strings. In C ändert bereits die Zerlegung selbst den
> Inhalt.

welcher Teil von "string_view" war denn nicht zu lesen?

von (prx) A. K. (prx)


Lesenswert?

Ich bin grad nicht bei C++, sondern bei C und D. Dass C++ Strings anders 
arbeiten als C Strings ist mir bewusst.

von (prx) A. K. (prx)


Lesenswert?

Man muss in D etwas aufpassen, ob man es mit statischen oder dynamischen 
Arrays zu tun hat. In obigem Beispiel wird
  b = a[1..3];
eine Referenz auf Daten in a produzieren, ein späteres
  b = ...was anderes...;
wird aber nicht den durch b referenzierten Inhalt von a überschreiben, 
sondern die Referenz b auf den neuen Inhalt verweisen lassen. Nur mit
  b[] = ...;
  b[2] = ...;
  b[1..$] = ...;
wird der referenzierte Inhalt geändert.

: Bearbeitet durch User
von Jobst Q. (joquis)


Lesenswert?

Kaj schrieb:
> Warum sich gewisse Sprachen nicht durchsetzen ist einfach: Faulheit.
> Die Faulheit des Menschen, sein gewohntes aufzugeben, etwas neues zu
> lernen, anders zu denken...

So ganz stimmt das nicht. Ich war BASIC gewohnt, als ich C lernte und 
habe es liebend gerne aufgegeben. Gefrustet von der Inkonsistenz 
(unklare Regeln und viele Ausnahmen), den vielen Schlüsselwörtern, die 
oft gleichzeitig Funktionen bzw Aktionen waren, der Umständlichkeit der 
Stringbearbeitung und vielen anderen Ärgernissen, war es eine Befreiung 
und ein Segen, C kennen zu lernen. Mit anderen Worten, eine neue Sprache 
setzt sich durch, wenn es sich lohnt gegenüber der alten.

Das Problem bei neuen Sprachen ist weniger die Faulheit als die 
Erwartungen. Die Vorstellungen, dass es so sein muss, wie man es 
kennengelernt hat. Dass etwas falsch ist, wenn es dann anders ist. Der 
Schritt von der ersten zur zweiten Sprache ist oft der schwerste, wenn 
man die erste Sprache mit dem Programmieren an sich identifiziert.

Falsche Erwartungen sind auch die Ursache der meisten Programmierfehler. 
Wer zB von strncpy erwartet, dass es eine begrenzte Form von strcpy ist, 
wird irgendwann merken, dass er sich getäuscht hat. Denn das Ergebnis 
ist nicht immer ein String wie bei strcpy, sondern bei Überlänge des 
Quellstrings nur ein gefülltes Array, dem zum String die abschließende 
Null fehlt. Dafür wird bei kürzeren Strings der Rest des angegebenen 
Puffers mit Null-Bytes gefüllt, was bis auf die eine Endnull bei Strings 
überflüssig ist. Die Funktion wäre also mit str2array treffender 
benannt.

Das ist aber kein Fehler der Sprache C sondern der Library-Entwickler 
bzw ein Mißverständnis zwischen ihnen und dem Anwender. Zur Vermeidung 
solcher Fehler muss man alle Funktionen und Methoden, die man verwendet, 
genau kennen, am besten den Quelltext. Und die Quelltexte der C-Lib sind 
leichter erhältlich als die von anderen Sprachen.

Wenn man sich die Funktionen selbst schreibt, hat man diese Probleme 
nicht, man kann sie genau so schreiben, wie man sie braucht. Natürlich 
ist das alles "von Hand", aber das ist kein wirkliches Problem. Man muss 
sie ja nicht für jedes Programm neu schreiben. Einmal geschrieben, kann 
man sie tausendfach verwenden.

von Jobst Q. (joquis)


Lesenswert?

A. K. schrieb:
> Jobst Q. schrieb:
>> In C kann man wegen der Nullterminierung einen String sehr einfach und
>> effizient ohne Rumkopieren in mehrere Teilstrings aufteilen, indem man
>> Trennzeichen durch '\0' ersetzt. In D ginge das nicht mehr. Toller
>> Fortschritt!
>
> Es ist tatsächlich genau andersrum. ;-)
>
> In C muss man umständlich den Originalstring manipulieren, um ihn in
> Teile zu zerlegen.

Um zB einen Kommentar abzutrennen, schreib ich s1=split(s,'#'); Dann hab 
ich den String ohne Kommentar in s und den Kommentar in s1. Was ist 
daran umständlich?

Die Funktion selbst ist auch kein Aufwand:

char * split(char *s,char c){
while (*s && *s!=c )s++;
if (*s==c)*s++=0;
return s;
}

> Wenn man das Original nicht verändern darf, muss man
> es vorher kopieren.

Wann braucht man schon mal einen unveränderbaren Originalstring? 
Normalerweise liest man eine Zeile aus einer Datei oder Eingabe in einen 
Puffer, der sowieso mit jeder Zeile wieder neu beschrieben wird. Und 
einen String zu kopieren ist ja auch kein Drama, wenn es mal sein muss.

von Rolf M. (rmagnus)


Lesenswert?

Oliver S. schrieb:
> Mit C ist es wie mit Kochgeräten:
> Thermomix , Backöfenautomatikprogramme, und was es da sonst noch an
> Küchen"helferlein" gibt, oder einfach ein scharfes Messer.
>
> Letzteres ist bei ungeübter Anwendung gefährlich, man muß tatsächlich
> lernen, damit umzugehen. Wenn man es aber kann, ist es unschlagbar
> schnell und flexibel.

Ich denke da an selber kochen vs. Mikrowellen-Essen aufwärmen. Ersteres 
ist mehr Aufwand, und es gibt mehr Möglichkeiten, was falsch zu machen, 
aber wenn man's kann, schmeckt das Ergebnis um Welten besser als das 
Mikrowellen-Futter. ;-)

Christopher C. schrieb:
> Menschen sind oft faul oder nehmen sich nicht mehr die Zeit, sich
> weiterzubilden. Ich bin viel zu vielen Menschen begegnet, die immer noch
> ungarische Notation einsetzten, keine Ahnung von C99 haben und seit dem
> Berufsleben technologisch stehen geblieben sind.

Das liegt meines Erachtens maßgeblich daran, dass Microsoft bei C auch 
auf diesem Level stehen geblieben ist.

> Oder schau mal ins Gnome/Gtk Lager, die machen 2016 GUI-Anwenungen immer
> noch in C (würg).

Das war schon nicht sinnvoll, als sie damit angefangen haben. Ich wollte 
mich mal in die Gtk-Programmierung einlesen, um mich nicht nur auf 
meinen Qt-Horziont zu beschränken. Ich hatte aber ziemlich schnell keine 
Lust mehr darauf. OOP kann man zwar auch zu Fuß in C machen, aber Spaß 
macht das absolut nicht.

Jobst Q. schrieb:
> Die Funktion selbst ist auch kein Aufwand:
>
> char * split(char *s,char c){
> while (*s && *s!=c )s++;
> if (*s==c)*s++=0;
> return s;
> }

Warum nimmst du nicht strtok()?

von Jobst Q. (joquis)


Lesenswert?

Rolf M. schrieb:
> Jobst Q. schrieb:
>> Die Funktion selbst ist auch kein Aufwand:
>>
>> char * split(char *s,char c){
>> while (*s && *s!=c )s++;
>> if (*s==c)*s++=0;
>> return s;
>> }
>
> Warum nimmst du nicht strtok()?

strtok ist wesentlich komplizierter in der Ausführung und der 
Verwendung. Es kann dafür mehrere Trennzeichen auf einmal behandeln, 
aber das habe ich noch nie gebraucht.

von Jobst Q. (joquis)


Lesenswert?

Dazu kommt bei strtok() als Rückgabe der NULL-Pointer, wenn keins der 
Trennzeichen gefunden wurde, was eine extra Fehlerbehandlung zwingend 
erforderlich macht. Mein split() gibt dann einfach das Stringende, also 
einen gültigen Leerstring zurück. Es ist ja nicht gleich ein Fehler, 
wenn eine Zeile keinen Kommentar enthält.

von (prx) A. K. (prx)


Lesenswert?

Rolf M. schrieb:
> Warum nimmst du nicht strtok()?

Das ist eine der C Funktionen mit eingebauter Falltür. So kleinräumig 
angewandt ist sie kein Problem. Aber wenn sowas in dieser Art draus 
wird:
1
  ...
2
  for (char *p = strtok(s1, ","); p; p = strtok(NULL, ","))
3
    f(...);
4
  ...
5
void f(...)
6
{
7
  for (char *q = strtok(s2, " "); q; q = strtok(NULL, " "))
8
    ...
9
}
dann wird man merken, dass strtok ein statisches Gedächtnis hat und das 
innere strtok(s2,..) die statische Information des äusseren 
strtok(s1,..) verwirft.

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

A. K. schrieb:
> dann wird man merken, dass strtok ein statisches Gedächtnis hat und das
> innere strtok(s2,..) die statische Information des äusseren
> strtok(s1,..) verwirft.

Dafür gibt's dann strtok_r, wo diese Information beim Aufrufer 
gespeichert wird. Natürlich macht das die Anwendung noch etwas 
umständlicher.
Was mich eher an strtok() gestört hat (bzw. dazu geführt hat, dass ich 
es meistens nicht nutzen kann) ist, dass es das Auftreten zweier direkt 
aufeinanderfolgender Delimeter nicht richtig behandelt. Statt dann einen 
leeren String zurückzugeben, überspringt es das einfach. Also kommt bei 
"a;b;;c" nur "a", "b" und "c" und nicht, wie ich es eigentlich praktisch 
immer brauche "a", "b", "" und "c".
Beim Parsen von NMEA oder von CSV-Daten ist das ziemlich blöd, denn da 
können leere Elemente durchaus vorkommen, müssen aber berücksichtigt 
werden, weil sonst der Rest der Zeile falsch einsortiert wird.

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Rolf M. schrieb:
> Was mich eher an strtok() gestört hat (bzw. dazu geführt hat, dass ich
> es meistens nicht nutzen kann) ist, dass es das Auftreten zweier direkt
> aufeinanderfolgender Delimeter nicht richtig behandelt.

"Richtig" ist das, was in der Doku steht. Insofern passt es.

> Beim Parsen von NMEA oder von CSV-Daten ist das ziemlich blöd, denn da
> können leere Elemente durchaus vorkommen, müssen aber berücksichtigt
> werden, weil sonst der Rest der Zeile falsch einsortiert wird.

Klar. Nur hatte man bei strtok wohl eher PATH im Auge gehabt. Oder 
Leerzeichen, die ja auch mal im Rudel auftreten können. NMEA oder CSV 
gab es damals noch nicht.

von Rolf M. (rmagnus)


Lesenswert?

A. K. schrieb:
> "Richtig" ist das, was in der Doku steht. Insofern passt es.

Dann lass mich "richtig" durch "sinnvoll" ersetzen.

>> Beim Parsen von NMEA oder von CSV-Daten ist das ziemlich blöd, denn da
>> können leere Elemente durchaus vorkommen, müssen aber berücksichtigt
>> werden, weil sonst der Rest der Zeile falsch einsortiert wird.
>
> Klar. Nur hatte man bei strtok wohl eher PATH im Auge gehabt. Oder
> Leerzeichen, die ja auch mal im Rudel auftreten können. NMEA oder CSV
> gab es damals noch nicht.

Wobei es bei einem strtok(), das auch leere Elemente zurückgibt, ein 
leichtes wäre, diese selber zu ignorieren. Mit einem strtok, das das 
schon von sich aus tut, kann man leider gar nichts anfangen, wenn man 
diese leeren Elemente braucht. Somit wäre ersteres eigentlich flexibler 
gewesen.

Übrigens gibt's NMEA schon seit 1983, also immerhin 6 Jahre länger als 
die ANSI-Version von C.

: Bearbeitet durch User
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.