2012-02-24 7 views
-1

IRリモートメッセージを作成するために、符号なしint配列を作成する必要があります。これを行うには、ヘッダーをデータビットに連結しなければなりません。どのキーを模倣するかによって異なります。 は、ここで私が持っているものだと問題:Cの符号なしint配列のコピー

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

const unsigned HEADER[34] = {4608, 4398, 655, 1588, 655, 1588, 655, 1588, 655, 472, 655, 472, 655, 472, 655, 472, 655, 472, 655, 1588, 655, 1588, 655, 1588, 655, 472, 655, 472, 655, 472, 655, 472, 655, 472}; 

unsigned short BTN_VOL_UP = 0xE01F; 

void intToBin(unsigned short a, char* buffer) { 
    buffer += 15; 
    int i = 15; 
    for (i; i >= 0; i--) { 
     *buffer-- = (a & 1) + '0'; 
     a >>= 1; 
    } 
} 

void hexToData(unsigned** data, int code) { 
    char* strHex = (char*) malloc(16 * sizeof(char)); 
    intToBin(code, strHex); 
    int i = 0; 
    for(i; i < 16; i++) { 
    char c = strHex[i]; 
    *(*data)++ = 655; 
    if (c == '1') { 
     *(*data)++ = 1588; 
    } else { 
     *(*data)++ = 472; 
    } 
    } 
    (*data) -= 32; 
} 

void getCode(unsigned** data, short code) { 
    int i = 0; 
    for (i; i < 34; i++) { 
    *(*data)++ = HEADER[i]; 
    } 
    unsigned* bits = (unsigned*) malloc(32 * sizeof(unsigned)); 
    hexToData(&bits, code); 
    i = 0; 
    for (i; i < 32; i++) { 
    *(*data)++ = bits[i]; 
    } 
    *(*data)++ = 647; 
    *(*data)++ = 0; 
    (*data) -= 68; 
} 

そして、ここでは、このすべてを呼び出すコードです:その後

unsigned* data = (unsigned*) calloc(68, sizeof(unsigned)); 
getCode(&data, BTN_VOL_UP); 

を、私は(それぞれの値を印刷するために使用して)ヘッダを印刷し、データ変数は、それは私が得るものです:

4608 4398 655 1588 655 1588 655 1588 655 472 655 472 655 472 655 472 655 472 655 1588 655 1588 655 1588 655 472 655 472 655 472 655 472 655 472

0 136 1588 655 1588 655 1588 655 472 655 472 655 472 655 472 655 55298 36609 55298 36609 55298 36609 55298 36609 55298 36609 55298 36609 55298 36609 55298 36609 655 655 1588 655 1588 655 1588 655 472 655 472 655 472 655 472 655 472 655 472 655 472 655 472 655 1588 655 1588 655 1588 655 1588 655 1588 647 0 16

HEADERは正しいですが、データが完全に間違っています:データのヘッダーは完全に間違っています。実際のデータ部分(VOL_UPコード)は正しいですが、最後に余計な値はありません。そこに:16.配列は... 647、0}で終わるはずです。

コードに問題がありますか?

編集:私はこの問題を発見し、修正を含むコードを編集しました。 値をコピーする正確な場所を見つけるのに問題があることがわかったので、intでintを手動でコピーし、最後にポインタを減算することにしました。醜いですが、それは動作します。

+1

ここで尋ねる代わりに、それをデバッグするだけの理由はありませんか? –

+0

私はArduinoでこれをやっているので、簡単にデバッグできるとは思いません。 –

+2

WindowsやLinuxでデバッグすることもできますが、デバイス依存のプログラムではありません。 –

答えて

2

あなたのコードは、次の生成...

4608 4398 655 1588 655 1588 655 1588 655 472 655 472 655 472 655 472 655 472 655 1588 655 1588 655 1588 655 472 655 472 655 472 655 472 655 472 1588 1588 1588 655 655 655 655 655 655 655 655 1588 1588 1588 1588 1588 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 647 0 

はヘッダがOKであるようです。私はキー生成のアルゴリズムを知らないので、34-49の値が大丈夫かどうかはわかりませんが、50-65の範囲で問題があることは間違いありません。あなたのコードは決してそれらをどんな値にも設定しません。通常、mallocはメモリを初期化しません(これは標準ライブラリの実装に依存します)ので、50-65でごみを取得します。

+0

ありがとう、私はここでこれらの結果を得ていませんでしたが、mallocが何かを不安定化させていないことを思い出したので、私はcallocに切り替えて問題を発見しました。私はここで書いたコードと何が比較されているのか正確にはわかりません。 –

関連する問題