Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2013, 07:54   #1
PK.Kirill
 
Аватар для PK.Kirill
 
Регистрация: 23.04.2010
Сообщений: 8
Восклицание raised exception class EAccesViolation

что-то в функции LSQ_InsertFrontElement неправильно сделано
при ее вызове С-Билдер выдает: raised exception class EAccesViolation


вот фаилы:
.c http://yadi.sk/d/SMXZ5cLR3JVRr
.h http://yadi.sk/d/Go_5SIwB3IKuM
или ниже код:
//___________________________________
Код:
#ifndef LINEAR_SEQUENCE_H_INCLUDED
#define LINEAR_SEQUENCE_H_INCLUDED
#include <stdlib.h>


typedef int LSQ_BaseTypeT;     /* Тип хранимых в контейнере значений */

typedef void* LSQ_HandleT;     /* Дескриптор контейнера */

#define LSQ_HandleInvalid NULL /* Неинициализированное значение дескриптора контейнера */

typedef void* LSQ_IteratorT;   /* Дескриптор итератора */

typedef int LSQ_IntegerIndexT; /* Тип целочисленного индекса контейнера */

/* Функция, создающая пустой контейнер. Возвращает назначенный ему дескриптор */
extern LSQ_HandleT LSQ_CreateSequence(void);

/* Функция, добавляющая элемент в начало контейнера */
extern void LSQ_InsertFrontElement(LSQ_HandleT handle, LSQ_BaseTypeT element);

#endif
//______________________________________________________________________________
//______________________________________________________________________________

typedef struct LSQ_HandleT     //контейнер
{
    //LSQ_BaseTypeT *ptr;      //Тип хранимых в контейнере значений
    LSQ_IntegerIndexT size;    //Кол-во элементов //Тип целочисленного индекса контейнера
    struct LSQ_Element *HeadElement;//указатель на первый элемент контейнера (вместо void - LSQ_Element)
    struct LSQ_Element *TailElement;//указатель на последний элемент контейнера (вместо void - LSQ_Element)
};

typedef struct LSQ_Iterator
{
    struct LSQ_Element *CurrentElement;//указатель на текущий эл-т
    struct LSQ_HandleT *Container;   //указатель на контейнер
};

typedef struct LSQ_Element
{
    struct LSQ_Element *PrewElement; //указатели на пред. и след. элемент контейнера
    struct LSQ_Element *NextElement;
    LSQ_BaseTypeT Data;
    LSQ_IntegerIndexT Index;         //номер элемента
};
//______________________________________________________________________________

LSQ_HandleT LSQ_CreateSequence()     //создать контейнер
{  // Потом все функции надо в отдельный фаил переместить   [C++ Warning] linear_sequence.h(100): W8058 Cannot create pre-compiled header: code in header
    struct LSQ_HandleT* handle = (struct LSQ_HandleT*)malloc(sizeof(struct LSQ_HandleT));
    (*handle).size = 0;
    (*handle).HeadElement = NULL;
    (*handle).TailElement = NULL;
	return (LSQ_HandleT)handle;
}

void LSQ_InsertFrontElement(LSQ_HandleT handle, LSQ_BaseTypeT element) /* Функция, добавляющая элемент в начало контейнера */
{
    struct LSQ_Element* ElementHandle = (struct LSQ_Element*)malloc(sizeof(struct LSQ_Element));
    struct LSQ_HandleT* con = handle;  //делаем типизированный указатель
    (*ElementHandle).Data = element;
    (*con).size++;                    //raised exception class EAccesViolation
    //(*handle).size++;
	//(*(LSQ_Container *)handle).size++;
	//((LSQ_Container *)handle)->size++;
    if (((*con).size) == 1)
    {
        (*con).TailElement = ElementHandle;
        (*ElementHandle).NextElement = NULL;
    }else{
        (*ElementHandle).NextElement = (*con).HeadElement;
        (*con).HeadElement->PrewElement = ElementHandle;
    }
    (*ElementHandle).PrewElement = NULL;
    (*con).HeadElement = ElementHandle;
}
PK.Kirill вне форума Ответить с цитированием
Старый 17.03.2013, 15:06   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Может так: ((LSQ_HandleT)*con).size++;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.03.2013, 20:21   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

