Forum: PC-Programmierung Zuweisung zweidimensionales Array


von Blindfisch (Gast)


Lesenswert?

Warum schmeißt der Compiler bei folgendem Programm die Meldung
1
expected expression before '{' token"
in den Zeilen mit der Array-Zuweisung?

Danke
1
#include <stdio.h>
2
3
int main( void )
4
{
5
char field[2][3];
6
int i;
7
8
    field[0] = {'0', '1', '2'};
9
    field[1] = {'a', 'b', 'c'};
10
11
    printf( "size: %d\n\n", sizeof(field) );
12
13
    for(i=0; i<sizeof(field); ++i)
14
    {
15
        printf("%c\t", *(field+i) );
16
    }
17
18
return 0;
19
}

von Peter II (Gast)


Lesenswert?

Blindfisch schrieb:
> Warum schmeißt der Compiler bei folgendem Programm die Meldungexpected
> expression before '{' token"in den Zeilen mit der Array-Zuweisung?

weil man Array nichts zuweisen kann. Egal on 1 oder mehr dimensional. 
Man kann sie nur initalisieren.
1
char field[2][3] = { {'1','2','3'}, {'3', '4', '5' } };

von Sebastian V. (sebi_s)


Lesenswert?

Arrays kann man nur bei der Deklaration auf diese Weise Werte zuweisen. 
So ginge es z.B.:
1
char field[2][3] = {{'0', '1', '2'}, {'a', 'b', 'c'}};

Nach der Deklaration kannst du nur den einzelnen Werten zuweisen als 
sowas wie:
1
field[0][0] = '0';

von Borislav B. (boris_b)


Lesenswert?

Hm, warum eigentlich diese Inkonsistenz?
Sollte doch für den Herrn Compiler kein Problem darstellen, oder?

von Peter II (Gast)


Lesenswert?

Boris P. schrieb:
> Hm, warum eigentlich diese Inkonsistenz?

welche Inkonsistenz?
Eine Zuweisung ist etwas völlig anders als eine Initialisierung.

von Dirk B. (dirkb2)


Lesenswert?

Sebastian V. O. schrieb:
> Arrays kann man nur bei der Deklaration auf diese Weise Werte zuweisen.
> So ginge es z.B.:char field[2][3] = {{'0', '1', '2'}, {'a', 'b', 'c'}};

Das ist aber schon die Definition (und auch Deklaration), da da schon 
Speicher verbraucht wird.

Eine reine Deklartion bei Variablen wird in C mit extern gemacht
1
extren char field[2][3];
Bekanntgabe, dass (irgendwo) eine Variable field existiert.

Bei Funktionen wäre das der Prottyp.

von BD244C (Gast)


Lesenswert?

Peter II schrieb:
> weil man Array nichts zuweisen kann. Egal on 1 oder mehr dimensional.

Warum muss man eigentlich immer gleich vorlaut die Klappe aufreißen, 
noch dazu wenn's falsch ist!

http://de.wikibooks.org/wiki/C-Programmierung:_Arrays

" .. Bei einer Initialisierung steht ein Zuweisungsoperator nach dem 
deklariertem Array, .. "

von Peter II (Gast)


Lesenswert?

BD244C schrieb im Beitrag #3999294:
> Warum muss man eigentlich immer gleich vorlaut die Klappe aufreißen,
> noch dazu wenn's falsch ist!
>
> http://de.wikibooks.org/wiki/C-Programmierung:_Arrays
>
> " .. Bei einer Initialisierung steht ein Zuweisungsoperator nach dem
> deklariertem Array, .. "

was war jetzt daran falsch?

Nur weil es einen Zuweisungsoperator gibt, ist es noch lange keine 
Zuweisung.

von BD244C (Gast)


Lesenswert?

Peter II schrieb:
> was war jetzt daran falsch?

Das fragst du ernsthaft noch?

> Nur weil es einen Zuweisungsoperator gibt, ist es noch lange keine
> Zuweisung.

Doch! Genau das IST es! Eine Zuweisung.

Nur weil du es nicht verstehst, heißt das nicht, das Wikibooks hier 
falsch liegt.

von Karl H. (kbuchegg)


Lesenswert?

BD244C schrieb im Beitrag #3999337:
> Peter II schrieb:
>> was war jetzt daran falsch?
>
> Das fragst du ernsthaft noch?
>
>> Nur weil es einen Zuweisungsoperator gibt, ist es noch lange keine
>> Zuweisung.
>
> Doch! Genau das IST es! Eine Zuweisung.

Ist es nicht.
Wikipedia liegt hier falsch. Das = ist an dieser Stelle kein 
Zuweisungsoperator.

Initialisierung ist nicht dasselbe wie Zuweisung. In C ist dieser 
Unterschied noch nicht so bedeutsam, aber in C++ ist der Unterschied 
essentiell um zu verstehen, wann ein operator= aufgerufen wird und wann 
ein Konstruktor aufgerufen wird.

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

BD244C schrieb im Beitrag #3999337:
> Peter II schrieb:
>> was war jetzt daran falsch?
>
> Das fragst du ernsthaft noch?
ja, ich will es ja schon wissen was falsch war.

>> Nur weil es einen Zuweisungsoperator gibt, ist es noch lange keine
>> Zuweisung.
> Doch! Genau das IST es! Eine Zuweisung.

nein, es ist eine Initialisierung die mit hilfe von dem 
Zuweisungsoperator gemacht wird.

> Nur weil du es nicht verstehst, heißt das nicht, das Wikibooks hier
> falsch liegt.
wo steht das man einem Array ein anders Array zuweisen kann?

von BD244C (Gast)


Lesenswert?

Karl Heinz schrieb:
>> Doch! Genau das IST es! Eine Zuweisung.
>
> Ist es nicht.
> Wikipedia liegt hier falsch. Das = ist an dieser Stelle kein
> Zuweisungsoperator.
>
> Initialisierung ist nicht dasselbe wie Zuweisung.

Doch ist es, lieber Karl-Heinz Buchegger. Und wir reden hier von C, 
nicht von C++ !!

Initial heißt übersetzt einfach ANFÄNGLICH! Eine INITIALISIERUNG ist 
hier nichts anderes als eine ZUWEISUNG ZU BEGINN, also anfänglich.

von Peter II (Gast)


Lesenswert?

BD244C schrieb im Beitrag #3999354:
> Initial heißt übersetzt einfach ANFÄNGLICH! Eine INITIALISIERUNG ist
> hier nichts anderes als eine ZUWEISUNG ZU BEGINN, also anfänglich.

noch mal nein. Initialisierung läuft anders, aber als eine Zuweisung. 
Nur weil es für dich das gleiche ist, hast du damit noch lange nicht 
recht.

Und weil es etwas anders ist, kann man auch nicht einfach Arrays etwas 
zuweisen.

von c-liker (Gast)


Lesenswert?

@ BD244C:
Blöde Frage, wenn es das gleiche ist, wieso funktioniert die zweite 
Zeile im folgenden Code dann nicht?
1
  int test[3] = {1, 2, 3};
2
  test = {4, 5, 6};

von BD244C (Gast)


Lesenswert?

Peter II schrieb:
> noch mal nein. Initialisierung läuft anders, aber als eine Zuweisung.

Das ist kein Widerspruch. Eine Initialisierung, also eine Zuweisung ZU 
BEGINN, ist nun mal in C anders geregelt als eine Werte-Zuweisung, die 
später geschieht. Trotzdem bleibt es immer ein ZUWEISEN von Werten! 
Anders geht es ja gar nicht! Ihr versucht mal wieder Begriffe ad 
absurdum spitzfindisch auszulegen, ohne euch über den Vorgang dahinter 
bewusst zu sein.

von Karl H. (kbuchegg)


Lesenswert?

BD244C schrieb im Beitrag #3999354:
> Karl Heinz schrieb:
>>> Doch! Genau das IST es! Eine Zuweisung.
>>
>> Ist es nicht.
>> Wikipedia liegt hier falsch. Das = ist an dieser Stelle kein
>> Zuweisungsoperator.
>>
>> Initialisierung ist nicht dasselbe wie Zuweisung.
>
> Doch ist es, lieber Karl-Heinz Buchegger.

Nein, lieber BD244C

Initialisierung ist eben nicht dasselbe.

> Und wir reden hier von C,
> nicht von C++ !!

Der Mechanismus und die Unterscheidung zwischen beidem ist in beiden 
Sprachen identisch.

> Initial heißt übersetzt einfach ANFÄNGLICH! Eine INITIALISIERUNG ist
> hier nichts anderes als eine ZUWEISUNG ZU BEGINN, also anfänglich.

Und wenn du es noch 20 mal wiederholst, du hast nicht recht. Eine 
Intialisierung ist ist eine Intialisierung und eine Zuweisung ist eine 
Zuweisung. Selbst wenn für beides dasselbe Symbol '=' benutzt wird, sind 
das konzeptionell 2 verschiedene Dinge.
Du hast doch auch kein Problem damit, dass ein '*' ja nach Umgebung in 
der er auftaucht verschiedene Bedeutungen hat und damit andere Regeln 
einhergehen. Warum hast du dann mit einem '=' das Problem? Das ist 
nichts anderes.

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

