C++ передать по ссылке WCHAR** в функцию
Я написал следующий код, где я передаю WCHAR**
ссылка на функцию для того, чтобы получить ее внутри функции. Внутри функции я заполняю этот двумерный массив. Я пытаюсь использовать проход по ссылке, чтобы сделать это.
BOOL get_file_names(WCHAR** outname)
{
WCHAR **outhandlername = NULL;
if (get_all_the_file_handelers( &outhandlername) > 0)
{
(*outname)[0] = *outhandlername[0];
}
return ret;
}
int get_all_the_file_handelers(WCHAR** outhandleName )
{
for (i = 0; i < 10; i++)
{
WCHAR *handleName = get_handle_name(handle, i);
outhandleName = (WCHAR**)realloc(outhandleName, sizeof(WCHAR)*(10 + 1));
(*outhandleName) = (WCHAR*)realloc(*outhandleName, sizeof(WCHAR)*(1024));
*outhandleName = handleName;
}
return 0;
}
Но это, похоже, не работает, кто-нибудь может мне помочь понять, как передача по ссылке работает для массива WCHAR
в таком случае Когда у меня есть WHCAR**
что правильно пройти &WCHAR
для второй функции, а внутри второй функции, как я должен назначать значения для 2-мерного WCHAR
массив
int _tmain(int argc, _TCHAR* argv[])
{
WCHAR *outhandlename=NULL;
get_file_names(&outhandlename);
DBGLOG("handler name %ls", outhandlename);
return 0;
}
BOOL process_search_file_handle( WCHAR** str)
{
*str = (WCHAR*) malloc(1024);
*str = L"TestName";
return true;
}
BOOL get_file_names(WCHAR** outname)
{
WCHAR **outhandlername = NULL;
if (get_all_the_file_handelers( &outhandlername) > 0)
{
*outname = outhandlername[0];
DBGLOG("outhandlername value %ls", outhandlername[0]);
DBGLOG("str value %ls", *outname);
}
return true;
}
2 ответа
Установив outHandleName на выход realloc, вы уже перезаписали outHandleName, поэтому вы не сможете изменить значение outHandleName из вызывающей функции.
Ты мог бы сказать:
*outHandleName = (WCHAR**) realloc(...);
Вам также придется изменить заголовок метода для get_all_the_file_handelers
чтобы:
int get_all_the_file_handelers(WCHAR *** outHandleName)
Это потому, что вы используете указатель на двойной указатель в этом методе.
Кроме того, вы не передаете по ссылке - вы передаете по указателю.
Кроме того, вы не должны использовать realloc здесь, так как вы делаете начальное выделение для массива. Ваш массив из 10 элементов должен быть размещен до цикла, например:
*outHandleName = (WCHAR **)malloc(sizeof(WCHAR *)*(10+1));
(*outHandleName)[10] = NULL;
Обратите внимание, что нулевое присваивание - вы выделяете пространство для 11 элементов в массиве из 10 элементов, поэтому я предполагаю, что вы используете последний элемент в качестве заполнителя - как NULL - для пометки конца массива.
Наконец, вам не нужно выделять пространство для буфера строк для каждого из 10 дескрипторов, так как вы получаете строку обратно из get_handle_name.
В качестве бонуса вы ничего не возвращаете, хотя остальная часть вашего кода предполагает, что вы это делаете.
Окончательный метод будет:
int get_all_the_file_handelers(WCHAR ***outHandleName) {
*outHandleName = (WCHAR **)malloc(sizeof(WCHAR *)*11);
(*outHandleName)[10] = NULL;
for(int i = 0; i < 10; i++) {
WCHAR *handleName = get_handle_name(handle, i);
(*outHandleName)[i] = handleName;
}
return .... /* WHAT AM I RETURNING?? */ ;
}
Вот пример кода, который генерирует список широких строк с использованием стандартной библиотеки. Позже вы должны научиться обращаться с массивами указателей, но я предлагаю вам сначала научиться использовать STL.
#include <cstdlib>
#include <experimental/filesystem>
#include <iostream>
#include <locale>
#include <string>
#include <vector>
#if _WIN32 || _WIN64
// Windows needs a little non-standard magic for this to work.
#include <io.h>
#include <fcntl.h>
#include <locale.h>
#endif
using std::endl;
using std::size_t;
using std::wcout;
using std::experimental::filesystem::path;
void init_locale(void)
// Does magic so that wcout can work.
{
#if _WIN32 || _WIN64
// Windows needs a little non-standard magic.
constexpr char cp_utf16le[] = ".1200";
setlocale( LC_ALL, cp_utf16le );
_setmode( _fileno(stdout), _O_U16TEXT );
#else
// The correct locale name may vary by OS, e.g., "en_US.utf8".
constexpr char locale_name[] = "";
std::locale::global(std::locale(locale_name));
std::wcout.imbue(std::locale());
#endif
}
std::vector<std::wstring> files_in_wd()
// Returns a list of filenames in the current working directory.
{
const path cwd = std::experimental::filesystem::current_path();
std::vector<std::wstring> filenames;
for ( const path& file : cwd )
filenames.emplace_back( file.filename().wstring() );
return filenames;
}
int main(void)
{
init_locale();
const std::vector<std::wstring> filenames = files_in_wd();
for ( const std::wstring& ws : filenames )
wcout << ws << endl;
return EXIT_SUCCESS;
}