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.