Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Может ли std::vector быть членом класса? и как его инициализировать 
:(
    Опции темы
Чупакабро
Дата 27.9.2012, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



Внутри класса объявил вектор, а при попытке что-то сделать с этим вектором программа вылетает
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
kosmonaFFFt
Дата 27.9.2012, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



А можно код хотя бы?


--------------------
user posted image
PM MAIL ICQ   Вверх
Чупакабро
Дата 27.9.2012, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



Вот:
Код

typedef std::vector<XMFLOAT33> VertexVector;
.......
struct Mesh
{
    int iStartIndex;
               ....
    VertexVector separatingAxis;
};
......
class PhNode
{
public:
    DWORD dwNodeNum;
.........
    Mesh* mesh;
.........
    void ComputeFacesAndLines();
    void ComputeNewVertices();
    void prepareSeparatingAxis();

};
.........
void PhNode::prepareSeparatingAxis() // поиск ребер для разделяющих осей
{
    mesh->separatingAxis.resize(1);
    for (int i = 0; i < mesh->dwFaceCount; ++i)  //перебор граней
    {
        for (int j = 0; j < mesh->faces[i].dwVertexCount; ++j) //перебор ребер грани
        {
            XMFLOAT33 p1 = mesh->faces[i].vertex[j];
            XMFLOAT33 p2 = mesh->faces[i].vertex[(j+1) % (mesh->faces[i].dwVertexCount -1)];
            XMFLOAT33 vec = Normalize33(p2 - p1);
            bool bFound=findSepAxe(vec); //проверка на наличие ребра в массиве
            bFound = bFound || findSepAxe(-vec);
            if (!bFound)
            {
                mesh->separatingAxis.push_back(vec);
            }
        }
    }
}

--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
mes
Дата 27.9.2012, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Чупакабро @  27.9.2012,  08:13 Найти цитируемый пост)
 Mesh* mesh;

где создание обьекта ?


--------------------
PM MAIL WWW   Вверх
rodnover
Дата 27.9.2012, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: 2
Всего: 10



А где 
Код

Mesh* mesh;


создается?

Код

mesh = new Mesh();


PM MAIL   Вверх
Чупакабро
Дата 27.9.2012, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



Да создается все, чесслово:
Код

void LoadPhysObj(LPCWSTR filename, vertex** pvertices, DWORD** pindices) {
    HANDLE hFile;
............
    iPhMeshCount++;
    pPhMeshes=(Mesh**)realloc(pPhMeshes,iPhMeshCount*sizeof(Mesh*));
...................
    iNodeCount++;
    pNodes=(PhNode*)realloc(&pNodes[0],sizeof(PhNode)*iNodeCount);
    pNodes[iNodeCount-1]=PhNode::PhNode(iNodeCount-1);
    pNodes[iNodeCount-1].mesh=pPhMeshes[iPhMeshCount-1];
    
}


Это сообщение отредактировал(а) Чупакабро - 27.9.2012, 09:38
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
feodorv
Дата 27.9.2012, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Чупакабро @  27.9.2012,  10:13 Найти цитируемый пост)
           XMFLOAT33 p2 = mesh->faces[i].vertex[(j+1) % (mesh->faces[i].dwVertexCount -1)];

Крайне сомнительная строчка. При dwVertexCount, равном 1, будет деление на ноль. 

Это сообщение отредактировал(а) feodorv - 27.9.2012, 09:39


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Dem_max
Дата 27.9.2012, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



Скорее всего выход за границы массивов.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Чупакабро
Дата 27.9.2012, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



feodorv это оффтоп... там не может быть значение меньше 3. а по теме подсказать можете?
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
mes
Дата 27.9.2012, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Чупакабро @  27.9.2012,  08:37 Найти цитируемый пост)
Да создается все, чесслово:


Цитата(Чупакабро @  27.9.2012,  08:37 Найти цитируемый пост)
    pPhMeshes=(Mesh**)realloc(pPhMeshes,iPhMeshCount*sizeof(Mesh*));

где создается ?! чесслово, я вижу только выделение памяти..  smile 


--------------------
PM MAIL WWW   Вверх
feodorv
Дата 27.9.2012, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Чупакабро @  27.9.2012,  10:41 Найти цитируемый пост)
eodorv это оффтоп...

