Hm. Da sind
- einige offensichtliche Dinge falsch
- einige Details falsch die (wie ich zugeben muss) mir auch nicht (mehr) durch Draufschauen auffallen
- einige Sachen falsch, die mit diffizilen Spezifika von C zu tun haben
Offensichtlich ist z.B. dass die Variable vector
in der main nicht deklariert ist, oder dass die indizes bei 0 anfangen (und nicht bei 1).
Details sind z.B., dass
int[4] v = {1,1,1,1};
eben
int v[4] = {1,1,1,1};
heißen muss. (Ich programmiere üblicherweise nicht mehr in C (wenn überhaupt dann in C++), und Dinge, die man z.B. von Java gewohnt ist, sind in C schlicht falsch (und das Bewußtsein dafür fehlt (mir)) - deswegen hätte ich das jetzt auch nicht “erkannt”, sondern habe es mehr oder weniger durch “ausprobieren” rausgefunden).
Bei den “diffizilen Spezifika von C” kommen jetzt die Sachen, wo ich auch durch mangelnde Praxis nicht mehr ganz so firm bin. (Vor ca. 10 Jahren kannte ich mich damit mal “etwas besser” aus, aber in der Zwischenzeit hat sich viel getan, deswegen sollte man alles, was ich dazu sage, mit etwas Skepsis aufnehmen, und hinnehmen, dass es vielleicht “etwas unpräzise” ist).
Ein wichtiger Punkt ist das Verhältnis zwischen Pointern und Arrays in C. Die sind weitgehend gleich. Man kann bei beiden auf die Elemente mit pointerOrArray[index]
zugreifen. Ein Array ist praktisch kaum zu unterscheiden von einem Pointer - nämlich einem Pointer auf das erste Array-Element.
[ot]
Tatsächlich geht diese “Gleichwertigkeit” sehr (SEHR!) tief in die Sprache runter. Es klingt verrückt, aber es gilt tatsächlich:
array**
ist das gleiche wie
*(array + i)
ist das gleiche wie
*(i + array)
ist das gleiche wie
i[array]
Das hier läßt sich also wirklich compilieren:
int array[4] = { 12, 34, 56, 78 };
int index = 2;
int element = index[array]; // <---------- WTF !?
printf("%d
", element);
und gibt “56” aus…
[/ot]
Richtig fummelig wird das aber, wenn arrays an Funktionen übergeben werden. DORT sind die Rollen dann etwas anders. GANZ grob gesagt: Der Typ eines Funktionsparameters ist dann nicht “Irgendein Array”, sondern ein Array mit einer bestimmten Größe. Man kann also (bitte nicht festnageln, aber IIRC) eine Funktion wie
void myFunction(int array[4]) { ... }
nicht mit einem Array der Größe 5 aufrufen. Wenn man die Arraygröße aber NICHT angibt, ist das IIRC dann doch wieder gleichbedeutend mit
void myFunction(int *array) { ... }
(Vielleicht kann @SlaterB da auch noch klärend eingreifen - IIRC war der auf Spotlight auch gelegentlich im C-Forum aktiv (vielleicht verwechsle ich da auch gerade was)).
Langer Rede gar kein Sinn: Wenn man arrays an eine C-Funktion übergeben will, macht man das üblicherweise so, dass man einen Pointer übergibt (nämlich auf das erste Array-Element), und zusätzlich die Länge des übergebenen Arrays. (Die kriegt man aus dem Pointer selbst nämlich nicht mehr raus - sizeof(pointer) liefert immer 4 oder 8).
Auch einen Array aus einer Funktion zurückzugeben ist heikel - speziell wenn der Array nur lokal definiert ist. Und sowas wie
int[] giveMeSomeArray() { ... }
geht gar nicht.
Die Funktionsdeklaration würde also eher so aussehen:
void times(int vector[], int length, int times)
Oder, analog dazu
void times(int *vector, int length, int times)
Der Aufruf wäre dann mit
times(v,sizeof(v)/sizeof(int),2);
möglich - wie du schon sagtest: Da muss durch die Elementgröße geteilt werden. Warum das “sizeof” DORT dann DOCH funktioniert? Weil der Array lokal als Array mit einer bestimmten Größe bekannt ist (und nicht nur als Pointer).
(Sorry, ich bräuchte da auch mal wieder eine kleine Auffrischung :o )