Przekazywanie tablicy jako parametru funkcji

0

Witam,
Mam problem z przekazaniem tylko adresu tablicy jako parametru funkcji a nie calej tabeli. Piszę projekt gry w środowisku Visual C# 2010 Express na specjalizację.
Deklaruję tablicę w taki sposób:

public bullet[] kule = new bullet[20];

Funkcję w taki:

 public void kolizja(int id, bullet[] kule)
{
//...
}

A tu np odwolanie do zmiennej obiektu w tej funkcji:

kule[id].rysuj;

Jak zrobić wskaznik na te tablicę i go uzywac? Szukałem w necie ale żaden ze sposobów nie działał. Prosiłbym też o jakiś link gdzie mógłbym sie douczyć.

0

Pomoże ktoś? W .NET C# wskaźników się troche inaczej uzywa i nie bardzo wiem jak.

0

W C# zarządzanym wskaźników jako takich nie ma. Są w niezarządzanym, np. można rezerwować pamięć niezarządzaną jeśli jest taka potrzeba, ale wypada, żeby był konkretny powód. Dlaczego potrzebujesz go tutaj w ogóle?

0

W C# zarządzanym wskaźników jako takich nie ma. Są w niezarządzanym

nie ma czegoś takiego jak niezarządzany C#, a wskaźnik można mieć choćby na zmienną lokalną. ale mniejsza o to.

pytający chce przekazywać wskaźnik zamiast „całej tablicy”. nie ma takiej potrzeby. w C# przekazuje się po prostu tablicę i tyle. w rzeczywistości przekazany zostanie uchwyt (zarządzana referencja).

bullet[] kule = new bullet[20];
kolizja(0, kule);
0

Skrót myślowy - można rezerwować pamięć sposób niezarządzany za pomocą klasy Marshal i dostać wskaźnik "właściwy" do takiego kawałka pamięci. Nie chodziło mi o podział jak w c++/cli.

0

ale można użyć wskaźnika też do zwykłej zmiennej

	int x;
	int* wsk = &x;
	*wsk = 3; /* to zmodyfikuje x */
	Console.WriteLine(x);

tylko to na codzień niepotrzebne, do jakichś specyficznych zastosowań najwyżej.

0

A to ne znaju, mówiąc szczerze. Choć ma to sens tylko w przypadku typów przekazywanych przez wartość raczej, nie przez referencję.

0

Może inaczej problem wytłumaczę. Piszę grę na wzór Battle City, do tej pory wszystko (kolizje itp) testowalem na kilku polach planszy. Obiazenie procka bylo nie wielkie. Zrobiłem wczytywanie pełnej planszy z pliku i od tego momentu gra się scina bardzo gdy np. wystrzele kule albo jadę. Ilośc obiektów na planszy nie powinna mieć znaczenia bo kolizja z polami planszy jest sprawdzana bezpośrednio poprzez odwołanie się do dwuwymiarowej tablicy [x,y] Jedno pole ma 16x16 px. Te obciazenie procka musi być generowane przez to ze do funkcji sprawdzającej kolizję jest przekazywana cała tablica zamiast tylko adresu początku. Mało korzystałem z wskazników i nie wiem jak ich użyć.

0

Tablice powinny być przekazywane przez referencję, nie przez wartość. Szukałbym problemu gdzie indziej jednak.

0
sucre666 napisał(a)

Te obciazenie procka musi być generowane przez to ze do funkcji sprawdzającej kolizję jest przekazywana cała tablica zamiast tylko adresu początku.

Jeśli do funkcji przekazujesz całą tablicę, to jest to Twoje celowe działanie, które musiałeś jakoś sam zaimplementować, bo standardowo tablica przekazywana jest przez referencję, czyli po Twojemu "adres początku".

0

sucre666: wybij sobie z głowy wskaźniki. w C# używa się ich do niektórych rzeczy, zwłaszcza podczas łączenia kodu w C# z natywnym, np. napisanym w C, albo do przyspieszenia operacji audio/video, ale nie są one ci potrzebne w normalnych okolicznościach.
jeśli program ci wolno chodzi, to problem leży przede wszystkim w algorytmie a nie w przekazywaniu tablic, których przekazanie jest zawsze szybkie niezależnie od wielkości tablicy.

jeszcze raz napiszę: przekazanie tablicy jako parametru do funkcji ani w C#, ani w C nie kopiuje całej tablicy, a jedynie przesyła „adres początku” jak to nazywasz.

pokaż lepiej więcej kodu, to może się okaże dlaczego działa wolno.

1 użytkowników online, w tym zalogowanych: 0, gości: 1