Это юмор?
Цитата(Чупакабро @  27.9.2012,  10:41 Найти цитируемый пост)
там не может быть значение меньше 3.

Вы проверяли?

Цитата(Dem_max @  27.9.2012,  10:39 Найти цитируемый пост)
Скорее всего выход за границы массивов. 

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

А точку кода, на которой программа рушится, Вы определили?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Чупакабро
Дата 27.9.2012, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



блин, вот
Код

pPhMeshes[iMeshIndex]=(Mesh*)malloc(sizeof(Mesh)*iPhMeshCount);

могу всю функцию запостить, там 100500 строк)
да создется mesh, там со всеми другими мемберами все в порядке, значения присваиваются.

Добавлено @ 09:49
 
feodorv, вылет происходит вот именно на этой строчке:
mesh->separatingAxis.resize(1);
а по поводу dwVertexCount - это число вершин в многоугольнике. которое не может быть меньше 3. ну, по хорошему надо проверку поставить...

Добавлено @ 09:52
косяк именно с std::vector, только вот в чем он заключается, не пойму...

Это сообщение отредактировал(а) Чупакабро - 27.9.2012, 09:54
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
feodorv
Дата 27.9.2012, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Чупакабро @  27.9.2012,  10:45 Найти цитируемый пост)
блин, вот

Нет, ну а там инициализации разные, в том числе и separatingAxis?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
mes
Дата 27.9.2012, 09:54 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Чупакабро @  27.9.2012,  08:45 Найти цитируемый пост)
да создется mesh, там со всеми другими мемберами все в порядке, значения присваиваются.могу всю функцию запостить, там 100500 строк)

malloc, realloc не создают С++ обьектов, коим является стд::вектор.. и даже 100500 маллоков его не создатут.. new в помощь..


--------------------
PM MAIL WWW   Вверх
feodorv
Дата 27.9.2012, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Вот же подсказывают:
Цитата(rodnover @  27.9.2012,  10:34 Найти цитируемый пост)
mesh = new Mesh();

Ну или массив этих мешей...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Чупакабро
Дата 27.9.2012, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



Цитата(feodorv @  27.9.2012,  09:54 Найти цитируемый пост)
Нет, ну а там инициализации разные, в том числе и separatingAxis?

Вот! тут, я думаю, корень зол! Но как инициализировать, не знаю!
Пробовал так:
Код

mesh->separatingAxis = VertexVector();

но вылетает...
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
feodorv
Дата 27.9.2012, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Чупакабро @  27.9.2012,  10:56 Найти цитируемый пост)
Но как инициализировать, не знаю!

Цитата(mes @  27.9.2012,  10:54 Найти цитируемый пост)
new в помощь.. 

В любом случае Вам нужно вызвать конструктор для вектора...

Это сообщение отредактировал(а) feodorv - 27.9.2012, 10:00


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Чупакабро
Дата 27.9.2012, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



Вот - mesh у меня нормально инициализирован. Но если я нажму F10, то произойдет вылет
user posted image

Добавлено через 3 минуты и 37 секунд
Вот ошипка:
user posted image

Добавлено через 14 минут и 57 секунд
Друзья!
Методом научного втыка я решил проблему:
Код

    VertexVector* separatingAxis;
......
     mesh->separatingAxis = new VertexVector();

Всем спасибо за советы!
Видимо я и создатели STL друг друга немного недопоняли))
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
mes
Дата 27.9.2012, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата

mesh->separatingAxis = VertexVector ();

нелегально, если separatingAxis не создан.. см. выше.. 


--------------------
PM MAIL WWW   Вверх
feodorv
Дата 27.9.2012, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Оператор присваивания не есть инициализация (это не C). Конструктор для separatingAxis должен быть вызван до оператора =, который здесь означает copy vector content:
Цитата

The elements contained in the vector object before the call are dropped

А дропать у Вас можно только мусор, присутствующий в separatingAxis...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Чупакабро
Дата 27.9.2012, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



да конструктор вот он: VertexVector ()
Но в общем, я решил проблему, см. выше
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
feodorv
Дата 27.9.2012, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Чупакабро @  27.9.2012,  11:24 Найти цитируемый пост)
да конструктор вот он: VertexVector ()

Это вызов конструктор другого экземпляра VertexVector, не separatingAxis.

