Common use of Abhilfe Clause in Contracts

Abhilfe. define QUADRAT ( x) (( x) * ( x)) Die ¨außeren Klammern sind no¨tig, da es Operatoren gibt, deren Priorit¨at ho¨her als die 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 Argumente Ausdru¨cke mit Nebeneffekten einsetzt. i = QUADRAT ( j++); Wird expandiert zu i = (( j++) * ( j++)); Abgesehen davon, dass der doppelte Nebeneffekt in der Regel nicht beabsichtigt sein wird, ist er auch gef¨ahrlich. 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 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. In diesen Makro kann dann auch gleich noch die Transformation der logischen Indizes 1, . . . , x in die C–Indizes 0, . . . , x − 1 hineingesteckt werden. # define lin ( xxxxx , xxxxxx , xxxxxx ) \ (((( zeile ) -1)*( laenge ))+(( spalte ) -1)) Definition der Funktion in einer Schreibweise, die der Formel zumindest einigermaßen nahekommt. # define lin ( xxxxx , xxxxxx , xxxxxx ) \ ((( zeile ) -1)*( laenge )+( spalte )-1) void matprod ( float c[], const float a[], const 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. # define 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 ( C[0], A[0], B[0], DIM_L , DIM_M , DIM_N ); Die angegebene Funktion matprod l¨aßt sich noch nicht wirklich universell fu¨r die Multiplikation von zwei float–Matrizen einsetzen. Ein Programm, das Matrizen verarbeitet, soll in der Regel bei jedem Aufruf Matrizen unterschiedlicher Gro¨ße verarbeiten ko¨nnen. Lo¨sungen. Man arbeitet mit dynamischem Speicher. Das bedeutet, man bestimmt zun¨achst die Gro¨ße der 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 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: user.informatik.uni-goettingen.de

Abhilfe. define QUADRAT ( x) (( x) * ( x)) Die ¨außeren Klammern sind no¨tigMan u¨bergibt die Matrix formal als Vektor und gibt diesem Vektor in der Funktion wieder Matrixstruktur, da es Operatoren gibt, deren Priorit¨at ho¨her als indem man die 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 ersetztSpeicherabbildungsfunktion selbst berechnet. Das hat zur Folgeist zwar nicht sch¨on, dass der Maschinencodein C aber nicht zu vermeiden. Beispiel Matrizenprodukt C = A B fu¨r Matrizen A = (aij ), 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 B = (bjk ) und die Parameterzuordnung, C = (cik ) 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 Argumente Ausdru¨cke mit Nebeneffekten einsetzt. i = QUADRAT 1, . . . , l, j = 1, . . . , m und k = 1, . . . , n. cik = xxx · xxx j=1 Prototyp einer entsprechenden Funktion. void matprod ( j++float c[], const float a[], const float b[], int l, int m, int n); Wird expandiert zu i = (( j++) * ( j++)); Abgesehen davon, dass der doppelte Nebeneffekt in der Regel nicht beabsichtigt sein wird, ist er auch gef¨ahrlich. 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 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. In diesen Makro 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 dann auch gleich noch die Transformation man nicht nur Kontanten benennen. Form der logischen Indizes 1, . . . , x in die C–Indizes 0, . . . , x − 1 hineingesteckt werdenDirektive. # define lin ( xxxxx name [ersatztext] Namen, xxxxxx , xxxxxx ) \ (((( zeile ) -1)*( laenge ))+(( spalte ) -1)) Definition der Funktion die in einer Schreibweisedefine–Direktive definiert werden, werden auch als Makros bezeichnet. Die Ersetzungen, die der Formel zumindest einigermaßen nahekommtein 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 lin 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 ( xxxxx x) x * x An den Stellen, xxxxxx an denen der Makro expandiert werden soll, xxxxxx ) \ 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 ( zeile ) -1x + 1)*( laenge )+( spalte )-1) void matprod ( float c[], const float a[], const float b[], int l, int m, int n) { xxx i, j, k; for ( i Ergibt letztlich folgende Quellanweisungen. x = 7.4 * 7.4; y = x + 1 * x + 1; i <= l; i++) for ( k = 1; k <= n; k++) { c[ xxx (i,kDer Makro QUADRAT ist unvollst¨andig definiert. Fu¨r y resultiert ein Ausdruck, 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. # define 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 ( C[0], A[0], B[0], DIM_L , DIM_M , DIM_N ); Die angegebene Funktion matprod l¨aßt sich noch nicht wirklich universell fu¨r die Multiplikation von zwei float–Matrizen einsetzen. Ein Programm, das Matrizen verarbeitet, soll in der Regel bei jedem Aufruf Matrizen unterschiedlicher Gro¨ße verarbeiten ko¨nnen. Lo¨sungen. Man arbeitet mit dynamischem Speicher. Das bedeutet, man bestimmt zun¨achst die Gro¨ße der 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 vorkommenden Matrizen und definiert alle Matrizen mit dieser Gro¨ße. Das wird in mathematischen Programmen oft gemacht, hat aber auch seine Nachteile-Intention entspricht.

Appears in 1 contract

Samples: user.informatik.uni-goettingen.de

Abhilfe. define QUADRAT ( x) (( x) * ( x)) Die ¨außeren Klammern sind no¨tigMan u¨bergibt die Matrix formal als Vektor und gibt diesem Vektor in der Funktion wieder Matrixstruktur, da es Operatoren gibt, deren Priorit¨at ho¨her als indem man die 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 ersetztSpeicherabbildungsfunktion selbst berechnet. Das hat zur Folgeist zwar nicht sch¨on, dass der Maschinencodein C aber nicht zu vermeiden. Beispiel Matrizenprodukt C = A B fu¨r Matrizen A = (aij ), 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 B = (bjk ) und die Parameterzuordnung, C = (cik ) 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 Argumente Ausdru¨cke mit Nebeneffekten einsetzt. i = QUADRAT 1, . . . , l, j = 1, . . . , m und k = 1, . . . , n. cik = xxx · xxx j=1 Prototyp einer entsprechenden Funktion. void matprod ( j++float c[], const float a[], const float b[], int l, int m, int n); Wird expandiert zu i = (( j++) * ( j++)); Abgesehen davon, dass der doppelte Nebeneffekt in der Regel nicht beabsichtigt sein wird, ist er auch gef¨ahrlich. 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 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. In diesen Makro 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 dann auch gleich noch die Transformation man nicht nur Kontanten benennen. Form der logischen Indizes 1, . . . , x in die C–Indizes 0, . . . , x − 1 hineingesteckt werdenDirektive. # define lin ( xxxxx name [ersatztext] Namen, xxxxxx , xxxxxx ) \ (((( zeile ) -1)*( laenge ))+(( spalte ) -1)) Definition der Funktion die in einer Schreibweisedefine–Direktive definiert werden, werden auch als Makros bezeichnet. Die Ersetzungen, die der Formel zumindest einigermaßen nahekommtein 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 lin 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 ( xxxxx x) x * x An den Stellen, xxxxxx an denen der Makro expandiert werden soll, xxxxxx ) \ 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 ( zeile ) -1x + 1)*( laenge )+( spalte )-1) void matprod ( float c[], const float a[], const float b[], int l, int m, int n) { xxx i, j, k; for ( i Ergibt letztlich folgende Quellanweisungen. x = 7.4 * 7.4; y = x + 1 * x + 1; i <= l; i++) for ( k = 1; k <= n; k++) { c[ xxx (i,kDer Makro QUADRAT ist unvollst¨andig definiert. Fu¨r y resultiert ein Ausdruck, 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. # define 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 ( C[0], A[0], B[0], DIM_L , DIM_M , DIM_N ); Die angegebene Funktion matprod l¨aßt sich noch nicht wirklich universell fu¨r die Multiplikation von zwei float–Matrizen einsetzen. Ein Programm, das Matrizen verarbeitet, soll in der Regel bei jedem Aufruf Matrizen unterschiedlicher Gro¨ße verarbeiten ko¨nnen. Lo¨sungen. Man arbeitet mit dynamischem Speicher. Das bedeutet, man bestimmt zun¨achst die Gro¨ße der 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 vorkommenden Matrizen und definiert alle Matrizen mit dieser Gro¨ße. Das wird in mathematischen Programmen oft gemacht, hat aber auch seine Nachteile-Intention entspricht.

Appears in 1 contract

Samples: user.informatik.uni-goettingen.de

Abhilfe. define QUADRAT ( x) (( x) * ( x)) Die ¨außeren Klammern sind no¨tig, da es Operatoren gibt, deren Priorit¨at ho¨her als die 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 Argumente Ausdru¨cke mit Nebeneffekten einsetzt. i = QUADRAT ( j++); Wird expandiert zu i = (( j++) * ( j++)); Abgesehen davon, dass der doppelte Nebeneffekt in der Regel nicht beabsichtigt sein wird, ist er auch gef¨ahrlich. 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 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. In diesen Makro kann dann auch gleich noch die Transformation der logischen Indizes 1, . . . , x in die C–Indizes 0, . . . , x − 1 hineingesteckt werden. # define lin ( xxxxx , xxxxxx , xxxxxx ) \ (((( zeile ) -1)*( laenge ))+(( spalte ) -1)) Definition der Funktion in einer Schreibweise, die der Formel zumindest einigermaßen nahekommt. # define lin ( xxxxx , xxxxxx , xxxxxx ) \ ((( zeile ) -1)*( laenge )+( spalte )-1) void matprod ( float c[], const float a[], const 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. # define 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 ( C[0], A[0], B[0], DIM_L , DIM_M , DIM_N ); Die angegebene Funktion matprod l¨aßt sich noch nicht wirklich universell fu¨r die Multiplikation von zwei float–Matrizen einsetzen. Ein Programm, das Matrizen verarbeitet, soll in der Regel bei jedem Aufruf Matrizen unterschiedlicher Gro¨ße verarbeiten ko¨nnen. Lo¨sungen. Man arbeitet mit dynamischem Speicher. Das bedeutet, man bestimmt zun¨achst die Gro¨ße der 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 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: user.informatik.uni-goettingen.de