• ベストアンサー

C言語での引数の省略方法

お世話になります。 C言語での関数の引数の省略方法についてお聞きしたいです。 たとえば、CalA(x,y,z)という関数があるとします。 このzの部分を使用しないときは省略という風にしたいのです。 CalA("あ","い","う"); CalA("あ","い"); ↑このようにどちらにも対応したい。 VBではそのようにできたと思うのですが、Cでは可能なやり方があるのでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • Mizyu
  • ベストアンサー率41% (245/593)
回答No.5

#1です > char型の場合は > void CalA(int x,int y,char *z='') それでOKです。 ただ、#4の方のおっしゃるように、コンパイルエラーが出ないため、設計がかなりしっかりしていないと危険ではあります。 危険ですが、実際にシステム開発のときに用いられる手法ですので、問題はないと思います。 ただ、ここでの不具合が報告されないため、実装後、該当関数関連の試験は重点的に行ったほうがよいですね。

u_kappa
質問者

お礼

たびたびありがとうございます。 解決できました。

その他の回答 (4)

回答No.4

Cでは'不可能'です。 C++なら簡単ですが。 他の方からの回答にあるように、可変引数という テがありますが、これだと引数の型と数について なんのチェックも行なわれず、コンパイラはエラー を報告しなくなります。危険を顧みないなら十分 な留意の上お使いください。

u_kappa
質問者

お礼

回答ありがとうございます。 不可能なのですか・・・ No1のやり方でOKだと思ったのですが。 たとえば使用する際にint型の所にchar型を指定してもwarningがでなくなるということですよね?

noname#11476
noname#11476
回答No.3

お使いになるのがC++でしたら先の回答者の方々の方法でOKです。 しかし、ただのCでしたら、簡単には実装できません。 この場合は、printf()などと同じような実装方式になります。 va_arg、va_end、va_start マクロ群を利用します。 int average( int first, ... ) {  va_list marker;  int a[10];  a[0] = first;  va_start( marker, first );  a[1] = va_arg( marker, int);  a[2] = va_arg( marker, int);  a[3] = va_arg( marker, int);  va_end( marker ); /* 可変個の引数のリセット */ } という感じです。

u_kappa
質問者

お礼

回答ありがとうございます。 このような方法もあるのですね。 No1の方の方法が求めているものでした。 かといってこちらの方法も知っておいて損はありませんでした。 知識が増えました。ありがとうございました。

  • mld_sakura
  • ベストアンサー率20% (264/1282)
回答No.2

可能です。 オーバーロードを使用します。 ここを参考にしてください。 http://www.mars.dti.ne.jp/~torao/program/cpp/overload.html

参考URL:
http://www.mars.dti.ne.jp/~torao/program/cpp/overload.html
u_kappa
質問者

お礼

回答ありがとうございます。 C++でしたらそうしたのですが・・・ C言語なのでNo1の方の方法を取りたいと思います。

  • Mizyu
  • ベストアンサー率41% (245/593)
回答No.1

void CalA(int x,int y,int z = 0) こんな形でOKです。

u_kappa
質問者

お礼

回答ありがとうございます。 試してみたらうまくいきました。 常識がないのでお教え願いたいのですが、 char型の場合は void CalA(int x,int y,char *z='') こんな感じでよろしいのですか? よろしくお願いします。

関連するQ&A

  • C言語(引数)

    はじめまして。 C言語を習い始めたものです。 関数を定義するとき、よく耳にする、仮引数や実引数があると思います。 仮引数は関数の定義内で値をうけとる変数のことであり 実引数は関数を呼び出す際に渡す値を実引数というらしいのですが どこからどこまでを仮引数と呼ぶのかわかりません。 例えば、 fの関数の定義内で ↓があるとします。 (関数にする意味はないのですが、確認のためあしからず・・・) double f(double x) {     x=5;     return(x); } この場合、仮引数とよばれるものは double f(double x)の xが仮引数であって x=5;のxは仮引数と呼ばないのでしょうか?? もしそうならば void f(double x) { printf("%f",x); } のprintf("%f",x);内のxは仮引数とよぶのでしょうか? 質問の内容が意味不明かもしれませんが よろしくお願いします。

  • C言語の関数の実引数と仮引数の名前について

     C言語で関数を使う場合、実引数と仮引数の名前(変数名)は、変えなければならないのでしょうか、同じでもいいのでしょうか。C言語のルールでは、どうなっているのでしょうか。よろしくお願い致します。

  • C言語の問題ができなくて困っています。

    C言語の問題ができなくて困っています。どなたか教えて教えていただけませんか? C言語の問題ができなくて困っています。どなたか教えて教えていただけませんか? 問題は、 「連立方程式 -3x+y+2z-s+3t =5 3x-5y-2+2s-t =-10 2x-2y-z+2s-3t =7 5x-2y+3z+2s+5t=-3 3x+5y-3z+4s-t=-11 をC言語のプログラムを用いて解きなさい。」 というものです。 お願いする立場で申し訳ありませんが、とても困っていてどなたかお願いします。

  • C言語:引数の型だけ異なる関数を一つにまとめる方法

    以下の引数の型だけ異なる関数を、どうにかして一つにまとめたいのですが、 何か良い方法はないでしょうか? void funcA(_MNGR_TAG mngr){ 処理X; } void funcB(_COPY_MNGR_TAG mngr){ 処理X; } 補足: ・_NODE_TAGと_COPY_NODE_TAGは構造体です。ただし中身は異なります。 ・(引数名が同じため)funcAとfuncBで行っている処理は全く同じです。 注意事項: 関数テーブルやC++言語を使用する方法は除いて下さい

  • C言語において、関数とその役割、また、引数とその役割、仮引数、実引数とは?

    C言語初心者です。 そもそもPC使うのも苦手ですがよろしくお願いします。 C言語において、関数とその役割、また、引数とその役割、仮引数、実引数の役割を、実例を用いて簡潔に説明していただけると助かります。お願いします。

  • C言語:関数の返り値と引数について

    C言語:関数の返り値と引数について C言語の関数を作るとき、ほしい値とかを引数にして渡す場合と、そのまま返り値で渡す場合の二種類がありますよね? 例えば、 ・void Smooth( Image *src, Image *dst, int param ); ・Image *Smooth( Image *src, int param ); みたいな感じで mallocとかは返り値で渡してますけど、opencvの関数(例えばcvSmooth)とかは引数にしてます これって使い分けとかあるんでしょうか?

  • C++で他のファイルの関数の引数を引きだす方法

    C++初心者です。 あるCプログラムに関数: testFunction(const char x[ ], int a, int b, int c)があり、 この関数はchar y[ ]を戻り値として返します。 次の段階で、別のC++を作成し、その中で、上記testFunctionを呼び出し、 使用している引数を引き出して以降のプログラムで使用する仕様のプログラムを組んでいます。 他のファイルに存在する関数を呼び出す方法は、 std::cout << testFunction(x[], a, b, c) << std::endl; ではないかと思っているのですが、ここから先が進まず困っている状況です。 戻り値だけではなく、引数も呼び出すことは可能でしょうか。 可能であれば、どのようにして呼び出すことができるのでしょうか。 アドバイスをお願いいたします。

  • php 省略可能な引数配列を持つ関数の作り方

    phpの関数で、省略する引数の右側の引数は全て省略しないといけませんが、連想配列を用いて、省略する順番が不確定で、必要な引数のみを設定して、省略したものはデフォルト値を使用するような関数を作るにはどのようにすればいいでしょうか。 ご教授のほどよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • c言語

    c言語で写真の課題を出されたのですが自分のプログラムでは上手くいきません。どこが間違っているのか教えて欲しいです。 自分のプログラム #include<stdio.h> #include<math.h> int main(){ int i,j; double c,d,x,y,z; for(i=0;i<=360;i++){ c=10*cos(i*M_PI/180); d=10*sin(i*M_PI/180); if(c>=0 && d>=0){ for(j=0;j<=1000;j++){ x=0.001*j; y =x*d/c; z=1-x*x-(sqrt(x)+y)*(sqrt(x)+y); if(z<=0.0){break;} } } if(c<=0 && d>=0){ for(j=0;j<=1000;j++){ x=-0.001*j; y=x*d/c; z=1-x*x-(sqrt(-x)+y)*(sqrt(-x)+y); if(z<=0.0){break;} } } if(c<=0 && d<=0){ for(j=0;j<=1000;j++){ x=-0.001*j; y=x*d/c; z=1-x*x-(sqrt(-x)+y)*(sqrt(-x)+y); if(z<=0.0){break;} } } if(c>=0 && d<=0){ for(j=0;j<=1000;j++){ x=0.001*j; y=x*d/c; z=1-x*x-(sqrt(x)+y)*(sqrt(x)+y); if(z<=0.0){break;} } } printf("x=%lf y=%lf z=%lf\n",x,y,z); } return(0); }

  • C++テンプレートでの引数

     こんにちは。 今回は、C++ テンプレートで引数に構造体を使えないか悩んでいます。 例えば #include <stdio.h> typedef struct _rect{ int x; int y; }RECT; typedef struct _rect{ double x; double y; }DATA; template <calss T> T Function(T abc) { // 構造体の要素にも対応している。 cout << abc//の要素x << endl; cout << abc//の要素y << endl; return T; } int main() { RECT t; DATA r; t.x = 80; t.y = 90; t = Function(t); // こういった事をしたい r = Function(r); return 0; } というふうにしたいんです。 テンプレート関数に引数として構造体にしてそれぞれの要素を参照する場合はどうすれば よろしいのか教えてください。 よろしくお願いします。