Поиск:

Ответ в темуСоздание новой темы Создание опроса
> EAccessViolation на XP(x64), А на Win7(x64) все Ok 
:(
    Опции темы
Zakhar_Shan
Дата 5.12.2012, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 14.6.2007
Где: Тюмень

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



Есть часть кода:

Код

bool LoadManager::LoadVFPTables(String fileName, VFPtable* &VFPtables, int &countVfpTables){
    int i = 0;
    TStrings * buff = new TStringList();
    try {

        buff->LoadFromFile(fileName);
        addToLog("Открыт файл: "+fileName);
        countVfpTables = 0;
        for (i = 0; i<buff->Count; i++  ){
            if(buff->Strings[i].Trim().Pos("--")==0 && buff->Strings[i].Trim().Pos("VFPPROD")==1 ){
                countVfpTables++;
            }
        }
        setProgBarMin(0);
        setProgBarMax(buff->Count);
        addToLog("Найдено: "+IntToStr(countVfpTables)+" VFP таблиц" );
        int itVFPtable = 0;

        VFPtables = new  VFPtable[countVfpTables];
        for (i = 0; i<buff->Count; i++  ){
                            ...


На Win7(x64) Никаких проблем нет, а на XP(x64) на строчке:
Код

     VFPtables = new  VFPtable[countVfpTables];
 
Выдает


Debugger Exception Notification
---------------------------
Project VFP_Check.exe raised exception class EAccessViolation with message 'Access Violation'.

и

Debugger Exception Notification
---------------------------
Project VFP_Check.exe raised exception class EAccessViolation & with message 'Exception Object Address: 0x3AC3CA2'.

Причем проверял countVfpTables - int число.
Класс VFPtables описан как:
Код

class VFPtable: public TObject{
....


PM MAIL   Вверх
artsb
Дата 5.12.2012, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Как мне кажется, проблема кроется в конструкторе VFPtables()

Добавлено через 2 минуты и 35 секунд
Код

pVFPtable = new  VFPtable();

отрабатывает нормально?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Zakhar_Shan
Дата 5.12.2012, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 14.6.2007
Где: Тюмень

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



Цитата(artsb @ 5.12.2012,  12:49)
Как мне кажется, проблема кроется в конструкторе VFPtables()

Добавлено @ 12:52
Код

pVFPtable = new  VFPtable();

отрабатывает нормально?

Код

VFPtable = new  VFPtable();

и на XP(x64) и на Win7(x64), сработала нормально, конструктор простой:
Код

VFPtable::VFPtable(){
    numVFP = -1;
    FLO_count = -1;
    THP_count= -1;
    WFR_count= -1;
    GFR_count= -1;
    ALQ_count= -1;

}


А сам заголовок:
Код

class VFPtable: public TObject{
    private:
        int numVFP;
        double curDepth;
        FLOtype floType;
        WFRtype wfrType;
        GFRtype gfrType;
        THPtype thpType;
        ALQtype alqType;
        VALS_TYPE valsType;
        UNITS units;
        int FLO_count;
        double* FLO_vals;
        int THP_count;
        double* THP_vals;
        int WFR_count;
        double* WFR_vals;
        int GFR_count;
        double* GFR_vals;
        int ALQ_count;
        double* ALQ_vals;
        double *****BHP_vals;
    public:
....

PM MAIL   Вверх
artsb
Дата 5.12.2012, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Zakhar_Shan @  5.12.2012,  13:04 Найти цитируемый пост)
и на XP(x64) и на Win7(x64), сработала нормально

Тогда странно. Какая ему разница сколько объектов создавать...

А если вместо countVfpTables, воспользоваться локальной переменной?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Zakhar_Shan
Дата 5.12.2012, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 14.6.2007
Где: Тюмень

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



Цитата(artsb @ 5.12.2012,  13:12)
Цитата(Zakhar_Shan @  5.12.2012,  13:04 Найти цитируемый пост)
и на XP(x64) и на Win7(x64), сработала нормально

Тогда странно. Какая ему разница сколько объектов создавать...

А если вместо countVfpTables, воспользоваться локальной переменной?

Помставил вместо countVfpTables тупо 99 - таже байда:(
PM MAIL   Вверх
artsb
Дата 5.12.2012, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А, тю... Вы же наследуете от TObject. А все VCL классы должны создаваться через new. Т.е. нельзя просто написать:
Код

TObject o[5];


Добавлено через 1 минуту и 7 секунд
Т.е. вам нужно создать массив указателей на VFPtable, и уже потом создавать каждый отдельный объект через new.

Добавлено через 7 минут и 14 секунд
Как-то так:
Код

class cls: public TObject
{
private:

public:
    int t;

    cls(void)
    {
        t = -1;
    }
};
//---------------------------------------------------------------------------
void ff(cls** &cl, int &count)
{
    count = 5;

    cl = new cls*[count];
    for(int i = 0; i < count; i++)
    {
        cl[i] = new cls();
        cl[i]->t = i;
    }
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    cls **cl = NULL;
    int count;

    ff(cl, count);

    if(cl)
    {
        for(int i = 0; i < count ; i++)
        {
            delete (cl[i]);
        }

        delete cl;
    }
}
//---------------------------------------------------------------------------



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Zakhar_Shan
Дата 5.12.2012, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 14.6.2007
Где: Тюмень

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



Цитата(artsb @ 5.12.2012,  14:43)
А, тю... Вы же наследуете от TObject. А все VCL классы должны создаваться через new. Т.е. нельзя просто написать:
....
[/code]

Не знаю, так надо будет переписывать пол кода далее, т.к. теперь в масиве лежат не объекты, а указатели на объекты. 
Я всегда так делаю, как у меня в коде, и всенда работает... просто тогда почему работает на Win7...
PM MAIL   Вверх
artsb
Дата 5.12.2012, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Zakhar_Shan @  5.12.2012,  14:57 Найти цитируемый пост)
Я всегда так делаю, как у меня в коде, и всенда работает...

У меня RADStudio XE выдаёт предупреждение:
Цитата

W8134 Cannot allocate arrays of Delphi style class 'cls'

на строке:
Код

cl = new cls[count];


Цитата(Zakhar_Shan @  5.12.2012,  14:57 Найти цитируемый пост)
просто тогда почему работает на Win7... 

Кто его знает...  smile

Добавлено через 1 минуту и 8 секунд
Цитата(Zakhar_Shan @  5.12.2012,  14:57 Найти цитируемый пост)
Не знаю, так надо будет переписывать пол кода далее, т.к. теперь в масиве лежат не объекты, а указатели на объекты. 

Так а цель какая? Чтобы работало или чтобы ничего не нужно было исправлять?  smile

Добавлено через 3 минуты и 59 секунд
Описание ворнинга W8134 из справки:

This occurs when an array of instances of a delphi style class is improperly initialized. 

Код

#include <System.hpp>
class TMyClass : public TObject
{
};
void test()
{
   TMyClass *p = new TMyClass[10];  // <-- W8134
}


Это сообщение отредактировал(а) artsb - 5.12.2012, 15:21


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Zakhar_Shan
Дата 10.12.2012, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 14.6.2007
Где: Тюмень

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



Спасибо, вроде помогло smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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