アプリ版:「スタンプのみでお礼する」機能のリリースについて

type型の二つの値を交換する関数形式マクロ
swap(type,a,b)を定義せよ
例えばint型でx、yに5、10があたえられているとき、swap(int,x,y)を
呼び出した後は、x,yには10と5が格納されていなければならない。
・・という問題で以下のようにswapを作ったのですがエラーがでます
どこが問題か教えていただけないでしょうか?

#include <stdio.h>
#define swap(type,a,b) (m = a a = b b = m)

int main(void)
{
int x = 1,y = 2,m;
swap(int,x,y);
printf("x=%d y=%d\n",x,y);

return(0);
}

A 回答 (5件)

#3 salsberryさんとまるかぶりしました。

失礼しました。

参考になるサイトがありましたので貼っておきます。

http://www.nurs.or.jp/~sug/soft/super/macro.htm

参考URL:http://www.nurs.or.jp/~sug/soft/super/macro.htm
    • good
    • 0
この回答へのお礼

サイトありがとうございます。また機会があればよろしくお願いします。

お礼日時:2009/10/13 12:27

#1です。


コンパイルエラーの原因はわかっていただけたでしょうか?

参考までに,私が考えたマクロを貼っておきます。
このマクロのメリットは外部にint宣言しなくても使えることです。

#define swap(type,a,b) {type m; m = a; a = b; b = m;}
    • good
    • 0

すぐに考えつくのは


#define swap(type,a,b) { type m; m = a; a = b; b = m; }
ですが、これだと
if (x < 0) swap(int,x,y);
else { ... }
のような使い方をした場合に問題が出るので、もう一工夫が必要です。
    • good
    • 1
この回答へのお礼

一工夫がんばります。回答ありがとうございます。

お礼日時:2009/10/13 12:19

 回答者#1です。

少し情報を追加します。
 プリプロセッサによって#defineマクロは展開されています。コンパイラがどのように処理しているか確認出来ますのでその方法を紹介します。
 お使いのコンパイル環境のコンパイルオプション(またはスイッチ)でプリプロセッサのオプション(またはスイッチ)を探して有効にして下さい。これでどのように#defineが置き換えられているか確認出来ます。
 例として「gcc」と「VC++」の設定方法について書いておきます。
【例1】「gcc」の場合
 「-E」で標準出力されますので「src.c」をコンパイルする場合「gcc -E src.c > src.i」とすると「src.i」にファイルが作成されます。
【例2】「VC++」の場合
 「/P」を追加してコンパイル。VisualStudio2008の統合環境からは「プロジェクト」の「プロパティページ」から「構成」の「構成プロパティ」,「C/C++」,「プリプロセッサ」を順に開き,「前処理済みファイルの生成」を「いいえ」から「行番号付き (/P)」に変更してコンパイル(ビルド)します。ソースファイルと同じ場所にソースファイルの拡張子が「.i」のファイルが生成されます。
    • good
    • 0
この回答へのお礼

返答おくれてすみません。親切な回答ありがとうございます!
何とかわかりそうなので、補足のほうも試してみたいと思います。

お礼日時:2009/10/07 19:41

こんにちは早速ですが問題点について説明します。



「#define swap(type,a,b) (m = a a = b b = m)」の場合,「swap(int,x,y);」 は次のように置き換えられる事が予想されます。(この場合は単純に「a」に「x」,「b」に「y」にそれぞれ置き換えるだけです。)

(m = x m = y y = m);

これではコンパイルエラーが出るはずです。「m = x; m = y; y = m;」などになるような#define定義が必要です。

尚,この問題の回答としては「type」も使うようなコーディングを求められていると思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!