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?
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.
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
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 :)
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?
Frage: Kann ich in C# nicht irgendwie die Adresse des aArray[1] ermitteln und diese der Funktion übergeben? Der aArray Typ ist ja bekannt.
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.
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.
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) { }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.