Массивы в VC++
От: spazhev_dima  
Дата: 15.05.07 06:17
Оценка:
Проблема: не могу разобраться, как сделать класс, содержащий член — массив нефиксированной длины. (MS VC++). Если делать массив локально в теле какой-нибудь функции, все работает:

    num_files = 0;   

    char path[255];
    GetCurrentDirectory(255, path);    
    strcat( path, PICTURE_LIST_FILEPATH );
    
    String* dirs[] = Directory::GetFiles(path);

    if (Directory::Exists(path))
        num_files = dirs->Length;

   // Массив нормально создается! // __gc насколько я понимаю здесь использовтать нобязательно,

    String *PictureFNames[] =  __gc new String*[num_files];   
                   
    Collections::IEnumerator* myEnum = dirs->GetEnumerator();
    int i=0;
    while (myEnum->MoveNext()) 
    {
        PictureFNames[i] =  dynamic_cast<String *>(myEnum->Current);     // В массив нормально пишется!            
        i++;
    }

   // Из массива нормально читается
    String * tmp_string = "";
    tmp_string = PictureFNames[1];

Но как только я выношу описание массива в свойства своего класса:


// .H
class TMyPicturesList
{
public:
    String *PictureFNames[];
    
    int num_files;
    TMyPicturesList();
};

// .CPP

TMyPicturesList::TMyPicturesList()
{
    num_files = 0;   

    char path[255];
    GetCurrentDirectory(255, path);    
    strcat( path, PICTURE_LIST_FILEPATH );

    String* dirs[] = Directory::GetFiles(path);

    if (Directory::Exists(path))
        num_files = dirs->Length;
    
    PictureFNames =  __gc new String*[num_files];
                   
    Collections::IEnumerator* myEnum = dirs->GetEnumerator();
    int i=0;
    while (myEnum->MoveNext()) 
    {
        PictureFNames[i] =  dynamic_cast<String *>(myEnum->Current);                
        i++;
    }

    String * tmp_string = "";
    tmp_string = PictureFNames[1];
    
    
    int a = 5; // debug    
    
};


, выдается ошибка: Cannot declare managed 'PictureFNames' in Unmanageg 'TMyPictureList'.

Массив я вероятно задаю не так, как надо. Пробовал добавить модификатор __gc к описанию класса (это далает его managed?),выдается другая ошибка -- 'MyPictureList' : cannot declare a global or static managed type object or a __gc pointer в строке, где объявляется глобальна переменная -- экземпляр моего класса:

TMyPicturesList * MyPictureList = NULL;


В общем, я запутался и разобраться, в чем суть этих managed и не managed данных, и как сделать массивы, у меня не получается.

----------------------------------------------
p.s.
1) знаком с Microsoft Vusial C++ примерно третий день, соответственно это диалект C++ знаю плохо, отсюда мои проблемы.
2) На форуме ответ поискал, не нашел
3) Нет, книги по MS VC++ у меня нет
4) HELP почитал, но не понял
5) сделать поделку нужно срочно, поэтому и не разбираюсь сам, а обращаюсь за помощью.
Re: Массивы в VC++
От: tyger Россия  
Дата: 15.05.07 07:03
Оценка:
Здравствуйте, spazhev_dima, Вы писали:

_>Проблема: не могу разобраться, как сделать класс, содержащий член — массив нефиксированной длины. (MS VC++). Если делать массив локально в теле какой-нибудь функции, все работает:


_>В общем, я запутался и разобраться, в чем суть этих managed и не managed данных, и как сделать массивы, у меня не получается.


Старнно у вас как-то объявления выглядят...
А почему бы не объявлять так:
array<System::String^, 1>^ MyStringArray;

MyStringArray = gcnew array<System::String^,1>(myStringCount);

MyStringArray[0] = "asdfasdf";
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Массивы в VC++
От: Mab Россия http://shade.msu.ru/~mab
Дата: 15.05.07 07:21
Оценка: 1 (1)
Здравствуйте, tyger, Вы писали:

T>Старнно у вас как-то объявления выглядят...

Чего же странного? Это Managed C++.

Автору топика -- unmanaged класс не может содержать managed указателей. Используй шаблон gcroot<T>.
Re[3]: Массивы в VC++
От: spazhev_dima  
Дата: 15.05.07 08:26
Оценка:
Mab>Чего же странного? Это Managed C++.

Иными словами действую в правильном направлении???

Mab>Автору топика -- unmanaged класс не может содержать managed указателей. Используй шаблон gcroot<T>.


Я понимаю, это наглость... Извиняюсь.

А не могли бы вы переделать мой пример -- с использованием gcroot. ДУмаю, это всего несколько строк кода...

А то с утра прошел все книжные нашего родного Бобруйска, толковых книг по теме нет, везде "Библия Notepad", "Internet Eplorer в деталях", "Профессиональная работа в MS PAint"
Re[4]: Массивы в VC++
От: spazhev_dima  
Дата: 18.05.07 06:30
Оценка:
В общем, я разобрался...

Почитал про gcroot, и все понял...

Спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.