Передать массив wchar по ссылке - PullRequest
1 голос
/ 28 июня 2011

Я хочу сделать функцию для выделения памяти массиву.Предположим, у меня есть это:

PWSTR theStrings[] = { L"one", L"two", L"three" };

void foo(PWSTR a, int b) {
    a=new PWSTR[b];
    for(int i=0;i<b;i++) a[i]=L"hello";
    return;
}

int main() {
    foo(theStrings,4);
}

Мой вопрос заключается в том, как сделать функцию foo и вызов этой функции так, чтобы после вызова foo theStrings содержали четыре "привет"

Спасибо :) Рейнардус

Ответы [ 4 ]

2 голосов
/ 28 июня 2011

Есть две вещи, которые вы должны сделать, чтобы эта работа работала:

Во-первых, вы должны использовать динамически размещаемый массив, а не статически размещенный массив.В частности, измените строку

PSWTR theStrings[] = { L"one", L"two", L"three" };

на

PWSTR * theString = new PWSTR[3];
theString[0] = L"one";
theString[1] = L"two";
theString[2] = L"three";

Таким образом, вы имеете дело с указателем, который можно изменить, чтобы он указывал на другую область памяти, в отличие отв статический массив, который использовал фиксированную часть памяти.

Во-вторых, ваша функция должна принимать либо указатель на указатель, либо ссылку на указатель.Две подписи выглядят примерно так (соответственно):

void foo(PWSTR ** a, int b); // pointer to pointer
void foo(PWSTR *& a, int b); // reference to pointer

Опция ссылки на указатель хороша, поскольку вы можете в значительной степени использовать свой старый код для foo:

void foo(PWSTR *& a, int b) {
    a = new PWSTR[b];
    for(int i=0;i<b;i++) a[i]=L"hello";
}

И вызов foo по-прежнему

foo(theStrings, 4);

Таким образом, почти ничего не должно быть изменено.

С параметром указатель-указатель вы всегда должны разыменовывать aпараметр:

void foo(PWST ** a, int b) {
    *a = new PWSTR[b];
    for(int i = 0; i<b; i++) (*a)[i] = L"hello";
}

и должен вызвать foo, используя адрес оператора:

foo(&theStrings, 4);
1 голос
/ 28 июня 2011
PWSTR theStrings[] = { L"one", L"two", L"three" };

void foo(PWSTR& a, int b) {
    a=new PWSTR[b];
    for(int i=0;i<b;i++) a[i]=L"hello";
    return;
}

int main() {
    PWSTR pStrings = theStrings;
    foo(pStrings,4);
}

Но вместо этого рассмотрите возможность использования std::vector и std::wstring и т. Д.

Кроме того, в любом случае рассмотрите возможность использования результата функции (return) для результатов функции вместо аргументов in / out.

Приветствия и hth.,

0 голосов
/ 28 июня 2011

вероятно, измените его на что-то вроде

void foo (PWSTR * a, int b)

и

foo (& thestrings, 4);

0 голосов
/ 28 июня 2011

Если вам не нужно использовать PWSTR, вы можете использовать std::vector< std::string > или std::valarray< std::string >.

Если вы хотите хранить Unicode-строки (или широкие символы), замените std::string на std::wstring.

Здесь вы можете узнать, как преобразовать CString / LPCTSTR / PWSTR в std :: string: Как преобразовать различные строковые типы .

...