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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.02.2017, 07:25   #1
Ароха
 
Регистрация: 21.09.2015
Сообщений: 8
По умолчанию Помогите найти ошибку

Здравствуйте, программа работает непредсказуемо, иногда все исполняется, иногда глухо виснет; и что-то я конкретно туплю с ней. Сократил фрагмент как мог, assert'ов понапихал от отчаянья, и вообще - я уже не понимаю, что происходит. Помогите пожалуйста.

Код:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

//================================ entity

typedef struct {
    void* obj;
    int Tid;
    void (*destroy)(void* obj)
}* entity_t;



void delEntity(entity_t E){
    E->destroy(E->obj);
    E->obj = NULL;
    free(E);
    E=NULL;
}



entity_t newEntity(int id){
    entity_t E;
    E = (entity_t)malloc(sizeof (entity_t));
    E->Tid = id;
    return E;
}

//================================ object

const objectID = 3;
typedef struct{
    int someField;
}* object_t;



void delObject(void* obj){
    ((object_t)obj)->someField = 0;
    free(obj);
    obj = NULL;
}



entity_t newObject(){
    entity_t E = newEntity(objectID);
    assert(E);
    E->obj = malloc(sizeof (object_t));
    assert(E->obj);
    ((object_t)E->obj)->someField = 111;
    E->destroy = delObject;
    return E;
}



void setObjectValue(entity_t E,int value){
    object_t O;
    assert(E);
    if(E->Tid == objectID){
        assert(E->obj);
        ((object_t)(E->obj))->someField = value;
    }

}



int getObjectValue(entity_t E){
    object_t O;
    int R;
    assert(E);
        if (E->Tid == objectID){
            assert(E->obj);
            R = ((object_t)(E->obj))->someField;
        }
    return R;
}

//================================ main

int main()
{
    int i;
    entity_t obj1 = newObject();

    setObjectValue(obj1,55);
    i = getObjectValue(obj1);
    printf ("%i\n",i);

    return 0;
}
Ароха вне форума Ответить с цитированием
Старый 09.02.2017, 08:40   #2
Ароха
 
Регистрация: 21.09.2015
Сообщений: 8
По умолчанию

Ошибка найдена: в malloc передается размер указателя вместо размера структуры.
Ароха вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Язык C]: В массиве числа образуют неубывающую последовательность. Найти количество различных чисел в массиве. Помогите найти ошибку. Yulia24* Помощь студентам 0 18.10.2016 20:41
Дан массив а(n) типа SWORD. найти сумму всех отрицательных элементов массива.помогите найти ошибку Юлия123456 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 07.09.2016 06:12
Найти седловые точки в матрице(помогите найти ошибку) - pascal tdsotm Помощь студентам 0 20.11.2014 18:57
Помогите найти ошибку - StrToFloat выдаёт ошибку EConvertError для ячеек StringGrid (Delphi) Artsiom Помощь студентам 10 18.12.2013 14:10
Помогите найти ошибку. Айдар Помощь студентам 1 05.01.2010 23:04