Anonymní profil tito100 – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil tito100 – Programujte.comAnonymní profil tito100 – Programujte.com

 

Příspěvky odeslané z IP adresy 84.47.86.–

tito100
C / C++ › otvorenie súboru
1. 7. 2009   #111371

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:

tito100
C / C++ › neznáma chyba. prosím o kore…
1. 7. 2009   #111370

ešte by som doplnil, že do dll môžem odoslať premenné len typu double a char .

tito100
C / C++ › neznáma chyba. prosím o kore…
1. 7. 2009   #111369

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]);
}

tito100
C / C++ › otvorenie súboru
1. 7. 2009   #111336

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 :-)

tito100
C / C++ › otvorenie súboru
1. 7. 2009   #111335

riadok 20 je char value=ukMask->get_element(w,e);
zabudol som prepisaťa takisto som dal všade sizeof(prislusnyTyp)

tito100
C / C++ › otvorenie súboru
1. 7. 2009   #111334

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 ?

tito100
C / C++ › otvorenie súboru
1. 7. 2009   #111329

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 :-)

tito100
C / C++ › otvorenie súboru
1. 7. 2009   #111325

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 :-)

tito100
C / C++ › otvorenie súboru
1. 7. 2009   #111321

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);

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý