2014-01-22 76 views
2

我想將數據從內存地址複製到另一個內存地址,一次752個字節。沒有for循環,我只能複製752個字節。我怎麼做480次,我需要增加我的目標地址,以便所有752字節的數據都被一個接一個地存儲在目標內存塊中。我怎樣才能做到這一點?這是我提出的解決方案,但它不工作,請幫助。謝謝 。將數據從內存地址複製到另一個內存地址,每次752字節

volatile unsigned char *DAQ_BUFF = (unsigned char *)0xC6010000; 
extern unsigned char *DAQ_BUFF; 
unsigned char *Dest = (unsigned char *)0xC6020000; 
int lv; 
for(lv=0;lv<480;lv++) 
{ 
    memcpy(Dest,DAQ_BUFF,752); 

    Dest=Dest+752; 
} 
+0

你不會提前DAQ_BUFF嗎? –

+0

目標內存指向哪? – const

+0

你爲什麼要分三部分複製?請縮進你的代碼,這看起來很糟糕(部分原因是TAB,你不應該使用它)。 –

回答

0
int a[5] = {1,2,3,4,5} 
int *p = a; 
for(i=0;i<5;i++) 
{ 
     printf("array value is %d pointer poiniting to %p ",*(p+i),p); 
} 

,如果你運行這段代碼每次p的值將是相同的 爲u是遞增指針只添加。修復增量或者像

p = p+1; 
p++; 

在你的情況Dest和DAQ_BUFF。

注:請檢查您是否已經正確初始化指針(可能是代碼缺失) 或將指向隨機內存

1

四件事情,我注意到:

您正在使用的memcpy 3倍
您不會增加DAQ_BUFF,因爲Rowland說
您正在使用memcpy(& Dest,& DAQ_BUFF,300);而不是memcpy(Dest,DAQ_BUFF,300);
和dest未初始化

unsigned char *Dest = something; 
int lv; 
for(lv = 0; lv < 480; lv++){ 
    memcpy(Dest, DAQ_BUFF, 752); 
    Dest += 752; 
    DAQ_BUFF += 752; 
} 

瓦爾特

+2

'DAQ_BUFF'可能不會增加,因爲它指向一個硬件FIFO,所以後面的讀取得到不同的數據。 –

+1

但他沒有說什麼。我們應該如何知道。 –

+2

,這個DAQ緩衝區甚至可能只有300個字節大(在很可能是微控制器/小型處理器上不常見) –

1

我認爲在你的循環小的變化將滿足的情況

下面是修改的循環

volatile unsigned char *DAQ_BUFF = (unsigned char *)0xC6010000; 
extern unsigned char *DAQ_BUFF; 
unsigned char *Dest; 
int lv,rv; 

for(lv=0;lv<480;lv++) 
{ 
    memcpy(&Dest,&DAQ_BUFF+752*lv,300); 
    memcpy(&Dest+300,&DAQ_BUFF+300+752*lv,300); 
    memcpy(&Dest+600,&DAQ_BUFF+600+752*lv,152); 
    Dest=Dest+752; 
} 
+0

'* Dest'仍未初始化,導致未定義的行爲(可能初始化爲* 0,EG NULL指針) –

+0

您是對的。但這並不是所提出的問題。我想代碼是從大文件中去掉的。 – dinomoth

+0

爲什麼要將+752添加到&DAG_BUFF? –

1

我覺得以下應該工作,看看我對你的問題的評論作出解釋。你能向我解釋爲什麼memcpy只有300字節的步驟?

volatile unsigned char *DAQ_BUFF = (unsigned char *)0xC6010000; 
extern unsigned char *DAQ_BUFF; 
unsigned char *Dest = (unsigned char *)0xC6020000; 
int lv; 

for(lv=0;lv<480;lv++) 
{ 
    memcpy(Dest, DAQ_BUFF, 300); 
    memcpy(Dest+300, DAQ_BUFF+300, 300); 
    memcpy(Dest+600, DAQ_BUFF+600, 152); 
    Dest += 752; 
} 

你的代碼讓我假設DAQ_BUFF足夠大,可容納752個字節。我之所以假設這是因爲沒有信號/標誌檢查來查看您的DAQ_BUFF中的'接下來的300'字節的數據是否'有效'。如果你需要檢查這個我本來期望是這樣的:

for(lv=0;lv<480;lv++) 
{ 
    while (DAQ_BUFF_DATA_IS_NOT_VALID); /* wait for DAQ data to be valid */ 
    memcpy(Dest, DAQ_BUFF, 300); 

    /* if DAQ_BUFF can only hold 300 bytes then it must be read from the beginning again */ 
    while (DAQ_BUFF_DATA_IS_NOT_VALID); /* wait for DAQ data to be valid */ 
    memcpy(Dest+300, DAQ_BUFF, 300); 

    while (DAQ_BUFF_DATA_IS_NOT_VALID); /* wait for DAQ data to be valid */ 
    memcpy(Dest+600, DAQ_BUFF, 152); 

    Dest += 752; 
} 

這似乎更像是一段代碼,有300

一個DAQ_BUFFER_SIZE如果情況並非如此,你的DAQ_BUFFER_SIZE足以容納752個字節,我期望以下內容:

for(lv=0;lv<480;lv++) 
{ 
    /* Do you first need to check if DAQ_BUFF-data is valid? */ 
    memcpy(Dest, DAQ_BUFF, 752); 

    Dest += 752; 
}