[linux-l] Arrays in C

Oliver Bandel oliver at first.in-berlin.de
Mo Nov 21 23:39:50 CET 2005


Moin,


On Mon, Nov 21, 2005 at 10:08:18PM +0100, Axel Wei wrote:
> Oliver Bandel schrieb:
> > Man muß auch schauen, ob es nicht knallt, wenn mal nicht das drin
> > steht, was man gerne drin haben will...
> 
> ack.
> 
> > .... wenn bestimmte Felder bestzt sein müssen, da es ansonsten rumst,
> > sollte man nicht mit eigener Programmiererei davon ausgehen, daß die
> > eigenen Moden, die man einführt, und wo man normalerweise in gewisser
> > Weise belegte Felder anders belegt, auch immer so nach eigenem Gusteo
> > gemacht wird.
> >
> > Man sollte sich für solide Programmierung schon auch an die
> > Gegebenheiten des Betriebssystems, auf dem man arbietet, halten.
> >
> > Ansonsten bitte ein ganz großes Schild drüber hängen, auf dem steht:
> >   "Ich programmiere nach meiner eigenen Nase und wenn es kracht
> >    weiß ich, daß es mein eigener Fehler war, aber vermutlich werde ich
> >    dann doch schimpfen, was das für ein Scheiß ist, den andere
> > verzapft haben."
> 
> ??
> 
> > Oder Kurz: Man kann das Ignoranten-Schild drauf hängen.
> 
> Worüber ärgerst Du Dich hier?


Naja, ich meine: man arbeitet auf einem OS und da gibt es Vorgaben
und wenn man mit bestimmten Sprachen auf so einem OS arbeitet,
die dann abesmmeln, wenn das OS was anderes erwartet als man übergibt,
dann hat man ein Problem.

Es gibt nicht um sonst in den Dokumentationen die Hinweise darauf,
was man erwartet... von OS-Seite. Wenn man dies als Programmierer
mißachtet - gerade in C , dann fliegen einem die Bruchstücke der
Software um die Ohren. :(

Wenn man also wider die Dokumentation programmiert - einfach so, weil
man mal was ausprobieren will, oder denkt man sei so cool, oder eben aus Ignoranz oder Unwissen -
dann ist das unsolide.

Und weniges nur hasse ich mehr als Pfusch.

Fehler gibt es immer - das ist ebenso.

Aber wenn man auf sowas hingewiesen wird, es zu gnorieren,
das ist dann doof.

Leider ist auch unter Linux der Programmierpfusch weit evrbreitet
(naja, vielleicht gehört Pfusch genauso zum Mensch sein, wie
 das fehler machen? Wer weiß ;-))

Bin dch extra zu Linux gewechseltm weil es mir mehr Kontrolle und
bessere betriebssicherheit brachte als Windoof...
... und dann sieht man auch hie rnur Pfusch, dann kotzt man. :(




> 
> > In argv[0] kommt der Name des programms (per Konvention).
> > Auf jeden Fall aber muß argv[0] vorhanden sein, auch wenn
> > da - wider jegl. Konvention - Bullshit drin steht.
> 
> Nachgeschaut: "Nach Konvention ist argv[0] der Name, mit dem das Programm 
> aufgerufen wurde, also ist argc wenigstens 1. [...] zusätzlich verlangt 
> der Standard, dass argv[argc] ein Nullzeiger ist." (K&R, S. 110)

EBEN!

Und wenn das so verlangt wird, bitte auch so machen,
dann haben wir alle was davon: sauber laufende Software.

Das Code-beispiel von dem diese Diskussion dann
in diesem Thread-Abzweig weiter lief, war unsolide
in dem Sinne, daß - Abhängig von der Anzahl der
Argumente des Programms - ggf. das Programm absemmelt.

Deswegen mein ganzes langes Geschreibe...


Mit anderen Worten: Möge man sich bitte an das halten, was
Du da oben zietiert hast und icht aus "cooler Programierstil"
oder ähnlichem oder anderem heraus das da oben igrnorieren...








> 
> Ich kenne einige C-Compiler, da ist argv == 0, argc == 0. Keine Argumente 

Ja, wenn Du nun wieder mit Embedded anfängst....
... das ist dann meistens Krüppel-C, aber nicht ANI/ISO-C,
denn sonst müssten die Compiler sich daran halten.

mit anderen Worten: Klar, wenn der Compiler nicht
standardkonform ist (ja, davon gibt es wohl viele im Embedded-Bereich),
dann kann sowaqs, aber auch viel anderer Müll vorkommen.

Das ist her aber die Linux-Liste und man darf hier wohl mit
einer soliden C-Implementierung rechnen...





> - auch kein Programmname in argv[0] (der wäre nämlich für diese 
> Plattformen nicht definiert). Man hat halt nicht immer ein 
> Dateisystem...
> 
> Ich habe mir angewöhnt, argc > 0 zu prüfen, bevor ich auf argv zugreife.

Mehr prüfen ist immer sinnvoll, wenn man sich nicht sicher ist,
was Sache ist.

Und was, wenn einer der Compiler auch argc nicht richtig setzt?! :(



> In diesem Sinn wäre
> 
> 	if (argc <= 1){
> 		return 1;
> 	}
>         execv(argv[1], argv + 1);
> 
> sicher besser, als der blinde exec-Aufruf.

Woher weißt Du, daß das korrekt gesetzt ist?
Wenn der Compiler alles so anders macht...
...woher weißt Du dann, ob das abschliessende NULL
auch drin steht in dem argv?

Dann also besser NULL als letzten Wert übergeben, schliesslich hast Du selber
ja gesagt, der Compiler würde manches doch recht anders machen
als man es erwartet...

Also wird es doch etwas aufwändiger, diesen Aufruf durchzuführen.
Aber drauf verlassen, daß das sauber ist, wie Du es da oben geschrieben hast,
obwohl der Compiler auch argv[0] anders belegt, z.b. mit NULL,
naja....


Gruß,
   Oliver



Mehr Informationen über die Mailingliste linux-l