(Mac) sizeof演算子のコンパイル

このQ&Aのポイント
  • MacBookAirでC言語のsizeof演算子をコンパイルしようとするとエラーが発生
  • エラーメッセージは「format ‘%d’ expects type ‘int’, but argument 2 has type ‘long unsigned int’」
  • 他のコードは問題なくコンパイルできているが、sizeof演算子を使ったコンパイルが必要な章で困っている
回答を見る
  • ベストアンサー

(Mac) sizeof演算子のコンパイル

現在MacBookAirにて入門書を参考にC言語を学んでいます。 その中で、 #include <stdio.h> int main(void) { int a = 1; printf("short int型のサイズは%dバイトです。\n", sizeof(short int)); printf("変数aのサイズは%dバイトです。\n", sizeof(a)); return 0; } と入力しコンパイルすると sample21.c:7: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘long unsigned int’ sample21.c:8: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘long unsigned int’ と表示されコンパイルすることができません。 なんども見直してコードに間違いはないと思いますが、原因が解りません。 他のコードは問題なくコンパイルできます。 この先、sizeof演算子を使って値を求めなければならない章があり、非常に困っています。 どなたか解決策を教えてください。お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

コンパイルできています。出ているメッセージは警告であって、エラーではありません。 コンパイル時の警告をなくすには、 "%d" を "%u" あるいは "%lu" あたりにしてみるといいのではないでしょうか。

Breeeeak
質問者

お礼

早急な回答ありがとうございます。 "%lu"に変えてみると無事コンパイルできました。 結果が変わった理由も自分で調べて復習したいと思います。

その他の回答 (1)

  • wormhole
  • ベストアンサー率28% (1619/5654)
回答No.2

原因はちゃんと、そのメッセージに書かれています。 辞書を引きながらでも訳してみることをおすすめします。

Breeeeak
質問者

お礼

回答ありがとうございます。 警告文の意味を改めて調べようと思います。

