Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
#1

Ошибка на стадии выполнения ptr = ptr; - C++

25.07.2013, 16:50. Просмотров 1059. Ответов 25
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class CObject
{
friend Parser;
// много полей методов, все должны заполняться в парсере
}
 
class Parser
{
CObject * object_
public:
    void CParser::LoadFromEcad(CObject * object, const std::wstring & path)
    {
        object_ = object; //  Тут происходит ошибка
    }
}
C++
1
2
3
4
5
6
7
Foo * soldat;
int main()
{
   CParser * parser = new CParser;
   CObject * object = new CObject;
   parser->LoadFromEcad(object,L"blabla.ecad");
}
Сообщение об ошибке:
Кликните здесь для просмотра всего текста
Unhandled exception at 0x777415de in ecad.exe 0xC00000005: Access violation writing location 0x0000004.

Заголовочный файл парсера и код вызываемой функции:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#pragma once
#pragma comment( lib, "shlwapi.lib" )
 
#include <Windows.h>
#include <Shlwapi.h>
#include <io.h>
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <vector>
#include <string>
#include "userfn.h"
#include "usertypes.h"
#include "engine/Object.h"
 
class CParser
{
    CObject * object_;
    static std::wstring type_parsing[7];
public:
    void LoadFromEcad(CObject * object, const std::wstring & path);
private:
    bool IsFileExist(const std::wstring & file_path);
    void IndexParse(std::ifstream & file_stream, std::string & tmp);
    void VertexParse(std::ifstream & file_stream, std::string & tmp);
    void DiffuseParse(std::ifstream & file_stream, std::string & tmp);
    void AmbientParse(std::ifstream & file_stream, std::string & tmp);
    
};
void CParser::LoadFromEcad(CObject * object, const std::wstring & path )
{
    if (IsFileExist(path))
    {
        object_ = object; // ВОТ ОНА ОШИБКА
        std::ifstream file_stream( path.c_str() );
        std::string tmp;
        file_stream >> tmp;
        if ( tmp == "START" )
            while (tmp != "END")
            {
                file_stream >> tmp;
                VertexParse(file_stream,tmp);
                IndexParse(file_stream,tmp);
                DiffuseParse(file_stream,tmp);
                AmbientParse(file_stream,tmp);
            }
        file_stream.close();
    }
    else
    {
        // InitEmptyObject();
    }
}

Пожалуйста если кто-то знает почему такая ошибка возникает чаще всего или возникала у вас, прошу сообщить тоже...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5410 / 4806 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.07.2013, 21:30     Ошибка на стадии выполнения ptr = ptr; #21
С этой ошибкой понятно (в WinMain.cpp):
C++
1
2
3
4
CParser * parser;
...
parser->LoadFromEcad(object, L"cube.ecad");
...
А объект под указатель где создаётся?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5410 / 4806 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.07.2013, 21:45     Ошибка на стадии выполнения ptr = ptr; #22
Добавить:
C++
1
parser = new CParser();
И пути к файлам мне пришлось по другому прописать:
C++
1
2
3
parser->LoadFromEcad(object, L"bin\\model\\cube.ecad");
object->LoadObjectFromECAD("bin\\model\\cube.ecad");
object2->LoadObjectFromECAD("bin\\model\\cube.ecad");
Миниатюры
Ошибка на стадии выполнения ptr = ptr;  
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
26.07.2013, 23:38  [ТС]     Ошибка на стадии выполнения ptr = ptr; #23
Цитата Сообщение от alsav22 Посмотреть сообщение
С этой ошибкой понятно (в WinMain.cpp):
КРАСАВЧИК, стыдно, но как говорят на форуме, "про слона, то и забыли".
Спасибо, возможно на код стоило взглянуть не замыленным взором.

Цитата Сообщение от alsav22 Посмотреть сообщение
И пути к файлам мне пришлось по другому прописать:
По этому поводу, не знаю вроде в debug прописана Working director $(ProjectDir)\bin, НО "bin\\model\\cube.ecad" - это работает. Если примерно, представляешь, почему путь надо задавать относительно $(ProjectDir) прошу подскажи...
alsav22
5410 / 4806 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.07.2013, 23:54     Ошибка на стадии выполнения ptr = ptr; #24
Цитата Сообщение от vbloodv Посмотреть сообщение
почему путь надо задавать относительно $(ProjectDir)
Наверное потому, что в студии, по умолчанию, файлы ищутся в папке проекта. Можно поместить cube.ecad в папку проекта и писать где нужно просто имя файла:
C++
1
object->LoadObjectFromECAD("cube.ecad");
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
27.07.2013, 01:25  [ТС]     Ошибка на стадии выполнения ptr = ptr; #25
Цитата Сообщение от alsav22 Посмотреть сообщение
Наверное потому, что в студии, по умолчанию, файлы ищутся в папке проекта. Можно поместить cube.ecad в папку проекта и писать где нужно просто имя файла:
Это конечно так, но структура плохая получается и неудобоваримая, хотелось бы профессиональней как-то есть догадка что я $(ProjectDir)bin неправильно написал... Попробую За HardCode'жить на полные пути и перепроверить...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2013, 02:36     Ошибка на стадии выполнения ptr = ptr;
Еще ссылки по теме:

C++ Ошибка во время выполнения
Ошибка bad ptr при возвращении занчения из функции C++
Трудности на начальной стадии C++
C++ Стадии эволюции С++ программиста
C++ Рекурсии, ошибка выполнения

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alsav22
5410 / 4806 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.07.2013, 02:36     Ошибка на стадии выполнения ptr = ptr; #26
Цитата Сообщение от vbloodv Посмотреть сообщение
есть догадка что я $(ProjectDir)bin неправильно написал...
По-моему, всё там правильно, установки там не влияют на то, где файлы для открытия будут искаться($(ProjectDir)\bin\ - это где .exe будет, $(ProjectDir)intermediate \ - это где .obj будут). Путь к файлу нужно правильно указывать: или полный, или относительно папки проекта.
Yandex
Объявления
27.07.2013, 02:36     Ошибка на стадии выполнения ptr = ptr;
Ответ Создать тему
Опции темы

Текущее время: 01:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru