vorher:
int offset = 2;
void bla(int a[], int *n)
{
int i;
for (i = 0; i < *n; i += offset)
{
a[i] = 3030;
}
}
nachher:
int offset = 2;
void fein(int a[], int n)
{
int i;
int lok_off = offset;
for (i = 0; i < n; i += lok_off)
{
a[i] = 3030;
}
}
Für viele Fälle hilft noch folgende Möglichkeit über eine
Convex-Erweiterung: In ANSI-C besteht kein großer Unterschied zwischen
einer Deklaration der Form
void foo1(float *a, float *b);
und
void foo1(float a[], float b[]);
solange man die Pointer a und b nicht ändern will. Dem Convex-Compiler
kann man nun aber durch die Option ''-alias array_args'' mitteilen, daß
keine Überlappungen zwischen Array-Argumenten bestehen, die in der zweiten
Form deklariert sind, sowie zwischen diesen und globalen Variablen. Mit
anderen Worten: Solche Arrays werden nicht als Pointer betrachtet, die
irgendwohin zeigen können, sondern als ordentliche Arrays, die ihren
eigenen Speicherbereich haben. Auf diese einfache Weise lassen sich ein
Großteil hartnäckiger Alias-Probleme lösen. Allerdings ist man dann
selbst dafür verantwortlich, daß auch wirklich keine Aliasse zwischen den
Arrays auftreten. Solange man den entsprechenden Routinen auch nur ''echte''
Arrays übergibt und keine Pointer, sollte das aber keine Probleme machen.
![]()