Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  C++ Builder ja dll'i protseduur/funktsioon märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
d_x
HV vaatleja

liitunud: 04.01.2009




sõnum 04.01.2009 15:35:39 C++ Builder ja dll'i protseduur/funktsioon vasta tsitaadiga

Ü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
vaata kasutaja infot saada privaatsõnum
i8080
Kreisi kasutaja
i8080

liitunud: 15.03.2002



Autoriseeritud ID-kaardiga

sõnum 05.01.2009 11:24:50 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
d_x
HV vaatleja

liitunud: 04.01.2009




sõnum 05.01.2009 19:34:32 vasta tsitaadiga

Data alignment ei olnudki Byte...
Tänan abi eest! icon_smile.gif
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  C++ Builder ja dll'i protseduur/funktsioon
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
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.