BD244C schrieb im Beitrag #3999365:
> Das ist kein Widerspruch. Eine Initialisierung, also eine Zuweisung ZU
> BEGINN, ist nun mal in C anders geregelt als eine Werte-Zuweisung, die
> später geschieht. Trotzdem bleibt es immer ein ZUWEISEN von Werten!

nein. Bei der Initiierung wird das Objekt gleich mit den Richtigen werte 
gebaut, bei der Zuweisung wird es erst leer gebaut und dann werden die 
Werte zuwiesen.

> Ihr versucht mal wieder Begriffe ad
> absurdum spitzfindisch auszulegen, ohne euch über den Vorgang dahinter
> bewusst zu sein.
wenn dir mal schaust, wie globale Variabel initialisiert werden, wirst 
du merken das dort keine Zuweisung stattfindet.

von BD244C (Gast)


Lesenswert?

Lies dazu auch den Satz im Kernighan/Ritchie, "Programmieren in C", 
Zweite Ausgabe im Kapitel 4 Funktionen und Programmstruktur bei 
Initialisierung, kurz bevor die Initialisierung eines Vektors erklärt 
wird (bei mir S. 84)

"Die Initialisierungen von [..] Variablen ist effektiv nur eine 
Ablürzung für Zuweisungsanweisungen."

Auf Seite 30 wird auch von "BELEGUNG" von Variablen geschrieben

"Am Beginn einer Funktion müssen automatische Variable jeweils explizit 
mit Werten BELEGT werden."

Ob man jetzt von Zuweisung oder Belegung spricht ist Jacke wie Hose. 
Inialisierung ist nichts anderes wie eine Wertezuweisung ZU BEGINN (= 
INITIAL). Das ist alles.

Ihr macht mal wieder eine Überdehnung an Spitzfindigkeiten dieser 
Begriffe, wie sie nie gedacht waren.

Sinnlos euch das zu vermitteln!

von Peter II (Gast)


Lesenswert?

BD244C schrieb im Beitrag #3999392:
> Sinnlos euch das zu vermitteln!

schön das so fleißig suchst, aber auch dort steht nichts das es das 
gleiche ist.


> "Die Initialisierungen von [..] Variablen ist effektiv nur eine
> Ablürzung für Zuweisungsanweisungen."

hier wird doch schon deutlich, das es 2 Verschiedene dinge sind, darum 
auch 2 Begriffe. Das sie eventuell zum gleichen Ergebnis kommen ist 
egal.

Aber eine Stelle wo steht, das man Array etwas zuweisen kann hast du 
nicht gefunden? Merkwürdig.

von BD244C (Gast)


Lesenswert?

Peter II schrieb:
> Bei der Initiierung wird das Objekt gleich mit den Richtigen werte
> gebaut,

In C gibt es keine Objekte!

Es werden Werte ZUGEWIESEN und nicht gebaut! Es gibt in C keinen 
"Bauplan" für Variable und auch keine Objekte.

Aber das zeigt mir wie sinnlos es ist mit euch um Begriffe zu feilschen!

Ende und aus.

von Rolf Magnus (Gast)


Lesenswert?

BD244C schrieb im Beitrag #3999354:
> Initial heißt übersetzt einfach ANFÄNGLICH!

Gut erkannt, aber

> Eine INITIALISIERUNG ist hier nichts anderes als eine ZUWEISUNG ZU
> BEGINN, also anfänglich.

diese Schlußfolgerung erschließt sich mir nicht. Weil "initial" soviel 
wie "anfänglich" heißt, muß es eine Zuweisung sein?

BD244C schrieb im Beitrag #3999365:
> Eine Initialisierung, also eine Zuweisung ZU BEGINN, ist nun mal in C
> anders geregelt als eine Werte-Zuweisung, die später geschieht.

Nein, eine "Zuweisung zu Beginn" gibt es nicht. Entweder bekommt die 
Variable gleich bei ihrer Erstellung einen Wert mit, dann wurde sie 
initialisiert, oder eine Variable, die bereits exisitert, bekommt einen 
neuen Wert, dann wurde dieser ihr zugewiesen.

> Ihr versucht mal wieder Begriffe ad absurdum spitzfindisch auszulegen,
> ohne euch über den Vorgang dahinter bewusst zu sein.

Du solltest vielleicht mal in die Definition der Sprache C reinschauen. 
Da sind diese Begriffe nämlich eindeutig beschrieben.

Peter II schrieb:
>> Ihr versucht mal wieder Begriffe ad
>> absurdum spitzfindisch auszulegen, ohne euch über den Vorgang dahinter
>> bewusst zu sein.
> wenn dir mal schaust, wie globale Variabel initialisiert werden, wirst
> du merken das dort keine Zuweisung stattfindet.

Schon alleine auch deshalb, weil C Zuweisungen außerhalb von Funktionen 
verbietet.

BD244C schrieb im Beitrag #3999399:
> Peter II schrieb:
>> Bei der Initiierung wird das Objekt gleich mit den Richtigen werte
>> gebaut,
>
> In C gibt es keine Objekte!

Auch dazu solltest du mal die C-Norm lesen. Dort ist der Begriff 
"object" genau definiert. Objekte sind im Prinzip alles, was Daten ist. 
Eine Variable ist ein Objekt, das einen Namen hat. Es gibt aber auch 
Objekte ohne Namen, wie z.B. das, in dem der Return-Wert einer Funktion 
zurückgegeben wird oder der Speicherblock, auf den ein malloc-Aufruf 
einen Zeiger zurückgibt.
Hier findet man ein Zitat aus der ISO-Norm:
http://de.wikipedia.org/wiki/Objekt_(Programmierung)#Pragmatische_Definition_in_C

von BD244C (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Auch dazu solltest du mal die C-Norm lesen. Dort ist der Begriff
> "object" genau definiert. Objekte sind im Prinzip alles, was Daten ist.

Richtig, Objekt ist in C ein Speicherbereich. Aber genau da liegt der 
Hase im Pfeffer. Es gibt schon genug Verwirrung durch Überschneidungen 
zwischen C und C++, so dass der Begriff "Objekt" sprachlich hier C++ 
vorbehalten sein sollte. Die meisten werden nun mal "Objekt" mit OOP in 
Zusammenhang bringen und dort sollte es auch hingehören bzw. bleiben, 
gerade auch wenn der Begriff "Bauplan" (wie geschehen) dabei fällt.

Rolf Magnus schrieb:
> diese Schlußfolgerung erschließt sich mir nicht. Weil "initial" soviel
> wie "anfänglich" heißt, muß es eine Zuweisung sein?

Es heißt nicht "soviel wie anfänglich", es HEISST anfänglich und nichts 
anderes. Initialisierung ist einfach ein spezieller Akt einer Zuweisung 
von Werten an Variable. Das ist alles. Wie das im einzelnen geschieht, 
etwa bei Arrays oder einfachen Variablen, ist geregelt. Punkt und aus. 
Wann immer Variable mit Werten belegt werden, findet eine Zuweisung 
dieser Werte an einen Platzhalter statt. Daraus braucht man keine 
Wissenschaft oder Talibanisierung der Begriffe machen. Der gesunde 
Menschenverstand reicht, um das zu verstehen. Wenn man im C&R dazu liest 
merkt man das auch.

von Karl H. (kbuchegg)


Lesenswert?

BD244C schrieb im Beitrag #3999392:
> Lies dazu auch den Satz im Kernighan/Ritchie, "Programmieren in C",
> Zweite Ausgabe im Kapitel 4 Funktionen und Programmstruktur bei
> Initialisierung, kurz bevor die Initialisierung eines Vektors erklärt
> wird (bei mir S. 84)
>
> "Die Initialisierungen von [..] Variablen ist effektiv nur eine
> Ablürzung für Zuweisungsanweisungen."

'ist effektiv' ist nicht dasselbe wie 'es ist'

Der C Standard unterscheidet zwischen den beiden.

Du scheinst eine Zuweisung einzig und alleine daran festzumachen, dass 
im Speicher Werte abgelegt werden.
Dem ist aber nicht so.
Mit dem Begriff 'Zuweisungsoperator' ist in der Sprachdefinition eine 
ganze Latte von Regeln verknüpft. Unter anderem auch eine Voraussetzung:
Damit ein Zuweisungsoperator anwendbar ist, muss die linke Seite eine 
'modifiable lvalue' sein.

Genau diese nicht erfüllte Voraussetzung ist es, die bei
1
const int i;
2
3
  i = 5;
beim Versuch das = als Zuweisungsoperator anzuwenden, einen Fehler 
provoziert. i ist zwar ein lvalue. Aber er ist nicht modifiable.

Das '=' in
1
  int j = 8;
ist syntaktisch kein Zuweisungsoperator sondern ganz klar in der 
Syntaxdefintion einfach nur als Zeichen '=' vorgesehen, welches anzeigt, 
dass eine Initialisierung folgt.
Das ist genau das gleiche, wie in
1
  foo( 2, 3, 4 );
das Komma an dieser Stelle kein Kommaoperator ist, sondern einfach nur 
ein Komma, welches Argumente voneinander trennt.

: Bearbeitet durch User
von kiloamp (Gast)


Lesenswert?

BD244C schrieb im Beitrag #3999450:
> Rolf Magnus schrieb:
>> Auch dazu solltest du mal die C-Norm lesen. Dort ist der Begriff
>> "object" genau definiert. Objekte sind im Prinzip alles, was Daten ist.
>
> Richtig, Objekt ist in C ein Speicherbereich. Aber genau da liegt der
> Hase im Pfeffer. Es gibt schon genug Verwirrung durch Überschneidungen
> zwischen C und C++, so dass der Begriff "Objekt" sprachlich hier C++
> vorbehalten sein sollte. Die meisten werden nun mal "Objekt" mit OOP in
> Zusammenhang bringen und dort sollte es auch hingehören bzw. bleiben,
> gerade auch wenn der Begriff "Bauplan" (wie geschehen) dabei fällt.
>
> Rolf Magnus schrieb:
>> diese Schlußfolgerung erschließt sich mir nicht. Weil "initial" soviel
>> wie "anfänglich" heißt, muß es eine Zuweisung sein?
>
> Es heißt nicht "soviel wie anfänglich", es HEISST anfänglich und nichts
> anderes. Initialisierung ist einfach ein spezieller Akt einer Zuweisung
> von Werten an Variable. Das ist alles. Wie das im einzelnen geschieht,
> etwa bei Arrays oder einfachen Variablen, ist geregelt. Punkt und aus.
> Wann immer Variable mit Werten belegt werden, findet eine Zuweisung
> dieser Werte an einen Platzhalter statt. Daraus braucht man keine
> Wissenschaft oder Talibanisierung der Begriffe machen. Der gesunde
> Menschenverstand reicht, um das zu verstehen. Wenn man im C&R dazu liest
> merkt man das auch.

[ ] Ich weiß alles und alle anderen sind doof.

Da darfst du jetzt ein Kreuzchen reinmachen lieber BD244C (Gast)!

von Karl H. (kbuchegg)


Lesenswert?

> Wenn man im C&R dazu liest merkt man das auch.

Der C&R definiert schon lange nicht mehr, wie C funktioniert oder wie es 
definiert wurde. Das tut der C-Standard.
Und der C-Standard gibt dir nicht recht.

Sorry.
Aber es reicht nicht, hemdsärmelig damit zu argumentieren, welche 
Auswirkungen bestimmte Zeichen in einer Programmiersprache haben. Zu den 
Begriffen wie zum Beispiel "Zuweisungsoperator" gibt es Regeln und 
Regelungen, wann und wo etwas ein Zuweisungsoperator ist und wann nicht.

Edit:
> Der gesunde Menschenverstand reicht, um das zu verstehen.
Und nochmal sorry. In einer formalen Sprachdefinition hat 'der gesunde 
Menschenverstand' nichts zu suchen. Dort müssen die Dinge genau 
definiert werden. Das ist nicht immer einfach und manchmal sind die 
Regeln scheinbar unnötig komplex formuliert (und ja: manchmal sind sie 
auch schlecht formuliert) aber eines findet sich in einem Regelwerk ganz 
sicher nicht: die Definition 'xyz funktioniert so, wie man sich das mit 
gesundem Menschenverstand vorstellt"

: Bearbeitet durch User
von BD244C (Gast)


Lesenswert?

Karl Heinz schrieb:
> Mit dem Begriff 'Zuweisungsoperator' ist in der Sprachdefinition eine
> ganze Latte von Regeln verknüpft.

Da gebe ich dir sogar gerne recht. Den Begriff würde ich hier auch nicht 
so verwenden, weil man an einen Operator schon ein sehr spezielles 
Regelwerk binden kann. Ich habe dennoch die Seite von Wikibooks hier als 
schnelles Beispiel aufgeführt, um zu verdeutlichen, dass der Begriff 
"zuweisen" eher ein sehr allgemeiner Begriff ist, den man nicht streng 
auslegen kann oder sollte (ähnlich wie den Begriff "belegen").

Sei es drum. Lassen wir es stehen wie es ist. Wir werden uns hier nicht 
einigen.

von BD244C (Gast)


Lesenswert?

Karl Heinz schrieb:
> Der C&R definiert schon lange nicht mehr, wie C funktioniert

Du meinst Kernighan/Ritchie, "Programmieren in C", Zweite Ausgabe ist 
überholt???

Seit wann gibt es denn eine dritte Ausgabe? Habe ich da was verpasst?

von Karl H. (kbuchegg)


Lesenswert?

BD244C schrieb im Beitrag #3999467:

> "zuweisen" eher ein sehr allgemeiner Begriff ist, den man nicht streng
> auslegen kann oder sollte (ähnlich wie den Begriff "belegen").

Der Begriff ist dort aber nicht gefallen. Dort ist der Begriff 
'Zuweisungsoperator' gefallen (zumindest nach deinem Zitat, ich habs 
nicht kontrolliert).

Und das ist nicht korrekt. Das hier ist kein Zuweisungsoperator. Selbst 
wenn der Effekt darin besteht, dass bestimmte Speicherstellen einen Wert 
bekommen.

>
> Sei es drum. Lassen wir es stehen wie es ist. Wir werden uns hier nicht
> einigen.

Ja. Weil du hemdsärmelig argumentierst anstatt dir im C Standard 
anzusehen, wie die Dinge tatsächlich definiert sind.

von Karl H. (kbuchegg)


Lesenswert?

Um noch einen draufzusetzen
1
 int i = 8;
2
 int j = i = 9;

was ist hier was?
1
  int i = 8;
das hier ist eine Initialisierung. Das = ist der Anzeiger für die 
Intialisierung

1
  int j = i = 9;

Dieses =
1
  int j = i = 9;
2
        ^
3
        |
4
      das hier
ist wieder der Anzeiger für eine Intialisierung. Die entsprechenden 
Regeln für Initialisierungen gelten.
Dieses = hier
1
  int j = i = 9;
2
            ^
3
            |
4
         das hier
ist ein Zuweisungsoperator. Die entsprechenden Regeln für den 
Zuweisungsoperator gelten.


verblüfft, das man das zweite Beispiel überhaupt schreiben kann?
Nun, das braucht niemanden zu verblüffen.
Etwas vereinfacht ausgedrückt, besagt die Syntax, dass eine 
Initialisierung eine Assignment-Expression sein kann. Wieder vereinfacht 
ausgedrückt ist eine Assignment Expression der rechte Teil einer 
Zuweisung. Die wiederrum von der Form
1
   unary-expression assignment-op assignent-expression
sein kann.

Genau diese Regel ermöglich zum Beispiel
1
  int i, j;
2
  i = j = 9;
also das 'Kaskadieren' von Zuweisungen.

Da das aber als Initialisierung benutzt werden kann, ist
1
  int k = l += 8;
genauso tauglich, wie auch
1
   int* p;
2
...
3
   int k = *p += 7;

: Bearbeitet durch User
von Dirk B. (dirkb2)


Lesenswert?

BD244C schrieb im Beitrag #3999468:
> Karl Heinz schrieb:
>> Der C&R definiert schon lange nicht mehr, wie C funktioniert
>
> Du meinst Kernighan/Ritchie, "Programmieren in C", Zweite Ausgabe ist
> überholt???
>
> Seit wann gibt es denn eine dritte Ausgabe? Habe ich da was verpasst?

Die zweite Ausgabe beschreibt ANSI-C. Auch als C89 bekannt.

Danach gab es noch einige neuere C-Standards von der ISO. Die 
bekanntesten sind C99 und C11.
Jeder neuere Standard setzt den vorhergehenden ausser Kraft (habe ich 
auch gerde gelernt).

Betrachte den K&R als Einführung in die Konzepte der Sprache.
Und die deutsche Übersetzung solltest du nicht unbedingt als Referenz 
nehmen.

von BD244C (Gast)


Lesenswert?

Karl Heinz schrieb:
>> Der gesunde Menschenverstand reicht, um das zu verstehen.
> Und nochmal sorry. In einer formalen Sprachdefinition hat 'der gesunde
> Menschenverstand' nichts zu suchen.

Das sehe ich ganz anders. Für mich gibt es hier keinen Widerspruch. Wir 
reden hier über Begriffe, die es auszulegen gilt und nicht über streng 
mathematische Definitionen. Den Unterschied, lieber Karl-Heinz, solltest 
du eigentlich verstehen. So 100 prozentig festgelegt wie du hier meinst 
sind einige Begriffe in der Programmiererei gar nicht. Dazu gehört auch 
der Begriff zuweisen. Und der Begriff Objekt beispielsweise auch. Wie 
willst du sonst den Leuten erklären, dass es einerseits um einen 
beliebigen Speicherbereich geht (C) und andererseits um ein "Exemplar 
eines bestimmten Datentyps oder einer bestimmten Klasse".

http://de.wikipedia.org/wiki/Objekt_%28Programmierung%29

Die Bedeutung der Begriffe hängt also immer von Kontext ab, in dem sie 
zur Anwendung kommen.

von Bitflüsterer (Gast)


Lesenswert?

@ BD244C

Ich vermute ich kann ein wenig nachvollziehen, was in Dir vorgeht. Es 
ist allerdings nicht ganz angenehm mit Dir auf die bisherige Weise über 
das Thema zu reden.
Lass doch das Thema mal einige Zeit ruhen. Wenn es Dir dann noch wichtig 
ist, dann kannst Du es ja nochmal aufgreifen.

von BD244C (Gast)


Lesenswert?

Dirk B. schrieb:
> Betrachte den K&R als Einführung in die Konzepte der Sprache.
> Und die deutsche Übersetzung solltest du nicht unbedingt als Referenz
> nehmen.

Die deutsche Übersetzung ist recht gut gelungen. Darüber braucht hier 
keiner als Oberschlaumeier den Stab zu brechen und dass es Neuerungen 
wie C99, C11 gibt tut hier nichts zur Sache.

von Karl H. (kbuchegg)


Lesenswert?

BD244C schrieb im Beitrag #3999496:
> Karl Heinz schrieb:
>>> Der gesunde Menschenverstand reicht, um das zu verstehen.
>> Und nochmal sorry. In einer formalen Sprachdefinition hat 'der gesunde
>> Menschenverstand' nichts zu suchen.
>
> Das sehe ich ganz anders.

OK. dann ist für mich der 'case closed' wie man so schön sagt.
Verbreite weiter deine falschen Konzepte und verwende Begriffe falsch.
Aber wundere dich nicht, wenn dir dann etwas strengerer Wind um die Nase 
pfeift und darauf aufmerksam gemacht wirst, wenn du Begriffe nicht so 
verwendest, wie sie von der Definition her gedacht sind.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

> Wir reden hier über Begriffe, die es auszulegen gilt

Da gibt es nichts auszulegen.
Was ein Zuweisungsoperator ist und was nicht, ist exakt geregelt. Kein 
Spielraum für Interpretationen.

Edit:
Du gehörst wohl auch zu denjenigen, die um 3 Uhr früh mit Polizisten 
diskutieren, ob es ok war die rote Ampel zu überfahren, wo doch um die 
Tageszeit kein Verkehr auf den Strassen ist. Schliesslich sind rote 
Ampeln ja auch Auslegungssache.

: Bearbeitet durch User
von BD244C (Gast)


Lesenswert?

Bitflüsterer schrieb:
> @ BD244C
>
> Ich vermute ich kann ein wenig nachvollziehen, was in Dir vorgeht. Es
> ist allerdings nicht ganz angenehm mit Dir auf die bisherige Weise über
> das Thema zu reden.
> Lass doch das Thema mal einige Zeit ruhen. Wenn es Dir dann noch wichtig
> ist, dann kannst Du es ja nochmal aufgreifen.

Ja, da hast du wohl recht. Jetzt beginnt auch die Phase, wo mit 
Quelltext  auf mich eingeschossen wird. Die Profis füttern ihre Kanonen, 
um den Spatz zu erlegen. Das schaffen sie dann auch ohne weiteres, weil 
es mir an Übung fehlt (wie leider meistens). Mir ging es ursprünglich 
nur darum, einen Begriff nicht derart überzustrapazieren, sondern etwas 
gelassener damit umzugehen. Und mir geht diese Schlaumeierei, die immer 
alles besser wissen will und doch so oft daneben liegt auf einfach den 
Senkel. Naja, ich wollte ja schon vorhin aufhören und muss nun Zeit 
aufholen. Der Mainstream hier ist sich ja des recht Habens einig, 
dagegen ist kein Kraut gewachsen. Ist auch im Grunde genommen nicht 
wichtig (wie so vieles im Leben).
;)

