CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Dynamiczne przydzielanie pamięci dla (unamanaged array)uChar

Dynamiczne przydzielanie pamięci dla (unamanaged array)uChar

dział ogólny

Dynamiczne przydzielanie pamięci dla (unamanaged array)uChar

Nowy postprzez Slynx » czwartek, 31 marca 2011, 16:33

KOD cpp:     UKRYJ  
// Zmienna array<Byte>^ data jako argument funkcji

                        //int i = data->Length;
                        unsigned char str[i];
                        memset(str, 0, i);
                        System::Runtime::InteropServices::Marshal::Copy(data, 0, IntPtr(str), i);

// reszta nieistotna...
 
Tak to wyglądać powinno. Problem jest z przydzieleniem rozmiaru tablicy, co widać w błędach:


1>.\Data.cpp(1209) : error C2057: expected constant expression
1>.\Data.cpp(1209) : error C2466: cannot allocate an array of constant size 0
1>.\Data.cpp(1209) : error C2133: 'str' : unknown size



Całość ogólnie ma zamieniać array<Byte> (managed) na tablice unsigned char (unmanaged). Problem właśnie w tym, że nie wiadomo jaką wielkość będzie miała "data". Kombinowałem z malloc(), ale niespecjalnie mi to wychodziło, by była tablica unsigned char (przy signed wyrzuci błąd kawałek dalej w pętli, więc powinien być unsigned).
Pytanie: Jak przydzielić rozmiar dla tej tablicy (str) w zależności od wielkości tablicy argumentu (data).
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: Dynamiczne przydzielanie pamięci dla (unamanaged array)uChar

Nowy postprzez polymorphism » czwartek, 31 marca 2011, 18:00

Ech, Slynx, do książek! Nie możesz definiować statycznej tablicy (str) określając jej rozmiar w zmiennej. Wielkość tablicy statycznej musi być znana lub musi dać się wyliczyć w czasie kompilacji. To, co chcesz zrobić, przechodzi tylko w C99, w C++ nie. Tobie potrzebna jest tablica dynamiczna, a tę tworzysz alokując pamięć operatorem new:
KOD cpp:     UKRYJ  
unsigned char *str = new unsigned char[i];

Później, gdy już pamięć nie będzie potrzebna, zwalniasz ją operatorem delete[].

Tradycyjnie przy tego typu historiach trzeba wspomnieć o klasie vector, która jest znacznie poręczniejsza (i bezpieczniejsza) od gołego wskaźnika.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Dynamiczne przydzielanie pamięci dla (unamanaged array)uChar

Nowy postprzez Slynx » czwartek, 31 marca 2011, 18:33

Ech, Slynx, do książek! Nie możesz definiować statycznej tablicy (str) określając jej rozmiar w zmiennej.

To, że nie mogę to wiem. Podałem tylko przykład jak to wyglądać powinno, a nie "jak zrobiłem i dlaczego nie działa". Jednak mniejsza z tym.

Tak swoją drogą, to rzeczywiście czasami... kombinuje na prawo, na lewo, zamiast najprościej, czyli w tym wypadku przez new(lub gcnew).
Ale ok, dzięki za tak upokarzające upomnienie ;)

---
P.S. Właśnie skończyłem pisać tą funkcję, a raczej tego twora. Patrząc na to można dostać zawału po usłyszeniu słowa "optymalizacja" i (o dziwo !) działa poprawnie. Pewnie jeszcze napiszę jeśli sam jej nie "podrasuję", jednak na razie chodziło tylko o to by ją napisać ; )
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 14 gości

cron