was macht diese C-Zeile

Gast #182341
Das sind zwei Vergleichsoperationen.

cmd ist ein Pointer auf eine Struktur, die Elemente namens cmd (wie
praktisch!) und status enthält.

Die erste Zeile vergleicht das Strukturelement cmd mit dem Wert(?), der
#definierten Konstanten (wäre aufgrund der Großschreibung naheliegend)
CMD_ABORT.

Die zweite Zeile enthält eine öffnende geschweifte Klammer.

Die dritte Zeile vergleicht das Strukturelement status mit der
(vermutlich auch) #definierten Konstanten STATUS_MOB_AVAILABLE. Dabei
wird der auf das if-Statement folgende Block ausgeführt, wenn die
Bedingung unwahr ist (!= ist nicht gleich, während das == der ersten
Zeile gleich ist.

Literaturempfehlung:

Kernighan&Ritchie, Programmieren in C, zweite Auflage, Hanser Verlag
Gast #182342
@Rufus
Danke.
Mal sehen ob ich es richtig vertanden haben
cmd enthält etwas, was "cmd" heißt und etwas, das "status" heißt,
also sozusagen zwei Variablen in einer?
Und um an den Inhalt von "status" in "cmd" ranzukommen, bedarf es
eines "->"?
Gast #182343
.
  "cmd enthält etwas, was "cmd" heißt und etwas, das
  "status" heißt, also sozusagen zwei Variablen in einer?"

Ja. Das nennt man eine Struktur. Und nein, "cmd" enthält das nicht,
sondern zeigt darauf. "cmd" ist ein Pointer.

Ein Beispiel:

  struct
  {
    int cmd;
    int status;
  } *cmd;


  "Und um an den Inhalt von "status" in "cmd" ranzukommen,
  bedarf es eines "->"?"


Da cmd ein Pointer ist, muss man ihn deferenzieren, und das geschieht
mit dem -> operator.

Wirklich beknackt ist hier die Namensvergabe; sowohl den Pointer als
auch ein Strukturelement mit dem gleichen Namen zu belegen, das ist
ziemlich dämlich.
Gast #182344
...nur ums vollständig zu machen:

/* Struktur als neuen Typen anlegen */
typedef struct
info_s
{
  int cmd;
  int status;
} info_t;

/* sysinfo definieren */
info_t sysinfo;

int
main(void)
{
  info_t *pInfo = &sysinfo;        /* Pointer anlegen & init.    */

  pInfo->cmd = CMD_START;          /* Zugriff mit pointer-deref  */
  sysinfo.status = STATUS_IDLE;    /* Zugriff ohne pointer-deref */

  return 0;
}
Gast #182345
»foo->bar« ist übrigens die Kurzform für »(*foo).bar«.  Da man diese
Form sehr häufig braucht und die sonst notwendige Klammerung recht
umständlich ist, haben die C-Autoren dafür einen eigenen Operator
erfunden.
Gast #182346
Herzlichen Dank Euch allen.

>>Wirklich beknackt ist hier die Namensvergabe; sowohl den Pointer als
>>auch ein Strukturelement mit dem gleichen Namen zu belegen, das ist
>>ziemlich dämlich.

Naja, das ist dann wohl auch der Grund dafür, dass es nicht so recht
funktioniert und ich diesen Müll auseinanderklambüsern muss um etwas
daraus zu schustern dass funktioniert.
Gast #182347
tja, ob mein ein prog "müll" ist, liegt immer im auge des
betrachters!

denk dran, das software eins der komplexesten gebilde ist, das der
mensch erschaffen hat! für ein prog gibt es meist nur eine lösung, aber
unendlich viele möglichkeiten, diese lösung zu erreichen.

schonmal einen code eines mathematikers, eines physikers oder eines
"nur" programmierers? alle benutzen die selbe sprache, alle lösungen
funktionieren, aber die programme haben eben bis auf die sprache und
das ergebnis nichts gemeinsam!!!

naja... und "müll" kann man ein prog eventuell nennen, wenn es voll
von symantischen fehlern ist. das würde dann auf ein frickelwerk
deuten, das nicht wirklich gut durchgeplant ist.
Gast #182348
Nun, ein strukturierter oder wenigstens halbwegs konsistenter Umgang mit
Bezeichnern ist schon ein wichtiges Kriterium bei der
Softwareentwicklung.

Das oben zitierte Beispiel (Verwendung des Bezeichners "cmd")
rechtfertigt zumindest eine hochgezogene Augenbraue bei der Lektüre des
Quelltextes.

Meinst Du "syntaktische" oder "semantische" Fehler?
Gast #182349
Hallo,

ich gebe dann auch noch kurz meinen Senf dazu ;-) :

"Beim Programmieren muss man immer darauf achten, dass man den Code
für den Menschen schreibt - den Code für die Maschine schreibt der
Compiler !"

Das stammt nicht von mir, aber ich denke es ist der richtige Weg.
Selbst einen gut optimierten Code kann man so schreiben, dass er lesbar
ist und nicht einfach nur aussieht wie ein modernes Kunstwerk -
faszinierend anzusehen und den meisten Menschen unverständlich.

Ein Beispiel : In meinem aktuellen Projekt (FAT12/16/32) gibt es eine
Struktur mit dem Namen "FATInfo" diese hat dann die Elemente (z.B.)
"ui16SectorsPerCluster". Das ist bestimmt mehr Tiparbeit, als wenn
ich es "FI2.SpC" genannt hätte, aber ist ungemein besser lesbar.
Aus einem "guten Code" erkennt der Leser die Intention bei der Lösung
eines Problems (was auch Optimierungen angeht - diese kann man auch so
darlegen, das sie nicht ausschauen wie ein Dschungel).

Zum Thema "Müll"-Programme : Das sind alle Programme, wo man nach 2
Wochen selbst nicht mehr weiß, was man sich dabei gedacht hat. Die kann
dann nämlich kein Mensch mehr brauchen - was wiederum das Kennzeichen
von Müll ist :-).

MfG, Daniel.
Gast #182350
Ich bitte das Wort "Müll" nicht überzubewerten. Der Programmierer hat
sich bestimmt viel Mühe gegeben, sein Bestes gegeben, viel viel mehr
erreicht als ich und kann bestimmt viel besser programmieren, als
ich...
Das ich mir damit die Karten lege liegt daran, dass ich nicht
programmieren kann. Somit ist der Ausdruck "Müll" bitte als
Verärgerung über meine Unfähigkeit zu verstehen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.