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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Divergence
7 / 7 / 0
Регистрация: 19.06.2013
Сообщений: 174
#1

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

25.06.2014, 01:52. Просмотров 320. Ответов 7
Метки нет (Все метки)

Всем привет!
У меня есть указатель типа 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 лежит что-то полезное
Тем не менее, замешательства у меня от этого меньше не становится...
Пожалуйста, помогите кто-чем сможет
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2014, 01:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как правильно скопировать void* v_buf в char* c_buf, не зная размера v_buf (C++):

Как сравнить char*, зная длинну? - C++
Привет. Допустим есть указатель на какой либо символ у массива символов. Пример: const char* buffer = ...; ... int...

Как скопировать содержимое строки char? - C++
У меня в структуре есть член структуры char* text; и const temp char* = CharToDouble(10) Что-то у меня не получается через strcat положить...

Как узнать параметры изображения, если оно представлено в виде const void* и размера данных - C++
Доброго. Собственно проблема в шапке. Файл изображения скачивается из интернета. Смотрел в сторону GDIplus, ничего путного пока не...

Как скопировать файл, зная только его имя без расширения? - CMD/BAT
Нужно скопировать файл,зная только его название,но не зная расширения.

Как пробежаться по массиву в цикле, не зная его размера - Visual Basic .NET
Например: надо суммировать первый элемент массива А1(0) с каждым элементом массива А2(i) что-бы не задавать 100 проходов For i=0 to...

Как правильно вызвать -(void)setNeedsDisplay? - Objective-C
Здравствуйте, форумчане. Собственно начал изучать сей язык. Решил написать программку, которая рисует график функции по некоторому...

7
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
25.06.2014, 02:24 #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];
}
1
Divergence
7 / 7 / 0
Регистрация: 19.06.2013
Сообщений: 174
25.06.2014, 02:29  [ТС] #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*, и спокойно считываем буфер через нее?
Забавно... Спасибо за идею!
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
25.06.2014, 02:30 #4
для джедаев:
C++
1
2
3
4
for(int i=0; i < 1000; i++)
{
   c_buf[i] = static_cast<char *>(v_buf)[i];
}
0
Divergence
7 / 7 / 0
Регистрация: 19.06.2013
Сообщений: 174
25.06.2014, 02:31  [ТС] #5
А можно ли как то определить где заканчивается память, на которую указывает void*?
У меня в реальности, пока нет четкой границы для цикла, а условие подходящее тоже придумать не получается...
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
25.06.2014, 02:33 #6
Цитата Сообщение от Divergence Посмотреть сообщение
А можно ли как то определить где заканчивается память, на которую указывает void*?
Никак, указатель - это просто адрес, неважно на какой тип он ссылается.
1
Divergence
7 / 7 / 0
Регистрация: 19.06.2013
Сообщений: 174
25.06.2014, 02:39  [ТС] #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;
}
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
25.06.2014, 02:44 #8
Хотя, если выделяется блок памяти в куче, то где то хранится и его размер (скорее всего перед первым элементом) для его дальнейшего удаления; но это всё шаманство с реализацией...

Добавлено через 3 минуты
Цитата Сообщение от Divergence Посмотреть сообщение
memcpy(v_buf, str, 17);
Что бы в ручную не считать, размер статического массива можно найти так:
C++
1
sizeof (str) / sizeof (*str)
1
25.06.2014, 02:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2014, 02:44
Привет! Вот еще темы с ответами:

Народ как скопировать из массива char x[] с позиции - C (СИ)
Народ как скопировать из массива char x с позиции n до позиции f, например есть массив char исходная = &quot;1234567890&quot; char выход; ...

Как правильно заполнить массив из указателей типа void* - C (СИ)
Насколько я понимаю, его можно заполнить, только присваивая адреса элементам Как это реализовать, если данные вводятся с клавиатуры? ...

Internal Void? как правильно аргумент преобразовать в int - C#
using System; using ConsoleApp2; using ConsoleApp2.Fifo; using System; using System.Collections.Generic; using System.Linq; ...

Как скопировать все *.jpg файлы с рабочего стола в папку на рабочем столе, не зная имени пользователя в пути? - C#
Как скопировать все *.jpg файлы с рабочего стола в папку на рабочем столе, не зная имени пользователя в пути? Читал про...


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

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

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