位置情報で子どもの居場所をお知らせ

二次元で直線の式はy=ax+bとなることはわかります。では三次元になるとどうなるのですか?直感としては、z=ax+by+cとなるかな~と考えているのですが、これでは一直線じゃないような気もします。どなたか教えてください。また、できれば4次元以上ではどうなるのかも教えてほしいです。よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

3次元空間での直線の式ですが、扱いやすいのは、



 (x,y,z)=(a,b,c)+t(p,q,r)

といった形で表す形式です。

上記は、「点(a,b,c)を通り、方向ベクトルが(p,q,r)の直線」です。tは、パラメーター(媒介変数)です。

上記の直線は、No.1さんのように、

(x-a)/p = (y-b)/q = (z-c)/r

という形(tを消去した形)にも表せます。
(p,q,rのうち、1つ以上が0だったら別の形にする必要があるなど、紛らわしいですが。)

なお、ax+by+cz+d=0という形は、直線ではなく「平面」を表します。
    • good
    • 1

x/a=y/b(ただし ab≠0)が原点を通る2次元での直線、


x/a=y/b=z/c(ただし abc≠0)が原点を通る3次元での直線です。
4次元以上でも同様に項を増やすだけでいいはずです。
(原点を通らない場合はxのかわりに(x-x0)などとしてください。)

z=ax+by+c は3次元平面を表します。
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q3次元座標2点からの直線式の求め方

お世話になります。

3次元座標2点からの直線式(ax+by+cz=0)の求め方を教えて下さい。

2次元座標であれば、1つの傾きから算出できるのですが、3次元座標になると、X-Y平面、Y-Z平面での傾きの使い方がこんがらかってしまいます。
基本的な質問で申し訳ありませんが、よろしくお願い致します。

座標1 = (x1,y1,z1)
座標2 = (x2,y2,z2)

以上

Aベストアンサー

> 直線式(ax+by+cz=0)の求め方を教えて下さい。
3次元座標では(ax+by+cz=0)は原点を通る平面になり、直線の式ではありません。ax+by+cz=dは平面の一般式です。

2点を通る直線の式には公式があります。
以下のように簡単に導けます。
点(x1,y1,z1)を通り方向ベクトル(x2-x1,y2-y1,z2-z1)の直線ですから
媒介変数形式で
(x,y,z)=(x1,y1,z1)+t(x2-x1,y2-y1,z2-z1)
と成ります。
これを変形してすれば
(x-x1)/(x2-x1)=(y-y1)/(y2-y1)=(z-z1)/(z2-z1)
と3次元座標の直線の式となります。

Q3次元空間内の直線の方程式

3次元空間内の直線の方程式の一般形は何でしょうか?
私の考えでは、2つの平面が交わった線として表すのでは
ないかと思いますが、どうでしょうか?つまり

aX+bY+cZ+d=0
eX+fY+gZ+h=0

いかがでしょうか?

Aベストアンサー

2点A,Bを通る直線の式は、
Oを原点、直線上の任意の点をPとし、
OPベクトルをp,OAベクトルをa,ABベクトルをdで表したとき
p=a+td  (tは実数)
とかけます。

たとえば2点A(-1,-2,-3),B(4,5,6)を通る直線の式は
p=(x,y,z)としたとき
(x,y,z)=(-1,-2,-3)+t(5,7,9)
となります。x,y,zはtの1次式で表されているので
すべてをt= の形に直すと
(x+1)/5=(y+2)/7=(z+3)/9
となり、こんなふうに直線ABを表現することも可能です。

もちろんpromeさんの表現の仕方も直線を表す1つの方法です。

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Q3次元の近似直線

こんにちは。2次元で実験データなどの点列から近似直線を求めるのは、最小二乗法の基本問題ですが、3次元の点群から直線の方程式(x-x0)/a=(y-y0)/b=(z-z0)/cを求めるにはどんなアルゴリズムを使いますか?スマートな方法があれば教えていただけたら幸いです。よろしくお願いします。

Aベストアンサー

3次元空間の曲面ではなく、直線に乗ると仰るのだから、
(1) x, y, zのどれかを与えて、残りの2つを推定する問題。
(2) <x[i],y[i],z[i]>と直線との距離d[i]の二乗和が最小になる直線を求める問題。
と分類すべきでしょう。

(1)の場合は、たとえばzを与えてx,yを求めたいのであれば、
・zからxを求める問題。
・zからyを求める問題。
の二つを別々に解けばおしまいです。
それぞれの解は(x=Az+B, yは任意)という平面と、(y=Cz+D, xは任意)という平面を定めますから、この二つの平面の交線が、求める直線ということですね。