von Karl H. (kbuchegg)


Lesenswert?

BD244C schrieb im Beitrag #3999468:

> Seit wann gibt es denn eine dritte Ausgabe? Habe ich da was verpasst?

Offenbar hast du das.
Was C ist und wie es funktioniert wird von einem ISO Gremium definiert 
und nicht mehr von den Herren Kernighan und Ritchie.
Was die beiden selbstverständlich nicht daran hindert (so wie jeden 
anderen Autor auch) ein Buch darüber zu schreiben. Aber auch wenn das 
Buch von Kernighan&Ritchie stammt, haben die beiden nicht mehr 
autoritäre Aussagekraft, wie jeder andere Autor auch.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

BD244C schrieb im Beitrag #3999522:


> Ja, da hast du wohl recht. Jetzt beginnt auch die Phase, wo mit
> Quelltext  auf mich eingeschossen wird. Die Profis füttern ihre Kanonen,
> um den Spatz zu erlegen.

Was nicht passiert wäre, wenn du nicht mit deinem Luftdruckgewehr 
angefangen hättest
Beitrag "Re: Zuweisung zweidimensionales Array"

OK. Es passiert mir auch manchmal, dass ich daneben haue. Aber im 
allgemeinen weiss ich recht gut Bescheid, was ich mit der exakten 
Sprachdefinition beweisen kann und was nicht. Und welche Aussage ich 
machen kann und welche nicht.

von BD244C (Gast)


Lesenswert?

Karl Heinz schrieb:
> Du gehörst wohl auch zu denjenigen, die um 3 Uhr früh mit Polizisten
> diskutieren, ob es ok war die rote Ampel zu überfahren, wo doch um die
> Tageszeit kein Verkehr auf den Strassen ist. Schliesslich sind rote
> Ampeln ja auch Auslegungssache

Nein, genau das Gegenteil stimmt. Ich bin grundsätzlich nett zu den 
Herren in Blau, wenn sie mich mal anhalten. Das erspart(e) mir dann auch 
die Gebühr für das Nichtmitführen meines Führerscheins nicht berappen zu 
müssen (blieb bei einer mündlichen Verwarnung). Der gesunde 
Menschenverstand sagt mir wann ich mich wie zu verhalten habe. Ich bin 
übrigens schon lange aus dem Alter raus, wo man morgens um 3 Uhr als 
Fußgänger an irgendwelchen Ampeln herumhängt.

Mit dem "Zuweisungsoperator" hast du dich jetzt auf einen Begriff 
eingeschossen, der gar nicht von mir war und den ich auch nicht als 
auslegungsfähig angesehen habe.

von Peter II (Gast)


Lesenswert?

BD244C schrieb im Beitrag #3999537:
> Mit dem "Zuweisungsoperator" hast du dich jetzt auf einen Begriff
> eingeschossen, der gar nicht von mir war und den ich auch nicht als
> auslegungsfähig angesehen habe.

du hast doch das Zitat gepostet!

> " .. Bei einer Initialisierung steht ein Zuweisungsoperator nach dem
> deklariertem Array, .. "

um dem Beweis zu liefern, das man Array etwas zuweisen kann.

von Karl H. (kbuchegg)


Lesenswert?

BD244C schrieb im Beitrag #3999537:

> Mit dem "Zuweisungsoperator" hast du dich jetzt auf einen Begriff
> eingeschossen, der gar nicht von mir war und den ich auch nicht als
> auslegungsfähig angesehen habe.

Du mögest vielleicht nochmal an den Anfang der Postingkette zurückkehren

Beitrag "Re: Zuweisung zweidimensionales Array"

und darüber nachdenken, wer hier den Begriff ins Spiel gebracht hat um 
damit welche Aussage zu diskreditieren.
Wenn du dann noch aus der Diskussion mitgenommen hast, dass es eben 
nicht egal ist, ob man sagt, dass etwas initialisiert wird oder ob etwas 
zugewiesen wird, dann hat der Thread tatsächlich etwas gebracht.
Nämlich das Verständnis deinerseits, dass auch in C eine Zuweisung und 
eine Initialisierung konzeptionell 2 verschiedene Dinge sind, mit 
unterschiedlichen Regeln. Und das nicht alles, was dafür sorgt, dass im 
Speicher bestimmte Bytes bestimmte Werte bekommen automatisch eine 
Zuweisung ist.

Wir sind doch hier nicht Töpfereikurs, bei dem man diskutieren kann, ob 
etwas noch ein Aschenbecher ist oder doch schon eine Vase. Wir reden 
hier über eine Programmiersprache. Noch dazu eine, für die es eine 
verbindliche Sprachdefinition gibt.

: Bearbeitet durch User
von Jay (Gast)


Lesenswert?

