C Analyse Bsp _Array_counter_

cprogrammer

Grünschnabel
Hallo alle miteinander...

und zwar bin ich c anfänger und brauche hilfe beim analysieren dieses bsp.!!!
C++:
int main()
{
int array[10] = {1,2,3,4,5};
int counter = 0;
for (counter=0;counter<5;counter++)
{
array[5+counter] = array[5-counter];
}

for (counter=0;counter<10;counter++)
{
printf("%d ", array[counter]);
}
return 0;
}

Warum ist die Ausgabe:1 2 3 4 5 0 5 4 3 2 !?!?

kanns mir nicht erklären.....

würde mich über jede Hilfe bzw.Tipp freuen....
 
Zuletzt bearbeitet von einem Moderator:
Hi

das Programm ist falsch und die Ausgabe kann je nach Compiler/Computer/...
unterschiedlich sein. (vor allem bei der 0). Bist du dir sicher, dass das Programm
so ausschauen sollte, oder hast du es evt. irgendwo her falsch abgeschrieben?

Möglich wäre zB., statt
C++:
array[5+counter] = array[5-counter];
das zu schreiben:
C++:
array[5+counter] = array[4-counter];
Die Ausgabe ist dann 1234554321
 
ja bin mir sicher, programm soll so ausschaun......
Frage war bei der klausur war:

Analysieren Sie folgenden Auszug aus einem Programm. Erklären Sie den Ablauf beim Ausführen des
Programms. Welche Werte nehmen die Variablen zu verschiedenen Zeitpunkten an? Welche Ausgaben
werden getätigt? Gibt es syntaktische oder semantische Fehlerstellen in diesem Programm?

was mir zu schaffen macht ist diese zeile: array[5+counter] = array[5-counter],da ich es mir nicht erklären wie da der ablauf ist und welche zahlen nun angenommen werden

meine erklärung wäre so:

int main()
{
int array[10] = {1,2,3,4,5}; //array mit 10 Elementen 5 werte sind initialisiert(array[0]=1,array[1]=2,array[2]=3,array[3]=4,array[4]=5)
int counter = 0; //counter auf 0
for (counter=0;counter<5;counter++) //for schleife zählt von 0 bis 4
{
array[5+counter] = array[5-counter]; //????
}

for (counter=0;counter<10;counter++)//for schleife zählt von 0 bis 9
{
printf("%d ", array[counter]); //ausgabe am bildschirm der werte
}
return 0;
}
 
Also, die Sache mit dem Anlegen und Initialisieren der Variablen passt.
(Wie du geschrieben hast haben array[0] bis array[4] schon Werte, aber array[5] bis array[9] noch nicht)
Die Ausgabe am Schluss passt auch.

Zur problematischen Schleife: Wie counter zählt ist auch richtig erkannt.
Zum Inneren muss man eigentlich nur Counter einsetzen...
Wenn counter 0 ist dann macht das
array[5] = array[5];
counter 1: array[6] = array[4];
counter 2: array[7] = array[3];
counter 3: array[8] = array[2];
counter 4: array[9] = array[1];
Es werden einfach ein paar der schon initialisierten Werte in die andere Hälfte
vom Array kopiert, in der umgekehrten Reihenfolge noch dazu (4321 wird zugewiesen zu 6789)

Und der semantische Fehler, nach dem gefragt ist, ist, dass man eben nicht einfach den ganzen
Arrayinhalt umgekehrt in die zweite Hälfte speichert (was vermutlich das Ziel sein sollte)und
noch dazu einen falschen Speicherzugriff drin hat.

Zurzeit ists ja
Code:
array[5] = array[5];
array[6] = array[4];
array[7] = array[3];
array[8] = array[2];
array[9] = array[1];
Der Wert von array[0] wird nicht verwendet, dafür weißt man [5] sich selbst zu.
Wenn man die schon initialisierten Werte umgedreht in die andere Hälfte speichern will
sollte es so ausschauen:
Code:
array[5] = array[4];
array[6] = array[3];
array[7] = array[2];
array[8] = array[1];
array[9] = array[0];
Und außerdem, beim falschen Original, verwendet man den
Wert von array[5], ohne es zuerst initialisiert zu haben => Fehler.
 
hmmmmmm.......okay......
ich glaub ich habs verstanden.....
es array[5] nimmt den wert 0 an weils es noch nicht gibt oder!!?!?
weil array[6] nimmt ja den Wert von array[4]--->sprich somit wäre das der wert:5 ,weil es array[4] ist schon vorhanden!!!
stimmen meine gedankengänge!!?!?:)
 
weil array[6] nimmt ja den Wert von array[4]--->sprich somit wäre das der wert:5 ,weil es array[4] ist schon vorhanden!!!
Genau.

Und array[5] nimmt sich den aber leider von array[5], und das hat eben noch nie einen Wert bekommen.
Ob es deswegen 0 oder -287324 oder sonstwas ist ist je nach Compiler etc. verschieden.
Genausogut wäre es "ok", wenn das Programm abstürzt (was man bei uninit. Pointern oft hat).
Ein unitialisiertes Etwas darf einfach nicht verwendet werden.

(In bestimmten Fällen werden int´s wirklich von selbst mit 0 initialisiert, auch ohne dass
man selber einen Wert reinfüllt hat. zB. bei globalen Variablen. Aber nicht hier)
 
Hallo sheel

Gemäss C++-Standard gilt:
To default-initialize an object of type T means:
[...]
— if T is an array type, each element is default-initialized;
— otherwise, no initialization is performed.

If no initializer is specified for an object, the object is default-initialized; if no initialization is performed, an
object with automatic or dynamic storage duration has indeterminate value.

Mit anderen Worten:
Wenn man folgenden Code hat:
C++:
void foo() {
    int b;
    int a[2];
}

Dann hat b undefinierten Wert. Das selbe gilt für die beiden Elemente im Array. Das Array als solches ist jedoch initialisiert. Ein Absturz beim Zugriff wäre also nicht in Ordnung.

Viele Grüsse
Cromon
 

Neue Beiträge

Zurück