(2)の場合はやっかいです。
[1]ちょっと手抜きしながらも、まともにやってみましょう。
(i) 直線をどう表すか。
ご質問の式を見ると、この直線はx軸、y軸、z軸のどれとも平行でも垂直でもないことが仮定されています。
ですから、zをパラメータとして
x=az+c
y=bz+d
と書いても良いでしょう。a,b,c,dが決められれば良い訳です。
(ii) 点<p,q,r>と直線との最短距離を求める。
直線上の任意の点<az+c,bz+d, z>と点<p,q,r>の距離をdとすると
d^2 = (az+c-p)^2+(bz+d-q)^2+(z-r)^2
= (az)^2+2az(c-p)+(c-p)^2+(bz)^2+2bz(d-q)+(d-q)^2+z^2-2rz+r^2
です。これが最小になるzを求めると、
0=∂(d^2)/∂z = 2(az+c-p)a+2(bz+d-q)b+2(z-r)
ゆえに
z=(ap+bq+r-ac-bd)/(a^2+b^2+1)
であって、このときの最短距離h(p,q,r)は
h(p,q,r)^2 = (ap+bq+r-ac-bd)^2/(a^2+b^2+1)+2(ap+bq+r-ac-bd)(ac-ap+bd-bq-r)/(a^2+b^2+1)+(c-p)^2+(d-q)^2+r^2
わあ、とんでもないですね。
(iii) じゃあ、直線を求めるには?
S=Σ(h(x[i],y[i],z[i]))^2  (i=1,2,...,N)
を最小化するには
∂S/∂a = 0
∂S/∂b = 0
∂S/∂c = 0
∂S/∂d = 0
を解く必要があります。言い換えれば
∂(h(x[i],y[i],z[i]))/∂a
∂(h(x[i],y[i],z[i]))/∂b
∂(h(x[i],y[i],z[i]))/∂c
∂(h(x[i],y[i],z[i]))/∂d
を求めておいて
Σh(x[i],y[i],z[i]) (∂(h(x[i],y[i],z[i]))/∂a)=0
Σh(x[i],y[i],z[i]) (∂(h(x[i],y[i],z[i]))/∂b)=0
Σh(x[i],y[i],z[i]) (∂(h(x[i],y[i],z[i]))/∂c)=0
Σh(x[i],y[i],z[i]) (∂(h(x[i],y[i],z[i]))/∂d)=0
という連立方程式を解くことになります。
これがa,b,c,dについて非線形である(一次式でない)ことは言うまでもありません。一筋縄では行かず、反復計算で徐々に収束させていくしかありません。

[2]手抜き
もうすこし手抜きの方法を考えてみましょう。
この座標系を回転・平行移動した座標系をX-Y-Zとします。そして、求めたい直線がZ軸と一致するようにしたとします。回転と平行移動は行列を使って
X = R x + p
Y     y   q
Z     z   r
と表せます。Rは3×3の行列で Rの転置をR'とすると RR' = R' R = 単位行列
となる行列です。各点<x[i],y[i],z[i]>をこの変換で<X[i],Y[i],Z[i]>に写したとすると、
直線、すなわちZ軸との最短距離はX[i]^2 + Y[i]^2ですから、他のどんな回転・平行移動の仕方に比べても
U=Σ(X[i]^2 + Y[i]^2)  (i=1,2,....,N)
が最小になっている筈で、しかも
S=U
です。
 さて、UはZ[i]の値とは無関係ですからZ[i]を求める必要はない。さらに座標系をZ軸の周りで回転してもUは変化しません。従って、
X = R x + p
Y     y   q
      z
R =P(α)Q(β)
P(α)=cosα  0  -sinα
       0   1    0
Q(β)= 1  0     0
      0 cosβ -sinβ
      0 sinβ  cosβ
とすれば良いのです。展開すれば
X[i] = x[i]cosα-y[i]sinαsinβ-z[i]sinαcosβ+p
Y[i] = y[i]cosβ-z[i]sinβ+q
ですね。
ここでα、β、p、qを決めたい訳です。

 始めに(1)の問題を解けば、α、β、p、qの大体の値を求めることができます。これを使ってU(α,β,p,q)を計算します。
 それから、U(α,β,p,q)が小さくなるようにα、β、p、qをちょっとずつ改良して行けば良いでしょう。これには微小な角度Δα、Δβを使って、
P(Δα)=cosΔα  0  -sinΔα
        0    1    0
      sinΔα  0   cosΔα
Q(Δβ)= 1  0      0
       0 cosΔβ -sinΔβ
       0 sinΔβ  cosΔβ
を作り、P(α)、Q(α)にそれぞれ掛け算すれば良い。
P(α+Δα)=P(Δα)P(α)
Q(β+Δβ)=Q(Δβ)Q(β)
だからです。さらにここで、Δα、Δβは微小だから、
cosΔα≒1、cosΔβ≒1、sinΔα≒Δα、sinΔβ≒Δβ
(Δα)^2≒0、(Δβ)^2≒0、ΔαΔβ≒0
という近似をしても構わないでしょう。
この近似を利用すると計算は一層簡単になり、Uを最小にするようにΔα、Δβ、p、qを求める問題は線形最小二乗法(一次式の最小二乗法)になってしまい、簡単に解けます。
それを解いてから、真面目にP(α)、Q(α)を計算しなおし、また線形最小二乗法を解く。これを収束するまで繰り返せば良いのです。

なお、stomachmanは計算間違いの常習犯ですから、チェックは慎重に。

3次元空間の曲面ではなく、直線に乗ると仰るのだから、
(1) x, y, zのどれかを与えて、残りの2つを推定する問題。
(2) <x[i],y[i],z[i]>と直線との距離d[i]の二乗和が最小になる直線を求める問題。
と分類すべきでしょう。

(1)の場合は、たとえばzを与えてx,yを求めたいのであれば、
・zからxを求める問題。
・zからyを求める問題。
の二つを別々に解けばおしまいです。
それぞれの解は(x=Az+B, yは任意)という平面と、(y=Cz+D, xは任意)という平面を定めますから、この二つの平面の交線が、求め...続きを読む

Q屈折率と波長と周波数の関係について

はじめまして。
ちょっと困っているので助けてください。

屈折率は入射光の波長に依存しますよね?
一般的な傾向として、波長が長くなると
屈折率は小さくなりますよね?
それで、このことを式で説明しようとしたんですが、

屈折率は真空の光速と媒質中の光速の比なので、
n=c/v
媒質中の光の速度、位相速度は
v=fλ
で、周波数と波長に依存します。

ところが!波長と周波数は逆数の関係なので、
この二つの式を使ってしまうと
屈折率が波長に依存しないことになってしまうのです・・・。
どうかこのあたりの説明をおしえてくださいませんか。
よろしくお願いいたします。

Aベストアンサー

ekisyouさん、改めまして初めまして。
ご指摘のようにfとνは全く同じものです。同じ物理量に異なる文字を使ってしまったのは私のミスです、申し訳ありませんでした。また「振動数」「周波数」の二つの言い方を用いましたがこれもどちらでも同じことです。ekisyouさんのこれまでのお考えで正しいです。

前回の回答をもう一度正しく書くと
--------
n=c/v
が屈折率の定義そのものである。真空中の光速cは不変であるからnが波長(または周波数)依存性を持つとしたら媒質中の光速vが周波数依存性を持つことになる。従ってこの式は周波数をfとして
n=c/v(f)
と表すべきものである。
二番目の式
v(f)=fλ
で、vに周波数依存性があることを考えるとfとλは厳密な反比例な関係でない。
--------
となります。大変失礼を致しました。

なお上記の式だけからでは「赤い光の方が紫の光より屈折率が小さくなる理由」は絶対に出てきません。
その理由を説明するためにはどうしても電場中での媒質の分極を考える必要があります。屈折の原因は既にご承知とのことですので、あとはその部分の理解を深めて頂くのみです。
(1)光が媒質中を通過する場合、周囲の媒質を分極させながら進む。
(2)可視光線の範囲であれば、周波数が高くなるほど分極の影響により光は進みにくくなる。
(3)(2)により光の速度が落ちる、ということは即ち屈折率が上がる、ということである。

(2)ですが、共振現象とのアナロジーで考えれば分かりやすいと思います。いまある物体を天井からひもで釣るし、それにさらに紐を付けて手で揺らすこととします。(A)ごくゆっくり揺らす場合は手にはほとんど力はかけなくて済みます。(B )ところが揺らす周期を短くするとだんだんと力が要るようになります。(C)さらに周期を短くして共振周波数に達すると急に力は要らなくなります。(D)そしてさらに揺らす周期を短くしようとすると、あたかもその錘に引張られるような感覚を受けます。(E)そしてさらにずっと周期を短くすると、錘はまったく動かずに錘と手を結んでいる紐だけが振動するようになります。
可視光線はちょうどこの中で(B)の領域になります。すなわち周波数を高くすると、それにつれて周囲の分極があたかも「粘り着く」ようになり、そのために媒質中の光の速度が落ちるのです。(もっとも、「粘り着く」なんて学問的な表現じゃないですね。レポートや論文でこんな表現をしたら怒られそう・・・)

こんな説明でよろしいでしょうか。

参考となりそうなページ:

「光の分散と光学定数の測定」
http://exciton.phys.s.u-tokyo.ac.jp/hikari/section2.htm
同、講義ノート(pdfでダウンロード)
http://exciton.phys.s.u-tokyo.ac.jp/kouginote/opt2k.html

"Kiki's Science Message Board" この中の質問[270]
http://www.hyper-net.ne.jp/bbs/mbspro/pt.cgi?room=janeway

過去の議論例(既にご覧になっているかと思いますが)
http://oshiete1.goo.ne.jp/kotaeru.php3?q=140630

ekisyouさん、改めまして初めまして。
ご指摘のようにfとνは全く同じものです。同じ物理量に異なる文字を使ってしまったのは私のミスです、申し訳ありませんでした。また「振動数」「周波数」の二つの言い方を用いましたがこれもどちらでも同じことです。ekisyouさんのこれまでのお考えで正しいです。

前回の回答をもう一度正しく書くと
--------
n=c/v
が屈折率の定義そのものである。真空中の光速cは不変であるからnが波長(または周波数)依存性を持つとしたら媒質中の光速vが周波数依存性を持つことにな...続きを読む

Q平面の交線の方程式

2平面の交線の方程式はどうやって求めるのですか?

例で適当に問題を作ってみたんで教えてください
x-y+3z-1=0,x+2y-z-3=0

どなたか教えていただけませんか?

Aベストアンサー

akatukinoshoujoさん、こんにちは。

>x-y+3z-1=0・・・・(1)
>x+2y-z-3=0・・・・(2)とおきましょう。
(1)(2)より、連立方程式を解いて、x、y、zをそれぞれどれか一つの文字で表していきます。

(1)×2 2x-2y+6z-2=0
(2)   x+2y-z-3=0
------------------------------これを足してみると
      3x+5z-5=0
      x=-5(z-1)/3・・・・(☆)

(1)   x-y+3z-1=0
(2)×3 3x+6y-3z-9=0
------------------------------これらを足し合わせると
      4x+5y-10=0
      4x=-5(y-2)
      x=-5(y-2)/4・・・・(★)

(☆)(★)より、yとzをxであらわせたので、つなげてみましょう。

x=-5(y-2)/4=-5(z-1)
もうちょっと整理すると、
x/5 =(y-2)/-4 =(z-1)/-3
となって、これは(0,2,1)を通り、方向ベクトルが(5,-4,-3)の
直線になることを示しています。


方程式が2つあるので、どれか一つの文字で表して、つなげてみるといいですね。
頑張ってください!!

akatukinoshoujoさん、こんにちは。

>x-y+3z-1=0・・・・(1)
>x+2y-z-3=0・・・・(2)とおきましょう。
(1)(2)より、連立方程式を解いて、x、y、zをそれぞれどれか一つの文字で表していきます。

(1)×2 2x-2y+6z-2=0
(2)   x+2y-z-3=0
------------------------------これを足してみると
      3x+5z-5=0
      x=-5(z-1)/3・・・・(☆)

(1)   x-y+3z-1=0
(2)×3 3x+6y-3z-9=0
------------------------------これらを足し合わせると
   ...続きを読む

Qlogとln

logとln
logとlnの違いは何ですか??
底が10かeかということでいいのでしょうか?
大学の数学のテストでlogが出てきた場合は底が10と解釈してよいのでしょうか??
解説お願いします!!

Aベストアンサー

こんにちは。

>>>logとlnの違いは何ですか??

「自然対数」は、natural logarithm の訳語です。
「ln」というのは、「logarithm 。ただし、natural の。」ということで、つまり「自然対数」という意味です。
一方、log というのは、底がeなのか10なのかがはっきりしません。


>>>大学の数学のテストでlogが出てきた場合は底が10と解釈してよいのでしょうか??

数学であれば、底がeの対数(自然対数)です。底が10の対数(常用対数)ではありません。
一方、log は、数学以外であれば不明確な場合があります。

私の大学時代と仕事の経験から言いますと・・・

【eを用いるケース】
・数学全般(log と書きます)
・電子回路の信号遅延の計算(ln と書く人が多いです)
・放射能、および、放射性物質の減衰(log とも ln とも書きます。ただし、eではなく2を使うこともあります。)

【10を用いるケース】(log または log10 と書きます)
・一般に、実験データや工業のデータを片対数や両対数の方眼紙でまとめるとき(挙げると切りがないほど例が多い)
・pH(水溶液の水素イオン指数・・・酸性・中性・アルカリ性)
・デシベル(回路のゲイン、音圧レベル、画面のちらつきなど)

ご参考になれば。

こんにちは。

>>>logとlnの違いは何ですか??

「自然対数」は、natural logarithm の訳語です。
「ln」というのは、「logarithm 。ただし、natural の。」ということで、つまり「自然対数」という意味です。
一方、log というのは、底がeなのか10なのかがはっきりしません。


>>>大学の数学のテストでlogが出てきた場合は底が10と解釈してよいのでしょうか??

数学であれば、底がeの対数(自然対数)です。底が10の対数(常用対数)ではありません。
一方、log は、数学以外であれば不明確な場...続きを読む

Q#defineの定数を文字列として読み込む

#define A "xxx"
#define B "yyy"
と定義しておいて

scanf("%s", str)
で読み込んだ文字列strが
"xxx"だった場合、"yyy"だった場合のように分岐したいのですが
このとき

if(str == "xxx")
のように中身を指定するのではなく

if(str == AA)
のように定数で分岐させることってできますか?

上記のままではできませんが、何か特別な関数とかでできるのでしょうか?

Aベストアンサー

こんにちは。

やりたいことの解釈ですが、(※勘違いの場合はすみません。)

1)マクロの名前(定義名)が文字列として格納された文字列 str があるとする。
 例)
   #define A "xxx"  //マクロ名=A
   char str[] = "A";   //"A"はマクロ名

2)上記の文字列 str を関数 func に渡す際に、マクロ名ではなくそのマクロで
  定義された文字列を渡したい。
 例)
   func( str );    //←この場合
    ↓
   func( "xxx" );  //←として展開される

ということで宜しいでしょうか?

だとした場合、少し回りくどいやり方かもしれませんが、以下のような文字列
変換用のマクロを定義してみては如何でしょうか?
※基本的には、他の回答者の方と同じように strcmp関数 を使用します。

■マクロ例
==============================
//文字列を定義したマクロ …※1
#define A "xxx"
#define B "yyy"

//引数を文字列として取得するマクロ
#define GETSTR(x) #x

//引数をマクロ名としてそのマクロで定義された文字列を取得するマクロ …※2
//注)<string.h>がインクルードされていることを前提とする
#define STR2MAC(str) \
!strcmp(str,GETSTR(A))? A : \
!strcmp(str,GETSTR(B))? B : str
==============================

上記マクロを使用して、関数 func にマクロ名が格納された文字列 str を
渡す場合は、
   func( STR2MAC( str ) );
のような記述になります。

前提として、※2のマクロ内でstrcmp関数を用いて文字列の照合を行って
いますので、<string.h>のインクルードが必要になります。

また、※1の文字列を定義するマクロの種類(パターン)を増やす場合、
※2のマクロの判定文もそれに合わせて増やす必要があります。

上記のマクロを使用したサンプルソースを下記に掲載致します。
注)エラー処理は行っていません。

■サンプルソース
==============================
#include <stdio.h>
#include <string.h>

//文字列を定義したマクロ
#define A "xxx"
#define B "yyy"

//引数を文字列として取得するマクロ
#define GETSTR(x) #x

//引数をマクロ名としてそのマクロで定義された文字列を取得するマクロ
//注)<string.h>がインクルードされていることを前提とする
#define STR2MAC(str) \
!strcmp(str,GETSTR(A))? A : \
!strcmp(str,GETSTR(B))? B : str

//プロトタイプ
void funcHoge( const char *str );

int main(void)
{
char sArg[128];

printf( "A or B ?>" );
scanf( "%s", sArg );

printf( "string1: %s\n", sArg );
funcHoge( STR2MAC(sArg) );

return 0;
}

void funcHoge( const char *str )
{
printf( "string2: %s\n", str );
}
==============================

■上記サンプルの実行結果
≫実行その1≪
A or B ?>A
string1: A
string2: xxx

≫実行その2≪
A or B ?>B
string1: B
string2: yyy

≫実行その3≪
A or B ?>hoge
string1: hoge
string2: hoge

以上です。

こんにちは。

やりたいことの解釈ですが、(※勘違いの場合はすみません。)

1)マクロの名前(定義名)が文字列として格納された文字列 str があるとする。
 例)
   #define A "xxx"  //マクロ名=A
   char str[] = "A";   //"A"はマクロ名

2)上記の文字列 str を関数 func に渡す際に、マクロ名ではなくそのマクロで
  定義された文字列を渡したい。
 例)
   func( str );    //←この場合
    ↓
   func( "xxx" );  //←として展開される

ということで宜しいでしょう...続きを読む


このカテゴリの人気Q&Aランキング