Frage Brauchen Sie Hilfe beim Konvertieren dieses Snippets von c in c #


typedef struct {
    int e1;
    int e2;
    int e3;
    int e4;
    int e5;
} abc;


void Hello(abc * a, int index)
{
    int * post = (&(a->e1) + index);

    int i;
    for(i = 0; i<5; i++)
    {
        *(post + i) = i;    
    }
}

Das Problem, auf das ich hier stoße, ist, wie sie auf das nächste Element in der Struktur zugreifen können

*(post + i)

Ich bin nicht sicher, wie all dies in C # getan werden würde und außerdem möchte ich keine unsicheren Zeiger in C # verwenden, sondern etwas anderes.

Vielen Dank!


5
2017-07-18 21:24


Ursprung


Antworten:


Sie sollten die ersetzen struct mit einer Anordnung von 5 Elementen.

Wenn Sie möchten, können Sie das Array in eine Klasse mit fünf Eigenschaften umbrechen.

bearbeiten...

Wenn Sie "Wrap" sagen, bedeutet das im Allgemeinen, Eigenschaften in eine Klasse zu schreiben, die den Wert einer einzelnen Variablen, eines Array-Elements oder eines Members einer anderen Klasse, deren Instanz in Ihrer Klasse lebt, setzen oder erhalten "wickle ein Objekt"). Sehr nützlich zum Trennen von Problemen und zum Verbinden der Funktionalität mehrerer Objekte. Technisch gesehen "wickeln" alle einfachen Eigenschaften ihre privaten Membervariablen einfach um.

Beispiel pro Kommentar:

class test
{

    int[] e = new int[5];
    public void Hello(int index)
    {
        for (int i = 0; i <= 4; i++) {
            // will always happen if index != 0
            if (i + index > 4) {
                MsgBox("Original code would have overwritten memory. .Net will now blow up.");
            }
            e[i + index] = i;
        }
    }

    public int e1 {
        get { return e[0]; }
        set { e[0] = value; }
    }

    public int e2 {
        get { return e[1]; }
        set { e[1] = value; }
    }

    //' ETC etc etc with e3-e5 ...

}

3
2017-07-18 21:26



Das Problem mit dem C-Code ist, dass, wenn der Index größer als 0 ist, er am Ende der abc-Struktur abläuft, wodurch zufälliger Speicher überschrieben wird. Das ist der Grund, warum C #, eine sicherere Sprache, solche Dinge nicht zulässt. Die Art, wie ich Ihren Code in C # implementieren würde, wäre:

struct abc
{
    public int[] e;
}

void Hello(ref abc a, int index)
{
    a.e = new int[5];
    for (int i = 0;  i < 5;  ++i)
        a.e[index + i] = i;
}

Beachten Sie, dass Sie bei einem Index> 0 eine Ausnahmebedingung erhalten, die nicht wie beim C-Snippet möglicherweise überschrieben wird.


2
2017-07-18 21:48



Der Gedanke hinter den C-Codes ist schlecht für C #. Der C-Code basiert auf der Annahme, dass die Felder der Struktur sequentiell im Speicher in der Reihenfolge angeordnet werden, in der die Felder definiert sind. Das obige sieht wie Hausaufgaben oder ein künstliches Beispiel aus. Ohne die wahre Absicht zu kennen, ist es schwierig, ein konkretes Beispiel in C # zu geben.

Andere Beispiele hier schlagen vor, die Datenstruktur zu ändern, aber wenn Sie das nicht können / wollen, können Sie die Reflektion in Kombination mit einem Array von Objekten des Strukturtyps verwenden, um das gleiche Ergebnis wie oben zu erzielen.

void Hello(abc currentObj){
  var fields = typeof(abc).GetFields();
  for(var i = 0;i<fields.Length;i++){
    fields[i].SetValue(currentObj,i);
  }
}

1
2017-07-18 21:41