2

XCODE4.3.1とARCを使用して生体分子の軌道を処理するObjective-Cプログラムを作成しています。PDBファイルを読み取る必要があります。つまり、大量のテキスト形式のデータを解析する必要があります。私はNSStringの非効率性に非常に失望しており、componentsSeparatedByString:と同等のCを書き込もうとしていました。アルゴリズムはNSStringとNSMutableArraysで問題なく動作しますが、char*とchar**を使用するのに苦労しています。

残念ながら、EXC_BAD_ACCESSエラーが発生します。奇妙なことに、i=68103とj=68049のエラーが発生します(これらの番号はベルを鳴らしますか?)。これは、クラッシュする前にしばらくの間機能したことを意味します。エラーは「静的」です(常に同じ(i、j)番号でブロックします)。配列は正常に機能しているようです(クラッシュする前の値のNSLog)。

どうやら、私はCコードとポインターの背後にある微妙な点についてはあまり経験がありませんが、それを機能させるための提案を聞いて間違いなく嬉しいです!ありがとう !

ここにコードがあります:

+(char**) componentsSeparedByNewLineCEQUIV:(const char*)aChar:(int*)numWord
{ // char* aChar : my file, is typically 3 millions characters
int j=-1; //Last non space character
int i; //Scanned character
int len=strlen(aChar);

char** stringArray=malloc((*numWord)*sizeof(char*));

for (i=0;i<len; i++)
{   if (aChar[i]==10)
    {
        if ( j!=-1)
        {   
            char* buffer2=malloc(i-j+1);
            strcpy(buffer2, strndup(aChar+j, i-j));
            stringArray[i]=malloc(sizeof(char)*strlen(buffer2)+1); //EXC_BAD_ACCESS HERE
            strcpy(stringArray[i], buffer2);
        }
        j=-1;
    }
    else if (j==-1)
    {j=i;}
}
if (j!=-1)
{   char* buffer2=malloc(i-j+1);
    strcpy(buffer2, strndup(aChar+j, i-j));
    stringArray[i]=malloc(strlen(buffer2)+1);
    strcpy(stringArray[i], buffer2);
}

return stringArray;
}
4

4 に答える 4

0

興味があるかもしれないすべての人のための更新:これは、コードの応答にまだ興味がありますが、便利なstrtokを使用した作業バージョンです。

このコードは、[astring componentsSeparatedByString:@ "\ n"]よりも5倍高速(125ms対581ms)でテストされています...

+(char**)componentsSeparatedByNewLine:(const char*)aChar:(int*)numWord
{

int i;
int j=0;
int len = strlen(aChar);
*numWord=1;
for (i=0;i<len; i++)
{
    if (aChar[i]==10) *numWord=*numWord+1;   //change 10 for any other character (ASCII for space)
}

char** stringArray=malloc((*numWord)*sizeof(char*));
char* pch;

char* aChar2=malloc(len+1);
strcpy(aChar2,aChar);

pch = strtok(aChar2,"\n");
while (pch != NULL)
{   
    stringArray[j]=(char*)malloc( (strlen(pch)+1)*sizeof(char));
    strcpy(stringArray[j], pch);
    //NSLog(@"%s",stringArray[j]);
    j=j+1;
    pch = strtok (NULL, "\n");
}
return stringArray;
}
于 2012-09-26T15:53:56.603 に答える
0

あなたはおそらくこの問題を抱えている最初の人ではありません:)

なぜstrtokを使用しないのですか?

PSどのような分析がNSStringがあなたの問題であったことを示しましたか?

于 2012-09-25T11:26:27.867 に答える
0

エラーが本来あるべき場所の上の行にある理由はわかりませんが、割り当てられていない文字列をコピーしています。
stringArray [i]は、buffer2にコピーするときに割り当てられません。割り当てます:

    if ( j!=-1)
    {   
        char* buffer2=malloc(i-j+1);
        strcpy(buffer2, strndup(aChar+j, i-j));
        stringArray[i]=malloc(sizeof(char)*strlen(buffer2)+1); //EXC_BAD_ACCESS HERE
        stringArray[i]=(char*)malloc( (strlen(buffer2)+1)*sizeof(char));  // Allocate the string
        strcpy(stringArray[i], buffer2);
    }
于 2012-09-25T11:36:26.663 に答える
0

まず、Imが完全に間違っているわけではないが、必要なメモリの少なくとも4倍のメモリを消費していると思う場合:

必要な文字mallocを作成するために使用し、取得するためにbuffer2も使用しています。あなたが望むことを正確に行いますが、1つのステップで。あなたの最初のステップでなければなりません。次の2行でさらに悪いことに、同じことをもう一度行うことが不可欠です。だから私はあなたが本当に欲しいのはだと思います。メモリの問題を確認するには:すべての関数は、メモリ割り当ての失敗を示すために使用します。strndupstrndupchar* buffer2 = strndup(aChar+j, i-j)stringArray[i] = strndup(aChar+j, i-j)errno

2番目:関数はコンポーネントの数を返さないため、stringArray知らないうちにゴミが含まれている可能性があります。

第三に:strlen高価であり、あなたはそれを必要とせず、ただ使うfor(int i = 0; aChar[i] != '\0'; i++)

于 2012-09-25T14:03:56.190 に答える