0

私は C++ プログラミングにかなり慣れていないので、現在のプロジェクトのどこが間違っているのか理解できません。前処理された値で埋めたい uint32_t の大きな配列があります。最初の計算では問題ありませんが、2 番目の計算からは *processed ポインターのメモリ アドレスのみが変化し、その値は変化しません。

uint32_t *candPreprocessed = (uint32_t*) malloc(sizeof(uint32_t) * indices.size());
for(int j = 0; j < indices.size()-1; j++)
{
    char *candidate = (char*) malloc(sizeof(char) * (indices[j+1] - indices[j]) + 1);

    ... 

    uint32_t *processed = preprocess((uint8_t*) candidate, len);
    memcpy(candPreprocessed + j * sizeof(uint32_t), processed, sizeof(uint32_t));
    processed = NULL;

    // free the messages
    free(candidate);
    free(processed);
}

前処理は次のようになります。

uint32_t* preprocess(uint8_t *word, size_t wordLength)
{
    uint8_t *toProcess = (uint8_t*) calloc(120, 1);

     ...

    return (uint32_t*) (toProcess);
}

私の理解では、 free(processed) 呼び出しは、前処理中に作成されたポインターによって占有されていたメモリを解放する必要があります。次のループの反復では、新しい候補がフェッチされ、新しい長さが計算されるため、引数が変更されます。何が足りないのですか?なぜこれが出力に反映されないのですか?

誰かが私を正しい方向に向けることができますか? 前もって感謝します!

編集: 要求に応じて、短い自己完結型のコンパイル例 -

#include <iostream>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

uint32_t* preprocess(uint8_t *word, size_t wordLength)
{
    // preprocessing
    uint8_t *toProcess = (uint8_t*) calloc(120, 1);
    memcpy(toProcess, word, wordLength);
    toProcess[wordLength] = 128;
    int numBits = 8 * wordLength;
    memcpy(toProcess + 56, &numBits, 1);
    return (uint32_t*) (toProcess);
}


int main(int argc, char* argv[])
{
    char cand[12] = {'1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c'};
int indices[4] = {0,4,8,12};
for(int j = 0; j < 3; j++)
{
    // extract the message from the wordlist
    char *candidate = (char*) malloc(sizeof(char) * (4) + 1);
    int i=0;
    for(int k = indices[j]; k < indices[j+1]; k++)
        candidate[i++] = cand[k];
    candidate[i] = '\0';
    size_t len = strlen(candidate);

    uint32_t *processed = preprocess((uint8_t*) candidate, len);

    std::cout << processed << std::endl;

    // free the messages
    free(candidate);
    free(processed);
}

return 0;
}

これにより 3 つの出力が生成され、そのうちの 2 つは同じです。

4

2 に答える 2

0

問題の説明はまだかなりあいまいなので (たくさんのコメントにもかかわらず)、私は少し推測しています:

memcpy(candPreprocessed + j * sizeof(uint32_t), processed, sizeof(uint32_t));

私には間違っているように見えます。candPreprocessedへのポインタuint32_tです。candPreprocessed実際には、4 エントリごとにデータを配列に移動したくないのではないかと思います。

試す:

memcpy(candPreprocessed + j, processed, sizeof(uint32_t));
于 2013-03-22T19:19:03.523 に答える
0

この行は、1 回の反復の結果をより大きなバッファーに追加しているように見えます。

 memcpy(candPreprocessed + j * sizeof(uint32_t), processed, sizeof(uint32_t));

ただし、4 バイト (単一のuint32_t) しかコピーしません。それが問題かもしれません。

それ問題であり、それを修正した場合、次の問題は、宛先バッファーがすべての結果を取得するのに十分な大きさではないことです。

あなたは C++ プログラミングについて言及していますが、実際に C++ を使ってみると、これはずっと簡単であることがわかるでしょう! std::vector大いに役立ちます。

于 2013-03-22T19:14:16.873 に答える