-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);

请注意,这使您必须确保不要超出数组的范围。

使用 a 会更容易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++ 中无法传递任何内容。因此,由于禁止使用指针,因此值或引用必须是正确答案。这意味着无论是胡安的答案还是我的答案都必须是正确的。

于 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;
    }
}

请注意,此代码仅说明了如何执行您显然要求的操作,即学习练习。

对于实际代码,使用例如 astd::vector而不是固定大小的数组。

于 2012-09-18T18:37:32.267 回答
-3

void addMovie(Inventory data[], double count)应该没事。

[]指变相的data指针。 data可以取消引用*data以获取数组中的第一个值,就像通过索引获取它一样data[0]

Inventory data[]和之间的唯一区别Inventory* data是您告诉代码的读者您的意思是分配对象的连续数组(顺便说一句,它的大小可以是 0、1 或内存限制内的任何其他整数)。

编译器和运行时不会区分两者。调用数组方法 asaddMovie(0x0, 0)将与指针版本一样工作。

此外,由于您尝试count在方法中更新,您可能希望通过引用来获取它,double &count并且如果计数是整个项目而不是部分值,您可能还希望使用整数int& count.

于 2012-09-18T16:10:02.513 回答