Hi merman
Header
******
In hoeheren Programmiersprachen (Maschinensprache waere die unterste) ist der Header meist nicht mehr als solcher erkenntlich. Ebenso ist die Variablendeklaration und Speicherplatzreservierung automatisiert. Man muss sich praktisch um nichts mehr kuemmern. So ist das auch in Maple oder Exel.
Zitat:
In Headerdateien wird auf jede Menge Quelltext verwiesen, insofern auch auf Funktionen.
|
Ja das stimmt. Aber nur teilweise. Bei speziellen oder selbsgeschriebenen Funktionen.
http://www.imb-jena.de/~gmueller/kur.../c_define.html
Der Header ist ein TEXT ! Preprozessor. Der ersetzt lediglich Zeichenfolgen im Quelltext.
Und jawohl, der Ausruck cos(x) ist natuerlich nichts weiter als die Einsprungadresse auf ein Unterprogramm, dass den Funktionswert zurueckgibt. Aber Standartfunktionen wie cos(x) gehoeren zur Standartbibliothek hoeherer Programmiersprachen. Man muss sie in einem Header also nicht extra einbinden. Die sind vorcompiliert.
Ein Header ist wie gesagt ein Textpreprozessor. Wenn du in C schreibst
#include Blabla.h
Dann ist es so als ob der Text der Datei Blabla.h genau an dieser Stelle steht.
Und was du nun vielleicht meinst. Wenn man in den Header schreibt :
#define C1 cos(dx)
Dann waere das nicht effizient sondern eventuel galileo2609. Also ineffizienter redudanter Code. Denn diese Anweisung ist rein textorientiert und ersetzt im folgenden die Zeichenfolgen C1 durch cos(dx). Und wenn C1 in einer Schleife steht ist das redudant. Denn dann steht dort in Wirklichkeit cos(dx). Und in jedem Schleifendurchgang springt man in die Cosinusunterfunktion, obwohl das Ergebnis eine Konstante ist ! Fuer effizienten Code muss man vor allem die Schleifen optimieren. Die galileos eliminieren.
Falsch
*****
start Schleife i=0..10 000
galileo2609:= i+cos(dx)
end Schleife i
Das Unterprogramm cos(dx) wird 10 000 Mal unnoetig angesprungen und alle Anweisungen dort ausgefuehrt. Dabei ist dx aber in der Schleife konstant. Damit auch cos(dx). Die Berechnung ist somit 9999 Mal unnoetig.
Falsch :
******
#define C1 cos(dx)
start Schleife i=0..10 000
galileo2609:= i+C1
end Schleife i
Denn hier wird im Quelltext C1 durch cos(dx) ersetzt und man erhaelt den selben Code wie im ersten Beispiel.
Richtig
******
C1:=cos(dx)
start Schleife i=0..10 000
wert:= i+C1
end Schleife i
Der Variablen C1 wird
einmal der Wert cos(dx) zugeordnet. Dazu einmal das Unterprogramm cos() vor der Schleife durchlaufen und nicht 10 000 mal in der Schleife. Darauf muss man auch in hoeheren Programmiersprachen achten gerade weil diese soundso sehr langsam sind.
ZUSATZBEMERKUNG
Der #define Befehl in einem C Header ist vor allem dazu gedacht Speicheradresse anschaulicher zu bezeichnen. Z.B. kannst du die eine Portadresse &ab20 im Header rein textlich umbenennen :
#define &ab20 AUDIOIN
Oder den Quelltext in badisch schreiben :-)
#define for MACH_DES_FOLGENDE_DO_MIT
#define from FANG_A_DU_SEGGEL_MIT
#define to UNN_HOER_UFF_BEI
Folgendes waere nun ein gueltiger MAPLE Befehl
MACH_DES_FOLGENDE_DO_MIT i FANG_A_DU_SEGGEL_MIT 1 UNN_HOER_UFF_BEI 10 do
Das wuerde tatsaechlich funktionieren.
/ZUSATZBEMERKUNG