2010-10-29 134 views
2
有hardtime

IM在memset和memcpy的转换为德尔福。有人可以为我提供这方面的信息,或者有关这方面工作的建议吗?帮助我的C++代码

do{ 
    memset(szSpeechBuf, 0x0, sizeof(char)*QSIZE); 
    if((nBufIter+1)*QSIZE > nRawBufLen) 
    { 
     diff = nRawBufLen - (nBufIter)*QSIZE; 

     if(diff < 0) 
     { 
     printf("DetectSpeech() error : timeout!!!"); 
     exit(1); 
     } 
     memcpy(szSpeechBuf, szRawBuf+(QSIZE*nBufIter), diff); 
    } 
    else 
    memcpy(szSpeechBuf, szRawBuf+(QSIZE*nBufIter), sizeof(char)*QSIZE); 
} while(1); 

// where szSpeechBuf: PAnsiChar; nBufIter: Integer; Const QSIZE = 3200 
+2

-1:这是不是*的帮助,我*,这是一个*做它换我*。告诉我们你已经尝试了什么,以及哪些特定部分不适合你。 – 2010-10-29 08:36:18

+1

请提供您目前为止的示例代码,然后告诉我们您遇到了什么问题。当Space_C0wb0y说“这是一个*为我做*”时,他意味着堆栈溢出不是为了这个目的。这是为了帮助,而不是无偿工作。 – 2010-10-29 08:43:31

+0

@Merlyn Morgan-Graham,我在这里找到关于memset和memcpy的http://www.daniweb.com/forums/thread238270.html。它不工作。他们有不同的参数(memcpy)。 – XBasic3000 2010-10-29 08:48:40

回答

4
  • memset填充多个具有指定值的字节。在德尔福,我们使用FillChar。但是如果我们想要填充的值为零,那么也可以使用ZeroMemory函数。

  • memcpy拷贝字节从一个位置到另一个位置的块(在RAM中)。在Delphi中,我们使用Move。您还可以使用CopyMemory(或相同功能MoveMemory)如果你想使用指针,而不是德尔福变量工作。

即,

Move(a, b, n) 

复制n个字节从名为a到b的位置,其中a和b是变量的数据。这相当于

CopyMemory(@b, @a, n) 

其中@a和@b分别是指向源和目标的指针。 (我个人认为,后者的语法更容易解释,在某种意义上,它需要两个地址,毕竟,这是我们如何与内存的工作。)

因此,如果pq是指针,你可以在Delphi堆做

CopyMemory(q, p, n) 

Move(p^, q^, n). 

你可能也想知道如何分配,重新分配和释放内存。您分别使用GetMemReallocMemFreeMem程序。

与指针

工作

Deplhi可以是相当严格的,当涉及到指针算术。但在32位系统上(例如运行Delphi应用程序的系统),指针实际上只是一个32位无符号整数,即一个cardinal。所以你可以像红衣主教一样使用指针,如果你只是告诉编译器这样做。

因此,如果编译器不允许

myPtr + 200 

那么你可以做

cardinal(myPtr) + 200. 
+0

Thanx的答复,但我怎么能把“szRawBuf +(QSIZE * nBufIter)”这个参数?它说第二个参数是一个指针。 'szRawBuf +(QSIZE * nBufIter)'怎么可能? – XBasic3000 2010-10-29 08:59:41

+0

好吧,我明白了。移动(..)是不可能的,但CopyMemory(..)不会。 thnx – XBasic3000 2010-10-29 09:11:51

+0

@ XBasic3000:如果'CopyMemory(a,b,n)'起作用,那么'Move(b ^,a ^,n)'也会起作用。 (但是,也许你需要像“Move(PSomeType(b)^,PSomeType(a)^,n')一样投射。 – 2010-10-29 09:16:51

1

试验后的代码的日子里,我finaly得到了它的工作!

@Merlyn摩根 - 格雷厄姆问我张贴的答案,那么这个问题得到了关闭!他们说它不是真的?因为我自己回答了吗?

+0

不,看起来不错,很高兴你的工作:) – 2010-10-31 02:27:16

+0

+1和投票重新打开;我同意这是一个关于从C/C++转换到Delphi的真正问题。 – 2010-10-31 07:53:18

+0

@Jeroen Pluimers,thanx。给你更多的权力。 – XBasic3000 2010-10-31 11:22:28