Cee99 VLA
 
StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern

Veränderung (letzte Änderung) (Korrektur, Autor, Normalansicht)

Verändert: 116c116
KategorieCee KategorieSchellong
(Leider has Wiki keine Talk Seite)

Hinzugefügt: 117a118,124
Der Text gibt einen den Eindruck das "VLAs in Strukturen." nicht möglich sind. Das ist aber nicht korrekt - z.B. hat Ada VLAs in Strukturen. Die einzige "Konsequenz" ist das man hierfür VLS (Varable Lenght Structures) benötigt.

--MartinKrischik?




KategorieC KategorieCee KategorieSchellong

C99-VLAs

Auszug aus http://www.schellong.de/c.htm

VLA: Variable-Länge-Array
VM: Variabel-Modifizierter Typ

VLAs sind Arrays, deren Elementeanzahl zur Laufzeit beliebig oft dynamisch festgelegt wird. Deshalb können VLAs nicht statisch sein (global; static), sondern nur bei/nach Funktions- und Blockeintritten ({) erzeugt werden; beim Funktionsverlassen werden sie zerstört. Auch können VLAs nicht in Strukturen enthalten sein (Man denke an die Konsequenzen!). VMs sind Adressen auf VLAs, VLA-Pointer.

VLAs sind ein wesentlich verbesserter Ersatz der alloca()-Funktion, die doch sehr oft problematisch ist und nur als compiler-interne Funktion recht sicher anwendbar ist.

In aller Regel werden VLAs im Stack-Speicher angelegt, was jeweils nur einige wenige Prozessortakte an Zeit beansprucht. Dies ist also eine ultraschnelle Allokation von Speicherplatz.

Deklaration bei Prototypen:

long Fu(int n, int m, long a[n][m]);
long Fu(int n, int m, long a[*][*]);
long Fu(int n, int m, long a[ ][*]);
long Fu(int n, int m, long a[ ][m]);

Falls in Prototypen keine Objektnamen angegeben sind, muß man [*] bei VLAs verwenden.

Beispiele aus C9X-Draft:

  extern int n;
  extern int m;

  void fcompat(void)
  {
     int a[n][6][m];
     int (*p)[4][n+1];
     int c[n][n][6][m];
     int (*r)[n][n][n+1];
     p = a;       // Fehler - nicht kompatibel, da 4 != 6.
     r = c;       // Kompatibel, aber definiertes Verhalten
                  // nur falls n == 6 und m == n+1.
  }

  extern int n;
  int A[n];                        // Error - file scope VLA
  extern int (*p2)[n];             // Error - file scope VM
  int B[100];                      // OK - file scope but not VM

  void fvla(int m, int C[m][m]);   // OK - VLA with prototype scope

  {
     typedef int VLA[m][m];   // OK - block scope typedef VLA

     struct tag {
        int (*y)[n];          // Error - y not ordinary identifier
        int z[n];             // Error - z not ordinary identifier
     };
     int D[m];                // OK - auto VLA.
     static int E[m];         // Error - static block scope VLA
     extern int F[m];         // Error - F has linkage and is VLA
     int (*s)[m];             // OK - auto pointer to VLA.
     extern int (*r)[m];      // Error - r had linkage and is
                              // a pointer to VLA.
     static int (*q)[m] = &B; // OK - q is a static block
                              // pointer to VLA.
  }

  void copyt(int n)
  {
     typedef int B[n];   // B hat n ints, n jetzt bewertet.
     n += 1;             // Nanu, vor Objektanlegen!?
     B a;                // a hat n ints, n ohne += 1.
     int b[n];           // a and b sind unterschiedlich groß
     for (int i = 1; i < n; i++)
        a[i-1] = b[i];
  }

  {
     int n = 4, m = 3;
     int a[n][m];
     int (*p)[m] = a;        // p == &a[0]
     p += 1;                 // p == &a[1]
     (*p)[2] = 99;           // a[1][2] == 99
     n = p - a;              // n == 1
  }

Konkretes Anwendungsbeispiel:

void Add(int n, int m, double a[n][n*m+300], double x);

int main()
{
   double b[4][308];
   Add(4, 2, b, 2.17);
   return 0;
}

void Add(int n, int m, double a[n][n*m+300], double x)
{
   for (int i=0;  i < n;  i++)
      for (int j=0, k=n*m+300;  j < k;  j++)
         a[i][j] += x;     // a ist ein Zeiger auf ein VLA
                           // mit n*m+300 Elementen
}

Man beachte, daß in C Arrays niemals als Ganzes an Funktionen übergeben werden können, sondern stets nur Adressen darauf!

Deshalb hat oben a den Typ:

 double(*a)[n*m+300]

--HelmutSchellong


(Leider has Wiki keine Talk Seite)

Der Text gibt einen den Eindruck das "VLAs in Strukturen." nicht möglich sind. Das ist aber nicht korrekt - z.B. hat Ada VLAs in Strukturen. Die einzige "Konsequenz" ist das man hierfür VLS (Varable Lenght Structures) benötigt.

--MartinKrischik?


KategorieC KategorieCee KategorieSchellong


StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert: 29. November 2007 8:31 (diff))
Suchbegriff: gesucht wird
im Titel
im Text