Forum: PC-Programmierung C# Array ab Feld [1] übergeben


von Janosch (Gast)


Lesenswert?

Hallo,

C# mag eine sichere und "schöne" Sprache sein.
Sie bringt einen aber auch zur Verzweiflung.

In C kann ich folgendes machen:

-------------------------------------
u16 aArray[7];

main()
{
   Funktion(&aArray[1]);

}


void Funktion(u16 *p)
{
   ...
   ...
}
-------------------------------------

Angenommen bai aArray[0] ist ein Inhalt, den ich der Funktion nicht 
geben möchte.

Ich übergebe der Funktion die Adresse vom Feld aArray[1].
Könnte genauso &aArray[0] oder aArray der Funktion übergeben.


Wie könnte ich das in C# machen.


Möchte quasi folgendes tun:
            byte* b;
            b = &aArray[1];

Folgendes geht in C#
Funktion(aArray, len);

Funktion(byte[] aArr, byte datalength)
{

}

Ich möchte aber das aArray erst ab der Stelle [1] übergeben.

Hat jemand eine Idee?

von Peter II (Gast)


Lesenswert?

Janosch schrieb:
> Hat jemand eine Idee?

die Frage ist wozu?

du kannst z.b. einen Enumerator ab der 1.stelle übergeben, damit kann 
dann die funktion von dort bis zum ende das array durchlaufen.

Dein Beispiel mit C ist aber auch sehr kurz gedacht, denn es geht schon 
nicht mehr mit einem std::Vektor oder einer std::List.

von bluppdidupp (Gast)


Lesenswert?

Man könnte die Funktion auch um nen Parameter "offset" erweitern, mit 
der die Funktion dann weiß wo sie im Array mit lesen anfangen soll

von PIC (Gast)


Lesenswert?

Peter II schrieb:
> Dein Beispiel mit C ist aber auch sehr kurz gedacht, denn es geht schon
> nicht mehr mit einem std::Vektor oder einer std::List.

C kennt keine std::vector und std::list (achte auf die Kleinschreibung 
:)

von Janosch (Gast)


Lesenswert?

Danke,

das war bislang die konstruktivste Antwort.

bluppdidupp schrieb:
> Man könnte die Funktion auch um nen Parameter "offset" erweitern, mit
>
> der die Funktion dann weiß wo sie im Array mit lesen anfangen soll



Das oben ist nur ein Beispiel. Natürlich übergibt man noch eine 
Längeninformation.

Gibt es andere Möglichkeiten?

von Janosch (Gast)


Lesenswert?

Frage:

Kann ich in C# nicht irgendwie die Adresse des aArray[1] ermitteln und 
diese der Funktion übergeben? Der aArray Typ ist ja bekannt.

von __tom (Gast)


Lesenswert?

Janosch schrieb:
> Kann ich in C# nicht irgendwie die Adresse des aArray[1] ermitteln und
> diese der Funktion übergeben? Der aArray Typ ist ja bekannt.

man kann schon, man sollte nicht. die zauberwörter an der stelle sind 
unsafe und fixed.
1
byte[] aArr = new byte[10];
2
3
fixed (byte* pSrc = aArr)
4
{
5
    // do something silly here
6
}

wesentlich besser wäre wirklich einfach den offset mitzugeben oder (zur 
not) eine kopie des arrays ohne die gewünschten elemente zu erstellen.

von Peter II (Gast)


Lesenswert?

Janosch schrieb:
> Kann ich in C# nicht irgendwie die Adresse des aArray[1] ermitteln und
> diese der Funktion übergeben? Der aArray Typ ist ja bekannt.

nein weil array selber ein eigener objekt type ist. die [] ist 
überladen. Aus dem Grund kann man auch eigenschaften vom array abfragen 
was bei C nicht geht.

array.length usw.


du könntest alle werte in ein neues array kopieren ohne den erste 
eintrag. Ich programmiere auch schon eine weile C# und habe soetwas noch 
nicht gebraucht. Da es das nun auch nicht gibt, stellt sich die Frage 
warum du etwas brauchst was sonst scheinbar niemand braucht.

von Sebastian-L (Gast)


Lesenswert?

weil die funktion nicht alle werte braucht
is nur die frage warum er in c# mit globalen arbeitet

mach halt folgendes


int[] aArray = new int[7];

main()
{
   int[] copy = new int[aArray.Length-1]

   aArray.CopyTo(copy, 1);
   Funktion(copy);

}

void foo(int[] test)
{
}

von Frank M. (aktenasche)


Lesenswert?

wenn du das erste element nicht übergeben willst, vermute ich, dass es 
eine andere bedeutung hat, als der rest des arrays.

wie wärs mit ner eigenen klasse für das array?

beispielsweise so
1
public class MyArray
2
{
3
  public uint16 FirstElement;
4
  public List<uint16> RestElements;
5
}
6
7
public static Function(MyArray.RestElements ToProcess)
8
{
9
...
10
}

wenn du das array komplett brauchst, musst du nur die get methode von 
RestElements dementsprechend anpassen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.