0

ヘルプを受け取ったばかりのコードについて少し助けが必要です。基本的に、このコードは Java で書かれていますが、C でも動作できるようにする必要があります。私はすでにコードをテストしており、正常に動作します。基本的にバイナリ文字列を話し、それをバイト配列に配置し、各場所に 8 文字 (1 と 0) を保持します。私は決して変わらないいくつかの変数を知っており、それらを以下にリストしました:

Byte.SIZE は常に 8 です

sLen は常に 64 です

len は常に 8 です

Javaコードと変換を試みる試みを含めました。ただし、私のコードには一貫して実行時エラーやその他の構文の問題があります。誰かが私の問題を見つけることができるかどうか疑問に思っていました:

Java コード

static byte[] fromBinary(String s) {
    int sLen = s.length(), len = sLen / Byte.SIZE;
    if (sLen % Byte.SIZE != 0) {
        len++;
    }
    byte[] toReturn = new byte[len];
    for (int i = 0; i < sLen; i++) {
        if (s.charAt(i) == '1') {
            toReturn[i / Byte.SIZE] = (byte) (toReturn[i / Byte.SIZE] | (0x80 >>> (i % Byte.SIZE)));
        }
    }

    return toReturn;
}

Cコード

char fromBinary [] (String s) {
    int sLen =64;
    int len=8;
    int i=0;
    char toReturn [8];
    char str [64]=s;

    for (i = 0; i < sLen; i++) {
        if (str[i] == '1') {
            toReturn[i/8] = (char)(toReturn[i/8] | (0x80 >>> (i%8)));
        }
    }

    return toReturn;
}

申し訳ありませんが、私は C に比較的慣れていません。数年間 Java でプログラミングを行っているため、C のエラーや構文に慣れていません。プログラミング環境として Dynamic C を使用しているため、エラー メッセージが表示される場合があります。異なる。次のメインを使用してプログラムを実行しました。

void main()  {
char bytes [8];
string s ="1010110011011110010010000010001101000101011001111010101111001101";
bytes=fromBinary(s);
 for (j=0;j<8;j++){
    printf("%d",toReturn[j]);
    printf(", ");
    }
}

次のエラーのため、プログラムを実行できませんでした:

1 行目 : ERROR UNTITLED2.C : cofunctions のみインデックスできます。
1 行目 : ERROR UNTITLED2.C : 古いスタイルの関数宣言にパラメーター宣言リストがありません。行 1: ERROR UNTITLED2.C: ',' が見つからないか、予期されます。
行 6: ERROR UNTITLED2.C: 定数式が必要です。
10行目 : ERROR UNTITLED2.C : 無効な式です。
行 10: ERROR UNTITLED2.C: 文字「;」がありません。
行 10: ERROR UNTITLED2.C: 文字「;」がありません。
行 10: ERROR UNTITLED2.C: 文字「)」がありません。
行 10: ERROR UNTITLED2.C: 文字「)」がありません。
10行目 : ERROR UNTITLED2.C : 無効な式です。
10 行目 : WARNING UNTITLED2.C : 互換性のないポインター型への変換 19 行目 : WARNING UNTITLED2.C : 型の不一致: 互換性のない型 char[] と unsigned int が式で使用されています。10 エラーに達しました。さらなるエラーが抑制されました。

何が間違っているのかわかりません。どんな洞察も高く評価されます。すべての混乱について申し訳ありません。

最新のアップデート

unsigned char *fromBinary(const char * const s) {
static unsigned char toReturn[8]={0};
size_t i,j;
const size_t len=8;
 for(i=0;i<len;i++)        {
    for(j=0;j<8;j++)
       toReturn[i]|=(s[i*8+j]=='1' ? 1<<(7-j) : 0);
    }
return toReturn;
 }

 void main()  {
 unsigned char bytes [8];
 string s ="1010110011011110010010000010001101000101011001111010101111001101";
 fromBinary(s)
 for (j=0;j<8;j++){
    printf("%d",toReturn[j]);
     printf(", ");
    }
}

私に次のエラーを与えました:

行 1 : ERROR UNTITLED3.C : キーワード 'const' は、グローバルおよび静的ローカルでのみ使用できます。4 行目 : ERROR UNTITLED3.C : 読み取り専用変数への代入は許可されていません。行 4 : ERROR UNTITLED3.C : キーワード 'const' は、グローバルおよび静的ローカルでのみ使用できます。7 行目 : WARNING UNTITLED3.C : 互換性のないポインター型への変換 7 行目 : WARNING UNTITLED3.C : 互換性のないポインター型への変換 7 行目 : WARNING UNTITLED3.C : 互換性のないポインター型への変換 15 行目 : WARNING UNTITLED3.C : 型の不一致:互換性のない型 char[] と unsigned int が式で使用されています。行 15: ERROR UNTITLED3.C: 無効な式 - 左辺値が必要です。
行 15: ERROR UNTITLED3.C: s はスコープ外/宣言されていません。
行 15: ERROR UNTITLED3.C: 文字がありません ';
行 15: ERROR UNTITLED3.C: 文字列が範囲外/宣言されていません。16 行目 : WARNING UNTITLED3.C : 互換性のないポインター型への変換 16 行目 : WARNING UNTITLED3.C : パラメーター 1 の型が間違っています

16 行目: ERROR UNTITLED3.C : DynamicC は配列の代入をサポートしていません。行 16: ERROR UNTITLED3.C: 無効な式 - 左辺値が必要です。

4

2 に答える 2

2

見た目だけでは、C コードはひどく爆発することになります (たとえ構文的に有効であったとしても、そうではありません)。toReturnスタックに割り当てられているものを返しているため、関数が返された瞬間に範囲外になります。これにより、ほぼ確実にセグメンテーション違反などが発生します。Java を翻訳しようとする代わりに、ゼロから C で記述してみませんか。

unsigned char *fromBinary(const char * const s)
{
   static unsigned char toReturn[8]={0};
   size_t i,j;
   const size_t len=8;

   for(i=0;i<len;i++)
       {
       toReturn[i]=0;
       for(j=0;j<8;j++)
          toReturn[i]|=(s[i*8+j]=='1' ? 1<<(7-j) : 0);
       }
   return toReturn;
}

返される配列は、a) 符号なし (符号拡張を避けるため) であり、b) 関数の外に出ないように静的に割り当てられていることに注意してください。

更新: これは、上記の関数の完全なテスト ハーネスです。

#include <stdio.h>

unsigned char *fromBinary(const char * const s);

int main(void)
{
   const char *const s="0010100100110101001101101101111010110010000001011101001001001001";
   unsigned char *b;
   b=fromBinary(s);
   printf("%02X %02X %02X %02X %02X %02X %02X %02X\n",b[0],b[1],b[2],b[3],b[4],b[5],b[6],b[7]);
   return 0;
}

unsigned char *fromBinary(const char * const s)
{
(as above)
}

これは、gcc を使用してエラーや警告なしでコンパイルされます。返します29 35 36 DE B2 05 D2 49。あなたのコードでは、a) ヘッダー ファイルを宣言していません。b) プロトタイプを作成していませんfromBinary()。c) 関数で宣言も代入もtoReturnしていませんmain()。また、戻り値の型で宣言main()しないでください。void上記のコードでエラーが発生する場合は、実際の C コンパイラを使用していないか、壊れています。C プログラミング言語の基本的な本を読むか、再読することをお勧めします。Kelley と Pohl の 'A Book on C' は良いスタートです。

于 2012-07-17T20:44:17.673 に答える
0

私は修正しました、これを試してください:

#include <stdio.h>

typedef char* string;

unsigned char* fromBinary(const char * const s) {
    static unsigned char toReturn[8]={0};
    size_t i,j;
    const size_t len=8;
    for(i=0;i<len;i++){
        for(j=0;j<8;j++)
            toReturn[i]|=(s[i*8+j]=='1' ? 1<<(7-j) : 0);
    }
    return toReturn;
 }

int main()  {
    unsigned char (*bytes)[8];
    string s ="1010110011011110010010000010001101000101011001111010101111001101";
    int j;

    bytes=(unsigned char (*)[8])fromBinary(s);
    for (j=0;j<8;j++){
        //printf("%02X",(*bytes)[j]);
        printf("%d",(*bytes)[j]);
        printf(", ");
    }
}
于 2012-07-18T00:38:49.610 に答える