C# wskazniki i zamiana kodu z C++/CLI

0

Witam. Zamieniam kod napisany w C++/CLI na C# i jak w temacie mam problem ze wskaznikami. Ogolnie chodzi o to ze blokuje bitmapa w pamieci za pomoca LockBits i cos tam szukam lub porownuje i to udalo mi sie ogarnac. Natomiast nie moge sobie poradzic z utworzeniem tablicy na wskazniku i przepisaniem do niej co mi tam potrzebne z tego bitmapa.
Dzialajacy kod w C++/CLI:


```///////////////////   kopiujemy screenshot i tworzymy kopie BW  /////////////////////////
	array<Byte>^ tab_ob = gcnew array<Byte>(1920 * 1080);
	pin_ptr<Byte> p1 = &tab_ob[0];
	byte* p2 = p1;
	///////////////////////////////////////////// BW + tablica //////////
	int od_wielkosci_koloru = 80;
	byte kolor_czarny = 0;
	for (int y = 0; y < 1080; y++)
	{
		byte* bits = scan0 + y * stride;
		for (int x = 0; x < 1920; x++)
		{
			byte kolor = Convert::ToByte((*(bits + 0) + *(bits + 1) + *(bits + 2)) / 3);
			if (kolor > od_wielkosci_koloru)
			{
				(*p2) = kolor;
				*(bits + 3) = kolor;
			}
			else
			{
				(*p2) = kolor_czarny;
				*(bits + 3) = kolor_czarny;
			}
			p2++;				//	to jest kolejna komorka
			bits += 4;
		}
	}
A to niedzialajacy (jeden z wielu jakie probowalem) na C# :




///////////////////   kopiujemy screenshot i tworzymy kopie BW  /////////////////////////
unsafe
{
                fixed (byte* p1 = new byte[1920 * 1080])
                {
                    byte p2 = p1;

                    ///////////////////////////////////////////// BW + tablica //////////
                    int od_wielkosci_koloru = 80;
                    byte kolor_czarny = 0;
                    for (int y = 0; y < 1080; y++)
                    {
                        byte* bits = scan0 + y * stride;
                        for (int x = 0; x < 1920; x++)
                        {
                            byte kolor = Convert.ToByte((*(bits + 0) + *(bits + 1) + *(bits + 2)) / 3);
                            if (kolor > od_wielkosci_koloru)
                            {
                                (*p1) = kolor;
                                *(bits + 3) = kolor;
                            }
                            else
                            {
                                (*p1) = kolor_czarny;
                                *(bits + 3) = kolor_czarny;
                            }
                            p1++;               //	to jest kolejna komorka
                            bits += 4;
                        }
                    }
                }
Nie mam pojecia jak to ugryzc... 
2

ten kod jest BLE

a mozesz zrobic z tego kodu CLI dllke i po prostu wywolywac dllke z tym kodem z poziomu C#?

0

Caly program mam juz przeniesiony na C#. Jedyne co zostalo to obsluga tych nieszczesnych tablic na wskaznikach. Szukalem w necie i znalazlem kilka rozwiazan ale jakos u mnie nie dzialaja i nie moge zakapowac o co tu chodzi. Nie moge tez poswiecic nie wiadomo ile czasu na uczenie sie jak korzystac z kodu C++\CLI w C#, to sie mija z celem. W ostatecznosci stworze bitmapa i go zablokuje i uzyje jako tablicy, tak mam czesc kodu i nawet dziala. Jakby ktos konkretnie chcial mi podpowiedziec jak ta nieszczesna tablice i wskazniki uruchomic z gory dziekuje!

0
byte* p2 = p1;

Co to jest byte? W C++/CLI jest Byte, a nie byte.
Ale załóżmy że byte to Byte.

byte* bits = scan0 + y * stride;

Co to jest scan0 i stride? Jaki konkretnie mają typ?

Kod z minimalną liczbą zmian, rzecz jasna nie sprawdzany:

unsafe void foo()
{
    byte[] tab_ob = new byte[1920 * 1080];
    fixed (byte* p1 = &tab_ob[0])
    {
        byte* p2 = p1;

        int od_wielkosci_koloru = 80;
        byte kolor_czarny = 0;
        for (int y = 0; y < 1080; y++)
        {
            byte* bits = scan0 + y * stride;
            for (int x = 0; x < 1920; x++)
            {
                byte kolor = Convert.ToByte((*(bits + 0) + *(bits + 1) + *(bits + 2)) / 3);
                if (kolor > od_wielkosci_koloru)
                {
                    (*p2) = kolor;
                    *(bits + 3) = kolor;
                }
                else
                {
                    (*p2) = kolor_czarny;
                    *(bits + 3) = kolor_czarny;
                }
                p2++;               //  to jest kolejna komorka
                bits += 4;
            }
        }
    }
}

Jeśli coś „nie działa”, to pisz co nie działa. Czy się nie kompiluje? Czy wywala po uruchomieniu? Nie robi tego co trzeba?

Nie moge tez poswiecic nie wiadomo ile czasu na uczenie sie jak korzystac z kodu C++\CLI w C#

Tworzysz w C++/CLI bibliotekę (nowy projekt, CLR, Class Library) i używasz jej w C# jak każdej dotnetowej DLL-ki (przez dodanie referencji do projektu).

0

@Artus2016 jezeli nie masz czasu to zaplac komus. Przygotowanie dllki i uzycie jej to jest 5 min roboty z przerwa na kawe.

Jezeli sie tego nie potrafi to jest to do godzinki czasu by na spokojnie zrozumiec co sie dokladnie dzieje.

Masz najprostsze rozwiazanie to uzycie DLLki i nie widze zadnych przeciwskazan by z tego skorzytac (dla tego projektu)

0

Spokojnie. Przetestowalem to co napisal Azarien. Alleluja. Dziala juz na wiekszosci kodu. Postaram sie reszte dzisiaj uruchomic i zobacze czy dziala. A co do placenia komus to jak zaczynalem pisac ten program okolo roku temu to pytalem o pomoc tu i tam i co uslyszalem to to ze do tego to potrzeba cala grupe specjalistow i ze na pewno bedzie to bardzo duzo kosztowalo. OK od zera uczac sie zrobilem sam. Pewny jestem ze duzo nauki przede mna jeszcze ale zrobilem program ktory z wykresow graficznych odczytuje wartosci gieldowe, przelicza wg zadanych mu wzorow, obstawia nowe pozycje, napisalem wlasnego OCR-a itp. Szczerze nie mam ochoty teraz pokazywac calego kodu komukolwiek. Mam mnostwo pomyslow na genialne programy i chetnych zawsze zapraszam do wspolpracy ale od poczatku do konca! A jesli chodzi o przygotowanie DLL ki to ja bardzo chetnie poznam kogos cierpliwego w Krakowie kto mi to bardzo ladnie wszystko wytlumaczy :)

1

Troche mi to zajelo ale gotowe! Mala podpowiedz od kogos kto ma pojecie i wszystko jest pieknie i ladnie. Wielkie dzieki za pomoc :)

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