Laden...

Ein simples array in einem struct?

Erstellt von dodo502b vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.523 Views
D
dodo502b Themenstarter:in
49 Beiträge seit 2006
vor 17 Jahren
Ein simples array in einem struct?

Hallo,

wie kann ich einer Structure sagen, das sie sein array von float Werten erstellen soll. Im moment geht nur das:


       public struct PositionNormalTexturedBlended
        {
            public Vector3 pos;
            public Vector3 normal;
            public float tu, tv, i1, i2, i3, i4, w1, w2, w3, w4;
            public static readonly VertexFormats Format = 
                                                VertexFormats.Position | 
                                                VertexFormats.Normal | 
                                                VertexFormats.Texture4;
        };

Ich hätte aber gerne das hier:


       public struct PositionNormalTexturedBlended
        {
            public Vector3 pos;
            public Vector3 normal;
            public float tu, tv;
            public float[] index = new float[4]; // hier entsteht ein compiler fehler
            public float[] weight = new float[4]; // hier auch
            public static readonly VertexFormats Format = 
                                                VertexFormats.Position | 
                                                VertexFormats.Normal | 
                                                VertexFormats.Texture4;
        };

6.862 Beiträge seit 2003
vor 17 Jahren

Ja, in einem Strukt darfst du keine Feldinitialisierer habe. Schreib einfach

float[] index;
float[] weight;

und fertig.

Baka wa shinanakya naoranai.

Mein XING Profil.

B
1.529 Beiträge seit 2006
vor 17 Jahren

Sei dir dennoch bewusst, dass es zwischen den beiden Varianten einen Unterschied gibt.

Bei public single i1, i2, i3, i4; liegen vier Singles direkt hintereinander im Struct und benötigen damit 16 Bytes.
Bei public single[] i; wird nur die Referenz auf ein Array, also vier Bytes, abgelegt. Das Array selbst wird auf dem Heap angelegt (mittels new).

Um dieses Problem zu umgehen, könntest du dir für die zusammengehörenden Werte index und weight einen eigenen Typ als Struct definieren und diesen nutzen.

PS.: Verwendet man den Begriff Heap unter .NET eigentlich noch? Und wenn nicht: welcher wäre besser?

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Borg,

der Begriff Heap ist auch unter .NET gängig.

herbivore

D
dodo502b Themenstarter:in
49 Beiträge seit 2006
vor 17 Jahren

Ich will aber feste größen in einem strukt benutzte, damit das ganze "blitz" schnell funktioniert. Z.B für Bildverarbeitung bei 50 Bilder in der Sekunde, wenn ich pro pixel zusätzliche Informationen benötige. Hat einer von euch schon mit performance relevanten algorithmen in C# gearbeitet? Oder ist C# doch wieder nur so'n VB murks? Im Moment finde ich C# in der Programmierung komfortabler als C++, da kann ich performance einbussen gut verkraften.


// Beispiel
myStruct[] ganzViel = new myStruct[100000];
myStruct[] ganzViel2 = new myStruct[100000];

for( int i=0; i<100000; i++ )
{
  for( int j=0; j<4; j++ )
  {
    ganzViel.weights.Add( zufall() );
    ganzViel.index.Add( zufall() );
  }
}

ganzViel.CopyTo( ganzViel2, 0 );

Andererseits könnte ich auch ganz brutal vorgehen:


// Beispiel
int stuctSize = 8;
float[] ganzViel = new float[100000 * stuctSize];
float[] ganzViel2 = new float[100000 * stuctSize];

for( int i=0; i<100000; i++ )
{
  for( int j=0; j<4; j++ )
  {
    ganzViel[ i * stuctSize + j * 2 + 0 ] = zufall();
    ganzViel[ i * stuctSize + j * 2 + 1 ] = zufall();
  }
}

ganzViel.CopyTo( ganzViel2, 0 );