Ein Array kann man nicht zuweisen nur initialisieren. Wäre Herr BD244C 
etwas freundlicher würde ich mir sogar die Mühe machen die 
entsprechenden Stellen aus dem Standard heraussuchen. Aber so ...

von BD244C (Gast)


Lesenswert?

Peter II schrieb:
> du hast doch das Zitat gepostet!

> um dem Beweis zu liefern, das man Array etwas zuweisen kann.

Ich habe mich vor allem gegen deinen Satz hier gewendet:

Peter II (Gast) schrieb:
>weil man Array nichts zuweisen kann. Egal on 1 oder mehr dimensional.
>Man kann sie nur initalisieren.

und dir zu erklären versucht, dass eine Initialisierung nichts anderes 
ist als ein ZUWEISEN von Werten ihre Platzhalter, nur eben INITIAL = am 
Anfang! That's all. Der formale Akt des INITIALISIERENS ist nichts 
anderes als ein spezieller Fall einer Wertezuweisung. Was denn sonst! 
Das der anderen Regeln unterliegt als eine Zuweisung mitten im Programm 
ist doch überhaupt kein Widerspruch. Wegen mir kannst du auch anstatt 
von ZUWEISUNG von BELEGUNG sprechen. Das ist aber Jacke wie Hose. 
Wichtig ist nur, dass man das Regelwerk dazu kennt und beachtet. Bei 
Nichtbeachtung hagelt es eben dann Fehlermeldungen.

von Peter II (Gast)


Lesenswert?

BD244C schrieb im Beitrag #3999575:
> und dir zu erklären versucht, dass eine Initialisierung nichts anderes
> ist als ein ZUWEISEN von Werten ihre Platzhalter, nur eben INITIAL = am
> Anfang! That's all. Der formale Akt des INITIALISIERENS ist nichts
> anderes als ein spezieller Fall einer Wertezuweisung. Was denn sonst!

Ein Apfel und eine Birne sind auch nicht das gleiche auch wenn beiden 
Vitamine haben.

Es gibt eine Initialisierung und eine Zuweisung.
Array kann man nichts zuweisen.

Es haben genug Leute versucht dir das zu erklären.

von BD244C (Gast)


Lesenswert?

Karl Heinz schrieb:
> Wenn du dann noch aus der Diskussion mitgenommen hast, dass es eben
> nicht egal ist, ob man sagt, dass etwas initialisiert wird oder ob etwas
> zugewiesen wird, dann hat der Thread tatsächlich etwas gebracht.
> Nämlich das Verständnis deinerseits, dass auch in C eine Zuweisung und
> eine Initialisierung konzeptionell 2 verschiedene Dinge sind, mit
> unterschiedlichen Regeln.

Lieber Karl-Heinz, du hast leider wie die anderen hier nicht begriffen, 
worin sprachlich der Unterschied zwischen "initialisieren" und 
"zuweisen" besteht. Darum lies nochmals den Absatz den ich gerade dazu 
schrieb. Initialisieren ist ein Spezialfall von zuweisen, mit 
(selbstverständlich) eigenen Regeln. Aber initialisieren heißt hier 
nichts anderes als INITIAL-ZUWEISEN, also zu Beginn belegen (fällt dir 
was auf!!). Der eigentliche Akt ist IMMER einen Platzhalter mit einem 
Wert zu BELEGEN, d.h. ihm (dem Platzhalter) ein- oder mehrere Werte 
ZUZUWEISEN.

Daran lässt sich nun mal nichts ändern.

von Karl H. (kbuchegg)


Lesenswert?

BD244C schrieb im Beitrag #3999591:

> Lieber Karl-Heinz, du hast leider wie die anderen hier nicht begriffen,
> worin sprachlich der Unterschied zwischen "initialisieren" und
> "zuweisen" besteht.

Sorry.
Mir scheint eher du bist derjenige der nicht begreift oder begreifen 
will, dass man sich um einen gewissen Grad von Exaktheit bemühen muss.

> schrieb. Initialisieren ist ein Spezialfall von zuweisen

für deine Privatdefinition von 'zuweisen'.

Für alle anderen, inklusive dem Norm-Gremium und der Sprachdefinition: 
nein, ist es nicht. Es sind 2 verschiedene Dinge.
Im Zweifel halte ich mich lieber an die Definitionen im Sprachstandard 
als an deine hemdsärmeligen Versuche. Denn die erklären mir noch so 
manch andere Unterschiede.

: Bearbeitet durch User
von BD244C (Gast)


Lesenswert?

Jetzt weiß ich langsam wie sich Galileo Galilei von der heiligen 
Inquisition gefühlt haben muss, als er zum Widerruf gezwungen wurde.

---

Ende

von Udo S. (urschmitt)


Lesenswert?

BD244C schrieb im Beitrag #3999591:
> du hast leider wie die anderen hier nicht begriffen,

