2012-01-13 4 views
0

私は、このようなプロトタイプを持つ関数を持っています:int func(int * a)、それは引数として配列を受け取ります。このsome_function({1,1,1,1})のように何かしますか?

どのように私はどこにでもエラーを示すコンパイラせずにこれを行うのです。このようFUNC({1,1,1,1})

+3

完全なコードを追加してください。 int funct(int * a)は配列を引数として受け入れませんが、intポインタを受け取ります。 – Alex

+9

「コンパイラにエラーが表示されないようにするにはどうすればよいのですか?」というのは、「正しいコードを書く方法」を求める非常に不思議な方法です... –

+0

@KerrekSB私は彼に同意します。彼が書こうとしていることは理にかなっている。コンピュータは人間に適応するべきであり、反対ではありません;-) – Offirmo

答えて

-1

によって占有されている として試してみて、NULLを検索する場合ジャンク値を与える int型のARの場合は[3] = {1,2,3} :それはあまりにもCで動作

#include <iostream> 

static void f (int* a) { 
    while (*a) std::cout << *a++ << "\n" ; 
    } 

int main() { 
    f ((int[]){1,2,3,4,0}) ; 
    } 

このコードを出力

1 
2 
3 
4 

からthis ideone linkを参照してください。

追記

私は、この構築物の合法性についてa new questionを掲示し、あなたがそういったことに興味があるならMat's answerは読む価値があります。簡単に言えば、それはC99でのみ有効であるようですが、一部のコンパイラではC/C++のすべての変種でその拡張を可能にしています。

+1

まず、シーケンスの正当な値であるsentinalが必要です。 '{1、0、2、3}'をどのように渡しますか?構文は正当なCやC++ pre C++ 11ではありません。 –

+1

@James - あなたの最初の異議はちょうど愚かです:私のプログラムはほんの少しの例でした。あなたの2番目の異論については、OPは具体的にどのようにコンストラクタを受け入れるようにコンパイラーを手に入れるか尋ねました。私のコードは、少なくともgccの下で、その基準を満たしています。 – TonyK

+0

@JamesKanze:これは正当なC++ 11ですか?私は複合リテラルがC++の一部であったとは思わなかった... –

6

int func(int * a); 

void somewhere_else() 
{ 
    int arr[4] = { 1, 1, 1, 1 }; 
    func(arr); 
} 
3

は生の配列を使用しないでください、と確かにそれらへのポインタを関数に渡さないでください。 Ew!我々はもはや1975年ではない。

#include <cstddef> 
#include <iostream> 
#include <vector> 

void func(std::vector<int> const& v) { 
    for (std::size_t i = 0; i < v.size(); i++) 
     std::cout << v[i] << " "; 
} 

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

// Output: "1 2 3 4 " 

これには、C++ 11の特定の機能に準拠したコンパイラが必要です。すなわち初期化子リスト。

int func(std::initializer_list<int> a) { 
    // do something with a here 
} 

または(何らかの理由であなたが本来の機能を変更することができない場合)あなたはstd::initializer_listを使用するラッパーを書くことができます:

+3

C++ 11でしか動作しませんか? –

+2

メー、すべてのツールには長所と短所があります。 "生の配列を使わないでください"、 "ポインタを渡さない"などと言っても、あまりにも気になることはありません。あなたが車を運転する方法を聞いたときにGPSを使う方法を誰かに教えてください。 –

+0

@BrianNeal:はい、それは正しいです。今年は2012年に書かれたコードサンプルです –

2

あなたはstd::initializer_list使用できることを行うには

int func_wrapper(std::initializer_list<int> a) { 
    std::vector<int> b = a; 
    func(b.data()); 
} 
+0

初期化リストのC++ 11サポートが必要です。 –

+0

C++ 11を使用しない唯一の理由は、ターゲットプラットフォームで使用できるまともなコンパイラがないことです。しかし、あなたは正しいです、はい。 –

+1

しかし、適切なサポートをしていないターゲットプラットフォームの*ロット*があります。そのレベルのC++ 11サポートを持たないコンパイラがたくさんあります。あなたが提供するソリューションには、ユーザーが持っていない可能性のある機能が必要であることは、少なくとも言及するのが一般的です。数年後には、おそらくC++ 11の普及を普遍的にサポートすることができます。 –

1

片道

#include <iostream> 
#include <stdio.h> 


    void abc (int *a,int z) 
    { 
    int m= z/sizeof(*a);  
    for(int i=0;i<m;i++) 
     { 
     std::cout<<"values " <<*a<<"\n"; 
     a++; 
     }  
    } 
int main() 
{ 
    int ar[]={11,12,13,14,15,1166,17}; 
    std::cout << sizeof(ar)<<"size\n"; 
    abc(ar,sizeof(ar)); 
    getchar(); 
} 

ここでは心配する必要はありませんサイズとすべて。あなたは第三位は必要なのは(int[])キャストである要素3

+2

さまざまなサイズのさまざまな配列で試しましたか?または64ビットマシンで? '関数内のsizeof(a)はポインタのサイズです。ポインタにバイトがあるのと同じ数の要素を持つ配列を渡すことによってあなたは騙されました。 –

+0

@JamesKanze yaは私の部分で間違いだ。 – Invictus

+0

@ JamesKanzeは新しい修正を投稿し、整数ポインタのサイズである4つ以上の要素でテストしました。アドバイスありがとうございました – Invictus

関連する問題