?? cbuffer.cpp
字號:
#include <stdio.h>
#include <string.h>
#include <fstream.h>
#include "cbuffer.h"
ostream& operator<<(ostream& o, cbuffer& b)
{
size_t maxitem = 5;
for(size_t i=0; i<b.len(); i++) {
o << b[i] << '\t';
if(((i+1) % maxitem)==0)
o << endl;
}
o << endl;
return o;
}
// 將第n個值設為d,如果引用數大于1,則克隆出一個新的
// 復數緩存區,再作設置,返回作了設置的緩存區指針
cbuffer* cbuffer::set(size_t n, COMPLEX d)
{
DOUBLE x,y;
if(doadjust) {
x = real(d);
y = imag(d);
d = COMPLEX(adjust(x),adjust(y));
}
if(refnum == 1) {
retrieve(n) = d;
return this;
}
refnum --;
cbuffer * b;
b = clone();
(b->retrieve(n)) = d;
return b;
}
// 克隆一個完全一樣的緩存區
cbuffer* memcbuffer::clone()
{
cbuffer* b;
b = new memcbuffer(length);
if(length > 0)
for(size_t i=0; i<length; i++)
(b->retrieve(i)) = (*this)[i];
return b;
}
// 磁盤緩存區構造函數,打開臨時文件
diskcbuffer::diskcbuffer(size_t lth):cbuffer(),length(lth),n(0)
{
tempfp = tmpfile();
}
// 析構函數,關閉臨時文件
diskcbuffer::~diskcbuffer()
{
fclose(tempfp);
}
// 將緩存區尺寸改為num
void diskcbuffer::alloc(size_t num)
{
length = num;
if(!tempfp)
tempfp = tmpfile();
n = 0;
}
// 釋放緩存區,關閉臨時文件
void diskcbuffer::release()
{
fclose(tempfp);
buf = 0.0;
length = 0;
}
// 返回第i個復數的引用,先將當前buf中的內容寫入臨時文件
COMPLEX& diskcbuffer::retrieve(size_t i)
{
long off;
off = n*sizeof(COMPLEX);
fseek(tempfp, off, SEEK_SET);
fwrite(&buf, sizeof(COMPLEX), 1, tempfp);
off = i*sizeof(COMPLEX);
fseek(tempfp, off, SEEK_SET);
fread(&buf, sizeof(COMPLEX), 1, tempfp);
n = i;
return buf;
}
// 克隆一個內容完全相同的磁盤緩存區
cbuffer* diskcbuffer::clone()
{
cbuffer* b;
b = new diskcbuffer(length);
if(length > 0)
for(size_t i=0; i<length; i++)
(b->retrieve(i)) = (*this)[i];
return b;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -