10

私はC++を初めて使用し、次のコードを記述しています。呼び出し元の関数のすべてのアドオンを反復処理する必要がありました- testFunction。これはC#で機能することは知っていますが、このコードは機能していません。誰かがC++でそれを行う正しい方法を指摘できますか?

#include "stdafx.h"
#include <iostream>
#include "resource.h"

int testFunction(char* tester);
int _tmain()
{
    int mainProd=2;
    int Addons[]={7,8,9,10};

    testFunction(mainProd,Addons);


}
void testFunction(int mainProd,int addons[])
{
    for(int x = 0 ; addons.length;++x) ---- Not working 
    {
        std::cout<< addons[x];
    }
}

私はあなたたちによる以下の提案としてベクトルを実装しようとしました

#include "stdafx.h"
#include <iostream>
#include "resource.h"
#include <vector>

void testFunction(std::vector<int> addons);

int _tmain(int argc, _TCHAR* argv[])
{

    std::vector<int>  Addons ;
    for(int i = 0 ;i<10;++i)
    {
        Addons.push_back(i);
    }
     testFunction(Addons);
}

void testFunction(std::vector<int> addons)
{
    for(int i =0 ; i<addons.size();++i)
    {
        std::cout<<addons.at(i);
    }
}
4

6 に答える 6

18

配列 (生の配列) は、引数として関数に渡されるとポインターに分解されるため、配列にはサイズ情報がありません。

関数内で配列の長さを知るには、配列の長さを関数に明示的に渡す必要があります。

または、より良い方法として、 a を使用するstd::vectorと、.size()必要なときにいつでも利用できるようになります。

于 2013-01-15T13:21:44.767 に答える
7

Tonyが示唆しているように、ベクトルを使用する以外に、テンプレートを使用して配列を参照で渡すことができるため、コンパイラーは配列のサイズを推測します。

template<int N>
void testFunction(int mainProd,int (&addons)[N])
{
    for(int x = 0; x < N; ++x) // ---- working 
    {
        std::cout<< addons[x];
    }
}
于 2013-01-15T13:25:43.657 に答える
3

C++ で C# の概念を使用していますが、両方の言語が似ていると仮定しても、同じではありません。

C++ での ranged-for の構文は次のとおりです。

for (type identifier : container) // note the ':', not ';'
{
    // do stuff
}

C++11 コンパイラをお持ちの場合は、これをフレーバーとして使用できます。

ところで、コードでプロパティを使用しているようです:

for(int x = 0 ; addons.length;++x) // what is lenght?
{
    std::cout<< addons[x];
}

C++ にはそのようなものはありません。オブジェクト メソッドを呼び出したい場合は、関数として呼び出す必要があります。

// assuming that the object 'addons' have a method
// named 'length'  that takes no parameters
addons.length();

しかし、addons変数はオブジェクトではなく、配列です (このチュートリアルを参照してください) length。反復するためにその長さを知る必要がある場合は、一部のコンテキストでsizeof演算子を使用できます (詳細については、チュートリアルを参照してください)。

addonsそれがコンテナだったとしましょう:

typedef std::vector<addon> Addons;
Addons addons;

C++11 の range-for を使用して繰り返したい場合は、次のように記述できます。

for (addon a : addons)
{
    // do stuff with a.
}

それが役に立てば幸い。

于 2013-01-15T14:20:39.963 に答える
2

std::vectorまたはを使用する場合は、 を使用std::arrayできますstd::foreach

std::vector<int> addons = {7,8,9,10};
std::array<int, 4> addons = {7,8,9,10}; // Only use one of these...
std::foreach(addons.begin(), addon.end(), [](int i) {
    std::cout << i
});
于 2013-01-15T13:41:33.403 に答える
1

コードはこれで動作しています

for (int i = 0; i < (end(配列) - begin(配列)); i++)

最大サイズを返す

配列が空かどうかをテストする

array::empty

配列の要素

array::size

配列サイズ

sizeof()
于 2014-08-28T18:45:44.210 に答える