Przekazywanie tablicy jako parametru funkcji

Odpowiedz Nowy wątek
2011-10-08 23:46
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ć.

edytowany 2x, ostatnio: sucre666, 2011-10-09 18:40

Pozostało 580 znaków

2011-10-09 18:42
0

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

Pozostało 580 znaków

2011-10-09 18:53
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?


You need to learn how to walk
before you can run

Pozostało 580 znaków

2011-10-09 19:33
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);
edytowany 2x, ostatnio: Azarien, 2011-10-09 19:41

Pozostało 580 znaków

2011-10-09 19:38
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.


You need to learn how to walk
before you can run
edytowany 1x, ostatnio: johny_bravo, 2011-10-09 19:38

Pozostało 580 znaków

2011-10-09 19:47
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.

Pozostało 580 znaków

2011-10-09 20:02
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ę.


You need to learn how to walk
before you can run

Pozostało 580 znaków

2011-10-09 20:02
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ć.

Pozostało 580 znaków

2011-10-09 20:03
0

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


You need to learn how to walk
before you can run

Pozostało 580 znaków

2011-10-09 20:45
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".


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2011-10-09 22:16
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.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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