ページ 11

コンパイルエラー

Posted: 2010年11月15日(月) 23:22
by Axe
ファイル名: In function 'base64Encode': ファイル名:51: warning: pointer targets in passing argument 1 of 'strlen' differ in signedness ファイル名: In function 'main': ファイル名:372: warning: pointer targets in passing argument 1 of 'base64Encode' differ in signedness ファイル名:372: warning: pointer targets in assignment differ in signedness

↑このようなコンパイルエラーになります。

下記ソース。
unsigned char *base64Encode(unsigned char *source)
{
unsigned char *result = NULL;
unsigned char buf1,buf2,buf3;
unsigned char ind1,ind2,ind3,ind4;

int i,j;
int size;

size = sizeof(source[0]) * strlen(source);

result = calloc(sizeof(char),(size*2)+1);

for(i=0, j=0; i<size; i+=3, j+=4)
{
buf1 = (i < size - 0) ? *(source + i + 0) : '\0';
buf2 = (i < size - 1) ? *(source + i + 1) : '\0';
buf3 = (i < size - 2) ? *(source + i + 2) : '\0';

ind1 = (buf1 >> 2);// 2bit右シフト
ind2 = (buf1 & 0x03) << 4 | (buf2 >> 4);
ind3 = (buf2 & 0x0f) << 2 | (buf3 >> 6);
ind4 = (buf3 & 0x3f);

*(result + j + 0) = BASE64[ind1];
*(result + j + 1) = BASE64[ind2];
*(result + j + 2) = ( i < size - 1 ) ? BASE64[ind3] : '=';// 端数は=に
*(result + j + 3) = ( i < size - 2 ) ? BASE64[ind4] : '=';
}

return(result);
}

int main(void)
{
省略

log2 = base64Encode(log);

省略
}


このソースだと51行目は
size = sizeof(source[0]) * strlen(source);
372行目は
log2 = base64Encode(log);
ということになります。

このエラーはどういう意味でしょうか?

Re:コンパイルエラー

Posted: 2010年11月15日(月) 23:24
by Axe
追記
コンパイルはLinuxでgccを使ってます。

Re:コンパイルエラー

Posted: 2010年11月15日(月) 23:44
by box
> ↑このようなコンパイルエラーになります。

エラーではなく、警告です。
errorじゃなくってwarningって書いてありますよね?

> ファイル名:51: warning: pointer targets in passing argument 1 of 'strlen' differ in signedness

strlen関数の引数が、unsignedを期待してないからではないでしょうか。

> log2 = base64Encode(log);

かんじんなところ(logとかlog2の定義部分)を省略してしまってるので、
何も回答できません。

Re:コンパイルエラー

Posted: 2010年11月15日(月) 23:49
by Axe
>かんじんなところ(logとかlog2の定義部分)を省略してしまってるので、
char *log,*log2
としています。

フォームから送信された値をlogに書き込んでいます。

Re:コンパイルエラー

Posted: 2010年11月15日(月) 23:59
by box
> char *log,*log2

と定義して、

> log2 = base64Encode(log);

と呼び出している、っと。
さて、関数本体の

> unsigned char *base64Encode(unsigned char *source)

と一致してますか?


たぶん、お使いの処理系では
char
と書くと
signed char
のことなんでしょうね。

画像

Re:コンパイルエラー

Posted: 2010年11月16日(火) 00:03
by Axe
>たぶん、お使いの処理系では
>char
>と書くと
>signed char
>のことなんでしょうね。

どのようにしたらよろしいでしょうか?
一応今のままでも動いてはいるのですが不安なんでコンパイルのときに何もでないようにしたいのですが・・・

Re:コンパイルエラー

Posted: 2010年11月16日(火) 00:07
by box
> どのようにしたらよろしいでしょうか?

まずは自分で考えてみてくださいよ。
人の回答に頼りきりだと、プログラミング能力がアップしませんよ。

画像

Re:コンパイルエラー

Posted: 2010年11月16日(火) 00:08
by Axe
>引数と戻り値の型が一致してないって警告
普通に型を一致させればいいだけですか?

Re:コンパイルエラー

Posted: 2010年11月16日(火) 00:13
by box
> >引数と戻り値の型が一致してないって警告
> 普通に型を一致させればいいだけですか?

そう思ったんなら、手を動かす。

Re:コンパイルエラー

Posted: 2010年11月16日(火) 00:20
by Axe
ありがとうございました。
関数のunsigned charをcharにしたら問題なくなりました。