掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.25798

...の扱いについて
投稿者---DAI(2006/01/29 21:17:50)


御世話になります。
printfのフォーマットは int printf(const char *format,...)
というように、...という形で任意の数の引数を使用できます。
このような関数を作りたいと思っております。
簡単なものとして、第一引数で与えた変数と同じ値のものをカウントして
その数をint型で返すというものを考えています。
宣言はint count(int i,...)という表現でよろしいのでしょうか?

使用法は以下の様に考えております。

int ori = 3;
int val1 = 4;
int val2 = 3;

cout<<count(ori,val1,val2)<<endl; //val2がoriとおなじなので、1を返したい。


実装の際に、第二引数以降の値を使用するには、どのようにすれば
いいのでしょうか?
お手数をお掛け致しますが、お分かりになる方ご教授お願い致します。
コンパイラはGNUを使用しております。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:...の扱いについて 25801 επιστημη 2006/01/29 21:30:08
<子記事> Re:...の扱いについて 25807 あかま 2006/01/29 21:56:00


No.25801

Re:...の扱いについて
投稿者---επιστημη(2006/01/29 21:30:08)


>宣言はint count(int i,...)という表現でよろしいのでしょうか?

ダメです。引数がいくつあるのか、何らかの方法で知ることができなくてはなりません。



この投稿にコメントする

削除パスワード

No.25807

Re:...の扱いについて
投稿者---あかま(2006/01/29 21:56:00)


#include <stdio.h>
#include <stdarg.h>

int count(int argnum,int ori, ...);//可変個引数の個数(第1,2引数は含まない),探す値,探される値…

int count(int argnum,int ori, ...){
    va_list va;
    int i,num,cnt=0;
    va_start(va, ori);
    for(i=0;i < argnum;i++){
        num = va_arg(va,int);
        if(ori == num) cnt++;
    }
    va_end(ap);
    return cnt;
}

int main(){
    int cnt;
    
    cnt = count(5,3,2,3,4,5,6);
    printf("%d\n",cnt);
    
    return 0;
}
こんな感じになりますが、επιστημηさんの仰られるとおり、可変個引数部分の個数がわからないと作れません。
カウントするなら、可変個引数よりカウント先を配列にして渡したほうがスマートだと思いますよ。




この投稿にコメントする

削除パスワード

No.25813

Re:...の扱いについて
投稿者---DAI(2006/01/29 22:17:07)


επιστημη様、あかま様、ご教授いただきありがとうございました。
要素数を引数で与える必要があるということで認識致しました。

勉強不足で申し訳ありませんが、もう一点質問させて下さい。
配列として与えた場合ですが、配列の要素数を求めるには
どうしたらよいのでしょうか?
JavaのlengthやPerlの@配列名のように、要素数を知る方法が
Cにもあるのでしょうか?


この投稿にコメントする

削除パスワード

No.25815

Re:...の扱いについて
投稿者---επιστημη(2006/01/29 22:20:59)


>JavaのlengthやPerlの@配列名のように、要素数を知る方法が
>Cにもあるのでしょうか?

ありません。要素数も引数として与えてください。

あるいは"絶対に使われない値"があるのなら、
それを配列の末尾に入れておけば、それが"終わり"の印になります。



この投稿にコメントする

削除パスワード

No.25818

Re:...の扱いについて
投稿者---DAI(2006/01/29 22:32:47)


>あるいは"絶対に使われない値"があるのなら、
>それを配列の末尾に入れておけば、それが"終わり"の印になります。


ご回答ありがとうございます。
番兵をもたせるわけですね。


この投稿にコメントする

削除パスワード

No.25819

Re:...の扱いについて
投稿者---επιστημη(2006/01/29 22:41:00)


>ご回答ありがとうございます。
>番兵をもたせるわけですね。

そ。だから今回のも"負値は扱わない"のであれば
count(4, ,1,5,4,3,5,4,6, -1);

なんてインタフェースにできます。



この投稿にコメントする

削除パスワード

No.25842

Re:...の扱いについて
投稿者---DAI(2006/01/30 01:51:01)


分かりました。
ご丁寧にありがとうございます。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