Форум программистов, компьютерный форум CyberForum.ru

Как правильно скопировать void* v_buf в char* c_buf, не зная размера v_buf - C++

Восстановить пароль Регистрация
 
Divergence
 Аватар для Divergence
7 / 7 / 0
Регистрация: 19.06.2013
Сообщений: 174
25.06.2014, 01:52     Как правильно скопировать void* v_buf в char* c_buf, не зная размера v_buf #1
Всем привет!
У меня есть указатель типа void на здоровенный кусок данных.
Эти данные мне нужно формализовать для обработки в массив char'ов.
Тут, видимо нужно использовать static_cast или dinamy_cast... Я с этими темами практически не знаком, даже пока не знаю куда точно думать...

Вот то, что я пытаюсь сделать:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void main(void)
{
void* v_buf = new char[1000];
char* c_buf = new char[1000];
 
for(int i=0; i < 1000; i++)
{
c_buf[i] = static_cast<char>v_buf[i]; //Вот тут я в полном замешательстве, спасайте((((
}
 
delete[] v_buf;
delete[] c_buf;
 
}
Естественно, это тестовый пример и в реальности по указателю v_buf лежит что-то полезное
Тем не менее, замешательства у меня от этого меньше не становится...
Пожалуйста, помогите кто-чем сможет
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2014, 01:52     Как правильно скопировать void* v_buf в char* c_buf, не зная размера v_buf
Посмотрите здесь:

C++ написать програму void(char source[] ,char dest[]) которая скопирует все символы из source[] ,которые не принадлежат алфавиту , в dest[].
C++ Как узнать параметры изображения, если оно представлено в виде const void* и размера данных
Преобразование из «void*» в «char*» C++
преобразование void в char C++
C++ Как сравнить char*, зная длинну?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
25.06.2014, 02:24     Как правильно скопировать void* v_buf в char* c_buf, не зная размера v_buf #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Divergence Посмотреть сообщение
C++
1
2
3
4
for(int i=0; i < 1000; i++)
{
c_buf[i] = static_cast<char>v_buf[i]; //Вот тут я в полном замешательстве, спасайте((((
}
C++
1
2
3
4
5
char * v_buf_ref = static_cast<char *>(v_buf);
for(int i=0; i < 1000; i++)
{
   c_buf[i] = v_buf_ref[i];
}
Divergence
 Аватар для Divergence
7 / 7 / 0
Регистрация: 19.06.2013
Сообщений: 174
25.06.2014, 02:29  [ТС]     Как правильно скопировать void* v_buf в char* c_buf, не зная размера v_buf #3
Цитата Сообщение от gray_fox Посмотреть сообщение
C++
1
2
3
4
5
char * v_buf_ref = static_cast<char *>(v_buf);
for(int i=0; i < 1000; i++)
{
  c_buf[i] = v_buf_ref[i];
}
То есть, смысл в том, что мы создаем вторую ссылку на ту же область памяти, при этом делаем эту ссылку типа char*, и спокойно считываем буфер через нее?
Забавно... Спасибо за идею!
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
25.06.2014, 02:30     Как правильно скопировать void* v_buf в char* c_buf, не зная размера v_buf #4
для джедаев:
C++
1
2
3
4
for(int i=0; i < 1000; i++)
{
   c_buf[i] = static_cast<char *>(v_buf)[i];
}
Divergence
 Аватар для Divergence
7 / 7 / 0
Регистрация: 19.06.2013
Сообщений: 174
25.06.2014, 02:31  [ТС]     Как правильно скопировать void* v_buf в char* c_buf, не зная размера v_buf #5
А можно ли как то определить где заканчивается память, на которую указывает void*?
У меня в реальности, пока нет четкой границы для цикла, а условие подходящее тоже придумать не получается...
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
25.06.2014, 02:33     Как правильно скопировать void* v_buf в char* c_buf, не зная размера v_buf #6
Цитата Сообщение от Divergence Посмотреть сообщение
А можно ли как то определить где заканчивается память, на которую указывает void*?
Никак, указатель - это просто адрес, неважно на какой тип он ссылается.
Divergence
 Аватар для Divergence
7 / 7 / 0
Регистрация: 19.06.2013
Сообщений: 174
25.06.2014, 02:39  [ТС]     Как правильно скопировать void* v_buf в char* c_buf, не зная размера v_buf #7
Кстати, чтобы полностью закрыть вопрос, до меня только что дошло как это можно сделать проще:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <conio.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    char str[] = "OMG WHAT A HELL!";
    void* v_buf = new char[1000];
    char* c_buf = new char[1000];
    memcpy(v_buf, str, 17); //Копируем в память из под void* что-то осмысленное
    memcpy(c_buf, v_buf, 17); //Копируем из памяти с указателем void* в память под указателем char*
 
    for(int i =0; i < 1000; i++)
    {
        cout<<c_buf[i];
        _getch();
    }
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2014, 02:44     Как правильно скопировать void* v_buf в char* c_buf, не зная размера v_buf
Еще ссылки по теме:

C++ Ввод массива не зная размера
C++ Как скопировать содержимое строки char?
C++ Static function 'void leave(char *)' declared but not defined

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

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
25.06.2014, 02:44     Как правильно скопировать void* v_buf в char* c_buf, не зная размера v_buf #8
Хотя, если выделяется блок памяти в куче, то где то хранится и его размер (скорее всего перед первым элементом) для его дальнейшего удаления; но это всё шаманство с реализацией...

Добавлено через 3 минуты
Цитата Сообщение от Divergence Посмотреть сообщение
memcpy(v_buf, str, 17);
Что бы в ручную не считать, размер статического массива можно найти так:
C++
1
sizeof (str) / sizeof (*str)
Yandex
Объявления
25.06.2014, 02:44     Как правильно скопировать void* v_buf в char* c_buf, не зная размера v_buf
Ответ Создать тему
Опции темы

Текущее время: 17:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru