Moje pytanie dotyczy działającego kodu C w linii: czy konieczne jest korzystanie z funkcji stosu inline (Inline_Stack_Vars) do przekazywania zmiennych do i na zewnątrz, czy może w tym kontekście wystarczy zmodyfikować zmienną w miejscu?Perl Inline :: C: Są Inline_Stack_Vars itp. Potrzebne, aby uniknąć wycieków pamięci (dopasowanie sekwencji elementów)
Do wyświetlania danych o sekwencji biologicznej, muszę pokazać tylko różnice między dwoma wyrównanymi ciągami; na przykład Biorąc pod uwagę te dwa ciągi:..
ATCAGAAA--GACATGGGCCAAAGATTAA-CAGTGGCCATTGACAGGA--
--CCCCAACTGACAGGGGGCAAAGATTAA-CAGTGGCCATTG---GGA--
chcę dostać to (Dopasowanie znaków w drugim ciągiem zastąpione”'S
--.CCC..CT....G...G..........-............---...--
Mam wiele sekwencji (miliony Illumina czyta), więc zwrócili się do inline :: c do dopasowywania znaków Poniższy kod wplatany wydaje się działać dobrze (zmiana drugi argument do funkcji add_matchchars w miejscu).
#!/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);
}
Ale 1) to ja t racjonalnie wydajne (czy istnieje mądrzejszy/lepszy sposób)? i 2) czy spowoduje wyciek pamięci?
'Inline_Stack_ *' jest sposobem dostępu do list argumentów o zmiennej długości.Nie ma nic wspólnego z wyciekami pamięci – ikegami
Inline_Stack _.... są makrami, które mogą być użyte w miejsce makr nawet niższego poziomu normalnie używanych przy przekazywaniu parametrów tam iz powrotem na stosie wywołań przy użyciu Perla XS, są wygodniejsze. Jeśli korzystasz ze stosu wywołań parametrów, zazwyczaj używasz tych makr lub niższy poziom XS zestaw makr. – DavidO