preto lebo z hlavneho programu môžem odoslať len 2 typy premennej. a to double a char. takisto aj prevziať
nechcem tu písať že ten hlavný program je gamemaker. tak to tu radčej nenapíšem :smile1:
Příspěvky odeslané z IP adresy 84.47.86.–
ešte by som doplnil, že do dll môžem odoslať premenné len typu double a char .
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:
// 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]);
}
takže už mi to funguje. ale neviem povedať čo som mal zle :-) . proste som sa v tom rýpal, a zrazu kukám, ono to funguje :-)
riadok 20 je char value=ukMask->get_element(w,e);
zabudol som prepisaťa takisto som dal všade sizeof(prislusnyTyp)
naskitol sa mi dalši problem. av tom istom scripte.
DLL sa normalne preloží, ked to spustím tak návratová hodnota je true .ale ked chcem subor nájisť, tak tam nieje. nieje nikde. skušal som zadať nazov aj priamo do fsave = fopen("test", "wb"); a nič. skušal som aj vymazať riadok z buferom. ani tak nič .
komplet funkcia :
export double mask_save(double id,char *fname)
{
MASK * ukMask = zoznam_mask[(int)id];
FILE *fsave;
int &w = 5;//ukMask->get_width();
int &h = ukMask->get_height();
long buff_size=w*h+9;
char buffer[buff_size];
fsave = fopen("test", "wb");
setbuf(fsave,buffer);
if (!fsave) {fclose(fsave); return (-1);}
fwrite(&w,2,1,fsave);
fwrite(&h,2,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);}
int value=ukMask->get_element(w,e);
fwrite(&value,1,1,fsave);
}
}
fflush(fsave);
fclose(fsave);
return (true);
}
vedeli by ste mi poradiť čo teraz ?
super :-) . moc díky. ptresne ako si vravel malo to byť "char fname[]"
a v tom druhom pripade zase ako si pisal "fwrite(&w,4,1,fsave);"
ešte raz dík :-)
C:\Users\Phenom\Desktop\paintball\paintball2\dll test)\dllmain.cpp In function `double mask_save(double, char)':
9 C:\Users\Phenom\Desktop\paintball\paintball2\dll test)\dllmain.cpp invalid conversion from `const char' to `const char*'
9 C:\Users\Phenom\Desktop\paintball\paintball2\dll test)\dllmain.cpp initializing argument 1 of `FILE* fopen(const char*, const char*)'
sak som pisal že pri fopen . ale ak to ma pomôcť o vyriešeniu :-)
zdravým. celé dva dni hladám riešenie pre tento problém.
otváram súbor pre zápis v binárnej podobe. pokial napíšem
fsave = fopen("nazov suboru", "wb");
tak funguje. lae akonahle chcem spraviť
export double mask_save(double id,char fname)
{
FILE *fsave;
MASK * ukMask = zoznam_mask[(int)id];
int h = ukMask->get_height();
long buff_size=h+4;
char buffer[buff_size];
fsave = fopen(fname, "wb");
setbuf(fsave,buffer);
if (!fsave) {fclose(fsave); return (-1);}
fwrite(h,2,1,fsave);
....
}
tak mi kompilator devc++ vzhodí hlášku že nemôže zmeniť dátový typ . akože mi je jasne prečo. ale ako to inač spraviť ?
ked som skušal napísať názov priamo fopen("nazov suboru", "wb"); tak mi zase vyhodilo tu hlášku pri fwrite(w,2,1,fsave);