Wieder so einer: "Ein Geisterfahrer, hier sind hunderte!"
:-(

Man sollte erkennen wann man unrecht hat, aber Fehler zuzugeben ist für 
manche halt unmöglich

von Udo S. (urschmitt)


Lesenswert?

BD244C schrieb im Beitrag #3999600:
> Jetzt weiß ich langsam wie sich Galileo Galilei von der heiligen
> Inquisition gefühlt haben muss

Nenn dich am besten Zweistein, du leidest massiv an Selbstüberschätzung.

von Karl H. (kbuchegg)


Lesenswert?

BD244C schrieb im Beitrag #3999600:
> Jetzt weiß ich langsam wie sich Galileo Galilei von der heiligen
> Inquisition gefühlt haben muss, als er zum Widerruf gezwungen wurde.

Mir dem einen Unterschied, dass Gallileo recht hatte und die 
Inquisitionsbehörde nicht.
Nur dass hier der Fall genau umgekehrt liegt: du hast eben nicht recht.

Wenn man schon ein Gallileo Gambit macht, sollte man dann auch in der 
Situation Gallileos sein: man muss auch tatsächlich recht haben. Und 
zwar auch dann, wenn man genauer hinsieht.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz schrieb:

> Wenn man schon ein Gallileo Gambit macht, sollte man dann auch in der
> Situation Gallileos sein: man muss auch tatsächlich recht haben. Und
> zwar auch dann, wenn man genauer hinsieht.


Zumal der Fall hier wirklich nicht schwer gelagert ist.
In C wird zwischen Zuweisung und Initialisierung unterschieden.
Einem Array kann man nichts zuweisen, wohl aber kann man es 
initialisieren.

2 Hauptwörter, 2 Zeitwörter. Jedes Zeitwort gehört zu einem Hauptwort 
und beschreibt den jeweiligen Vorgang. Ein Vorgang, der inklusive 
Nebenbedingungen exakt definiert ist.

Eigentlich ganz einfach. Da muss man nichts interpretieren und man muss 
nichts auslegen. Man muss nur akzeptieren, dass die Sachen eben genau so 
sind und für den jeweiligen Vorgang das richtige Verb benutzen. Dann 
folgt alles andere daraus ganz automatisch.
Selbiges für Definition und Deklaration bzw. definieren und deklarieren.

: Bearbeitet durch User
von Bitflüsterer (Gast)


Lesenswert?

Naja. Wenn man sich mal BD244C Standpunkt zu nähern versucht, dann 
scheint mir das möglich zu sein, in dem man von dem Standard absieht.

Damit hat man die Möglichkeit die "Identitätsbeziehung", die BD244C 
zwischen Zuweisung und Initialisierung herstellt, recht weit auszulegen. 
Da das Zeichen '=' in beiden Zusammenhängen benutzt wird, liegt die 
Assoziation nahe und sie ist, meiner Meinung nach plausibel.

Nur wollten wir (der TO) hier ja hier eigentlich nicht vom Standard 
absehen, denn die Frage richtete sich ja auf ein konkretes Problem mit 
einem Code und einer Fehlermeldung. Und die richtet sich definitiv nach 
dem Standard. Und der Standard definiert einen Unterschied zwischen den 
Kategorieren.

Insofern ist es für das Thema überhaupt nicht nützlich, die oben 
erwähnte Assoziation einzuführen. Der TO erhält die Meldung genau 
deswegen, weil der Standard den Unterschied in dieser Weise und so 
festlegt und nicht weil der Compiler nicht so phantasivoll ist wie 
BD244C ist.

Es ist in diesem Zusammenhang vielleicht nützlich zu erwähnen, das 
Sprach-Definitionen nicht "richtig" oder "falsch" sind. Höchstens 
zweckmässig, etc.

von Karl H. (kbuchegg)


Lesenswert?

Bitflüsterer schrieb:

> Damit hat man die Möglichkeit die "Identitätsbeziehung", die BD244C
> zwischen Zuweisung und Initialisierung herstellt, recht weit auszulegen.
> Da das Zeichen '=' in beiden Zusammenhängen benutzt wird, liegt die
> Assoziation nahe und sie ist, meiner Meinung nach plausibel.


Oh.
Das sehe ich ganz genau so.

Mir ist schon klar, das gerade Neulinge sich nicht darüber bewusst sind, 
dass das '=' in
1
  int i = 6;
und
1
  int i;
2
  i = 6;
nicht komplett dieselbe Bedeutung haben, auch wenn das Endergebnis 
dasselbe ist.

Aber es ist eben genau dieser kleine feine formale Unterschied, der 
erklärt warum
1
  const int j = 8;
legal ist, während
1
  const int j = 8;
2
  j = 9;
nicht legal ist.

Oder eben auch, warum es hier geht, warum formal ein
1
  int a[] = { 1, 2, 3 };
erlaubt ist, während ein
1
  int a[3];
2
  a = { 1, 2, 3 };
eben nicht erlaubt aus, selbst wenn beides auf den ersten Blick 
eigentlich identisch aussieht. Die beiden '=' bedeuten eben nicht das 
gleiche. Die beiden Anweisungen sind aus ganz unterschiedlichen 
Anweisungskategorien. Das eine ist eine Variablendefinition, das andere 
eine ausführbare Anweisung.

Ich versteh schon, dass man das durch die etwas Unscharf-Brille durchaus 
als eigentlich den gleichen Vorgang ansehen könnte. Wenn da nicht die 
Nebenbedingungen wären, hätte ich auch kein Problem damit. Aber die 
Nebenbedingungen existieren nun mal und verbieten mir, das eine als eine 
irgendwie speziellere Form des anderen aufzufassen. Da die Sache aber 
viel leichter zu verstehen ist, wenn man die Begriffe streng trennt, ist 
es auch nicht zielführend die Begriffe erst mal miteinander zu 
vermanschkern nur um sich dann sprachlich wieder um einen Haufen 
Ausnahmen rumzuwinden.

von Definierer (Gast)


Lesenswert?

Bitflüsterer schrieb:
> Es ist in diesem Zusammenhang vielleicht nützlich zu erwähnen, das
> Sprach-Definitionen nicht "richtig" oder "falsch" sind.
Ist eine Definition nicht per Definition richtig?

von Bitflüsterer (Gast)


Lesenswert?

@ Karl Heinz

> Ich versteh schon, dass man das durch die etwas Unscharf-Brille durchaus
als eigentlich den gleichen Vorgang ansehen könnte. Wenn da nicht die
Nebenbedingungen wären, hätte ich auch kein Problem damit. Aber die
Nebenbedingungen existieren nun mal und verbieten mir, das eine als eine
irgendwie speziellere Form des anderen aufzufassen.

Vielleicht verbieten sie Dir das doch nicht, oder jedenfalls nicht 
solange Du Dich der Situation näherst.
Anders ausgedrück: Ständiges formales Denken bedeutet ebenso ein 
Ungleichgewicht wie ständiges assoziatives Denken.

Genau genommen bestand der der "Irrtum" von BD244C darin, ein streng 
formales Argument von Peter II 05.02.2015 10:52 in den Bereich des 
assoziativen Denkens zu übertragen und sich dabei auf den 
Wikipedia-Artikel zu stützen.

> Da die Sache aber viel leichter zu verstehen ist, wenn man die
> Begriffe streng trennt, ist es auch nicht zielführend die Begriffe
> erst mal miteinander zu vermanschkern nur um sich dann sprachlich
> wieder um einen Haufen Ausnahmen rumzuwinden.

Mag sein. Jeder "versteht" auf seine eigene Weise. BD244C hat es auf die 
gezeigte Weise getan und konnte Deine Antwort, dass Dein Gegenargument 
auf der Existenz und der Relevanz einer formalen Definition beruht nicht 
in Beziehung zu seinem "Verstehens"-Modus setzen.
Das hat man ja an seiner Reaktion gesehen. Eine solche 
"vermanschkerlung" zu ignorieren halt ich für genauso kontraproduktiv 
wie sie selbst.

Nur war BD244C gefühlsmäßig nicht in der Lage, seinen eigenen Modus zu 
erfassen. Deswegen ja auch mein Vorschlag zur Pause. Aber naja. Das 
gipfelte in dem Galileo-Vergleich, den ich für ein klares Zeichen halte, 
dass Selbsterkenntnis im Moment nicht möglich ist.
Meine Antwort war ohnehin nicht als Kritik an Deiner Argumentation 
gedacht sondern als Denkanstoss an BD244C wenn er wieder ruhiger ist und 
hier reinguckt.

von Yalu X. (yalu) (Moderator)


Lesenswert?

@BD244C:

Es ist in Diskussionen in höchstem Maße förderlich, wenn jeder
Diskussionsteilnehmer dieselbe Sprache spricht, d.h. jeder unter
demselben Begriff auch dasselbe versteht. Das ist in der Alltagssprache
oft nicht möglich, weil viele Begriffe keine feststehende Definition
haben.

Genau aus diesem Grund entstanden und entstehen Fachsprachen, in denen
häufig verwendete Begriffe genau definiert werden. Wenn bspw. in einer
Diskussion unter Mathematikern der Begriff "Menge" fällt, weiß jeder
Teilnehmer sofort gemeint ist, obwohl der Begriff in der Alltagssprache
sehr viel weiter gefasst ist.

In diesem Thread geht es um die Programmiersprache C. Eine Diskussion
darüber verläuft dann am effizientesten, wenn jeder die damit
zusammenhängenden Fachbegriffe in gleicher Weise benutzt. Als Referenz
für die Bedeutung dieser Fachbegriffe wird sinnvollerweise der
ISO-Standard herangezogen. Und dort wird nun einmal klar zwischen
"initialization" (Initialisierung) und "assignment" (Zuweisung)
unterschieden.

Vor diesem Hintergrund ist die erste Antwort auf die Frage

Peter II schrieb:
> weil man Array nichts zuweisen kann. Egal on 1 oder mehr dimensional.
> Man kann sie nur initalisieren.

völlig richtig, klar und eindeutig.

Man könnte allenfalls zum besseren Verständnis für einen C-Neuling
hinzufügen, was der Unterschied zwischen Initialisierung und Zuweisung
ist und warum es diese Unterscheidung gibt.

Natürlich hat nicht jeder C-Programmierer den kompletten Standard im
Kopf, so dass es vorkommen kann, dass er unabsichtlich einen Begriff
anders benutzt als vom Standard vorgesehen. Er sollte dann aber –
nachdem er von anderen darauf hingewiesen wurde – nicht mehr auf seiner
eigenen Definition bestehen, sondern sich sprachlich der C-Community
anpassen, die sich bereits auf eine gemeinsame Definition geeinigt hat.

Dir scheint das äußerst schwer zu fallen, was unnötigerweise zu über 50
Thread-Beiträgen geführt hat, die kaum etwas zum ursprünglichen Thema
beitragen. So eine Diskussion ist alles andere als effizient.

von Rolf Magnus (Gast)


Lesenswert?

BD244C schrieb im Beitrag #3999450:
> Rolf Magnus schrieb:
>> diese Schlußfolgerung erschließt sich mir nicht. Weil "initial" soviel
>> wie "anfänglich" heißt, muß es eine Zuweisung sein?
>
> Es heißt nicht "soviel wie anfänglich", es HEISST anfänglich und nichts
> anderes.

Ok, dann wiederhole ich die Frage in korrigierter Form:
Weil "initial" "anfänglich" HEISST, muß es eine Zuweisung sein?

> Initialisierung ist einfach ein spezieller Akt einer Zuweisung
> von Werten an Variable. Das ist alles. Wie das im einzelnen geschieht,
> etwa bei Arrays oder einfachen Variablen, ist geregelt. Punkt und aus.

Nun, die C-Definition beschreibt es anders.

BD244C schrieb im Beitrag #3999496:
> Karl Heinz schrieb:
>>> Der gesunde Menschenverstand reicht, um das zu verstehen.
>> Und nochmal sorry. In einer formalen Sprachdefinition hat 'der gesunde
>> Menschenverstand' nichts zu suchen.
>
> Das sehe ich ganz anders. Für mich gibt es hier keinen Widerspruch. Wir
> reden hier über Begriffe, die es auszulegen gilt und nicht über streng
> mathematische Definitionen.

C definiert die Begriffe streng. Auszulegen gibt's da nichts.


> Den Unterschied, lieber Karl-Heinz, solltest du eigentlich verstehen. So
> 100 prozentig festgelegt wie du hier meinst sind einige Begriffe in der
> Programmiererei gar nicht.

Leider sind sie das nicht immer, wodurch man manchmal an einander 
vorbeiredet. Im technischen Bereich und gerade in der Programmierung 
sind solche unscharfen Begriffsdefinitionen nicht immer zu vermeiden, 
aber sie sind eigentlich immer von Nachteil. Programmiersprachen selbst 
sind dagegen möglichst eindeutig definiert, denn wenn der Computer nicht 
exakt das tut, was man ihm sagt, sondern stattdessen deinen Code 
irgendwie auslegen kann, wäre das ziemlich schlecht.

> Die Bedeutung der Begriffe hängt also immer von Kontext ab, in dem sie
> zur Anwendung kommen.

Genau, und im Kontext "C-Programmierung" ist deine Verwendung des 
Begriffs falsch. Der Begriff "Stock" hat auch ganz unterschiedliche 
Bedeutungen. Damit kann ein Stab, ein Geschoss oder eine Börse gemeint 
sein. Jeder dieser Begriffe hat wieder mehrere Bedeutungen. In einer 
Diskussion kommt aber nur Unsinn raus, wenn jeder die selben Begriffe 
verwendet, aber unterschiedliche Bedeutungen meint. Ist dir noch nicht 
aufgefallen, daß du der einzige bist, der hier einen Begriff in einer 
anderen Bedeutung verwendet, als sämtliche anderen 
Diskussionsteilnehmer?

BD244C schrieb im Beitrag #3999502:
> und dass es Neuerungen wie C99, C11 gibt tut hier nichts zur Sache.

"Neuerungen" ist gut... C99 hat vor 16 Jahren C89 ersetzt und wurde 
selbst wiederum vor 4 Jahren durch C11 ersetzt.

BD244C schrieb im Beitrag #3999522:
> Mir ging es ursprünglich nur darum, einen Begriff nicht derart
> überzustrapazieren, sondern etwas gelassener damit umzugehen.

Du bist doch eigentlich derjenige, der damit angefangen hat, beharrlich 
auf einer ganz bestimmten Bedeutung des Begriffs zu bestehen. Daß sich 
dann Widerstand regt, wenn diese dann auch noch falsch ist, ist doch 
kein Wunder.

> Und mir geht diese Schlaumeierei, die immer alles besser wissen will und
> doch so oft daneben liegt auf einfach den Senkel.

Dir ist noch gar nicht aufgefallen, daß du selbst in diese Kategorie 
fällst, oder?

Karl Heinz schrieb:
> Wir sind doch hier nicht Töpfereikurs, bei dem man diskutieren kann, ob
> etwas noch ein Aschenbecher ist oder doch schon eine Vase. Wir reden
> hier über eine Programmiersprache.

Der Spruch ist gut, der wäre echt signaturwürdig, wenn's denn hier 
Signaturen gäbe ;-)

