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;
}
Другие вопросы по тегам