Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
429 / 383 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
1

Создание вектора wstring через указатели

16.07.2013, 10:38. Показов 697. Ответов 9
Метки нет (Все метки)

Вот так правильно? Обратите особое внимание на цикл do-while.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
vector<wstring> MachinesList;
 
bool createMachinesList() {
    IVirtualBox* VirtualBox;
    HRESULT rc = VirtualBoxClient->get_VirtualBox(&VirtualBox);
    if (FAILED(rc)) return false;
    
    SAFEARRAY* MachinesArray = NULL;
    rc=VirtualBox->get_Machines(&MachinesArray);
    if (FAILED(rc)) return false;
    
    IMachine **Machines;
    rc = SafeArrayAccessData (MachinesArray, (void **) &Machines);
    if (FAILED(rc)) return false;
 
    ULONG i = MachinesArray->rgsabound[0].cElements;
    if (i == 0) return false;
    MachinesList.reserve(i);
    
    do {
        wstring* MachineID = NULL;
        rc = Machines[--i]->id(&MachineID);
        if FAILED(rc) return false;
        MachinesList.push_back(*MachineID);
    } while (i != 0);
    
    SafeArrayUnaccessData (MachinesArray);
    SafeArrayDestroy (MachinesArray);
    return true;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.07.2013, 10:38
Ответы с готовыми решениями:

Не меняются значения элементов вектора через указатели
Вот учусь программировать. Дошел до всяких там указателей. Программа выводит два числа: ...

Через указатели на указатели посчитать сумму двух чисел и записать в третье
1. Через указатели на указатели посчитать сумму двух чисел и записать в третье. 2. Написать...

Написать программу сортировки через указатели на указатели
Вот моя программа #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;string&gt; using namespace...

Указатели, вектора
Добрый день! Помогите написать код, желательно на С Тема: указатели на функции Нужно написать...

9
Эксперт С++
8378 / 6114 / 613
Регистрация: 10.12.2010
Сообщений: 28,530
Записей в блоге: 30
20.07.2013, 15:26 2
C++
1
2
3
4
5
6
7
do 
  {
     wstring* MachineID = NULL;
     rc = Machines[--i]->id(&MachineID);
     if FAILED(rc) return false;
     MachinesList.push_back(*MachineID);
  } while (i != 0);
А где тут присвоение значения MachineID ?

Или Machines[--i]->id(); меняет указатель MachineID?
0
429 / 383 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
21.07.2013, 09:04  [ТС] 3
Цитата Сообщение от Avazart Посмотреть сообщение
А где тут присвоение значения MachineID ?

Или Machines[--i]->id(); меняет указатель MachineID?
Да, id() вызывается с параметром &MachineID. А у вас эта фукнция отображается так, как Вы процитировали? Странно.
0
Эксперт С++
8378 / 6114 / 613
Регистрация: 10.12.2010
Сообщений: 28,530
Записей в блоге: 30
21.07.2013, 13:05 4
Так что не так работает ?
А то тяжело что-либо по коду сказать.
0
429 / 383 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
21.07.2013, 18:32  [ТС] 5
Цитата Сообщение от Avazart Посмотреть сообщение
Так что не так работает ?
Я даже не пробовал запускать пока, проверяю по частям, нет ли явных ошибок типа отсутствующих/лишних звёздочек.

А то тяжело что-либо по коду сказать.
Вот почему С++ является самым моим нелюбимым языком. Использую его по минимуму, и только там, где никак не обойтись. Обычно я нужные функции выношу в отдельную ДЛЛ. В половине случаев заказываю её фрилансеру. Собственно, это оно и есть. Я получил исходники, но мне кое-что не понравилось, и я решил чуточку переписать.
0
Эксперт С++
8378 / 6114 / 613
Регистрация: 10.12.2010
Сообщений: 28,530
Записей в блоге: 30
21.07.2013, 18:42 6
Да как бы дело не в С++ а в "огрызке кода" вырванного из контекста, кроме того стиль написания как по мне не очень, но это возможно по тому что код использует какие-то либы Си

Добавлено через 5 минут
C++, STL
C++
1
vector<wstring> MachinesList;
В духе Си
C
1
2
3
IVirtualBox* VirtualBox;
HRESULT rc = VirtualBoxClient->get_VirtualBox(&VirtualBox);
if (FAILED(rc)) return false;
0
429 / 383 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
22.07.2013, 09:35  [ТС] 7
Цитата Сообщение от Avazart Посмотреть сообщение
Да как бы дело не в С++ а в "огрызке кода" вырванного из контекста, кроме того стиль написания как по мне не очень, но это возможно по тому что код использует какие-то либы Си
Я же объяснил, что сам алгоритм написан другим человеком, а я, по большому счёту, переоформил в своём (уж наверняка не самом лучшем, но в своём) стиле. Например, изначально код состоял из трёх больших функций, а я, наоборот, пишу настолько маленькие функции, насколько это возможно. Иногда даже две-три строчки. Но в данном случае это затруднительно, потому что используется Virtualbox SDK. Всё это, видимо, и наложило какой-то отпечаток.

P.S. В принципе, от vector можно отказаться, тем более что строки имеют строго определённую длину (это UUID). Но я плохо знаю C++, вот и решил попроще и понадёжнее сделать.
0
Эксперт С++
8378 / 6114 / 613
Регистрация: 10.12.2010
Сообщений: 28,530
Записей в блоге: 30
22.07.2013, 12:48 8
Цитата Сообщение от Vtulhu Посмотреть сообщение
потому что используется Virtualbox SDK.
Обвернуть нужный ф-ционал API в класс что бы он не маячил си стилем.

Добавлено через 2 минуты
Цитата Сообщение от Vtulhu Посмотреть сообщение
а я, наоборот, пишу настолько маленькие функции, насколько это возможно.
Обычно разбивают по назначению, а не по размеру ( и конечно с учетом дальнейшего пользователя.)
0
429 / 383 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
22.07.2013, 14:43  [ТС] 9
Цитата Сообщение от Avazart Посмотреть сообщение
Обвернуть нужный ф-ционал API в класс что бы он не маячил си стилем.
Была у меня такая мысль, но я счёл это избыточным. Это довольно простой враппер вокруг одной функции VB SDK.

Обычно разбивают по назначению, а не по размеру ( и конечно с учетом дальнейшего пользователя.)
Я и не говорил, что разбиваю по размеру. Разумеется, в зависимости от назначения может получиться функция и в две, и в двадцать строк. И даже функция из одной строки иногда имеет смысл. Речь шла о том, что в данной ситуации я бы ещё кое-где сделал разбиения, но не могу. Частично из-за специфики SDK, частично из-за своего незнания С++.

В общем, дискуссия пошла куда-то не туда. Меня интересовало только, не напортачил ли я в этом куске кода. В остальных кусках я ничего особо не менял, только переставлял местами. Так что там я уверен. Можете посоветовать, как оптимизировать эту часть. Например, если я правильно понимаю, можно vector легко на массив wchar заменить. Длина одной строки заранее известна. Количество строк заранее неизвестно, но уж точно не более десятка. После создания массива он уже не будет меняться, только читать из него.
0
Эксперт С++
8378 / 6114 / 613
Регистрация: 10.12.2010
Сообщений: 28,530
Записей в блоге: 30
22.07.2013, 14:59 10
Цитата Сообщение от Vtulhu Посмотреть сообщение
Частично из-за специфики SDK
Я не работал с ним и не знаю, нужно смотреть именно в документацию что бы что-то сказать.
Стоит обратить особое внимание на освобождение ресурсов ( хендлов, строк итп)

Добавлено через 2 минуты
Цитата Сообщение от Vtulhu Посмотреть сообщение
C++
1
rc = Machines[--i]->id(&MachineID);
В данном случае до конца не ясно как работать с присваиваемым указателем, нужно ли освобождать как либо память по его адресу.

Добавлено через 4 минуты
Если бы создавать класс, то можно было бы организовать вывод ошибок( и вероятно можно получить их описание) в лог, что позволило бы удобно отлаживать программу и судить от правильности кода.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.07.2013, 14:59

Создание нового вектора посредством выборки значений данного вектора
Добрый день! Знаю, вопрос совсем простецкий, но как-то я совсем запуталась... Есть вектор из...

Создание контейнера (вектора), хранящего вектора разной размерности
Можно ли в матлабе создать вектор, который будет хранить вектора разной размерности? Добавлено...

Вектора Указатели и RDP ActiveX
1 std::vector&lt;TMsRdpClient9NotSafeForScripting&gt; *rdp = new...

Объясните, что означает wstring input = L""; и wstring output = L""; ?
Непонятно особенно L&quot;&quot;.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.