C ++: массив struct как параметр функции - PullRequest
1 голос
/ 26 ноября 2010

У меня есть структура:

typedef struct
{  
   int nNum; 
   string str;   
}KeyPair;

Допустим, я инициализирую свою структуру:

KeyPair keys[] = 
{    {0, "tester"},  
     {2, "yadah"},  
     {0, "tester"} 
};  

Я хочу использовать инициализированные значения в функции. Как передать эту структуру массива в качестве параметра функции?

У меня есть:

FetchKeys( KeyPair *pKeys)
{
     //get the contents of keys[] here...   
}

Ответы [ 8 ]

5 голосов
/ 26 ноября 2010

Как насчет?

template<int N> void FetchKeys(KeyPair const (&r)[N]){}

РЕДАКТИРОВАТЬ 2:

Или даже

template<int N> void FetchKeys(KeyPair const (*p)[N])

с вызовом как

FetchKeys(&keys);
4 голосов
/ 26 ноября 2010

Вы можете сделать это, как упоминалось в @MSalters, или вы можете создать std::vector<KeyPair> и передать его функции.Вот пример кода:

using namespace std;

struct KeyPair 
{ 
   int nNum;
   string str;  
};

void fetchKeys(const vector<KeyPair>& keys)
{
    //Go through elements of the vector
    vector<KeyPair>::const_iterator iter = keys.begin();
    for(; iter != keys.end(); ++iter)
    {
        const KeyPair& pair = *iter;

    }
}



int main()
{
    KeyPair keys[] = {{0, "tester"}, 
                   {2, "yadah"}, 
                   {0, "tester"}
                  }; 

    //Create a vector out of the array you are having
    vector<KeyPair> v(keys, keys + sizeof(keys)/sizeof(keys[0]));

    //Pass this vector to the function. This is safe as vector knows
    //how many element it contains
    fetchKeys(v);
    return 0;

}
3 голосов
/ 26 ноября 2010

Должно быть

// Definition
void FetchKeys( KeyPair *pKeys, int nKeys)
{
     //get the contents of keys[] here...   
}
// Call
FetchKeys(keys, sizeof(keys)/sizeof(keys[0]));
1 голос
/ 26 ноября 2010

В зависимости от того, что вы хотите сделать, вы можете даже использовать диапазон увеличения и передать его в качестве пары итераторов:

void FetchKeys(KeyPair *begin, KeyPair *end)
FetchKeys(boost::begin(keys), boost::end(keys));
1 голос
/ 26 ноября 2010

В c / c ++ имя массива (любого типа) представляет адрес первого элемента массива, поэтому ключи и & keys [0] совпадают.Вы можете передать любой из них для KeyPair *.

1 голос
/ 26 ноября 2010

Вы просто звоните FetchKeys(keys);

РЕДАКТИРОВАТЬ

Обратите внимание, чтобы объявить FetchKeys 'тип возврата.

РЕДАКТИРОВАТЬ 2

Если вам также нужно количество элементов, вы добавляете размер как FetchKeys входные параметры:

void FetchKeys(KeyPair*, size_t size);

и звоните FetchKeys(keys, sizeof(keys)/sizeof(*keys));

BTW,сформулируйте все свои вопросы, отредактировав свой первый пост, если можете.

0 голосов
/ 26 ноября 2010

Я использую VS 2008, и это прекрасно работает для меня.

#include "stdafx.h"

typedef struct
{  
   int nNum; 
   CString str;   
}KeyPair;

void FetchKeys( KeyPair *pKeys);
int _tmain(int argc, _TCHAR* argv[])
{

    KeyPair keys[] = 
{    {0, _T("tester")},  
     {2, _T("yadah")},  
     {0, _T("tester")} 
};

    FetchKeys(keys); //--> just pass the initialized variable.
    return 0;
}

void FetchKeys(KeyPair *pKeys)
{
    printf("%d, %s\n",pKeys[0].nNum, pKeys[0].str);

}

Я не понимаю трудностей.поправьте меня если я ошибаюсь.Чтобы было проще, я избегал использования векторов, шаблонов и т. Д. Редактирование: чтобы узнать размер структуры, вы можете передать еще один аргумент.

0 голосов
/ 26 ноября 2010

См. Этот ответ: Как передать массив по ссылке на функцию в C ++?

Оберните это в структуру, красивый и легкий ..

#include <iostream>

struct foo
{
  int a;
  int b;
};

template <typename _T, size_t _size>
struct array_of
{
  static size_t size() { return _size; }
  _T data[_size];
};

template <typename _at>
void test(_at & array)
{
  cout << "size: " << _at::size() << std::endl;
}

int main(void)
{
  array_of<foo, 3> a = {{ {1,2}, {2,2}, {3,2} }};

  test(a);

}

РЕДАКТИРОВАТЬ: URGH, я не вижу панель инструментов для правильного форматирования кода, надеюсь, теги работают ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...