Einzelnen Beitrag anzeigen
  #17  
Alt 12.12.11, 19:53
Benutzerbild von richy
richy richy ist offline
Singularität
 
Registriert seit: 01.05.2007
Ort: karlsruhe
Beitr?ge: 4.170
Standard AW: Math Schwingungs DZGL

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

Ge?ndert von richy (12.12.11 um 22:23 Uhr)
Mit Zitat antworten