回 帖 发 新 帖 刷新版面

主题:想不明白问题在哪

今天做了一个小练习,可出现了一个想不明白的问题

题目是找出100到999之间的既是回文数且又素数的数,目标是练习VB和C++的混编

判断一个数是否是回文数,素数的函数用C++编:

1.cpp:

#include<cmath>

extern "C" __declspec(dllexport) bool __stdcall prime(int n)
{
    for(int i=2;i<=n-1;i++)
        if(n%i==0) return false;
    return true;
}

extern "C" __declspec(dllexport) bool __stdcall huiwen(int n)
{
    int t=n,m=0;
    while(t)
    {
        m=m*10+t%10;
        t/=10;
    }
    return(m==n);
}


1.def:

LIBRARY 1
EXPORTS
 
 prime @1
 huiwen @2

以上使用VC++ 6.0编译成1.dll


VB部分:
Form1上只有一个Combo控件

Private Declare Function huiwen Lib "1.dll" (ByVal n As Long) As Boolean
Private Declare Function prime Lib "1.dll" (ByVal n As Long) As Boolean

Private Sub Form_Load()
Me.Show
Combo1.Clear
Dim i As Long
For i = 100 To 999
If (prime(i) And huiwen(i)) Then Combo1.AddItem i
Next
End Sub

经我测试,用C++编的两个函数应该没问题,因为我建了一个C++ Win32 Console工程,编了一个main()函数测试,没有问题,但上面的程序100-500之间的数是算对了,可600以上的数就有问题了,连969,999都加到了Combo1里,我又将循环改成For i=10 To 99 算得结果又是正确的.

问题到底在哪呢

回复列表 (共11个回复)

11 楼


前面解释的已经足够了,稍有点C/C++基础的应该早就明白了。不过楼上哥们一方面说不用再争,另一方面言词更过急,我也只好多说几句。

1、bool是C++的基本类型,如果不支持,基本类型就不存在了;
2、编译能否通过?就这么简单的问题,如果实在搞不清楚,试一下不就行了;
3、照C还是C++编译,是编译选项决定的,不是extern "C"决定的,extern的基本概念清楚了,就知道用法了;
4、"什么书都不管用"让人觉得......,基本概念还是先搞清楚吧。


附件中的示例在VC++6.0中生成的,在VC++2005中也能通过,在2005中:

    int max = (int)sqrt(n) + 1;

要用float转换一下:

    int max = (int)sqrt((float)n) + 1;

因为VB的dll声明用了绝对路径,请将附件解压到C盘运行,即是解压到目录:C:\Test\,或者自己改下VB中声明的路径。VC的dll代码和VB的测试代码都在同一个目录下:

http://upload.programfan.com/upfile/200803031714386.rar

这是我对此贴的最后一次回复,再谈什么已经没意思了。

我来回复

您尚未登录,请登录后再回复。点此登录或注册