Forum: Mikrocontroller und Digitale Elektronik Kann man in C mit 'with' auf eine struct zugreifen?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Roth (Gast)


Bewertung
-5 lesenswert
nicht lesenswert
Ich weiß es jetzt echt nicht mehr... :(

von Timmo H. (masterfx)


Bewertung
0 lesenswert
nicht lesenswert
nein

von Roth (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Gibt es sowas wie with in C ?

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
2 lesenswert
nicht lesenswert
Nein, "with" ist kein reserviertes Schlüsselwort in C, und es gibt auch 
kein Äquivalent dafür.

Da eine Struktur Elemente der unterschiedlichsten Typen enthalten kann, 
zur Laufzeit aber der Typ einer Variablen nicht bestimmt werden kann, 
könnte ein entsprechendes Konstrukt auch nicht sinnvoll umgesetzt 
werden.

: Bearbeitet durch Moderator
von Roth (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Schade.

von Kaj G. (Firma: RUB) (bloody)


Bewertung
1 lesenswert
nicht lesenswert
Roth schrieb:
> Gibt es sowas wie with in C ?
Wenn du sagen wuerdest, wo das herkommt, dann koennte man dir auch 
helfen. Meinst du das with aus Python? Beschreib doch mal was du machen 
willst.

von Roth (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Kaj G. schrieb:
> Wenn du sagen wuerdest, wo das herkommt, dann koennte man dir auch
> helfen. Meinst du das with aus Python? Beschreib doch mal was du machen
> willst.
mh? Ich kenne With eigentlich aus vielen Sprachen. VB/VBA z.B. In TC 
oder Borland Pascal waren sogar kaskadierte With-Strukturen möglich. Das 
spart unheimlich Buchstaben. Wegen der Übersicht, meine ich.

Aktuell habe ich ein Struct-Array in mehreren Dimensionen. Um auf ein 
Element zuzugreifen, muss ich ohne With immer den kompletten Namen mit 
allen Indices benennen. Ist ja kein Problem, erzeugt halt nur unschöne, 
lange Zeilen...

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Wenn es Dir darum geht:

Du kannst jederzeit einen Pointer auf die Struktur o.ä. bestimmen und 
den anstelle der komplett durchreferenzierten und ausdeklinierten 
Struktur verwenden.

Ich hatte angenommen, Du wolltest Strukturelemente iterieren.

(So lange ist's schon her, daß ich mal Pascal verwendet habe, daß ich 
das glatt vergessen habe ...)

Also:

Statt
1
bla[5].laber[x].schwall = 1;
2
bla[5].laber[x].fusel = 37;
3
bla[5].laber[x].schawarma = 0;
4
bla[5].laber[x].rembrandt = 98.721;

kannst Du auch schreiben:
1
laberstruct *p;
2
3
p = bla[5].laber + x;
4
5
// alternativ
6
p = &bla[5].laber[x];
7
8
p->schwall = 1;
9
p->fusel = 37;
10
p->schawarma = 0;
11
p->rembrandt = 98.721;

(annehmend, daß das Array laber[] vom Typ laberstruct ist).

Das dürfte Deinem

with bla[5].laber[x]

entsprechen.

: Bearbeitet durch Moderator
von foobar (Gast)


Bewertung
2 lesenswert
nicht lesenswert
Rufus schrieb:
> Da eine Struktur Elemente der unterschiedlichsten Typen enthalten kann,
> zur Laufzeit aber der Typ einer Variablen nicht bestimmt werden kann,
> könnte ein entsprechendes Konstrukt auch nicht sinnvoll umgesetzt
> werden.

Das Pascal-With ist ne rein statische Compile-Time-Klamotte und könnte 
problemlos in C implementiert werden.

von Tom (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Roth schrieb:
> Ich kenne With eigentlich aus vielen Sprachen. VB/VBA z.B. In TC
> oder Borland Pascal waren sogar kaskadierte With-Strukturen möglich. Das
> spart unheimlich Buchstaben. Wegen der Übersicht, meine ich.

Ich finde, das war das genaue Gegenteil von übersichtlich. Bei bisher 
nicht bekannten Quellcode war es auf den ersten Blick überhaupt nicht 
nachvollziehbar was bei kaskadierten with-Anweisungen genau gesetzt 
wurde.

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
foobar schrieb:
> Das Pascal-With ist ne rein statische Compile-Time-Klamotte und könnte
> problemlos in C implementiert werden.

Das hat sich mittlerweile geklärt, s.o.

Ich dachte zunächst an den Wunsch, Strukturelemente zu iterieren (etwas, 
was mit VB und "Variant" o.ä. möglich ist), und das ist in C nicht 
möglich.

von foobar (Gast)


Bewertung
0 lesenswert
nicht lesenswert
> Ich finde, das war das genaue Gegenteil von übersichtlich.

Allerdings. Innerhalb eines with-Blocks weiß man nie genau, welche 
Variablen gerade verdeckt werden. Da packt dann irgendwer nen 
zusätzliches Feld (z.b. count oder i) in ne Struktur und bisher 
korrekter Kode spinnt auf einmal.

von Nils P. (torus)


Bewertung
-1 lesenswert
nicht lesenswert
ist schade, würde ich mir auch wünschen, aber ist nicht.

von Roth (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Tom schrieb:
> Ich finde, das war das genaue Gegenteil von übersichtlich.
Findet ihr ?

Im Beispiel VBA sieht das so aus:

Standard:
1
MeinArray1[MeinErsterIndex, MeinZweiterIndex, MeinDritterIndex3].MeinWert1 = 12345
2
MeinArray1[MeinErsterIndex, MeinZweiterIndex, MeinDritterIndex3].MeinWert2 = 23456
3
MeinArray1[MeinErsterIndex, MeinZweiterIndex, MeinDritterIndex3].MeinWert3 = 34567

With-Version:
1
With MeinArray1[MeinErsterIndex, MeinZweiterIndex, MeinDritterIndex3]
2
  .MeinWert1 = 12345
3
  .MeinWert2 = 23456
4
  .MeinWert3 = 34567
5
End With

Was ist daran unübersichtlich?

von Tom (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Roth schrieb:
> Was ist daran unübersichtlich?

Tom schrieb:
> bei kaskadierten with-Anweisungen

Wer lesen kann ist klar im Vorteil

von foobar (Gast)


Bewertung
3 lesenswert
nicht lesenswert
> Was ist daran unübersichtlich?

Schachtel mal 2 oder mehr with-Statements und klamüser dann raus, welche 
Zugriff was referenziert. Bei Pascal war es noch schlimmer, da der 
führende Punkt nicht vorhanden war:
1
with ob1 do
2
  with obj2 do
3
    a := b+c;
Das ist vollkommen nichtssagend, wenn man nicht die aktuellen Definition 
beider Objekte genau kennt.

von A. S. (achs)


Bewertung
4 lesenswert
nicht lesenswert
Roth schrieb:

> Im Beispiel VBA sieht das so aus:

in c so:
1
tWert *pw = &MeinArray1[MeinErsterIndex, MeinZweiterIndex, MeinDritterIndex3];
2
   pw->MeinWert1 = 12345;
3
   pw->MeinWert2 = 23456;
4
   pw->MeinWert3 = 34567;

> Was ist daran unübersichtlich?

Es verleitet dazu, lange statt sprechende Variablennamen zu haben und 
die dann zu "verstecken".

Tipparbeit zu sparen ist nur für absolute Beginner (bzw. 
Wiedereinsteiger) ein Issue, da bei denen das Schreiben den Löwenanteil 
hat. Bei Profis ist die Lesbarkeit viel wichtiger. Und die erhöht sich 
weder mit langen Variablennamen noch mit deren Aliasing. Am Ende sind 10 
Zeilen am Tag in etwa die Größenordnung eines Softwerkers. Da überleg 
mal, wieviel davon Tipparbeit ist.

: Bearbeitet durch User
von Florian (Gast)


Bewertung
-2 lesenswert
nicht lesenswert
Achim S. schrieb:
> nur für absolute Beginner (bzw. Wiedereinsteiger) ein Issue

Du meinst, wenn man das anderst macht, ist man compliant? Und wenn 
nicht, muss man halt die requierments solange runterlowern bis es fit

von A. S. (achs)


Bewertung
0 lesenswert
nicht lesenswert
Florian schrieb:
> Du meinst, wenn man das anderst macht, ist man compliant? Und wenn
> nicht, muss man halt die requierments solange runterlowern bis es fit

was meinst Du damit in Bezug auf meine Ausführungen zu

Roth schrieb:
> In TC
> oder Borland Pascal waren sogar kaskadierte With-Strukturen möglich. Das
> spart unheimlich Buchstaben. Wegen der Übersicht, meine ich.

Sobald jemand ein echtes Projekt programmiert, ist "Tipparbeit" beim 
Quelltext das geringste Problem.

von Roth (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Rufus Τ. F. schrieb:
> kannst Du auch schreiben:
>
>
1
laberstruct *p;
2
> 
3
> p = bla[5].laber + x;
4
> 
5
> // alternativ
6
> p = &bla[5].laber[x];
7
8
> p->schwall = 1;
9
> p->fusel = 37;
10
> p->schawarma = 0;
11
> p->rembrandt = 98.721;


Achim S. schrieb:
> in c so:
>
1
tWert *pw = &MeinArray1[MeinErsterIndex, MeinZweiterIndex, MeinDritterIndex3];
2
>    pw->MeinWert1 = 12345;
3
>    pw->MeinWert2 = 23456;
4
>    pw->MeinWert3 = 34567;

Funktioniert, danke :-)

Verrät mir noch jemand, was der Unterschied zwischen
1
pw.MeinWert3
und
1
pw->MeinWert3
ist? Ich habe seit 25J. nix mehr mit C gemacht. Late Binding fällt mir 
ein bei '->'. Ist das so? PS: Mit dem '.' lässt es sich nicht 
compilieren (war aber "gefühlsmäßig" zu erwarten). Nur weiß ich nicht, 
warum ....

von asdf (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Roth schrieb:
> Verrät mir noch jemand, was der Unterschied zwischen
>
1
pw.MeinWert3
> und
>
1
pw->MeinWert3
> ist? Ich habe seit 25J. nix mehr mit C gemacht. Late Binding fällt mir
> ein bei '->'. Ist das so? PS: Mit dem '.' lässt es sich nicht
> compilieren (war aber "gefühlsmäßig" zu erwarten). Nur weiß ich nicht,
> warum ....
1
pw.MeinWert3
greift auf das Element MeinWert3 zu, wenn pw z.B. ein struct ist
1
pw->MeinWert3
dereferenziert den Pointer pw und greift dann auf das Element MeinWert3 
zu

von (prx) A. K. (prx)


Bewertung
0 lesenswert
nicht lesenswert
p->x ist identisch mit (*p).x

von S. R. (svenska)


Bewertung
0 lesenswert
nicht lesenswert
Roth schrieb:
> Verrät mir noch jemand, was der Unterschied zwischen
> pw.MeinWert3 und pw->MeinWert3ist?

Im ersten Fall ist "pw" eine Variable (vom Typ 'struct irgendwas'), im 
zweiten Fall ist "pw" ein Zeiger auf eine Variable (vom Typ 'struct 
irgendwas').

von Äpfel vs Birnen (Gast)


Bewertung
-4 lesenswert
nicht lesenswert
Stichworte:
with, pointer

vs

Stichworte:
Übersetzungszeit, Laufzeit

Uuups ....

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
3 lesenswert
nicht lesenswert
Äpfel vs Birnen schrieb:
> Uuups ....

Wenn man sich selektiv einzelne Postings aus einem Thread heraussucht 
und sich Mühe gibt, nachfolgende Postings nicht zu lesen, die 
Missverständnisse aufklären, dann kann man zu so einem Schluss kommen.

Wie wäre es, einen Lerngang im sinnerfassenden Lesen zu belegen?

von Roth (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Das Forum ist klasse. Hier kann man immer was lernen. Danke an alle :-)

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]
  • [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.