Vermutlich steht irgendwo oben (oder in einem Header, unfindbar versteckt) ein
#define FLT float
oder (besser) vielleicht ein entsprechendes typedef
. Sowas macht man manchmal, um z.B. schnell zwischen der Verwendung von ‚float‘ und ‚double‘ hin- und her schalten zu können.
2.) Prinzipiell ist mir Zeile 5 klar. Aber warum schreibt man nicht einfach so etwas wie float v[nh-nl+1];
?
Weil es nicht geht (Mehr ist dazu eigentlich nicht zu sagen - außer vielleicht noch, dass Arraygrößen in C zur compilezeit feststehen müssen - andernfalls muss man den Speicher mit malloc/free selbst verwalten. (Abgesehen davon, dass ein lokal deklarierter array nach dem Verlassen der funktion ja schon nicht mehr gültig wäre)).
3.) Bei Zeile 10 setzt es bei mir leider aus. Mit v verweist man doch auf die Adresse des 1. Arrayelements; wieso zieht man davon nl ab?
Ja, die Funktion finde ich gelinde gesagt etwas fragwürdig. Angenommen, man ruft sie mit den Parametern nl=10 und nh=15 auf. Dann wird dort platz für 6 float-Werte allokiert. Durch das ‚v-nl‘ am Ende wird aber nicht der Pointer auf diesen allokierten Speicher zurückgegeben, sondern ein Pointer, der um ‚nl‘ Stellen „nach links“ verschoben ist.
| Hierhin wird der Speicher ge'alloct
|
|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|
| Das sieht dann so aus
|
v
|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|_|_|_|_|_|_|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|
| Aber ein Pointer an DIESE Stelle wird zurückgegeben!
|
v-nl
|
|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|_|_|_|_|_|_|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|
Was damit erreicht wird, ist eigentlich klar: Bei einem Aufruf wie
FLT *p = vector(10, 15);
wird ein Pointer zurückgegeben, der auf einen ungültigen Speicherbereich zeigt. Aaaber man kann mit diesem Pointer dann trotzdem arbeiten: Wenn man dort mit sowas wie
p[10] = 123;
daten reinschreibt, dann landen diese Daten ja tatsächlich in dem Bereich, wo wirklich Speicher allokiert wurde!
(Der Grund dafür ist, dass für Array-Zugriffe in C gilt
array** = *(array + i)
und damit durch das [10] dieses ‚-nl‘ aus der Funktion quasi wieder „ausgeglichen“ wird)
Ich persönlich halte das aber für ziemlich gewagt. Damit kann man sich IMHO schon SEHR leicht Bugs reinhauen, wenn man den Pointer doch mal mit p[0] = 123;
verwendet und man damit in ungültigen Speicher reinschreibt…
BTW: Es gilt übrigens tatsächlich
array** = *(array + i) = *(i + array) = i[array]
und man kann wirklich sowas schreiben wie
float *array = allocateIt();
for (int i=0; i<10; i++)
{
i[array] = 123; // <- geht!
}
aber… nur weil man etwas KANN, sollte man das nicht auch gleich TUN )