braunbär hat geschrieben:Ich habe seinerzeit Informatik studiert. Aber in der täglichen Programmierpraxis mit dem Datentyp array brauchst du keine modulo-Arithmetik, du solltest das nicht mit einer Praktikumsarbeit oder einer Diplomarbeit über irgend ein theoretisches Thema verwechseln. Es würde ja auch nichts dagegen sprechen, dort mit 0 zu zählen zu beginnen, wo es einen Nutzen bietet. Bei normalen arrays kannst du Anfangs- und Endindex frei wählen, warum nicht auch bei offenen Arrays?
Also ein einfaches Beispiel wo ich vor ein paar Wochen noch Froh war das Arrays bei 0 anfangen: Ich lese Bilddaten in ein Array ein, jeder Wert entspricht einem Voxel. Wobei jede Zeile aus 512 Werten besteht, und jeder Layer aus 512 Zeilen besteht. Um nun einen Index i des arrays in die x, y, z koordinate umrechnen muss, benötige ich Modulo Arithmetik -> 0 basierte Indizes besser. Ich denke, obwohl das ein Uni Praktikum war, das dieses Problem häufiger der Fall ist, auch außerhalb der Uni.
Für so gut wie jedes Verfahren aus der Kryptographie, der Bildverarbeitung, der Datenkommunikation, wird an einer Stelle mindestens Modulo verwendet.
Das ding ist, Arrays mit 1 zu beginnen bringt nun mal gar nichts (außer das es natürlicher ist), und man verliert also auch nichts wenn man mit 0 anfängt. Wenn man allerdings mit 1 anfängt, muss man bei all diesen Modulo Operation geklammert noch +1 hinzufügen. Es ist also ein Trade zwischen keinem Mehraufwand (man hat es nach 1-2 Tagen drauf mit 0 anzufangen), oder viel Mehraufwand. Und um ehrlich zu sein, bei Statischen Arrays verwende ich mittlerweile auch 0 als Startindex, einfach damit ich Konsistent bin. Wenn ich für dynamsiche Arrays den Start Index auch setzen könnte, würde ich dort auch 0 einstellen, einfach weil es mir nichts bringt ihn auf 1 zu setzen.
braunbär hat geschrieben:In 99% der Fälle, in denen sie verwendet wird, ist Zeigerarithmetik fehl am Platz. Eine höhere Programmiersprache sollte dem Programmierer die Handhabung von Zeigern generell abnehmen, und kann das in der Regel auch sehr gut. Ausnahmen bestätigen die Regel, wobei aber die meisten Ausnahmen, bei denen Zeigerartithmetik Sinn macht, eher als Hinweis auf fehlende Sprachfeatures anzusehen sind.
wenn in diesem 1% der Fälle ich mir mit 0 basiertem Index arbeit sparen kann, und in den restlichen 99% der Fälle keine mehraufwand durch 0 Basierte Indizes habe, warum sollte ich dann 1 basierte Indizes verwenden? Da verliere ich ja 1% nutzen
braunbär hat geschrieben:Der Sinn und der reale Vorteil von höheren Programmiersprache liegt darin, Algorithmen aufgabenorientiert formulieren können, möglichst ohne auf Implementierungdetails Rücksicht nehmen zu müssen. Und da würde ich mir eben lieber nicht antrainieren müssen, mit 0 anzufangen. In der Praxis der Anwendungsprogrammierung ist die erzwungen 0-basierte Zählweise in 99% der Fälle von Nachteil, weil der Programmcode die Aufgabenstellung nicht adäquat abbildet, und bietet überhaupt keinen "realen Vorteil".
Um ehrlich zu sein verstehe ich dieses Argument nicht, wenn eine Aufgabe so ins Detail geht, das die Tatsache das ein Array Index mit 0 oder 1 anfängt relevant für die Aufgabenstellung ist, dann ist das wohl eine Aufgabe für Programmieranfänger in ihrer ersten Woche, alle anderen Aufgaben sind meist so gestellt, das sie gar nicht auf die Implementierungsdetails eingehen, und die Tatsächliche Implementierung dem Entwickler komplett allein überlassen (eventuell ein Hinweis wie verwenden sie Arrays, mehr aber auch nicht).
braunbär hat geschrieben:Das Problem hat ganz sicher nichts mit "Perfomance Analyse" zu tun. Ich würde es aber auch nicht als Schwachpunkt der Sprache C einstufen, sondern als schleißige und ineffiziente Umsetzung der Sprache durch den Compiler. Es steht in der Definition von C sicher nirgends, dass das so umgesetzt werden muss oder soll.
Warum hat das nichts mit performanceanalyse zu tun? Wenn ich es richtig verstanden habe ist das Problem: "Die operation funktioniert zwar, braucht aber zu lange". Das ist doch Performance analyse par excellence