関連するQ&A

  • プログラミングについてです。

    単純なかけ算を利用したプログラムなんですが、エラーコードが出てきてしまって、全然デバックできません。 わかる方、どこがどういうふうに間違っているか、ご教授お願いします。 使っているPCはMacBook Proです。 #include <stdio.h> int main( void ) { int go, hachi, goukei, azukari, otsuri ; printf("五十円切手の枚数と八十円切手の枚数を入力してください。(例 10,4):") ; scanf("%d,%d", go, hachi) ; goukei = go * 50 + hachi * 80 ; printf("合計金額は%dです、いくら支払いますか?:",goukei) ; scanf("%d 円",azukari) ; otsuri = azukari - goukei ; printf("ありがとうございました、おつりは %d 円です。",otsuri) ; return 0 ; } エラー内容 q2_5.c: In function ‘main’: q2_5.c:8: warning: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘int’ q2_5.c:8: warning: format ‘%d’ expects type ‘int *’, but argument 3 has type ‘int’ q2_5.c:8: warning: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘int’ q2_5.c:8: warning: format ‘%d’ expects type ‘int *’, but argument 3 has type ‘int’ q2_5.c:11: warning: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘int’ q2_5.c:11: warning: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘int’ です。お願いします。

  • 【C言語】 コンパイルエラーが解決できません

    参考書でC言語学習中の初心者です。 参考書記載のサンプルコードをコンパイルするとエラーになります。 誤字脱字は何度も確認しています。google等でも調べましたがわかりませんでした。。。 どなたか、どこが間違っているのかご教示いただけませんでしょうか。 また、何か的外れな記載があればご指摘いただけますでしょうか。 【環境】 OS: Mac OS X 10.9.3 コンパイラ:Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn) 【サンプルコード】  ------------------------------------------------- #include<stdio.h> int main(void){ int data; data = 10; printf("変数dataの値 = %d\n", data); printf("変数dataのアドレス = %08X", &data); return 0; } ------------------------------------------------- 【エラー】 破線内 ------------------------------------------------- sample12-1.c:9:45: warning: format specifies type 'unsigned int' but the argument has type 'int *' [-Wformat] printf("変数dataのアドレス = %08X", &data);                     ~~~~ ^~~~~ 1 warning generated. ------------------------------------------------- 宜しくお願い申し上げます。

  • macでのポインタの扱いについて

    最近macを使ってc言語の勉強をしています。 ポインタの所でどうしてもつまづいて解決できないことがあるため質問させていただきました。 ある変数のアドレスを表示するのに main(){ int d=5; printf("dのアドレス:%d 値:%d\n",&d,d); return 0; } のようなプログラムを書いたときにMacでコンパイルすると なぜか以下のようなエラーがでてしまいます $ gcc test.c -o test.out test.c: In function ‘main’: test.c:8: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘int *’ まったく同じソースをWindows上でBorlandを使ってコンパイルしてみると 問題ありません。 Mac環境とWindows環境ではポインタ指定の表記が違うのかと思ったのですが 調べてみてもよくわかりません。 もしわかる方がいらっしゃいましたらご教授願えないでしょうか?

  • ポインタのsizeofについて

    C初心者です。 ポインタ宣言させた変数をsizeof()で値を取得させて 表示させてみました。 char *cp; short int *sp; int *ip; i = sizeof(cp); printf("%d\n",i); i = sizeof(sp); printf("%d\n",i); i = sizeof(ip); printf("%d\n",i); 結果は全て4となりました。 これはなぜですか? (ただの変数として宣言すれば1、2、4となります。この理由も理解できています。)

  • NSString文字列をprintfで出力するには

    Objective-CでNSStringクラスの文字列をprintf関数で出力しようとするとコンパイルエラーになります。 どうすればprintfで出力できるようになるでしょうか。 実行環境はMacOSX。Xcodeをインストールしています。 ソースコードとエラーメッセージは以下です。 #import <Foundation/NSObject.h> #import <stdio.h> int main(void){ NSString *str01 = @"test"; printf("%s\n", [str01 UTF8String]); return 0; } <コンパイルエラーメッセージ> warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘id’

  • 配列のアドレス取得が出来ません(in MacOSX 10.6)。

    配列のアドレス取得が出来ません(in MacOSX 10.6)。 例えば、配列要素数3の一次元配列で、int hei[3] = {x, y, z};(xyzは整数)で初期化した配列 hei の、それぞれの要素のアドレスを取得しようと思い、 %x を使って、for 文で {printf("address: %x\n", &hei[i])} としてターミナルのコマンドからgccでコンパイルすると、"warning: format ‘%x’ expects type ‘unsigned int’, but argument 2 has type ‘int *’" とエラーが出てきてしまいます(配列が char 型でも double 型でも表示は同じです。'%x' は 'unsigned int' だから、と跳ねられます)。 これはどういう理由によりますでしょうか?ちなみに使っている教科書は、1993年が初版で2000年に増補改訂された「入門 ANSI-C」という実教から出ているものです。簡単な質問で申し訳ありませんがよろしくお願いします。

  • sizeof()の使い方

    あるプログラムでちょっと珍しいソースコードがありました。 *************************************************************** int x[7]; int nx = sizeof(x) / sizeof(x[0]); for (i = 1; i < nx; i++) { -省略- } *************************************************************** sizeof()という珍しい関数を使っています。 このプログラムの目的は、sizeof()を使って、forの繰り返し回数を算出して、 プログラマー側がアルゴリズムを考えて、forの繰り返し回数を設定する手間を省いてくれることにあります。 しかし、ちょっとおかしな事がありまして、 printf("sizeof(x)="); printf("%d\n",&sizeof(x)); printf("sizeof(x[0])="); printf("%d\n",&sizeof(x[0])); printf("nx=sizeof(x) / sizeof(x[0]):"); printf("%d\n",&nx); を使って、sizeof(x),sizeof(x[0]),nxに何が設定されたかを確かめたところ、 sizeof(x)=28 sizeof(x[0])=7 nx=1638196 と分かりました。nxは”7”でないとおかしいと思うのですが、いかがでしょうか?

  • sizeof(long), sizeof(short)   (処理系依存と言うけれど・・・)

      数値(整数)型の定義サイズについて、質問です。 ANSIの規格では、 sizeof(short) ≦ sizeof(int) ≦ sizeof(long) としか定義されていないので、実際にこれらの型が取る大きさは処理系依存だ、と聞きます。 しかし、VC++、BCCなど、知名度の高いコンパイラでは、いずれも、 sizeof(short) → 2 sizeof(int) → 2 sizeof(long) → 4 となっているようです。(手元にないので、gccでは確認していませんが・・・) 実際のところ、上記のサイズにならない処理系は実在するのでしょうか? 何故こんな質問をするのかというと、あるテキスト(事情があって、書名等の情報は出せないのですが)に > 次の sizeof 演算子の返す値として正しいものはどれですか。 > > long hoge[32]; > sizeof(hoge); > ------------------------------------------------------ > A. 32 > B. 64 > C. 128 > D. 256 > E. 512 という問題が掲載されており、解説が、 > 正解は C 。 > > long 型は 4 バイトで構成されるので、32 個の要素がある配列では、 128 バイトになります。 となっていたのです。(short型のサイズを問う類題あり) 特定の処理系が前提条件とされていないので、適切な設問、解説とは思えないのですが、誤りと断言できるほどの自信がないため、作者に指摘すべきか否か、迷っています。 sizeof(short) → 2、sizeof(long) → 4 にならない処理系が実在しなければ、規格の定義上は正しくなくても、実務上は誤りとは言えないような気もしますが、どうでしょうか? コメントをお待ちしております。  

  • 変数の扱える範囲

    C言語で、整数型変数の扱える範囲を確認するために 以下のような処理をしているのですが、どうもうまくいきません。 変数に入りうる最大値の値を、2進数の計算ではなく プログラム内で正しく扱われているか確認する方法はないでしょうか? ご存知の方、教えてください<(_ _)> 宜しくお願いいたします。 **********************************************  unsigned long long I; unsigned long A; unsigned int B; unsigned short C; printf("I:%d A:%d byte B:%d byte C:%d byte \n"    ,sizeof(I),sizeof(A),sizeof(B),sizeof(C)); A = B = C = 0; for(I = 0; I <= 4294967295; I++){ A++;B++;C++; if(I>= 4294967290 && I<= 4294967295)    printf("I:%d A:%d B:%d C:%d\n",I,A,B,C); }

  • C++ operator演算子の動作について

    下記プログラムを実行した時のoperator演算子の動作についての質問になります。 (VC++2010で動作確認) #include <iostream> struct UInterger { unsigned long ul_ui; UInterger( unsigned long ul_value ) : ul_ui( ul_value ) {} operator unsigned short() { return (unsigned short)ul_ui; } //(1)の時になぜ使用される?. operator unsigned int() { return (unsigned int)ul_ui; } operator unsigned long() { return (unsigned long)ul_ui; } }; int main() { UInterger s_uin(2); int i_temp = s_uin; // (1)コンパイルが通る. short s_temp = s_uin; // (2)コンパイルエラー. long l_temp = s_uin; // (3)コンパイルエラー. return 0; } (2)と(3)はoperatorの定義がないためコンパイルエラーとなるのは理解できます。 (1)でなぜコンパイルが通るのかがわかりません。 下記の定義を追加しない限り、コンパイルは通らないのではと考えております… operator int() { return (int)ul_ui; } 試しに(2)と(3)をコメントアウトしてステップ実行したところ (1)の時に下記のunsigned short()のオペレータが使用されておりました。 operator unsigned short() { return (unsigned short)ul_ui; } どなたか詳しい方、ご教授の程よろしくお願い致します。

専門家に質問してみよう