BD244C schrieb im Beitrag #3999575:
> Der formale Akt des INITIALISIERENS ist nichts anderes als ein
> spezieller Fall einer Wertezuweisung. Was denn sonst!

Na einfach eine Initialisierung. Es muss gar nicht 5 Dinge auf einmal 
sein. Es kann auch einfach nur eine Initialisierung sein - nicht mehr, 
und nicht weniger.

> Das ist aber Jacke wie Hose. Wichtig ist nur, dass man das Regelwerk
> dazu kennt und beachtet.

Richtig, aber wenn das Regelwerk sagt, daß man seine Beine besser mit 
Hosen bedeckt, werde ich die nicht stattdessen in die Jackenärmel 
stecken, nur weil das ja auch ginge, denn gerade um diese Zeit könnte 
das "untenrum" etwas frisch werden.

Definierer schrieb:
> Bitflüsterer schrieb:
>> Es ist in diesem Zusammenhang vielleicht nützlich zu erwähnen, das
>> Sprach-Definitionen nicht "richtig" oder "falsch" sind.
> Ist eine Definition nicht per Definition richtig?

Das würde ich auch sagen. Die Sprachdefinition definiert ja erst, was 
richtig und was falsch ist.

von BD244C (Gast)


Lesenswert?

Ein letztes mal noch zum Abschluss

Karl Heinz schrieb:
> Oder eben auch, warum es hier geht, warum formal ein  int a[] = { 1, 2,
> 3 };
> erlaubt ist, während ein  int a[3];
>   a = { 1, 2, 3 };
> eben nicht erlaubt aus, selbst wenn beides auf den ersten Blick
> eigentlich identisch aussieht.

Warum ist es denn nicht erlaubt? Ganz einfach, weil man es bisher nicht 
erlaubt hat. Würde man es erlauben, würde kein Hahn danach krähen und 
jeder C Programmierer hielte solche Zuweisungen für eine 
Selbstverständlichkeit. Genauso hättest du mir als Beispiel eines 
"verbotenen Aktes" in C den (nach deiner Auffassung) "Unterschied" 
zwischen den Anweisungen

i = i + 1;     // erlaubt

und

i++;           // "verboten", weil (angenommen) nicht im Regelwerk

vorhalten können. Nur besteht dieses "Verbot" eben nicht (oder nicht 
mehr seit Unzeiten).

Yalu X. schrieb:
> Man könnte allenfalls zum besseren Verständnis für einen C-Neuling
> hinzufügen, was der Unterschied zwischen Initialisierung und Zuweisung
> ist und warum es diese Unterscheidung gibt.

Man könnte auch was ganz anderes machen. Man könnte einem C-Neuling 
vermitteln nicht in die dogmatische Denkfalle zu tappen, in der IHR ALLE 
(bis auf  Bitflüsterer) hoffnungslos gefangen seid. Ihr habt verlernt 
mal zwischen den Zeilen zu denken und VERSTÄNDNIS abseits aller 
Definitionen für Begriffe zu entwickeln. Wie erklärt ihr denn einem Kind 
eure sogenannte "Initialisierung"? Das kann nämlich mit diesem Fremdwort 
Initialisierung nix anfangen. Doch nicht anders, als mit Kästchen, die 
Namen tragen, die Programmierer Variable nennen, in die wir vor Beginn 
mit der eigentlichen Programmausführung WERTE ZUFÜHREN, BELEGEN, 
ZUWEISEN. Was denn sonst! Und das nennen wir nun mal Initialisierung 
oder auch wie es eigentlich besser heißen sollte: Initial-Zuweisung. 
Letztere unterliegt einem anderen Regelwerk als ein bloße Zuweisung. Das 
ist alles.

Rolf Magnus schrieb:
> BD244C schrieb:
>> Der formale Akt des INITIALISIERENS ist nichts anderes als ein
>> spezieller Fall einer Wertezuweisung. Was denn sonst!
>
> Na einfach eine Initialisierung. Es muss gar nicht 5 Dinge auf einmal
> sein. Es kann auch einfach nur eine Initialisierung sein - nicht mehr,
> und nicht weniger.

Und gerade das ist dieser von dir und anderen unsägliche Dogmatismus des 
Denkens. Eure Selbstbeweihräucherung geht sogar so weit, dass ihr mir 
unterstellt, ich kenne nicht den Unterschied zwischen Initialisierung 
und Zuweisung. Den kenne ich sehr wohl. Aber ihr wollt nicht begreifen, 
was hinter einer Initialisierung eigentlich steckt, nämlich das simple 
Zuweisen von Werten. Ihr seid betriebsblind geworden. Das ist alles.

Bitflüsterer schrieb:
> Genau genommen bestand der der "Irrtum" von BD244C darin, ein streng
> formales Argument von Peter II 05.02.2015 10:52 in den Bereich des
> assoziativen Denkens zu übertragen und sich dabei auf den
> Wikipedia-Artikel zu stützen.

Den Wikipedia-Artikel brauche ich dabei eigentlich gar nicht. Der war 
nur ein Schuss auf die Schnelle, um zu zeigen, dass es auch andere gibt, 
die ähnlich denken (nur ein paar Sekunden gegoogelt). Mit dem 
Formalismus hast du recht. Nimm mein Beispiel mit dem Kind. Das 
entzaubert dir ruckzuck den Begriff "Initialisierung" und übrig bleibt 
ein simples Zuweisen von Werten an ihre Platzhalter. Das die anwesende 
Meute hieraus Zähne fletschend in ihrer dogmatischen Betriebsblindheit 
sofort die Schlussfolgerung zieht, man wolle den Begriff der 
Initialisierung grundsätzlich verwässern oder gleichsetzen mit dem 
Begriff der Zuweisung in C, ist einfach nur falsch. Mir ging es um ein 
simples hinter die Begriffe schauen und entmystifizieren. Es ist so 
ähnlich als hätte man in den 80er Jahren einem gestandenen Handwerker 
beibringen wollen, dass sein Schraubenzieher eigentlich ein 
Schraubendreher ist, weil man damit nun mal Schrauben ein- und ausdreht 
und nicht zieht. Und dieser Handwerker partout auf seinem gelernten 
Begriff seines angeeigneten Regelwerks "Schraubenzieher" beharrt, weil 
seine Denke gar keine andere Schlussfolgerung oder Hinterfragung des 
Begriffs zulässt. Betriebsblind eben. Da kommste nicht gegen an. Keine 
Chance. Der Kreis der gestandenen Handwerker verspottet dich und wirft 
dir Unkenntnis vor. Erst von "von oben", d.h. von denen die das 
Regelwerk kontrollieren und weiterentwickeln Begriffsumbildungen 
erfolgen wird das akzeptiert. Dahinter stecken irrationale Ängste an 
Sicherheit zu verlieren und der Unwille selbst eingebrannte Denkmuster 
zu hinterfragen. Das man dafür sogar die gute zweite Ausgabe vom K&R mal 
eben in den Dreck tritt und abfällig als überholtes Buch hinstellt, 
hätte ich mir vorher allerdings wirklich nicht vorstellen können.

