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

C# wskazniki i zamiana kodu z C++/CLI
A2
  • Rejestracja:prawie 9 lat
  • Ostatnio:prawie 8 lat
  • Postów:11
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:

Kopiuj

```///////////////////   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;
		}
	}
Kopiuj
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;
                        }
                    }
                }
Kopiuj
Nie mam pojecia jak to ugryzc... 
edytowany 2x, ostatnio: Artus2016
fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
2

ten kod jest BLE

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

edytowany 1x, ostatnio: fasadin
A2
Przepraszam ze moj kod jest "BLE". Jakbym umial super programowac to bym nie prosil o pomoc! W sumie to wole szukac w necie kilka dni niz pytac bo zawsze jest to samo. Nikt mi nie musi pomagac, bo predzej czy pozniej sam wszystko ogarne i nadejdzie taki dzien ze lepszy bede w programowaniu niz wy wszyscy "specjalisci" razem wzieci. Natomiast prosze was tylko o to zeby zanim komus kto nie ma silnej psychiki dowalicie jak to nic nie potrafi i zeby sie nie zabieral za programowanie, zastanowcie sie jaki to ma wplyw na swiat i w sumie na was samych.
fasadin
nie rozumiesz i sie wsciekasz niepotrzebnie. Bierzesz to zbyt personalnie. Chce Ci pomoc, tylko mowie ze sciezka ktora obrales jest zla skad to BLE. Wiecej dystansu do swiata i do siebie. Nie kazdy chce Cie zgnoic, ja tylko gnoje za zle rozwiazania i gnoje same rozwiazania a nie osoby ktore to zrobily. Sam zrobilem duzo gownianych kodow ale to nie powod do wsciekania sie
fasadin
wiec zacznijmy od poczatku i po prostu odpowiedz na moje pytanie w poscie to poradze cos wiecej na ten temat
A2
Ale ja sie absolutnie nie wsciekam - serio. Pilem tylko do tego zeby uwazac na to co sie pisze lub mowi do innych bo w duzym uproszczeniu mowiac tworzymy sobie sami ten swiat a potem na niego narzekamy :) . OK mniejsza z tym. Jesli chodzi o DLL ke to ja tyle wiem co nic. Napisalem siebie tzw. robota gieldowego :) i wszystko jest OK powiedzmy ale jak zaczynalem rok temu malo wiedzialem i wybralem C++/cli. A teraz chcialbym ten program napisac w c# bo nastepnie chcialbym go uruchomic na linuxie. Wsykrobalem 10K linijek kodu spageti. Nawet nie wiem jak to rozdzielic na dll
fasadin
a mnie to tak srednio obchodzi. Ja lubie byc bezposredni. Nie jestem ani msciwy ani kasliwy. Jestem po prostu bezposredni. Ja nienarzekam na swoj swiat i swoje otoczenie. Odpowiedziec mozesz w poscie bo wtedy dyskusja jest w komentarzach a nie w temacie. Co do ostatniego zdania to masz tutaj linki http://stackoverflow.com/questions/19163839/how-to-access-class-in-c-cli-from-c http://stackoverflow.com/questions/5655936/how-to-use-c-cli-within-c-sharp-application z dllka bedzie Ci duzo latwiej zamiast to przepisywac
A2
  • Rejestracja:prawie 9 lat
  • Ostatnio:prawie 8 lat
  • Postów:11
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!

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 5 godzin
0
Kopiuj
byte* p2 = p1;

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

Kopiuj
byte* bits = scan0 + y * stride;

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

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

Kopiuj
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).

edytowany 2x, ostatnio: Azarien
fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
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)

A2
  • Rejestracja:prawie 9 lat
  • Ostatnio:prawie 8 lat
  • Postów:11
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 :)

A2
  • Rejestracja:prawie 9 lat
  • Ostatnio:prawie 8 lat
  • Postów:11
1

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

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)