Abhilfe. Man u¨bergibt die Matrix formal als Vektor und gibt diesem Vektor in der Funktion wieder Matrixstruktur, indem man die Speicherabbildungsfunktion selbst berechnet. Das ist zwar nicht sch¨on, in C aber nicht zu vermeiden. Beispiel Matrizenprodukt C = A B fu¨r Matrizen A = (aij ), B = (bjk ) und C = (cik ) mit i = 1, . . . , l, j = 1, . . . , m und k = 1, . . . , n. cik = xxx · xxx j=1 Prototyp einer entsprechenden Funktion. void matprod ( float c[], const float a[], const float b[], int l, int m, int n); Die Speicherabbildungsfunktion um den u¨bergebenen Vektoren wieder Matrixstruktur zu geben, wird als Makro (Pr¨aprozessoranweisung) definiert. Der Makro berechnet zu jedem Indexpaar den Abstand vom Anfang des Vektors, dazu wird zus¨atzlich zu den beiden Indizes auch die L¨ange der Zeilen der Matrix als Parameter beno¨tigt. Funktionen Exkurs Zeiger Funktionen (Fortsetzung) Xxxxxx Ru¨ckblick Vereinbarung von Feldern Anordnung von Feldern im Speicher Xxxxxx als Parameter I Einschub. Makros Xxxxxx als Parameter II Initialisierung von Feldern Zeiger und Xxxxxx Aufgaben Mit der Direktive #define kann man nicht nur Kontanten benennen. Form der Direktive. # define name [ersatztext] Namen, die in einer define–Direktive definiert werden, werden auch als Makros bezeichnet. Die Ersetzungen, die ein Makro bewirkt, bezeichnet man als Expandierung des Makro. Als ersatztext sind beliebige Zeichenfolgen erlaubt. Diese Zeichenfolgen du¨rfen insbesondere auch bereits zuvor definierte Makros enthalten oder leer sein. Beispiel # define BREITE 10 # define HOEHE ( BREITE + 5) Makros ko¨nnen Parameter erhalten. # define name (parameter ) ersatztext Wichtig ist, dass die o¨ffnende Klammer dem Namen unmittelbar folgen muss damit wird gekennzeichnet, dass die Klammer eine Parameterliste einleitet und nicht Bestandteil des Ersatztextes ist. Beispiel # define QUADRAT ( x) x * x An den Stellen, an denen der Makro expandiert werden soll, mu¨ssen Argumente angegeben werden, ¨ahnlich wie bei einer Funktion. Makros mit Parameter fu¨hren praktisch zu einer doppelte Textersetzung. Der Makro einschließlich seiner Argumentliste wird durch den Ersatztext ersetzt; im Ersatztext werden die Parameter durch die Argumente ersetzt. Beispiel x = QUADRAT (7.4); y = QUADRAT ( x + 1); Ergibt letztlich folgende Quellanweisungen. x = 7.4 * 7.4; y = x + 1 * x + 1; Der Makro QUADRAT ist unvollst¨andig definiert. Fu¨r y resultiert ein Ausdruck, der nicht der Intention entspricht.
Appears in 1 contract
Samples: C Programmierung Grundlagen
Abhilfe. Man u¨bergibt die Matrix formal als Vektor und gibt diesem Vektor in der Funktion wieder Matrixstruktur, indem man die Speicherabbildungsfunktion selbst berechnet. Das ist zwar nicht sch¨on, in C aber nicht zu vermeiden. Beispiel Matrizenprodukt C = A B fu¨r Matrizen A = (aij ), B = (bjk ) und C = (cik ) mit i = 1, . . . , l, j = 1, . . . , m und k = 1, . . . , n. cik = xxx · xxx j=1 Prototyp einer entsprechenden Funktion. void matprod ( float c[], const float a[], const float b[], int l, int m, int n); Die Speicherabbildungsfunktion um den u¨bergebenen Vektoren wieder Matrixstruktur zu geben, wird als Makro (Pr¨aprozessoranweisung) definiert. Der Makro berechnet zu jedem Indexpaar den Abstand vom Anfang des Vektors, dazu wird zus¨atzlich zu den beiden Indizes auch die L¨ange der Zeilen der Matrix als Parameter beno¨tigt. Funktionen Exkurs Zeiger Funktionen (Fortsetzung) Xxxxxx Ru¨ckblick Vereinbarung von Feldern Anordnung von Feldern im Speicher Xxxxxx als Parameter I Einschub. Makros Xxxxxx als Parameter II Initialisierung von Feldern Zeiger und Xxxxxx Aufgaben Zeiger Mit der Direktive #define kann man nicht nur Kontanten benennen. Form der Direktive. # define name [ersatztext] Namen, die in einer define–Direktive definiert werden, werden auch als Makros bezeichnet. Die Ersetzungen, die ein Makro bewirkt, bezeichnet man als Expandierung des Makro. Als ersatztext sind beliebige Zeichenfolgen erlaubt. Diese Zeichenfolgen du¨rfen insbesondere auch bereits zuvor definierte Makros enthalten oder leer sein. Beispiel # define BREITE 10 # define HOEHE ( BREITE + 5) Makros ko¨nnen Parameter erhalten. # define name (parameter ) ersatztext Wichtig ist, dass die o¨ffnende Klammer dem Namen unmittelbar folgen muss damit wird gekennzeichnet, dass die Klammer eine Parameterliste einleitet und nicht Bestandteil des Ersatztextes ist. Beispiel # define QUADRAT ( x) x * x An den Stellen, an denen der Makro expandiert werden soll, mu¨ssen Argumente angegeben werden, ¨ahnlich wie bei einer Funktion. Makros mit Parameter fu¨hren praktisch zu einer doppelte Textersetzung. Der Makro einschließlich seiner Argumentliste wird durch den Ersatztext ersetzt; im Ersatztext werden die Parameter durch die Argumente ersetzt. Beispiel x = QUADRAT (7.4); y = QUADRAT ( x + 1); Ergibt letztlich folgende Quellanweisungen. x = 7.4 * 7.4; y = x + 1 * x + 1; Der Makro QUADRAT ist unvollst¨andig definiert. Fu¨r y resultiert ein Ausdruck, der nicht der Intention entspricht.
Appears in 1 contract
Samples: Grundlagen Der C Programmierung
Abhilfe. Man u¨bergibt define QUADRAT ( x) (( x) * ( x)) Die ¨außeren Klammern sind no¨tig, da es Operatoren gibt, deren Priorit¨at ho¨her als die Matrix formal der Multiplikation ist. Makros mit Parametern k¨onnen wie Funktionen die Lesbarkeit eines Programms erho¨hen und Schreibarbeit sparen. Zwischen Makros und Funktionen bestehen aber ganz wesentliche Unterschiede, die letztlich alle aus der Tatsache resultieren, dass Xxxxxx expandiert werden, bevor die eigentliche U¨ bersetzung beginnt und dass sie damit im ausfu¨hrbaren Programm u¨berhaupt nicht mehr in Erscheinung treten. Die Parameter von Makros besitzen keine Typen, so dass die Argumente beliebige Typen besitzen ko¨nnen. Typen spielen erst eine Rolle, wenn der Compiler u¨bersetzt. Jedes Vorkommen eines Makro wird durch den Ersatztext ersetzt. Das hat zur Folge, dass der Maschinencode, der aus dem Ersatztext resultiert, mehrfach im ausfu¨hrbaren Programm steht, w¨ahrend der Maschinencode, der aus einer Funktion resultiert, nur einmal im Programm steht. Dadurch entfallen die Spru¨nge und die Parameterzuordnung, mit denen Funktionsaufrufe verbunden sind. Aus der Tatsache, dass ein Makro–Aufruf durch Textersetzung aufgelo¨st wird, folgt auch, dass man vorsichtig sein muss, wenn man als Vektor und gibt diesem Vektor Argumente Ausdru¨cke mit Nebeneffekten einsetzt. i = QUADRAT ( j++); Wird expandiert zu i = (( j++) * ( j++)); Abgesehen davon, dass der doppelte Nebeneffekt in der Funktion wieder MatrixstrukturRegel nicht beabsichtigt sein wird, indem man die Speicherabbildungsfunktion selbst berechnetist er auch gef¨ahrlich. Das ist zwar nicht sch¨on, in C aber nicht zu vermeidenFunktionen Exkurs Zeiger Funktionen (Fortsetzung) Xxxxxx Ru¨ckblick Vereinbarung von Feldern Anordnung von Feldern im Speicher Xxxxxx als Parameter I Einschub. Beispiel Matrizenprodukt C = A B fu¨r Matrizen A = (aij ), B = (bjk ) Makros Xxxxxx als Parameter II Initialisierung von Feldern Zeiger und C = (cik ) mit i = 1, . . . , l, j = 1, . . . , m und k = 1, . . . , n. cik = xxx · xxx j=1 Prototyp einer entsprechenden Funktion. void matprod ( float c[], const float a[], const float b[], int l, int m, int n); Xxxxxx Aufgaben Zeiger Die Speicherabbildungsfunktion um den u¨bergebenen Vektoren wieder Matrixstruktur zu geben, wird als Makro (Pr¨aprozessoranweisung) definiert. Der Makro berechnet zu jedem Indexpaar den Abstand vom Anfang des Vektors, dazu wird zus¨atzlich zu den beiden Indizes auch die L¨ange der Zeilen der Matrix als Parameter beno¨tigt. Funktionen Exkurs Zeiger Funktionen (Fortsetzung) Xxxxxx Ru¨ckblick Vereinbarung von Feldern Anordnung von Feldern im Speicher Xxxxxx als Parameter I EinschubIn diesen Makro kann dann auch gleich noch die Transformation der logischen Indizes 1, . Makros Xxxxxx als Parameter II Initialisierung von Feldern Zeiger und Xxxxxx Aufgaben Mit der Direktive #define kann man nicht nur Kontanten benennen. Form der Direktive. , x in die C–Indizes 0, . . . , x − 1 hineingesteckt werden. # define name [ersatztext] Namenlin ( xxxxx , xxxxxx , xxxxxx ) \ (((( zeile ) -1)*( laenge ))+(( spalte ) -1)) Definition der Funktion in einer Schreibweise, die in einer define–Direktive definiert werden, werden auch als Makros bezeichnet. Die Ersetzungen, die ein Makro bewirkt, bezeichnet man als Expandierung des Makro. Als ersatztext sind beliebige Zeichenfolgen erlaubt. Diese Zeichenfolgen du¨rfen insbesondere auch bereits zuvor definierte Makros enthalten oder leer sein. Beispiel # define BREITE 10 # define HOEHE ( BREITE + 5) Makros ko¨nnen Parameter erhaltender Formel zumindest einigermaßen nahekommt. # define name lin ( xxxxx , xxxxxx , xxxxxx ) \ (parameter (( zeile ) ersatztext Wichtig ist-1)*( laenge )+( spalte )-1) void matprod ( float c[], dass die o¨ffnende Klammer dem Namen unmittelbar folgen muss damit wird gekennzeichnetconst float a[], dass die Klammer eine Parameterliste einleitet und nicht Bestandteil des Ersatztextes istconst float b[], int l, int m, int n) { xxx i, j, k; for ( i = 1; i <= l; i++) for ( k = 1; k <= n; k++) { c[ xxx (i,k, n)] = 0; for ( j = 1; j <= m; j++) c[ xxx (i,k, n)] += a[ lin (i,j, m)] * b[ xxx (j,k, l)]; } } Aufruf der Funktion. Beispiel # define QUADRAT DIM_L ... # define DIM_M ... # define DIM_N ... float A[ DIM_L ][ DIM_M ], B[ DIM_M ][ DIM_N ], C[ DIM_L ][ DIM_N ]; matprod ( x) x * x An den StellenC[0], an denen der Makro expandiert werden sollA[0], mu¨ssen Argumente angegeben werdenB[0], ¨ahnlich wie bei einer Funktion. Makros mit Parameter fu¨hren praktisch zu einer doppelte Textersetzung. Der Makro einschließlich seiner Argumentliste wird durch den Ersatztext ersetzt; im Ersatztext werden die Parameter durch die Argumente ersetzt. Beispiel x = QUADRAT (7.4DIM_L , DIM_M , DIM_N ); y = QUADRAT ( x + 1); Ergibt letztlich folgende QuellanweisungenDie angegebene Funktion matprod l¨aßt sich noch nicht wirklich universell fu¨r die Multiplikation von zwei float–Matrizen einsetzen. x = 7.4 * 7.4; y = x + 1 * x + 1; Der Makro QUADRAT ist unvollst¨andig definiertEin Programm, das Matrizen verarbeitet, soll in der Regel bei jedem Aufruf Matrizen unterschiedlicher Gro¨ße verarbeiten ko¨nnen. Fu¨r y resultiert ein AusdruckLo¨sungen. Man arbeitet mit dynamischem Speicher. Das bedeutet, man bestimmt zun¨achst die Gro¨ße der nicht zu bearbeitenden Matrizen und beschafft sich dann vom Betriebssystem den entsprechenden Speicher. Man arbeitet mit Maximalgro¨ßen fu¨r die Matrizen. D.h. man u¨berlegt sich eine obere Schranke fu¨r die Gro¨ße der Intention entspricht.vorkommenden Matrizen und definiert alle Matrizen mit dieser Gro¨ße. Das wird in mathematischen Programmen oft gemacht, hat aber auch seine Nachteile-
Appears in 1 contract
Samples: Grundlagen Der C Programmierung
Abhilfe. Man u¨bergibt define QUADRAT ( x) (( x) * ( x)) Die ¨außeren Klammern sind no¨tig, da es Operatoren gibt, deren Priorit¨at ho¨her als die Matrix formal der Multiplikation ist. Makros mit Parametern k¨onnen wie Funktionen die Lesbarkeit eines Programms erho¨hen und Schreibarbeit sparen. Zwischen Makros und Funktionen bestehen aber ganz wesentliche Unterschiede, die letztlich alle aus der Tatsache resultieren, dass Xxxxxx expandiert werden, bevor die eigentliche U¨ bersetzung beginnt und dass sie damit im ausfu¨hrbaren Programm u¨berhaupt nicht mehr in Erscheinung treten. Die Parameter von Makros besitzen keine Typen, so dass die Argumente beliebige Typen besitzen ko¨nnen. Typen spielen erst eine Rolle, wenn der Compiler u¨bersetzt. Jedes Vorkommen eines Makro wird durch den Ersatztext ersetzt. Das hat zur Folge, dass der Maschinencode, der aus dem Ersatztext resultiert, mehrfach im ausfu¨hrbaren Programm steht, w¨ahrend der Maschinencode, der aus einer Funktion resultiert, nur einmal im Programm steht. Dadurch entfallen die Spru¨nge und die Parameterzuordnung, mit denen Funktionsaufrufe verbunden sind. Aus der Tatsache, dass ein Makro–Aufruf durch Textersetzung aufgelo¨st wird, folgt auch, dass man vorsichtig sein muss, wenn man als Vektor und gibt diesem Vektor Argumente Ausdru¨cke mit Nebeneffekten einsetzt. i = QUADRAT ( j++); Wird expandiert zu i = (( j++) * ( j++)); Abgesehen davon, dass der doppelte Nebeneffekt in der Funktion wieder MatrixstrukturRegel nicht beabsichtigt sein wird, indem man die Speicherabbildungsfunktion selbst berechnetist er auch gef¨ahrlich. Das ist zwar nicht sch¨on, in C aber nicht zu vermeidenFunktionen Exkurs Zeiger Funktionen (Fortsetzung) Xxxxxx Ru¨ckblick Vereinbarung von Feldern Anordnung von Feldern im Speicher Xxxxxx als Parameter I Einschub. Beispiel Matrizenprodukt C = A B fu¨r Matrizen A = (aij ), B = (bjk ) Makros Xxxxxx als Parameter II Initialisierung von Feldern Zeiger und C = (cik ) mit i = 1, . . . , l, j = 1, . . . , m und k = 1, . . . , n. cik = xxx · xxx j=1 Prototyp einer entsprechenden Funktion. void matprod ( float c[], const float a[], const float b[], int l, int m, int n); Xxxxxx Aufgaben Die Speicherabbildungsfunktion um den u¨bergebenen Vektoren wieder Matrixstruktur zu geben, wird als Makro (Pr¨aprozessoranweisung) definiert. Der Makro berechnet zu jedem Indexpaar den Abstand vom Anfang des Vektors, dazu wird zus¨atzlich zu den beiden Indizes auch die L¨ange der Zeilen der Matrix als Parameter beno¨tigt. Funktionen Exkurs Zeiger Funktionen (Fortsetzung) Xxxxxx Ru¨ckblick Vereinbarung von Feldern Anordnung von Feldern im Speicher Xxxxxx als Parameter I EinschubIn diesen Makro kann dann auch gleich noch die Transformation der logischen Indizes 1, . Makros Xxxxxx als Parameter II Initialisierung von Feldern Zeiger und Xxxxxx Aufgaben Mit der Direktive #define kann man nicht nur Kontanten benennen. Form der Direktive. , x in die C–Indizes 0, . . . , x − 1 hineingesteckt werden. # define name [ersatztext] Namenlin ( xxxxx , xxxxxx , xxxxxx ) \ (((( zeile ) -1)*( laenge ))+(( spalte ) -1)) Definition der Funktion in einer Schreibweise, die in einer define–Direktive definiert werden, werden auch als Makros bezeichnet. Die Ersetzungen, die ein Makro bewirkt, bezeichnet man als Expandierung des Makro. Als ersatztext sind beliebige Zeichenfolgen erlaubt. Diese Zeichenfolgen du¨rfen insbesondere auch bereits zuvor definierte Makros enthalten oder leer sein. Beispiel # define BREITE 10 # define HOEHE ( BREITE + 5) Makros ko¨nnen Parameter erhaltender Formel zumindest einigermaßen nahekommt. # define name lin ( xxxxx , xxxxxx , xxxxxx ) \ (parameter (( zeile ) ersatztext Wichtig ist-1)*( laenge )+( spalte )-1) void matprod ( float c[], dass die o¨ffnende Klammer dem Namen unmittelbar folgen muss damit wird gekennzeichnetconst float a[], dass die Klammer eine Parameterliste einleitet und nicht Bestandteil des Ersatztextes istconst float b[], int l, int m, int n) { xxx i, j, k; for ( i = 1; i <= l; i++) for ( k = 1; k <= n; k++) { c[ xxx (i,k, n)] = 0; for ( j = 1; j <= m; j++) c[ xxx (i,k, n)] += a[ lin (i,j, m)] * b[ xxx (j,k, l)]; } } Aufruf der Funktion. Beispiel # define QUADRAT DIM_L ... # define DIM_M ... # define DIM_N ... float A[ DIM_L ][ DIM_M ], B[ DIM_M ][ DIM_N ], C[ DIM_L ][ DIM_N ]; matprod ( x) x * x An den StellenC[0], an denen der Makro expandiert werden sollA[0], mu¨ssen Argumente angegeben werdenB[0], ¨ahnlich wie bei einer Funktion. Makros mit Parameter fu¨hren praktisch zu einer doppelte Textersetzung. Der Makro einschließlich seiner Argumentliste wird durch den Ersatztext ersetzt; im Ersatztext werden die Parameter durch die Argumente ersetzt. Beispiel x = QUADRAT (7.4DIM_L , DIM_M , DIM_N ); y = QUADRAT ( x + 1); Ergibt letztlich folgende QuellanweisungenDie angegebene Funktion matprod l¨aßt sich noch nicht wirklich universell fu¨r die Multiplikation von zwei float–Matrizen einsetzen. x = 7.4 * 7.4; y = x + 1 * x + 1; Der Makro QUADRAT ist unvollst¨andig definiertEin Programm, das Matrizen verarbeitet, soll in der Regel bei jedem Aufruf Matrizen unterschiedlicher Gro¨ße verarbeiten ko¨nnen. Fu¨r y resultiert ein AusdruckLo¨sungen. Man arbeitet mit dynamischem Speicher. Das bedeutet, man bestimmt zun¨achst die Gro¨ße der nicht zu bearbeitenden Matrizen und beschafft sich dann vom Betriebssystem den entsprechenden Speicher. Man arbeitet mit Maximalgro¨ßen fu¨r die Matrizen. D.h. man u¨berlegt sich eine obere Schranke fu¨r die Gro¨ße der Intention entspricht.vorkommenden Matrizen und definiert alle Matrizen mit dieser Gro¨ße. Das wird in mathematischen Programmen oft gemacht, hat aber auch seine Nachteile-
Appears in 1 contract
Samples: C Programmierung Grundlagen