2010-06-30 23 views
6
int Sequence::scoreDegeneracy() 
{ 
    cout << "Score Degeneracy" << name << seqLen << endl; 
    int f = 0; 
    if (degenComputed == false) 
    { 
     char _2foldTest = '*'; 
     char _4foldTest = '*'; 
     int aaseqLen = seqLen/3; 
     int i = 0; 
     for (i; i < aaseqLen; i++) 

     { 
      _4foldTest = is4FoldDegenerateSite(i); 
      _2foldTest = is2FoldDegenerateSite(i,_4foldTest); 
      degScores.totalCodons++ 
       if (_2foldTest != '*') 
      { 
       degScores.totalCodons_2fold++; 
       if (_2foldTest == 'A') 
       { 
        degScores.total_2fold_A++; 
       } 
          else if (_2foldTest == 'T') 
       { 
        degScores.total_2fold_T++; 
       } 
          else if (_2foldTest == 'G') 
       { 
        degScores.total_2fold_G++; 
       } 
          else 
       { 
        degScores.total_2fold_C++; 
       } 
      }else if (_4foldTest != '*') 
      { 
       degScores.totalCodons_4fold++; 
       if (_4foldTest == 'A') 
       { 
        degScores.total_4fold_A++; 
       } 
          else if (_4foldTest == 'T') 
       { 
        degScores.total_4fold_T++; 
       } 
          else if (_4foldTest == 'C') 
       { 
        degScores.total_4fold_C++; 
       } 
          else 
       { 
        degScores.total_4fold_G++; 
       } 
      } 
      cout << "Crashes right here when i = 0." << endl;   
     } 
    } 
    degenComputed = true; 
    return 1; 
} 

¡Conduciéndome loco! SegFault ocurre justo al final de la primera iteración de for loop. Se comporta EXACTAMENTE como se suponía, la primera prueba arroja resultados correctos .. La falla de segmentación ocurre antes de que yo sea incrementado ...Error de segmentación: cómo.

¿Qué me estoy perdiendo?

...

char Sequence::is4FoldDegenerateSite(int codonIndex){ 
char aminoAcid = aaSeq[codonIndex]; 
//cout << "Amino acid of codon number " << codonIndex << " is: " << aminoAcid << endl; 
int loc = readingFrame + (codonIndex * 3) + 2; 
int locR = loc - 2; 
switch (aminoAcid){ 
    case 'A': 
    return seq[loc]; 
    case 'T': 
    return seq[loc]; 
    case 'V': 
    return seq[loc];  
    case 'G': 
    return seq[loc]; 
    case 'P': 
    return seq[loc]; 
    case 'S'://Can also be 2 fold degenerate 
    if (seq[locR] == 'T'){ 
    return seq[loc]; 
    }else{ 
    return '*'; 
    }  
    case 'R'://Can also be 2 fold degenerate 
    if (seq[locR] == 'C'){ 
    return seq[loc]; 
    }else{ 
    return '*'; 
    } 
    case 'L'://Can also be 2 fold degenerate 
    if (seq[locR] == 'C'){ 
    return seq[loc]; 
    }else{ 
    return '*'; 
    } 
} 
return '*'; 
} 
char Sequence::is2FoldDegenerateSite(int codonIndex, char _4FoldResults){ 
char aminoAcid = aaSeq[codonIndex]; 
int loc = readingFrame + (codonIndex * 3) + 2; 
//char doubleDegeneracyTest = is4FoldDegenerateSite(codonIndex); 
//bool doubleDegeneracy = false; 
//if (doubleDegeneracyTest != '*') doubleDegeneracy = true; 
switch (aminoAcid){ 
    case 'N': 
    return seq[loc]; 
    case 'D': 
    return seq[loc]; 
    case 'C': 
    return seq[loc];  
    case 'Q': 
    return seq[loc]; 
    case 'E': 
    return seq[loc]; 
    case 'H': 
    return seq[loc]; 
    case 'K': 
    return seq[loc]; 
    case 'F': 
    return seq[loc]; 
    case 'Y': 
    return seq[loc]; 
    case 'X': 
    return seq[loc]; 
    case 'S'://Can also be 2 fold degenerate 
    if (_4FoldResults == '*'){ 
    return seq[loc]; 
    }else{ 
    return '*'; 
    }  
    case 'R'://Can also be 2 fold degenerate 
    if (_4FoldResults == '*'){ 
    return seq[loc]; 
    }else{ 
    return '*'; 
    } 
    case 'L'://Can also be 2 fold degenerate 
    if (_4FoldResults == '*'){ 
    return seq[loc]; 
    }else{ 
    return '*'; 
    } 
} 
return '*'; 
} 