a зачем надо везде писать (*ptr).member? Разве не проще и понятней ptr->member?
waleri вне форума Ответить с цитированием
Старый 18.03.2013, 16:55   #4
PK.Kirill
 
Аватар для PK.Kirill
 
Регистрация: 23.04.2010
Сообщений: 8
По умолчанию

((LSQ_HandleT)*con).size++;
[C++ Error] linear_sequence.h(116): E2110 Incompatible type conversion
да и con - уже типизированая структура
PK.Kirill вне форума Ответить с цитированием
Старый 18.03.2013, 16:57   #5
PK.Kirill
 
Аватар для PK.Kirill
 
Регистрация: 23.04.2010
Сообщений: 8
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
a зачем надо везде писать (*ptr).member? Разве не проще и понятней ptr->member?
можно и так, не важно, главное чтоб работало
не получается обратиться к полям структуры
PK.Kirill вне форума Ответить с цитированием
Старый 18.03.2013, 17:28   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Ну хоть покажите как вызываете LSQ_InsertFrontElement()
waleri вне форума Ответить с цитированием
Старый 19.03.2013, 01:11   #7
PK.Kirill
 
Аватар для PK.Kirill
 
Регистрация: 23.04.2010
Сообщений: 8
По умолчанию

size это просто число в структуре типа LSQ_HandleT*, которую мы уже создали в функции LSQ_CreateSequence(), память для этой структуры мы выделили (malloc) и даже присвоили значение полю size=0;
Код:
LSQ_HandleT LSQ_CreateSequence()     //создать контейнер
{  // Потом все функции надо в отдельный фаил переместить   [C++ Warning] linear_sequence.h(100): W8058 Cannot create pre-compiled header: code in header
    struct LSQ_HandleT* handle = (struct LSQ_HandleT*)malloc(sizeof(struct LSQ_HandleT));
    (*handle).size = 0;
    (*handle).HeadElement = NULL;
    (*handle).TailElement = NULL;
	return (LSQ_HandleT)handle;
}
теперь в функции LSQ_InsertFrontElement память выделяется только для структуры типа LSQ_Element*,
а указатель на стр-ру типа LSQ_HandleT* (память для которой уже выделялась раннее) идет в качестве параметра данной функции,
который затем типизируется таким способом struct LSQ_HandleT* con = handle;

вот кстати C-фаил:
Код:
#include <stdio.h>
#include "linear_sequence.h"

int main()
{
  LSQ_BaseTypeT e = 9;
  LSQ_HandleT sec = LSQ_CreateSequence;
  printf("LSQ_CreateSequence %d\n",sec);
  LSQ_InsertFrontElement(sec,e);

  getchar();  return 0;
}
PK.Kirill вне форума Ответить с цитированием
Старый 19.03.2013, 09:47   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Что по вашему делает эта строчка:
LSQ_HandleT sec = LSQ_CreateSequence;

Подсказка - как получают адреса функций?
waleri вне форума Ответить с цитированием
Старый 20.03.2013, 06:47   #9
PK.Kirill
 
Аватар для PK.Kirill
 
Регистрация: 23.04.2010
Сообщений: 8
Радость

Спасибо, очень помог,
именно в этой строчке был косяк
PK.Kirill вне форума Ответить с цитированием
Старый 20.03.2013, 13:36   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от PK.Kirill Посмотреть сообщение
Спасибо, очень помог,
именно в этой строчке был косяк
Ну, жмите на весы
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ОШИБКА! project raised exception class Einouterror with message file not found obsession Общие вопросы Delphi 2 11.08.2011 12:46
ошыбка Project vk_id.exe raised exception class eoserror with message System error Pein95 Общие вопросы Delphi 6 17.06.2011 20:38
project raised exception class estringlisterror with message list index out of bounds obsession Общие вопросы Delphi 23 09.05.2011 01:31
Project Project1.exe raised exception class EnvalidOP Rock'n'rolla Безопасность, Шифрование 16 20.01.2010 18:39
raised exception class EIdSocketError with message' Socket Error # 10022 Invalid argument eldar Работа с сетью в Delphi 16 08.08.2008 23:49