Skocz do zawartości

Problem z zapisaniem do zmiennej w DLL'u


Rekomendowane odpowiedzi

Witam.

 

Mam taki kod w dllu

 

#include "DGE_DB.h"

static CLASS_DB db(100);

double DGE_init_buildplace( double numer_planety, double ilosc )
{
    db.planet[(int)numer_planety].init_buildplace( (int)ilosc );
    return 0;
}
double DGE_edit_buildplace( double numer_planety, double numer_buildplace, double katczybudynek, double wartosc )
{
    if( katczybudynek ) // 1- ustalenie pozycji buildplacu
    {
        db.planet[(int)numer_planety].build_place[(int)numer_buildplace].kat=(int)wartosc; // <----------- TA linijka powoduje blad
    }
    else // 0 - ustalenie numeru budynku
    {
        db.planet[(int)numer_planety].build_place[(int)numer_buildplace].budynek=wartosc;
    }
    return 0;
}

 

klasy:

struct BUILD_PLACE
{
    int kat;
    int budynek;
};
class CLASS_PLANET
{
public:
    int wlasciciel;
    int a;
    BUILD_PLACE* build_place;
    CLASS_PLANET::CLASS_PLANET()
    {
        wlasciciel=0;
    }
    void init_buildplace( int ilosc_buildplace )
    {
        BUILD_PLACE* build_place = new BUILD_PLACE[ilosc_buildplace];
        for(int a=0;a<ilosc_buildplace;a++){ build_place[a].budynek=0; build_place[a].kat=0; }
    }
};

class CLASS_DB
{
public:
    CLASS_PLANET* planet;
    CLASS_DB::CLASS_DB( int ilosc_planet )
    {
        CLASS_PLANET* planet= new CLASS_PLANET[ilosc_planet];
    }

};

 

No i gdy w gmie odpale DGE_init_buildplace to nie ma żadnych problemów ale gdy potem używam DGE_edit_buildplace wywala oczywiście "nieoczekiwany bląd".

z tego co samemu udało mi sie ustalić to błąd powoduje linijka z przypisaniem wartości.

DLL kompiluje sie normalnie ( visual studio 2010 )

 

Nie mam pomysłu co może być źle, może to cos oczywistego i ktos da radę pomóc :P

Odnośnik do komentarza
Udostępnij na innych stronach

Nie bardzo wiem w czym to mi ma pomóc, skoro dll dziala poprawnie( w sensie mam juz funkcje w gmie wszystko dziala, jak zakomentuje linijke w której napisalem że jest błąd to poprawnie zwróci 0 ).

 

Tu jest jeszcze DGE_DB.h zeby uniknac kolejnych nieporozumien:

 

#ifndef DGE_DB_H_
#define DGE_DB_H_

#include <windows.h>
#include "DB_class.h"

#define export extern "C" __declspec(dllexport)

export double DGE_edit_buildplace( double, double, double, double );
export double DGE_zwroc_buildplace( double, double, double);
export double DGE_init_buildplace( double, double );

#endif /* _DLL_H_ */

 

A jezeli w tamtym arcie jest mimo wszystko odpowiedx na moje pytanie to prosiłbym o wskazanie bo pacze juz na ten kod i pacze i nic wypaczec nie moge ;p

A nie chce czekac do jutra aż mój mózg znowu będzie w stanie dokonac na to świeżego spojrzenia^^

Odnośnik do komentarza
Udostępnij na innych stronach

A, widzisz. Brakowało mi tego.

 

W takim wypadku być może problem leży po stronie tablic. Bo to, że Ci się kompiluje to jeszcze nic. Jak wyskakujesz poza rozmiar tablicy to może być to problem.

Odnośnik do komentarza
Udostępnij na innych stronach

Niestety nie wyskakuje bo na razie robiłem bardzo podstawowe testy.

Czyli najpierw:

 

DGE_initbuildplace( 1, 8 ) - z założenia ma stworzyc w db.planet[1] tablice 8 buildplace.

 

Gdy potem proboje DGE_edit_buildplace( 1, 1, 1, 70 )

Czyli zeby do db.planet[1].buildplace[1].kat dac 70 juz gmowi nie pasuje.

 

Poza zasieg wiec napewno nie wychodzi. Jedyne co mi przychodzi na mysl to to że ta tablica buildplacow zostala skasowana(?)

 

A nie bardzo wiem jak to sprawdzic.

Odnośnik do komentarza
Udostępnij na innych stronach

Najprościej? To co napisałeś spróbuj uruchomić pod C++. Znaczy piszesz main i... no po prostu testujesz, tylko w C++.

 

EDIT

#include "DGE_DB.h"

CLASS_DB db(100);

export double DGE_init_buildplace( double numer_planety, double ilosc )
{
    db.planet[(int)numer_planety].init_buildplace( (int)ilosc );
    return 0;
}
export double DGE_edit_buildplace( double numer_planety, double numer_buildplace, double katczybudynek, double wartosc )
{
    if( katczybudynek == 1 ) // 1- ustalenie pozycji buildplacu
    {
        db.planet[(int)numer_planety].build_place[(int)numer_buildplace].kat=(int)wartosc; // <----------- TA linijka powoduje blad
    }
    else // 0 - ustalenie numeru budynku
    {
        db.planet[(int)numer_planety].build_place[(int)numer_buildplace].budynek=(int)wartosc;
    }
    return 0;
}

?

Odnośnik do komentarza
Udostępnij na innych stronach

zmiana miejsca exportu nic nie zmieni ;0

zreszta robiłem juz dlle i działały gdy były budowane w ten sposób^^

 

Przeniosłem to do nowego projektu i robie pod konsolke - na razie wywala błędy pamięci:

Unhandled exception at 0x770415de in proba.exe: 0xC0000005: Access violation reading location 0x00000014.

 

Nie mam pojecia dlaczego, bede próbowal dojść co się dzieje

 

EDIT: w mainie db.planet[1].wlasciciel=3; tez wywala blad pamieci. WTF?

Odnośnik do komentarza
Udostępnij na innych stronach

Nie mówię o przeniesieniu tylko dodaniu. Po za tym miałeś brak rzutowania na int. No i nie wiem.

 

Jestem prawie na 100% pewny, że masz coś nie tak z tymi tablicami.

 

EDIT

struct BUILD_PLACE
{
    int kat;
    int budynek;
};
class CLASS_PLANET
{
public:
    int wlasciciel;
    int a;
    BUILD_PLACE* build_place;
    CLASS_PLANET::CLASS_PLANET()
    {
        wlasciciel=0;
    }
    void init_buildplace( int ilosc_buildplace )
    {
        build_place = new BUILD_PLACE[ilosc_buildplace];
        for(int a=0;a<ilosc_buildplace;a++){ build_place[a].budynek=0; build_place[a].kat=0; }
    }
};

class CLASS_DB
{
public:
    CLASS_PLANET* planet;
    CLASS_DB::CLASS_DB( int ilosc_planet )
    {
        planet= new CLASS_PLANET[ilosc_planet];
    }

};

Bez CLASS_PLANET* i BUILD_PLACE* przed tworzeniem tablic dla pól obiektów. Najwyżej możesz dodać this->.

Odnośnik do komentarza
Udostępnij na innych stronach

Faktycznie wcześniej nie wykrywalo mi tych zmiennych w innych funkcjach wiec dopisalem na poczatku nie kasujac w funkcji.

 

W konsolce kompiluje sie bez bledów i zwraca poprawne dane. Ide zobaczyc czy w dllu zadziala :D

 

EDIT: DZIALA, nienawidze tego jak sie długo przy czyms siedzi to potem nie zauważa się tak prostych błedów ;p

Wielkie dzięki za pomoc ^^

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...