Valgrind Resultados:

**17043** new/new[] failed and should throw an exception, but Valgrind 
==17043== at 0x4024E35: VALGRIND_PRINTF_BACKTRACE (valgrind.h:3720) 
==17043== by 0x40253C2: operator new(unsigned int) (vg_replace_malloc.c:214) 
==17043== by 0x40D6435: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x40D70A7: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned int) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x40D7EDC: std::string::reserve(unsigned int) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x40D83AF: std::string::append(std::string const&) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x804BA7F: std::basic_string<char, std::char_traits<char>, std::allocator<char> > std::operator+<char, std::char_traits<char>, std::allocator<char> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (basic_string.h:2168) 
==17043== by 0x804ACDF: GenomeSeq::setup() (GenomeSeq.C:108) 
==17043== by 0x804A4FE: GenomeSeq::GenomeSeq(std::string, std::string) (GenomeSeq.C:52) 
==17043== by 0x80496DF: main (Main2.C:143) 
**17043** cannot throw exceptions and so is aborting instead. Sorry. 
==17043== at 0x4024E35: VALGRIND_PRINTF_BACKTRACE (valgrind.h:3720) 
==17043== by 0x40253D0: operator new(unsigned int) (vg_replace_malloc.c:214) 
==17043== by 0x40D6435: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x40D70A7: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned int) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x40D7EDC: std::string::reserve(unsigned int) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x40D83AF: std::string::append(std::string const&) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x804BA7F: std::basic_string<char, std::char_traits<char>, std::allocator<char> > std::operator+<char, std::char_traits<char>, std::allocator<char> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (basic_string.h:2168) 
==17043== by 0x804ACDF: GenomeSeq::setup() (GenomeSeq.C:108) 
==17043== by 0x804A4FE: GenomeSeq::GenomeSeq(std::string, std::string) (GenomeSeq.C:52) 
==17043== by 0x80496DF: main (Main2.C:143) 
Loading sequence..==17043== 
==17043== HEAP SUMMARY: 
==17043==  in use at exit: 2,749,679 bytes in 10 blocks 
==17043== total heap usage: 39,043 allocs, 39,032 frees, 80,022,672,644 bytes allocated 
==17043== 
==17043== 27 bytes in 1 blocks are definitely lost in loss record 1 of 10 
==17043== at 0x4025390: operator new(unsigned int) (vg_replace_malloc.c:214) 
==17043== by 0x40D6435: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x40D7340: ??? (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x40D7525: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x804969E: main (Main2.C:143) 
==17043== 
==17043== 28 bytes in 1 blocks are definitely lost in loss record 2 of 10 
==17043== at 0x4025390: operator new(unsigned int) (vg_replace_malloc.c:214) 
==17043== by 0x40D6435: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x40D7340: ??? (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x40D7525: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x80496C3: main (Main2.C:143) 
==17043== 
==17043== 83 bytes in 1 blocks are definitely lost in loss record 3 of 10 
==17043== at 0x4025390: operator new(unsigned int) (vg_replace_malloc.c:214) 
==17043== by 0x40D6435: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x40D70A7: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned int) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x40D7EDC: std::string::reserve(unsigned int) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x40D814A: std::string::append(char const*, unsigned int) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x40B3F3E: std::basic_istream<char, std::char_traits<char> >& std::getline<char, std::char_traits<char>, std::allocator<char> >(std::basic_istream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, char) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x40C9799: std::basic_istream<char, std::char_traits<char> >& std::getline<char, std::char_traits<char>, std::allocator<char> >(std::basic_istream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x804ACB5: GenomeSeq::setup() (GenomeSeq.C:106) 
==17043== by 0x804A4FE: GenomeSeq::GenomeSeq(std::string, std::string) (GenomeSeq.C:52) 
==17043== by 0x80496DF: main (Main2.C:143) 
==17043== 
==17043== 100 bytes in 1 blocks are definitely lost in loss record 4 of 10 
==17043== at 0x4025390: operator new(unsigned int) (vg_replace_malloc.c:214) 
==17043== by 0x40D6435: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x40D70A7: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned int) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x40D7EDC: std::string::reserve(unsigned int) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x40D814A: std::string::append(char const*, unsigned int) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x40B3F3E: std::basic_istream<char, std::char_traits<char> >& std::getline<char, std::char_traits<char>, std::allocator<char> >(std::basic_istream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, char) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x40C9799: std::basic_istream<char, std::char_traits<char> >& std::getline<char, std::char_traits<char>, std::allocator<char> >(std::basic_istream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x804AC07: GenomeSeq::setup() (GenomeSeq.C:101) 
==17043== by 0x804A4FE: GenomeSeq::GenomeSeq(std::string, std::string) (GenomeSeq.C:52) 
==17043== by 0x80496DF: main (Main2.C:143) 
==17043== 
==17043== 100 bytes in 1 blocks are definitely lost in loss record 5 of 10 
==17043== at 0x4025390: operator new(unsigned int) (vg_replace_malloc.c:214) 
==17043== by 0x40D6435: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x40D7340: ??? (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x40D75D1: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x40D33C5: std::basic_istringstream<char, std::char_traits<char>, std::allocator<char> >::basic_istringstream(std::string const&, std::_Ios_Openmode) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x804AC42: GenomeSeq::setup() (GenomeSeq.C:103) 
==17043== by 0x804A4FE: GenomeSeq::GenomeSeq(std::string, std::string) (GenomeSeq.C:52) 
==17043== by 0x80496DF: main (Main2.C:143) 
==17043== 
==17043== 8,192 bytes in 1 blocks are definitely lost in loss record 8 of 10 
==17043== at 0x4025024: operator new[](unsigned int) (vg_replace_malloc.c:258) 
==17043== by 0x40A2592: std::basic_filebuf<char, std::char_traits<char> >::_M_allocate_internal_buffer() (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x40A65B1: std::basic_filebuf<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x40A7EAF: std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(char const*, std::_Ios_Openmode) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x804ABBF: GenomeSeq::setup() (GenomeSeq.C:97) 
==17043== by 0x804A4FE: GenomeSeq::GenomeSeq(std::string, std::string) (GenomeSeq.C:52) 
==17043== by 0x80496DF: main (Main2.C:143) 
==17043== 
==17043== 8,192 bytes in 1 blocks are definitely lost in loss record 9 of 10 
==17043== at 0x4025024: operator new[](unsigned int) (vg_replace_malloc.c:258) 
==17043== by 0x40A2592: std::basic_filebuf<char, std::char_traits<char> >::_M_allocate_internal_buffer() (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x40A65B1: std::basic_filebuf<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x40A7EAF: std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(char const*, std::_Ios_Openmode) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x804AC9D: GenomeSeq::setup() (GenomeSeq.C:105) 
==17043== by 0x804A4FE: GenomeSeq::GenomeSeq(std::string, std::string) (GenomeSeq.C:52) 
==17043== by 0x80496DF: main (Main2.C:143) 
==17043== 
==17043== 2,732,253 bytes in 1 blocks are definitely lost in loss record 10 of 10 
==17043== at 0x4025390: operator new(unsigned int) (vg_replace_malloc.c:214) 
==17043== by 0x40D6435: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x40D70A7: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned int) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x40D7EDC: std::string::reserve(unsigned int) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x40D83AF: std::string::append(std::string const&) (in /usr/lib/libstdc++.so.6.0.13) 
==17043== by 0x804BA7F: std::basic_string<char, std::char_traits<char>, std::allocator<char> > std::operator+<char, std::char_traits<char>, std::allocator<char> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (basic_string.h:2168) 
==17043== by 0x804ACDF: GenomeSeq::setup() (GenomeSeq.C:108) 
==17043== by 0x804A4FE: GenomeSeq::GenomeSeq(std::string, std::string) (GenomeSeq.C:52) 
==17043== by 0x80496DF: main (Main2.C:143) 
==17043== 
==17043== LEAK SUMMARY: 
==17043== definitely lost: 2,748,975 bytes in 8 blocks 
==17043== indirectly lost: 0 bytes in 0 blocks 
==17043==  possibly lost: 0 bytes in 0 blocks 
==17043== still reachable: 704 bytes in 2 blocks 
==17043==   suppressed: 0 bytes in 0 blocks 
==17043== Reachable blocks (those to which a pointer was found) are not shown. 
==17043== To see them, rerun with: --leak-check=full --show-reachable=yes 
==17043== 
==17043== For counts of detected and suppressed errors, rerun with: -v 
==17043== ERROR SUMMARY: 8 errors from 8 contexts (suppressed: 19 from 8) 

Sequence.h:

#ifndef SEQUENCE_H 
#define SEQUENCE_H 
using namespace std; 
#include <iostream> 
#include <fstream> 
#include <cstring> 
#include <sstream> 
#include <string> 
class GeneSeqs; 
class Sequence{ 
    public: 
     Sequence(); 
     Sequence(char * seqStart,char * aaSeqStart, int length);//Constructor 
     ~Sequence();//Destructor -- for the transprof 
     //void setup();//Setups up variables. 
     char &operator[](int); 
     char * getSeq(){return seq;}//returns the address of sequence 
     string getAASeq(){return aaSeq;}//returns address of aaSeq 
     int getLength(){return seqLen;} 
     bool isPositive(){return positiveStrand;} 
     /** 
     * Setters 
     */ 
     void setRevC(char * sequ){revC = sequ;} 
     void setSeq(char * sequ){ 
      seq = sequ; 
     } 
     void setAASeq(char * a){aaSeq = a;} 
     void setLength(int len){seqLen = len;} 
     void setAALength(int len){aaSeqLen = len;} 
     void setPositivity(bool trufal){ 
      positiveStrand = trufal; 
      if (trufal == false){ 
       buildRevC(); 
      } 
     } 
     // 
     int getTCount(){return count.T;} 
     int getACount(){return count.A;} 
     int getCCount(){return count.C;} 
     int getGCount(){return count.G;} 
     //void setAASeq(int * a){aaSeq = a;} 
     string get_aaSeq(){return aaSeq;} 
     bool get_aaSeqExhists(){return aaSeqTranslated;} 
     int get_aaSeqLen(){return aaSeqLen;} 
     void print(); 
     void printAA(); 
     char getAA(int i){return aaSeq[i];} 
     int getAALoc(char aa){return AAchar2num(aa);} 
     float getMIMScore(){return MIMScore;} 
     void setMIM(float MIM){MIMScore = MIM;} 
     void translateToAA(int code); 
     void computeCrudeCompositions(); 
     int scoreDegeneracy(); 
     void degeneracyReport(); 
     void setName(string n){name = n;} 
     float distanceMeasure(Sequence * target); 
     bool degeneracyIsScored(){return degenComputed;} 
     float distanceMeasure(GeneSeqs * target); 
     float distanceMeasureA(GeneSeqs * target, int point, float runningSum); 
     int getDegenData(int code); 
     void setStartConstant(int i){start = i;} 
     void printInfo(); 
    private: 
     struct nucleotideCounts{ 
      int T; 
      int C; 
      int A; 
      int G;  
     }count; 
     struct degeneracyScores{ 
      int totalCodons; 
      int totalCodons_4fold; 
      int totalCodons_2fold; 
      int total_4fold_A; 
      int total_4fold_T; 
      int total_4fold_C; 
      int total_4fold_G; 
      int total_2fold_A; 
      int total_2fold_T; 
      int total_2fold_G; 
      int total_2fold_C;   
     }degScores; 
     string name; 
     char is4FoldDegenerateSite(int codonIndex); 
     char is2FoldDegenerateSite(int codonIndex, char _4FoldResults); 
     bool degenComputed; 
     float MIMScore; 
     void buildRevC(); 
     string revC; 
     char nucleoRevC(char c); 
     char * seq; 
     int readingFrame;//zero till used... 
     int aaSeqLen; 
     bool aaSeqTranslated; 
     int start; 
     int seqLen; //Number of nucleotides in sequence 
     bool positiveStrand; //Positive strand = true, negative = false; 
     //bool hasY; 
     //Genetic sequence in numerical Amino Acide representation; 
     string aaSeq; 
     void geneSegments2AASeq(); 
     void computeAATransProf(); 
     int AAchar2num(char x); 
     char AAnum2char(int x); 
     char codon2AA(int codonIndex); 
     char codon2AA(char * codon); 
     char codon2AA(int * codon); 
     int Int(string num);  
     int Int(char num); 
     char num2nucleo(int a); 
     void codonSeq2AASeq(); 
     int char2nucleo2(char a); 
     string String(int num);  
}; 
#endif 
+2

¿Puede utilizar una sangría más grande? Esto es difícil de leer. –

+3

Algunas notas sobre su código: 1. No use guiones bajos como los primeros caracteres en un identificador. 2. Intente usar una instrucción 'switch' en lugar de la escala' if-else if-else'. –

+3

Ese código es el tipo de cosa que me provoca ardor de estómago. Sería más fácil si reduce un poco la [complejidad ciclomática] (http://en.wikipedia.org/wiki/Cyclomatic_complexity). –

Respuesta

5
total heap usage: 39,043 allocs, 39,032 frees, 80,022,672,644 bytes allocated 

80GB ?? Creo que tienes una fuga de memoria en algún lugar ...

Yo votaría por la forma en que manejas "seq" como un char *, en lugar de usar std: string en otros lugares. Parece un accidente esperando a suceder.

4

¿Está usted en una máquina Linux o Unix? Si es así, Valgrind es una gran herramienta para resolver este tipo de problemas.

+0

valgrind resultados agregados a la publicación principal. – DSing

4

De cualquier is4FoldDegenerateSite o is2FoldDegenerateSite está corrompiendo su pila, entonces cuando el programa intenta expandirse de nuevo al comienzo de la para, la pila está apagado para que la rama de mala memoria.

Observe esas dos funciones y asegúrese de que están limpiando su memoria correctamente. ¿Tiene código de cualquiera de esas funciones que podría publicar?

EDITAR: Sobrecarga el operador []. Tal vez ese es un buen lugar para mirar? El código es bastante complejo para que los desconocidos depuren de forma remota.

+0

Lo siento, me acabo de quedar sin ... bueno, todo. Esta falla de segmentación me ha detenido por 3 días. – DSing

1

Comience a eliminar elementos pieza por pieza (los comentarios de bloque son útiles) para descubrir qué afecta a su bloqueo. La corrección es irrelevante en esta técnica de solución de problemas. Si eliminar algo lo soluciona, probablemente estés viendo algo sistémico.

La triste realidad es que su problema no es local en el sitio del accidente, por lo que no basta con enviar los fragmentos del sitio del accidente para que descubramos su error.

+0

¡Yay! 10k representante! :) –

1

Tengo serias dudas sobre la forma en que se maneja la variable seq en la clase de Secuencia. Por ahora, sugeriría que usted agregue

bool Sequence::isValid (int loc){ 
    if ((seq != NULL) && (loc < strlen(seq))) { return true; } // optimize it later 
    else { return false; } 
} 

y actualizar is4FoldDegenerateSite() & & is2FoldDegenerateSite() con el siguiente,

int loc = readingFrame + (codonIndex * 3) + 2; 
int locR = loc - 2; 

if (isValid(loc) == false) return '*'; 
// also validate locR before using it. 

En mi opinión también se debe añadir un poco de manejo de excepciones; actualizar setSeq (char * sequ) & setLength (int len) para lanzar excepciones en caso de entrada no válida.

hth

+0

Gracias por una muy buena sugerencia. Decidí simplemente eliminar todo el genoma con subsecuencias apuntando a sus respectivos comienzos y solo hacer un genoma y cada subsecuencia tiene su propia secuencia almacenada como una cadena. Más caro pero optimizaré más tarde. A partir de ahora, siempre y cuando tenga resultados de Tom, realmente no me importa. pero definitivamente retrocederé y trataré de ver si alguna parte del cálculo estaba operando fuera de límites y causando todo esto. – DSing

Cuestiones relacionadas