Цитата(Чупакабро @  27.9.2012,  11:03 Найти цитируемый пост)
Видимо я и создатели STL друг друга немного недопоняли))

STL тут совсем не причём. А вот ООП - очень даже)))


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Чупакабро
Дата 27.9.2012, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



VertexVector это имя типа
typedef std::vector<XMFLOAT33> VertexVector;
с таким же успехом можно написать 
 mesh->separatingAxis= std::vector<XMFLOAT33>();

Это сообщение отредактировал(а) Чупакабро - 27.9.2012, 10:33
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
mes
Дата 27.9.2012, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Чупакабро @  27.9.2012,  09:32 Найти цитируемый пост)
с таким же успехом можно написать 
 mesh->separatingAxis= std::vector<XMFLOAT33>();

успехов в многочасовой отладке неуловимых багов  smile раз мимо ушей пропускаете то, что Вам советуют.. 


--------------------
PM MAIL WWW   Вверх
Чупакабро
Дата 27.9.2012, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



Цитата(feodorv @  27.9.2012,  09:58 Найти цитируемый пост)
В любом случае Вам нужно вызвать конструктор для вектора

вроде же прислушался к совету))
Ну и собственно, у меня все заработало.
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
bsa
Дата 27.9.2012, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Чупакабро, ты видимо так и не понимаешь. Основная проблема в том, что ты выделяешь память с помощью realloc для массива объектов типа Mesh. А Mesh с вектором не является POD (plain old data) типом. Т.е. его, например, нельзя тупо копировать. Поэтому, забудь о реаллок и маллок. Тебе необходимо использовать new[], а лучше векторы и списки.
В целом, прежде чем что-то писать рекомендую почитать книжки.
PM   Вверх
mes
Дата 27.9.2012, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Чупакабро @  27.9.2012,  10:10 Найти цитируемый пост)

вроде же прислушался к совету))

Цитата(mes @  27.9.2012,  09:19 Найти цитируемый пост)
нелегально, если separatingAxis не создан.. см. выше..  





--------------------
PM MAIL WWW   Вверх
Чупакабро
Дата 27.9.2012, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



Mesh это просто структура, не класс.
Потом вектор в меше я заменил на указатель на вектор.
Соответсвенно, Mesh так и осталась структурой фиксированного размера.
А маллоки я заменю на new, да.

Цитата(bsa @  27.9.2012,  11:17 Найти цитируемый пост)
А Mesh с вектором не является POD (plain old data) типом

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

Это сообщение отредактировал(а) Чупакабро - 27.9.2012, 11:27
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Dem_max
Дата 27.9.2012, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



Цитата

Потом вектор в меше я заменил на указатель на вектор.

И в итоге у тебя структура стала не POD


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Чупакабро
Дата 27.9.2012, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



Вот сначала у меня было, грубо говоря, так:
struct S1
{
  int a;
  std::vector<int> b;
};

Потом стало так:
struct S1
{
  int a;
  void* b;
}; - разве это не POD?

В общем, есть неочевидные моменты, которые не во всех книгах расписаны. Поэтому и спрашиваю здесь))



Это сообщение отредактировал(а) Чупакабро - 27.9.2012, 11:46
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Alexeis
Дата 27.9.2012, 11:36 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



  Если стандартный метод выделения памяти не подходит, то перегрузите оператор new для своего класса и выделяйте в нем память своим способом, при этом будет правильно работать инициализация объектов.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Чупакабро
Дата 27.9.2012, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



Цитата(Alexeis @  27.9.2012,  11:36 Найти цитируемый пост)
 Если стандартный метод выделения памяти не подходит, то перегрузите оператор new для своего класса и выделяйте в нем память своим способом, при этом будет правильно работать инициализация объектов.

Надо до этого дорасти)) Начать использовать new вместо malloc. Пойду читать книжки)
И с вектором все ж таки разберусь до конца.
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Alexeis
Дата 27.9.2012, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Цитата(Чупакабро @  27.9.2012,  12:51 Найти цитируемый пост)
Надо до этого дорасти)) Начать использовать new вместо malloc. Пойду читать книжки)
И с вектором все ж таки разберусь до конца. 

  По моему худший вариант смешивать С и С++ . Это чревато появлением кучи трудноуловимых ошибок. Лучше уж писать на чистом С и проводить все инициализации и перераспределения памяти руками. Т.е. всегда сам следишь за всем. Сам контролируешь время жизни структур данных и последовательность инициализации. Или же совсем забыть про С как про страшный сон и даже перестать использовать указатели в явном виде (Использовать классы, которые сами следят за своей памятью, которую они выделили в куче). 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
