mikrocontroller.net

Forum: Compiler & IDEs was macht diese C-Zeile


Autor: flyingwolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi.
Was machen diese Zeilen?


if (cmd->cmd == CMD_ABORT)
{
if (cmd->status!=STATUS_MOB_AVAILABLE)
...

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: flyingwolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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 "->"?

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.
  "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.

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...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;
}

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
»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.

Autor: flyingwolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: KoF (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: flyingwolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.