praegune kellaaeg 20.06.2025 22:57:51
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
d_x
HV vaatleja
liitunud: 04.01.2009
|
04.01.2009 15:35:39
C++ Builder ja dll'i protseduur/funktsioon |
|
|
Üritan siis C++ Builder'ga kasutada dll'is olevat funktsiooni/protseduuri, mis tagastab muutujale "synteesitudvorme" ilusti väärtuse, kuid jätab "formsBuffer'le" väärtused omistamata.
Fail ise on selline:
struct SynthForm
{
char vorm[30];
int stemLength;
};
struct SynthFormSet
{
int tyybinumber;
char sqnaliik[3];
int variandinumber;
int paralleelvorme;
char vormikood[30];
SynthForm vormid[5];
};
typedef int (__stdcall *XSynthesizeForms )(const char*, int, int, SynthFormSet*, int);
AnsiString Paradigma(AnsiString s)
{
//****************************
HINSTANCE handle;
XSynthesizeForms SynthesizeForms;
//****************************
SynthFormSet formsBuffer[300];
int synteesitudvorme, i, j, x_tyybinumber = 0, x_variandinumber = 0;
int valde = 0, valjundkood = 0;
char lemma[30];
AnsiString itemStr, x_sqnaliik = "", s1;
StrPCopy(lemma, s);
handle = LoadLibrary("fmsynth.dll");
SynthesizeForms = (XSynthesizeForms) GetProcAddress(handle, "SynthesizeForms");
synteesitudvorme = SynthesizeForms(lemma, valde, valjundkood, formsBuffer, 300);
FreeLibrary(handle);
if ( synteesitudvorme > 300 ) {
synteesitudvorme = 300;
}
if ( synteesitudvorme == 0 ) {
return "Sellist lemmat reeglid ei lubanud!";
} else {
for (i = 0; i < synteesitudvorme; i++) {
if ( (formsBuffer[i].tyybinumber != x_tyybinumber) ||
((formsBuffer[i].sqnaliik) != x_sqnaliik) ||
(formsBuffer[i].variandinumber != x_variandinumber) ) {
s1 = "*** muuttüüp " + (IntToStr(formsBuffer[i].tyybinumber));
s1 += "\n*** sõnaliik " + char(formsBuffer[i].sqnaliik);
s1 += "\n*** variant " + (IntToStr(formsBuffer[i].variandinumber));
x_tyybinumber = formsBuffer[i].tyybinumber;
x_sqnaliik = formsBuffer[i].sqnaliik;
x_variandinumber = formsBuffer[i].variandinumber;
}
itemStr = char(formsBuffer[i].vormikood) + "\t";
for (j = 0; j < formsBuffer[i].paralleelvorme; j++) {
if ( j > 0) {
itemStr += " ~ ";
}
itemStr += char(formsBuffer[i].vormid[j].vorm) + " ("
+ AnsiString(IntToStr(formsBuffer[i].vormid[j].stemLength)) + ")";
}
s1 += "\n" + itemStr;
}
return s1;
}
}
|
Milles võib viga olla, mis on valesti?
Lisaks veel, et kui kutsuda selle dll'i funktsioon välja Delphi's, siis on kõik OK.
|
|
tagasi üles |
|
 |
i8080
Kreisi kasutaja

liitunud: 15.03.2002
|
05.01.2009 11:24:50
|
|
|
paistab olevat mingi üldine probleem. kui toksida google otsingusse fmsynth.dll, siis analoogseid teemasid tundub olevat küllaga. võib olla leiad nende hulgast midagi. ise praegu ei hakanud neid läbi vaatama ja esimene link kah vastust ei andnud.
niisama omalt poolt huupi pakuksin sellist asja, et katsu kuskil kompilaatori settingute all järgi vaadata, kas struktuuride alignement on ikka 1byte? alates pentiumi ajastust (64bitti ehk 8baiti) harrastati justkui C/C++ struktuuride vaikimisi paigutamist 8baidi kaupa. st 1baidine char võtab oma alla 8baiti jne. see aga viiks struktuuri suuruse ja andmete asukohad paigast ära, kui dll on teiste settingute alusel kompileeritud (oletan, et kasutab 1baidist alignementi, aga mine sa tea). lisaks veel ka on visual studio puhul näiteks oluline vahest kasutada multi-threaded settingut, kui dll on ka näiteks multi-threaded. borlandi täpseid seadistuste analooge ka kohe peast ei mäleta
EDIT:
lisaks on sul seal kahtlase väärtusega AnsiString ja char tüüpi muutujate võrdlemine segamini, vaata igaksjuhuks üle:
((formsBuffer[i].sqnaliik) != x_sqnaliik)
kas ikka saab AnsiStringi (Borland_C objekti ponter) ja char (pointer kuhugi massiivile) omavahel niisama võrrelda?
AnsiString kõiki meetodeid hetkel ei mäleta, aga puhta C++ vahenditega oleks midagi taolist:
(strcmp(formsBuffer[i].sqnaliik, x_sqnaliik.c_str()) != 0)
|
|
Kommentaarid: 169 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
151 |
|
tagasi üles |
|
 |
d_x
HV vaatleja
liitunud: 04.01.2009
|
05.01.2009 19:34:32
|
|
|
Data alignment ei olnudki Byte...
Tänan abi eest!
|
|
tagasi üles |
|
 |
|
lisa lemmikuks |
|
|
sa ei või postitada uusi teemasid siia foorumisse sa ei või vastata selle foorumi teemadele sa ei või muuta oma postitusi selles foorumis sa ei või kustutada oma postitusi selles foorumis sa ei või vastata küsitlustele selles foorumis sa ei saa lisada manuseid selles foorumis sa võid manuseid alla laadida selles foorumis
|
|
Hinnavaatlus ei vastuta foorumis tehtud postituste eest.
|