baldina
Дата 27.9.2012, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(Чупакабро @  27.9.2012,  11:51 Найти цитируемый пост)
Начать использовать new вместо malloc

лучше заменить ручное распределение памяти на контейнеры:
Код

class PhNode
{
...
    size_t n;
    Mesh *pMesh;
...
public:
...
    PhNode (size_t n, Mesh* pm) : n(n), pMesh(pm) {}
...
};

std::vector <PhNode> pNodes;
std::vector <Mesh*> pPhMeshes;

void LoadPhysObj(LPCWSTR filename, vertex** pvertices, DWORD** pindices) {
...
    Mesh *pm = new Mesh;
    pPhMeshes.push_back (pm);
    pNodes.push_back (PhNode(pNodes.count(), pm));
...
}


Это сообщение отредактировал(а) baldina - 27.9.2012, 13:10
PM MAIL   Вверх
Чупакабро
Дата 27.9.2012, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



ну вот я начал потихоньку заменять все на контейнеры, поэтому собственно тема и образовалась
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
bsa
Дата 27.9.2012, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Чупакабро, начинать надо не изнутри, а снаружи. А по хорошему, почитай хорошую литературу, список приведен в "Ответах на часто задаваемые вопросы" (тема закреплена в разделе).
PM   Вверх
rodnover
Дата 27.9.2012, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: 2
Всего: 10



Цитата(Чупакабро @  27.9.2012,  15:24 Найти цитируемый пост)
Mesh это просто структура, не класс.

В С++ структура от класса отличается только тем, что в структуре члены класса по умолчанию публичные, а в классе приватные (если в новом, стандарте, конечно, этого не понимали)

Есть такое правило выделять и освобождать память определенным методом. Если в С мы могли выделить память malloc, то и очищать мы его должны родственной функцией (free). Создание классов в С++ намного сложнее. Каждый член класса должен быть проинициализирован (иначе, он будет содержать просто мусор). В итоге, все члены класса (которые тоже может быть классами) запускают свои конструкторы (по просту говоря функции инициализации), которые будут запускать конструкторы и для встроенных членов. и так далее.. Для этого служит оператор new, который помимо выделения памяти еще и производит действия инициализации.. Оператор delete выполняет противоположные обязанности. Сначала производит определенные действия при удалении объекта, а потом очищает память.

Все операторы, фактически, являются функциями, начинающимися с [b]operator[b]. в итоге 

Код

mesh->separatingAxis = std::vector<XMFLOAT33>();

преобразуется к виду (как примерный показательный вариант)

Код

void operator=(mesh->separatingAxis, std::vector<XMFLOAT33>())


где функция operator= просто копирует определенным образом объект из второго параметра в объект из первого параметра. Но, если первый параметр был выделене без инициализации (malloc), он будет скопирован в мусор.

Поэтому все объекты в С++ надо выделять через оператор new, а удалять через delete.

P.S. Для инициализации массивов объектов в С++ существует оператор new[] и обратный оператор delete []

Код

Mech a* = new Mech[15]; // Создаем массив из 15 Mech
delete []; // удаляем все 15 Mech

PM MAIL   Вверх
bsa
Дата 27.9.2012, 21:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(rodnover @  27.9.2012,  20:31 Найти цитируемый пост)
delete []; // удаляем все 15 Mech

 smile 
PM   Вверх
baldina
Дата 28.9.2012, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



// удаляем все

PM MAIL   Вверх
borisbn
Дата 29.9.2012, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



bsa, baldina, т.е. это
> Mech a* = new Mech[15]
вас не смутило?

Это сообщение отредактировал(а) borisbn - 29.9.2012, 00:50


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
NoviceF
Дата 29.9.2012, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: 2
Всего: 2



 smile 

Цитата(borisbn @ 29.9.2012,  00:48)
bsa, baldina, т.е. это
> Mech a* = new Mech[15]
вас не смутило?

Ну очипятка же.. что вы, право слово!

Это сообщение отредактировал(а) NoviceF - 29.9.2012, 13:08
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0950 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.