4

va_list の使用に問題があります。以下のコードは int に対して機能します。

main() {
  int f1=1;
  float** m = function(n,f1);
}

float** function(int n,...) {

  va_list mem_list;
  va_start(mem_list, n);
  for (int i=0;i<n;i++) {
    for (int j=0;j<n;j++) {
      //m[i][j]=va_arg(mem_list,float);
      int f = va_arg(mem_list,int);
      printf("%i \n",f);
    }
  }

  va_end(mem_list);
  return NULL;
}

ただし、フロートに変更すると

float f1=1.0;
float f = va_arg(mem_list,float);
printf("%f \n",f);

正しい値を返しません (値は 0.00000 です)。私は何が起こっているのか非常に混乱しています。

4

2 に答える 2

8

varargs 呼び出しのコンテキストでは、float実際には に昇格されdoubleます。doubleしたがって、実際には sではなくsを引き出す必要がありますfloat%fこれは、 forprintf()が と の両方で機能するfloatのと同じ理由ですdouble

于 2012-06-03T14:44:41.677 に答える
2

ここでは C++ について話しているので、新しい C++11 機能を使用することをお勧めします。

可変個引数のテンプレートを提案することはできますが、少し高度すぎるかもしれません。一方、任意の長いリストを渡すにstd::initializer_list<T>T単純な型です。

 void function(std::initializer_list<int> list);

多くの機能はありません。

  • size()リスト内の要素の数を返します
  • and begin()andend()は通常どおりイテレータを返します

だからあなたは実際に行うことができます:

void function(std::initializer_list<int> list) {
    std::cout << "Gonna print " << list.size() << " integers:\n";

    bool first = true;
    for (int i: list) {
        if (first) { first = false; } else { std::cout << ", "; }
        std::cout << i;
    }
    std::cout << "\n";
}

そして、次のように呼び出します。

int main() {
    function({1, 2, 3, 4, 5});
}

印刷されます:

Gonna print 5 integers:
1, 2, 3, 4, 5

一般に、C++ では、C バリアディックには近づかないでください。それらはタイプセーフではなく、落とし穴がいっぱいです。

于 2012-06-03T15:10:42.343 に答える