我的問題涉及到工作內聯C代碼:是否需要使用內聯堆棧函數(Inline_Stack_Vars)來傳遞變量進出,還是在這種情況下適當地修改一個變量是適當的?Perl Inline :: C:Inline_Stack_Vars等需要避免內存泄漏(生物序列字符匹配)
對於顯示生物序列數據,我需要顯示兩個對齊的字符串之間的差異;例如鑑於這兩個字符串:。
ATCAGAAA--GACATGGGCCAAAGATTAA-CAGTGGCCATTGACAGGA--
--CCCCAACTGACAGGGGGCAAAGATTAA-CAGTGGCCATTG---GGA--
我想用」的替換第二個字符串中得到這個(在匹配字符
--.CCC..CT....G...G..........-............---...--
我有很多的序列(百萬Illumina的讀),所以紛紛轉向內聯::下的字符匹配以下聯的代碼似乎只是正常工作(改變的第二個參數來代替add_matchchars功能):
#!/usr/bin/perl
use Inline C;
my($seq1,$seq2) = qw/ ATCAGAAA--GACATGGGCCAAAGATTAA-CAGTGGCCATTGACAGGA--
--CCCCAACTGACAGGGGGCAAAGATTAA-CAGTGGCCATTG---GGA-- /;
print $seq1,"\n";
print $seq2,"\n";
add_matchchars($seq1,$seq2);
print $seq2,"\n";
__END__
__C__
void add_matchchars(char *seq1, char *seq2) {
int seq1char;
int seq2char;
while(seq1char = *seq1++ , seq2char = *seq2++) {
if (seq1char == seq2char) {
*seq2--;
if (seq1char != '-') {
*seq2 = '.';
}
*seq2++;
}
//printf("%c-%c\n",seq1char,seq2char);
}
// printf("%s\n%s\n",seq1,seq2);
}
但是1)是我合理高效(有更聰明的人/更好的方法)? 2)會泄漏內存嗎?
'Inline_Stack_ *'是一種訪問變長參數列表的方法,與內存泄漏無關 – ikegami
Inline_Stack _....是可以用來代替傳遞參數時通常使用的更低級宏的宏使用Perl XS在調用堆棧中來回訪問它們非常方便如果您訪問參數調用堆棧,通常要麼使用這些宏,要麼使用這些宏更低級別的XS宏集。 – DavidO