zdravým všetkých.
v c++ pracujem len druhý den. a po napísaní mojho DLL sa mi vyslitla neznáma chyba.
dll mi normálne funguje. masku môžem vytvoriť, nastaviť jej obsah. následne ho načítať. potom uložiť , aj načítať.
problém nastáva vtedy ked vypnem program ktorý dll používa. po vypnutí sa shrúti .
týmto prsím niekoho ochotného. či by mi mohol spraviť kolektúru celého kódu. podla mna je jednoduchšie ako písať tu čo všetko mám zle. takisto netuším ako spraviť deinicializáciu dll.
každému som vopred vďačný.
(kódované v devc++)
zdroják:
Kód:
// C/C++
#define export extern "C" __declspec (dllexport)
#include <windows.h>
#include <vector>
#include <fstream>
#include <stdio.h>
using namespace std;
class MASK
{
private:
int width;
int height;
vector< vector<char> > pole;
public :
MASK(){}
MASK(int w, int h)
{
width=w;
height=h;
pole.resize(w);
for (int i; i<w;i++)
{
pole[i].resize(h);
}
for (int i=0;i<w;i++)
{
for (int e=0;e<h;e++)
{
pole[i][e]=false;
}
}
}
void set_element(int w, int h,char value)
{
pole[w][h]=value;
}
char get_element(int w, int h)
{
return (pole[w][h]);
}
int get_width()
{
return (width);
}
int get_height()
{
return (height);
}
int empty()
{
for (int i; i<width;i++)
{
pole[i].empty();
}
pole.empty();
}
};
vector< MASK *> zoznam_mask;
int last_mask;
export double init()
{
last_mask=1;
}
export double create_mask(double w, double h)
{
zoznam_mask.resize(zoznam_mask.size()+1);
zoznam_mask[zoznam_mask.size()]= new MASK((int)w,(int)h);
return (zoznam_mask.size());
}
export double mask_set_element(double id, double w, double h,double value)
{
zoznam_mask[(int)id]->set_element( (int)w, (int)h, (int)value);
}
export double mask_get_element(double id, double w, double h)
{
return (zoznam_mask[(int)id]->get_element( (int)w, (int)h));
}
export double mask_save(double id,char *fname)
{
MASK * ukMask = zoznam_mask[(int)id];
FILE *fsave;
int w = ukMask->get_width();
int h = ukMask->get_height();
long buff_size=w*h+(sizeof(int)*2);
char buffer[buff_size];
fsave = fopen(fname, "wb");
setbuf(fsave,buffer);
if (!fsave) {fclose(fsave); return (-1);}
fwrite(&w,sizeof(int),1,fsave);
fwrite(&h,sizeof(int),1,fsave);
for (int i=0;i<w;i++)
{
for (int e=0;e<h;e++)
{
if (ftell(fsave)>buff_size) {fclose(fsave); return (-2);}
char value=ukMask->get_element(i,e);
fwrite(&value,sizeof(char),1,fsave);
}
}
fflush(fsave);
fclose(fsave);
return (true);
}
export double mask_load(char *fname)
{
FILE *fload;
fload = fopen(fname, "rb");
int w ;
int h ;
if (!fload) {fclose(fload); return (-1);}
fread(&w,sizeof(int),1,fload);
fread(&h,sizeof(int),1,fload);
MASK * ukMask = new MASK(w,h);
zoznam_mask.resize(zoznam_mask.size()+1);
zoznam_mask[zoznam_mask.size()] = ukMask;
for (int i=0;i<w;i++)
{
for (int e=0;e<h;e++)
{
char value;
fread(&value,sizeof(char),1,fload);
ukMask->set_element( i, e, value);
}
}
fclose(fload);
return (zoznam_mask.size());//zoznam_mask.size()
}
export double mask_delete(double id)
{
zoznam_mask[(int)id]->empty();
delete(zoznam_mask[(int)id]);
}
ešte by som doplnil, že do dll môžem odoslať premenné len typu double a char .