我无法弄清楚为什么我输入k = 10时代码会中断(假设k始终在[2-10]范围内),仅当k = 10时才有错误报告。这是我创建的程序,基本上将序列转换为4个基数,然后转换回十进制,我认为转换为十进制的方法很干净,因此我不在此发布它们,如果需要查看该方法,请告诉我 代码:
void convert4base(char arr[])//convert from base-10 to base-4
{
int z=k;
int countersize = pow(4.0,k);
int counterarray[countersize]={0};
for(int j=0; j<size-k+1;j++)// convert from decimal to base-4.
{
str="";
for(int i=j;i<z;i++)
{
str+=arr[i];
}
z+=1;
//output string
int sum =0;
int p=0;
for(int d= str.size()-1; d>-1; d--)
{
int power =pow(4.0,p);
p++;
if(str[d]=='A')
{
sum+=0*power;
}
if(str[d]=='C')
{
sum+=1*power;
}
if(str[d]=='G')
{
sum+=2*power;
}
if(str[d]=='T')
{
sum+=3*power;
}
}
counterarray[sum]+=1;
}
for(int i=0;i<countersize;i++){
if(counterarray[i]>=t)
{
convertdecimal(i);
std::cout<<str<<" "<<counterarray[i]<<std::endl;
}
}
}
int main(int argc, char* argv[])
{
t=std::stoi(argv[3]);
k = std::stoi(argv[2]);
std::string dna_seq;
std::ifstream file(argv[1]);
getline(file,dna_seq);
size = dna_seq.length();
char* input_array = new char[size];
for(int s=0;s<size;s++)
{
input_array[s]=dna_seq[s];
if(input_array[s]=='A')
{
As+=1;
}
if(input_array[s]=='C')
{
Cs+=1;
}
if(input_array[s]=='G')
{
Gs+=1;
}
if(input_array[s]=='T')
{
Ts+=1;
}
}
if(k>size)
{
std::cout<<"0 "<<k<<" "<<size<<std::endl;
std::cout<<"1 "<<As<<" "<<Cs<<" "<<Gs<<" "<<Ts<<std::endl;
std::cout <<"error"<<std::endl;
}
else
{
std::cout<<"0 "<<k<<" "<<size<<std::endl;
std::cout<<"1 "<<As<<" "<<Cs<<" "<<Gs<<" "<<Ts<<std::endl;
convert4base(input_array);
}
delete[] input_array;
return 0;
}
valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes --track-origins=yes ./a1 foo.txt 10 4
==9366== Warning: client switching stacks? SP change: 0x1ffefffd10 --> 0x1ffebffd00
==9366== to suppress, use: --max-stackframe=4194320 or greater
==9366== Invalid write of size 4
==9366== at 0x109F0F: convert4base(char*) (in /home/siquanwa/A1/a1)
==9366== by 0x1097F1: main (in /home/siquanwa/A1/a1)
==9366== Address 0x1ffebffd00 is on thread 1's stack
==9366== in frame #0, created by convert4base(char*) (???:)
==9366==
==9366== Invalid write of size 4
==9366== at 0x109F30: convert4base(char*) (in /home/siquanwa/A1/a1)
==9366== by 0x1097F1: main (in /home/siquanwa/A1/a1)
==9366== Address 0x1ffebffd04 is on thread 1's stack
==9366== in frame #0, created by convert4base(char*) (???:)
==9366== Invalid read of size 8
==9366== at 0x4F61965: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_replace(unsigned long, unsigned long, char const*, unsigned long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25)
==9366== by 0x109F8E: convert4base(char*) (in /home/siquanwa/A1/a1)
==9366== by 0x1097F1: main (in /home/siquanwa/A1/a1)
==9366== Address 0x1ffebffcf8 is on thread 1's stack
==9366== in frame #0, created by std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_replace(unsigned long, unsigned long, char const*, unsigned long) (???:)
==9366==
==9366== Invalid read of size 4
==9366== at 0x10A0D4: convert4base(char*) (in /home/siquanwa/A1/a1)
==9366== by 0x1097F1: main (in /home/siquanwa/A1/a1)
==9366== Address 0x1ffec78484 is on thread 1's stack
==9366== in frame #0, created by convert4base(char*) (???:)