-4

こんにちは私は、ポインタを使用せずに構造体を使用して関数を介して配列を適切に渡す方法について非常に混乱しています。ポインタを含まない第1章から第8章のみを使用することになっています。誰かがあなたを助けるための提案やリンクを持っているなら、これが私のコードです!

const int MAX_DATA = 10000;

struct Inventory
{
   double sku;
   double count;
   double cost;
   string title;
};

void addMovie(Inventory data[], double count);
void allInfo(Inventory data[], double count);

int main ()
{
   Inventory data[MAX_DATA];
   int choice;
   int i = 0;
   double count = 0;
   return 0;
}

void addMovie(Inventory data[], double count)
{
int i = 0;

cout << "Please enter the name of the movie you wish to add " << endl;

cin >> data[i].title;
cin.ignore();
cout << "Please enter the SKU " << endl;
cin >> data[i].sku;
cout << "You have successfully added " << data[i].title << " : " << data[i].sku <<    endl;
i++;
count++;

}


void allInfo(Inventory all[], double count)
{
    for (int i = 0; i < count; i++)
    {
       cout << "Title: " << all[i].title << endl;
       cout << "SKU: " << all[i].sku << endl;
       i++;
    }
}
4

4 に答える 4

9

固定サイズの配列の場合、配列を参照渡しすると、次のように機能するはずです。

template <unsigned long N>
void addMovie(Inventory (&data)[N], unsigned long& count)
{
  std::cout << "addMovie has an array of size " << N << "\n";
}

...

Inventory data[MAX_DATA];
unsigned long counter = 0;
addMovie(data, counter);

これにより、配列の境界を超えないようにする必要があることに注意してください。

を使用する方がはるかに簡単std::vector<Inventory>です。その場合、次元や参照構文による奇妙な passign 配列について心配する必要はありません。

void addMovie(std::vector<Inventory>& data)
{
  std::cout << "addMovie has an array of size " << data.size() << "\n";
  Inventory invent = ....;
  data.push_back(invent)
}

....
std::vector<Inventory> data;
addMovie(data);
于 2012-09-18T16:14:43.993 に答える
4

値型にラップすると、直接渡すことも、参照することもできます。これは標準クラスにきちんとパッケージ化されてstd::arrayいますが、必要に応じて独自の構造体またはクラスを作成できます。

C++ では、参照、ポインター、または値以外に何かを渡す方法はありません。したがって、ポインターは禁止されているため、値または参照のいずれかが正しい答えでなければなりません。これは、juan の答えまたは私の答えのいずれかが正しい必要があることを意味します。

于 2012-09-18T18:09:35.740 に答える
3

あなたが尋ねる、

ポインターを使用せずに、構造体を使用して関数を介して配列を適切に渡す方法。

そこにあるキーワード句は と思いますstruct

ポインターを渡す代わりに参照渡しを行うことで、次のように行うことができます。

#include <assert.h>         // assert
#include <iostream>         // std::wcout, std::endl
#include <stddef.h>         // ptrdiff_t
#include <stdlib.h>         // abort
#include <string>           // std::string
#include <utility>          // std::begin, std::end
using namespace std;

typedef ptrdiff_t Size;

template< class Collection >
Size nElements( Collection& c ) { return end( c ) - begin( c ); }

wostream& operator<<( wostream& stream, string const& s )
{
    return (stream << s.c_str());
}

void error( string const& message )
{
    wcerr << "!" << message << endl;
    abort();
}

struct Person
{
    string      name;
    int         birthYear;
};

struct Persons
{
    int         count;
    Person      data[10000];
};

void addTo( Persons& persons, string const& name, int const birthYear )
{
    if( persons.count == nElements( persons.data ) )
    {
        error( "Max capacity exceeded." );
    }

    Person& person = persons.data[persons.count];

    person.name = name;
    person.birthYear = birthYear;

    ++persons.count;
}

int main()
{
    Persons     persons = {};       // All zeroed out.

    addTo( persons, "Maria", 1990 );
    addTo( persons, "Eliza", 1965 );

    assert( persons.count == 2 );

    for( int i = 0;  i < persons.count;  ++i )
    {
        wcout
            << i << ": " << persons.data[i].name
            << " born " << persons.data[i].birthYear
            << endl;
    }
}

このコードは、明らかに求められていることを実行する方法を示しているだけであることに注意してください。これは学習演習です。

実際のコードでstd::vectorは、固定サイズの配列の代わりに a などを使用します。

于 2012-09-18T18:37:32.267 に答える
-3

void addMovie(Inventory data[], double count)大丈夫なはずです。

変装したポインターである こと[]を意味します。のようにインデックスで取得するのと同じように、配列の最初の値を取得するように逆参照できます。datadata*datadata[0]

との唯一の違いはInventory data[]Inventory* data割り当てられたオブジェクトの連続した配列を意味することをコードの読者に伝えていることです (ちなみに、メモリの制限内でサイズが 0、1、またはその他の整数になる可能性があります)。

コンパイラとランタイムは、この 2 つを区別しません。配列メソッド as の呼び出しはaddMovie(0x0, 0)、ポインター バージョンとまったく同じように機能します。

さらに、countメソッドで更新しようとするため、参照によって取得したいdouble &count場合や、カウントが部分的な値ではなくアイテム全体の場合は整数を使用したい場合があります。int& count.

于 2012-09-18T16:10:02.513 に答える