Karl Heinz schrieb:
> BD244C schrieb:
>> Jetzt weiß ich langsam wie sich Galileo Galilei von der heiligen
>> Inquisition gefühlt haben muss, als er zum Widerruf gezwungen wurde.
>
> Mir dem einen Unterschied, dass Gallileo recht hatte und die
> Inquisitionsbehörde nicht.
> Nur dass hier der Fall genau umgekehrt liegt: du hast eben nicht recht.

Das du so denkst ist doch klar. Die Inquisition hat auch nicht am 
gleichen Tag der Anklage ihre eigene Fehlbarkeit begriffen. Das braucht 
zeit. Manche brauchen halt länger bis der Groschen fällt.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Eine Initialisierung als Zuweisung zu bezeichnen, weil dadurch die
initialisierte Variable einen Wert zugewiesen bekommt, ist in etwa
vergleichbar damit, den Datentyp uint64_t als double zu bezeichnen,
weil er doppelt so groß wie ein uint32_t ist.

Deswegen noch einmal: Initialisierung und Zuweisung sind in C
feststehende Begriffe, ebenso wie double einen ganz bestimmten
Datentyp bezeichnet. Jede von den vorgegebenen Definitionen abweichende
Verwendung dieser Wörter führt nur zu unnötiger Verwirrung.

: Bearbeitet durch Moderator
von Freddie (Gast)


Lesenswert?

BD244C, verschwinde bitte einfach. Du bist hier nicht willkommen.

von Rolf M. (rmagnus)


Lesenswert?

BD244C schrieb im Beitrag #4000419:
> Karl Heinz schrieb:
>> Oder eben auch, warum es hier geht, warum formal ein  int a[] = { 1, 2,
>> 3 };
>> erlaubt ist, während ein  int a[3];
>>   a = { 1, 2, 3 };
>> eben nicht erlaubt aus, selbst wenn beides auf den ersten Blick
>> eigentlich identisch aussieht.
>
> Warum ist es denn nicht erlaubt?

Weil es eine Zuweisung ist und es nicht erlaubt ist, Arrays zuzuweisen. 
Ganz einfach. Womit wir wieder beim Anfang der Diskussion sind.

> Würde man es erlauben, würde kein Hahn danach krähen und jeder C
> Programmierer hielte solche Zuweisungen für eine Selbstverständlichkeit.

Ja, aber was hat das alles damit zu tun, was eine Initialisierung ist?

> Man könnte auch was ganz anderes machen. Man könnte einem C-Neuling
> vermitteln nicht in die dogmatische Denkfalle zu tappen, in der IHR ALLE
> (bis auf  Bitflüsterer) hoffnungslos gefangen seid.

Und sich stattdessen Begriffe einfach frei nach Belieben umzudefinieren, 
einfach nur so, damit's nicht zu langweilig wird?

> Wie erklärt ihr denn einem Kind eure sogenannte "Initialisierung"? Das
> kann nämlich mit diesem Fremdwort Initialisierung nix anfangen.

Man könnte es mit "Vorbelegung" übersetzen. Und nein: Belegen und 
Zuweisen ist nicht das gleiche.

> Doch nicht anders, als mit Kästchen, die Namen tragen, die Programmierer
> Variable nennen, in die wir vor Beginn mit der eigentlichen
> Programmausführung WERTE ZUFÜHREN, BELEGEN, ZUWEISEN.

Zuweisen tun wir sie erst danach. In dem Moment, in dem die Variable das 
Licht der Welt erblickt, bekommt sie gleich einene Wert. Das ist 
Initialisierung. Später wird der Wert geändert, und das kann dann 
unter anderem durch Zuweisung geschehen.
Wenn ein Kind auf die Welt kommt, hat es ein bestimmtes Geschlecht. Es 
wurde quasi damit initialisert. Wenn es sich später zu einer 
Geschlechtsumwandlung entscheidet, wird ihm ein neues Geschlecht 
zugewiesen.

> Was denn sonst!

Nochmal: Nicht alle Arten, auf die ein Objekt zu einem Wert kommen kann, 
sind automatisch Zuweisungen. Eine Zuweisung ist nur eine von vielen 
Möglichkeiten.
Du kannst einen Baum auch mit einer Axt fällen, mit einer Säge, oder 
indem du ihn mit einem großen und schweren Fahrzeug umreißt. Aber nicht 
jede Art, einen Baum zu fällen, heißt deshalb automatisch "umsägen", nur 
weil man das so auch machen könnte.

> Und das nennen wir nun mal Initialisierung oder auch wie es eigentlich
> besser heißen sollte: Initial-Zuweisung.

Man hätte es so nennen können. Tut aber keiner außer dir. Eine Zuweisung 
ist nun mal nicht das, was im Silizium passiert, wenn eine Variable 
einen Wert bekommt, sondern das, was du im Quellcode schreibst, um den 
Inhalt einer Variablen durch was anderes zu ersetzen. Und da liegt 
meines Erachtens dein fundamentaler Fehler. Du siehst die Zuweisung 
nicht als Sprachkonzept, sondern als Beschreibung eines 
dahinterliegenden Vorgangs.

> Und gerade das ist dieser von dir und anderen unsägliche Dogmatismus des
> Denkens. Eure Selbstbeweihräucherung geht sogar so weit, dass ihr mir
> unterstellt, ich kenne nicht den Unterschied zwischen Initialisierung
> und Zuweisung.

Wenn es einen Unterschied gibt, sind es zwei verschiedene Dinge.

> Den kenne ich sehr wohl. Aber ihr wollt nicht begreifen,
> was hinter einer Initialisierung eigentlich steckt, nämlich das simple
> Zuweisen von Werten.

Jeder weiß, was dahinter steckt. Aber jeder außer dir weiß, daß man das 
nicht "Zuweisung" nennt.

> Es ist so ähnlich als hätte man in den 80er Jahren einem gestandenen
> Handwerker beibringen wollen, dass sein Schraubenzieher eigentlich ein
> Schraubendreher ist, weil man damit nun mal Schrauben ein- und ausdreht
> und nicht zieht. Und dieser Handwerker partout auf seinem gelernten
> Begriff seines angeeigneten Regelwerks "Schraubenzieher" beharrt, weil
> seine Denke gar keine andere Schlussfolgerung oder Hinterfragung des
> Begriffs zulässt.

Um ganz ehrlich zu sein, denke ich bei dem Begriff "Schraubendreher" an 
eine Person, die an einer Drehbank Schrauben anfertigt und nicht an das 
Werkzeug, mit dem man Schauben anzieht. Wer um alles in der Welt sagt 
denn: "Ich geh mal ein paar Schrauben drehen" (außer vielleicht Werner)?
https://www.youtube.com/watch?v=otTdwVb2UyE

> Erst von "von oben", d.h. von denen die das Regelwerk kontrollieren und
> weiterentwickeln Begriffsumbildungen erfolgen wird das akzeptiert.

Und bei dir reicht nicht mal das. Denn das Regelwerk sagt klar, was eine 
Zuweisung ist, aber du ignorierst das.

> Karl Heinz schrieb:
>> Mir dem einen Unterschied, dass Gallileo recht hatte und die
>> Inquisitionsbehörde nicht.
>> Nur dass hier der Fall genau umgekehrt liegt: du hast eben nicht recht.
>
> Das du so denkst ist doch klar. Die Inquisition hat auch nicht am
> gleichen Tag der Anklage ihre eigene Fehlbarkeit begriffen. Das braucht
> zeit. Manche brauchen halt länger bis der Groschen fällt.

Nicht jeder, der anders denkt, hat automatisch Recht.

von Udo S. (urschmitt)


Lesenswert?

Yalu X. schrieb:
> Deswegen noch einmal: Initialisierung und Zuweisung sind in C
> feststehende Begriffe,

Wie oft wollt ihr es ihm noch sagen? Das ist sinnlos, der Junge ist ein 
Narzist wie er im Buche steht. Das er unrecht hat kann nicht sein, weil 
es nicht sein darf.
Ich hatte oben versucht das mit dem "ein Geisterfahrer, nein hunderte!" 
scherzhaft auszudrücken, aber die Kommentare von Galileo und der 
Inquisition zeigen dass er das wirklich ernst meint.

Die Diskussion hier ist völlig sinnlos, BD244C wird keinem Argument 
folgen. Am besten sollte man den Thread schliessen, überlegt euch 
vieleicht einen guten Beitrag zum Thema Initialisierung versus Zuweisung 
stehen zu lassen und den Rest zu löschen, denn die hundert sehr 
ähnlichen Erklärungsversuche nützen BD244C nichts, und der Rest hat es 
auch so verstanden.

Meine Meinung

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.