在vc中定义的函数原型:Frequency1(int BlockLength,FILE* fp);
delphi中function Frequency1(BlockLength:integer;fp:pfile ):double ;far;external'symmetry_modules.dll' ;调用assignfile(f,'E:\test\crytext');
tt:=@f;
cc:= Frequency1(xx,tt);
其中文件是二进制文件。
为什么总是说NTDLL.DLL出错呢?谁帮我解决这个问题,我再加100分
是不是DELPHI与VC的文件类型什么不一致。
delphi中function Frequency1(BlockLength:integer;fp:pfile ):double ;far;external'symmetry_modules.dll' ;调用assignfile(f,'E:\test\crytext');
tt:=@f;
cc:= Frequency1(xx,tt);
其中文件是二进制文件。
为什么总是说NTDLL.DLL出错呢?谁帮我解决这个问题,我再加100分
是不是DELPHI与VC的文件类型什么不一致。
解决方案 »
- 我的一个函数类型是指针, 但编译报错,为何?
- 小问题 Tmy_query = class(Tadoquery)
- 连接sybase数据库老是弹出数据库德登陆框,每次都要输入sa和密码什么的,有办法去掉吗?或者设置成自动登陆??
- query问题
- 谁知道去那可以下载到一些BITBTN,BUTTON,TOOLBAR等用的图标??
- 我这样写INI文件,对吗?
- 是高手的过来!!如何在Delphi中根据PID来结束系统线程
- 高分请教小问题
- 請教:TCanvas如何用?分不夠再加上,謝謝?
- 一个小型的酒店让我帮助开发一个酒店管理系统,请高手指点,最好有思路及编程方法。高分相送。
- 第一次使用Delphi的FastReport,见笑了,各位指点一下,真的很菜。
- 超级猛料 2003 [CHM版本] 制作完成,热烈欢迎大家下载!!
你采用的是静态调用,你可以跟综测试哈!
当然你要确包是那边出的问题哈,采用动态调用可以监控指针哈!好调释哈
{ int freqnum;
int TestLength=0,testnum,testnum1,testlen=0;
int *BlockData ;
char *TestData;
int i,readnum;
float result;
BlockData=(int *)malloc((BlockLength+1)*sizeof(int));
TestData=(char *)malloc(BlockLength/8);
for (i=0;i<=BlockLength;i++)
BlockData[i]=0;
do
{
readnum=fread(TestData,sizeof(char),BlockLength/8,fp);
if (!readnum) break;
TestLength++;
freqnum=0;
for (i=0;i<readnum;i++)
{if (i>0)
{testnum=TestData[i];
testnum&=128;
if (testnum) TestData[i-1]^=1;}
testnum=testnum1=TestData[i];
testnum1=testnum1<<1;
testnum=testnum^testnum1;
TestData[i]=(char)testnum; /*for (j=1;j<9;j++)
{
testnum1=testnum&128;
if (testnum1) freqnum++;
testnum=testnum<<1;
}*/
}
TestData[readnum-1]&=254;
//BlockData[freqnum]++;
BlockData[HammingWeight(readnum,TestData)]++;
}
while (!feof(fp));
result=two_test2(BlockLength-1,TestLength,BlockData);
//return (two_test2(BlockLength-1,TestLength,BlockData));//?????
free(BlockData);
free(TestData); return(result);
}
我以前也做过类似的,确实是因为定义不一致导致的,就是那个File *Fp
和delphi中不一致,你将这个参数换掉,换成将文件名传过去
在C中
用Char *a;
Delphi用 var a: PChar就好了
我就是这样做的
{ int i,j,testnum,testnum1,freqnum;
char *BlockPtr;
freqnum=0;
BlockPtr=Block;
for (i=1;i<=ByteNum;i++)
{testnum=*BlockPtr;
for (j=1;j<9;j++)
{
testnum1=testnum&128;
if (testnum1) freqnum++;
testnum=testnum<<1;
}
BlockPtr++;
}
return(freqnum);
}
float two_test2(int BlockLength,int Length,int*Data)
{ double midsum=0,temp=0,temp1=0,assumnum=0,assumnum1=0,tempdata=0,tempdata1=0;
int blocktemp=0,blocktemp1=0,i=0;
int trueblock=0;
/*The following is to compute the verified value!*/
for (i=0;i<=BlockLength;i++)
{
temp=Length*Pi(BlockLength,i);
tempdata+=temp;
blocktemp+=Data[i];
if (tempdata>5)
{temp1=(blocktemp-tempdata)*(blocktemp-tempdata);
assumnum1=temp1/tempdata;
assumnum=assumnum1+assumnum;
blocktemp1=blocktemp;
tempdata1=tempdata;
trueblock++;
tempdata=0;
blocktemp=0;}
}
if (tempdata)
{blocktemp+=blocktemp1;
tempdata+=tempdata1;
assumnum-=assumnum1;
temp1=(blocktemp-tempdata)*(blocktemp-tempdata);
assumnum=temp1/tempdata+assumnum;
} return((float)(assumnum));}
那样的话,改动也是很少的
float Followancy1(int BlockLength,PChar *lpfilename)
{
FILE *fp = fopen ( lpfilename, "rb" );
.......
}不过最好还是不要传递 FILE * 文件指针,使用我说的方法安全很多
float Followancy1(int BlockLength,PChar lpfilename)你的调用有错,因为 DLL 要求的是文件读写的指针,你提供的是文件名
(不错才怪呢)
如果 Delphi 没有 DOS 下的直接读写文件的函数
fopen、fwrite、fread、fclose 等的话
(比 open、read、write、close 等多了一个字母 f )在 TC2.0、BC++ 3.1 for DOS 下使用的
(不知道在 Turbo Pascal 下如何使用?我没有使用过 Delphi,正在学习)只能通过传递要操作的文件名进去了
如果 Delphi 没有 DOS 下的直接读写文件的函数
fopen、fwrite、fread、fclose 等的话
(比 open、read、write、close 等多了一个字母 f )在 TC2.0、BC++ 3.1 for DOS 下使用的
(不知道在 Turbo Pascal 下如何使用?我没有使用过 Delphi,正在学习)只能通过传递要操作的文件名进去了
function Frequency1(BlockLength:integer;fp:pointer ):double ;far;
external'symmetry_modules.dll' ;
试试
function Frequency1(BlockLength:integer;fp:pchar):double ;stdcall;
external'symmetry_modules.dll' ;
一运行就说access violation at address XXXX in module 'ntdll.dll'
我已经快绝望了。是在不行就得去改底层接口了。
那个pi 函数
double Pi(int n,int m)
{double PiValue;
int i;
int m1;
m1=m;
PiValue=1.0;
for (i=1;i<=n;i++)
PiValue/=2;
if (m&&m!=n)
{if (m>n-m) m1=n-m;
for (i=1;i<=m1;i++)
PiValue*=(n-i+1);
for (i=1;i<=m1;i++)
PiValue/=i;
}
return PiValue;
}
辛苦你了,菜鸟
提供点资料吧:
在Delphi中,文件指针可用pchar型
function Frequency(BlockLength:integer;fp:pchar):double ;stdcall;
external 'symmetry_modules.dll' ;
za再看看:
http://www.china-askpro.com/msg25/qa54.shtml