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

перевод значений неуправляемого массива в управляемый - C++

Восстановить пароль Регистрация
 
hamster28
0 / 0 / 0
Регистрация: 25.07.2012
Сообщений: 41
30.07.2013, 16:57     перевод значений неуправляемого массива в управляемый #1
Есть 2 массива. одинаковой длины. один неуправляемый двумерный. другой управляемый одномерный. я, конечно, могу присвоить поэлементно значениям управляемого значения неуправляемого, но хотелось бы одной функцией их приравнять и все. есть ли такая функция?
Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2013, 16:57     перевод значений неуправляемого массива в управляемый
Посмотрите здесь:

Не/ управляемый код С/С# указатели C++
Для каждого массива опpеделить сpеднее аpифметическое наибольшего и наименьшего значений массива C++
C++ Требуется написать код программы для расчета внутренних значений массива, если известны граничные значения массива.
Вопрос по передаче параметров в процу из C# в управляемый C+ C++
Перевод значений угла из градусной меры в радианную C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
es_
 Аватар для es_
198 / 198 / 46
Регистрация: 14.01.2013
Сообщений: 446
30.07.2013, 17:21     перевод значений неуправляемого массива в управляемый #2
А что значит неуправляемый и управляемый массивы?)
В цикле присваивать, так не пойдёт? Я что-то не припомню, что-бы в С++ был перевод из двумерного массива в одномерный(вектор).

Добавлено через 13 минут
C++
1
2
3
4
5
6
7
8
for (int i = 0; i < m; ++i)
{
 for(int j=0;j<n;j++)
 {
   Y[z]=X[i][j];
   z++;
 }
}
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
30.07.2013, 17:24     перевод значений неуправляемого массива в управляемый #3
memcpy
Tulosba
30.07.2013, 17:24
  #4

Не по теме:

Цитата Сообщение от es_ Посмотреть сообщение
А что значит неуправляемый и управляемый массивы?)
видимо ТС использует C++/CLI диалект и всякие gcnew.

Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
30.07.2013, 17:35     перевод значений неуправляемого массива в управляемый #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
int main()
{
    const int rows = 3;
    const int cols = 4;
    int a[rows][cols] = 
    {
        {1, 2,  3,  4},
        {5, 6,  7,  8},
        {9, 10, 11, 12},
    };
    
    const int size = rows * cols;
    int b[size];
 
    memcpy(b, *a, sizeof(a));
    
    for(int i = 0; i < size; ++i)
        std::cout << b[i] << " ";
 
    return 0;
}
hamster28
0 / 0 / 0
Регистрация: 25.07.2012
Сообщений: 41
31.07.2013, 10:18  [ТС]     перевод значений неуправляемого массива в управляемый #6
Schizorb,
C++
1
2
3
4
5
6
7
8
9
10
11
    const int rows = 3;
    const int cols = 4;
    int a[rows][cols] = 
    {
        {1, 2,  3,  4},
        {5, 6,  7,  8},
        {9, 10, 11, 12},
    };
    int bytes = rows*cols;
    array<Byte>^rgbValues = gcnew array<Byte>(bytes);
    memcpy(&rgbValues, *a, sizeof(a));
после выполнения последней строки длина rgbValues становится равной нулю... это с чего так? я неправильно функцию вызвал?
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
31.07.2013, 10:33     перевод значений неуправляемого массива в управляемый #7
hamster28, если бы я что-то понимал в этих майкрософтных штуках:

C++
1
array<Byte>^rgbValues = gcnew array<Byte>(bytes);
Посмотрите, может разберетесь: Memcpy of native array to managed array
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6171 / 2900 / 282
Регистрация: 04.12.2011
Сообщений: 7,708
Записей в блоге: 3
31.07.2013, 11:38     перевод значений неуправляемого массива в управляемый #8
hamster28, посмотрите здесь:
http://msdn.microsoft.com/ru-ru/library/9b1fy41s.aspx
Управляемый дискриптор, это не указатель "родного" C++ ещё и в том смысле, что он может изменяться во времени так как данные в управляемой куче могут перемещаться сборщиком мусора (gc). Булавкой пришпиливающей управляемый дескриптор является шаблонный указатель pin_ptr<>. Считается, что его применение может снизить скорость в целом. То есть, как я понимаю это может помочь лишь если массив очень большой.
hamster28
0 / 0 / 0
Регистрация: 25.07.2012
Сообщений: 41
01.08.2013, 10:40  [ТС]     перевод значений неуправляемого массива в управляемый #9
IGPIGP,
совем запутался.
pin_ptr<> "передает управляемый массив неуправляемой функции"
а что мне нужно изначально.
есть неуправляемый массив, его забить в битмап.

для этого
C++
1
2
3
4
5
6
7
8
9
10
11
12
System::Drawing::Rectangle rect = System::Drawing::Rectangle(0,0,scanBitmap->Width,scanBitmap->Height);
System::Drawing::Imaging::BitmapData^ scanBitmapData = scanBitmap->LockBits( rect, System::Drawing::Imaging::ImageLockMode::ReadWrite, scanBitmap->PixelFormat );
 
IntPtr ptr = scanBitmapData->Scan0;
 
int bytes = scanBitmapData->Stride * scanBitmap->Height;
array<Byte>^rgbValues = gcnew array<Byte>(bytes);
 
//потом преобразования над управляемым массиом rgbValues и запись его обратно в неуправляемую память
System::Runtime::InteropServices::Marshal::Copy (rgbValues, 0, ptr, bytes );
scanBitmap->UnlockBits(scanBitmapData);
scan->DrawImage(scanBitmap, 0, 0, pictureBox->Width, pictureBox->Height);
в преобразованиях я управляемому массиву с помощью цикла присваиваю значения неуправляемого массива (матрицы). и это долго.
нужно как-то эту матрицу по-другому засунуть в битмап.
то ли по-другому переводить значения неуправляемого массива в rgbValues, то ли сразу его как-то копировать в ptr.
?????
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6171 / 2900 / 282
Регистрация: 04.12.2011
Сообщений: 7,708
Записей в блоге: 3
01.08.2013, 12:40     перевод значений неуправляемого массива в управляемый #10
Цитата Сообщение от hamster28 Посмотреть сообщение
совcем запутался.
лучше сразу всё в управляемых дескрипторах делать (имхо). Маршалинг nativ->managed не моя стихия, но гляну вечерком.
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
02.08.2013, 02:39     перевод значений неуправляемого массива в управляемый #11
hamster28, это все та же история про черно-белое изображение из матрицы ?
Будем вспоминать ...
изображение черно-белое , значит красная, синяя, зеленая составляющая цвета пиксела равны
R = G = B
Создадим 24-битное изображение, прозрачность нам не нужна .
перевод значений неуправляемого массива в управляемый
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
array<Byte> ^  oneDimensArray = gcnew array<Byte> (arrayLenght);
   unsigned char** matrix   //  наша матрица 
....................................................
..................................................
 
  for (int j = 0; j < height; j++)
            {                  
                 for (int i = 0; i < width; i++)
                 {
                    oneDimensArray[counter]     = matrix[i][j];
                    oneDimensArray[counter + 1] = matrix[i][j];
                    oneDimensArray[counter + 2] = matrix[i][j];
                    counter += 3;
                }
            }
т.е. R G B равно значению матрицы ( R = G = B = matrix[i][j])
counter += 3; счетчик увеличиваем на 3 потому что у нас 3 байта на пиксел
(по 8 бит на красную, синюю и зеленую составляющую)

Поподробнее :
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
   int  width = //matrix width
              int  height = //matrix Height
              int counter = 0;
            unsigned char** matrix   //  наша матрица 
                
 
                //   
                // ЗАПОЛНЯЕМ МАТРИЦУ 
 
                // СОЗДАЕМ БИТМАП ПО РАЗМЕРУ МАТРИЦЫ 
               Bitmap^ bmp = gcnew Bitmap(width, height);
               Rectangle rect = Rectangle(0, 0, width, height);
               System::Drawing::Imaging::BitmapData^ bmpData = bmp->LockBits(rect, System::Drawing::Imaging::ImageLockMode::ReadWrite, PixelFormat::Format24bppRgb);
 
             //   Get the address of the first line.
               IntPtr ptr = bmpData->Scan0;
               int stride = Math::Abs(bmpData->Stride);
 
               //  УЗНАЕМ ДЛИНУ МАССИВА
               arrayLenght = stride * height; 
 
               // СОЗДАЕМ ОДНОМЕРНЫЙ МАССИВ 
               array<Byte> ^  oneDimensArray = gcnew array<Byte> (arrayLenght);
               
               // ЗАПОЛНЯЕМ МАССИВ ИЗ МАТРИЦЫ 
            for (int j = 0; j < height; j++)
            {                  
                 for (int i = 0; i < width; i++)
                 {
                    oneDimensArray[counter]     = matrix[i][j];
                    oneDimensArray[counter + 1] = matrix[i][j];
                    oneDimensArray[counter + 2] = matrix[i][j];
                    counter += 3;
                }
            }
            // Copy the RGB values back to the bitmap
            System::Runtime::InteropServices::Marshal::Copy(oneDimensArray, 0, ptr, arrayLenght);
 
            bmp->UnlockBits(bmpData);
                                 // удаляяем матрицу 
                for (int i = 0; i < width ; i++)
                     delete []matrix [i] ;
                delete [] matrix ;
 
            pictureBox1->Image = bmp;
hamster28
0 / 0 / 0
Регистрация: 25.07.2012
Сообщений: 41
02.08.2013, 15:25  [ТС]     перевод значений неуправляемого массива в управляемый #12
MrCold, спасибо большое, но в этом я как-то разобрался, применил. неплохо, но хотелось бы еще быстрее. поэтому и возник вопрос - можно ли обойтись совсем без цикла
C++
1
2
3
4
5
6
7
8
9
10
11
// ЗАПОЛНЯЕМ МАССИВ ИЗ МАТРИЦЫ 
            for (int j = 0; j < height; j++)
            {                  
                 for (int i = 0; i < width; i++)
                 {
                    oneDimensArray[counter]     = matrix[i][j];
                    oneDimensArray[counter + 1] = matrix[i][j];
                    oneDimensArray[counter + 2] = matrix[i][j];
                    counter += 3;
                }
            }
так сказать, на более низком, что ли, уровне перекинуть эти значения. чтоб без цикла вообще.
или это нереально?
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
02.08.2013, 21:19     перевод значений неуправляемого массива в управляемый #13
Цитата Сообщение от hamster28 Посмотреть сообщение
так сказать, на более низком, что ли, уровне перекинуть эти значения. чтоб без цикла вообще.
или это нереально?
Помнится вы собирались копировать часть изображения и перемещать его .Уж
не собрались ли вы делать это таким способом ?
Цитата Сообщение от hamster28 Посмотреть сообщение
for (int j = 0; j < height; j++)
* * * * * * { * * * * * * * * *
* * * * * * * * *for (int i = 0; i < width; i++)
* * * * * * * * *{
* * * * * * * * * * oneDimensArray[counter] * * = matrix[i][j];
* * * * * * * * * * oneDimensArray[counter + 1] = matrix[i][j];
* * * * * * * * * * oneDimensArray[counter + 2] = matrix[i][j];
* * * * * * * * * * counter += 3;
* * * * * * * * }
* * * * * * }
предложу на всякий случай
Клонирование битмапа
C++
1
2
Bitmap^ myBitmap = gcnew Bitmap("C:\\<path");
Image^ myImage = (Image^)myBitmap->Clone();
C++
1
2
3
4
Bitmap^ CopyBitmap(Bitmap^ source)
{
    return gcnew Bitmap(source);
}
Копия части битмапа
C#
1
2
3
4
5
6
7
8
Bitmap ^CopyBitmap(Bitmap^ source, Rectangle part)
{
    Bitmap^ bmp = gcnew Bitmap(part.Width, part.Height);
    Graphics^ g = Graphics::FromImage(bmp);
    g->DrawImage(source,0,0,part,GraphicsUnit::Pixel);
   delete  g;
    return bmp;
}
взято отсюда
http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx
Если не угадал, тогда уже не знаю что предложить
hamster28
0 / 0 / 0
Регистрация: 25.07.2012
Сообщений: 41
04.08.2013, 23:41  [ТС]     перевод значений неуправляемого массива в управляемый #14
MrCold, о нет, нет, копировать так я не собирался, слава богу))
просто идея создать битмап по матрице, но не поэлементно, в цикле, а сразу б, одной функцией, бах, и создал. у меня ж матрица. а тут битмап. прямо из матрицы. да за одно действие). размер матрицы соответствует размеру битмапа.
но если вы не предложили ничего такого, значит такого и нет в помине, а лишь в моих мечтах.
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
05.08.2013, 00:28     перевод значений неуправляемого массива в управляемый #15
Цитата Сообщение от hamster28 Посмотреть сообщение
вы не предложили ничего такого, значит такого и нет в помине
Почему же нет . Просто предложил то что знаю.
Вот что нашел Перебор пикселей на изображениях занимает очень много времени

Не по теме:

беда в том что вам нужно на С++\СLI
Определились бы уже . Если .NET - значит С# . Без .NET значит С++
Можно хотя-бы надеяться на помощь...
А то С++\СLI пугает местных жителей

hamster28
0 / 0 / 0
Регистрация: 25.07.2012
Сообщений: 41
05.08.2013, 00:32  [ТС]     перевод значений неуправляемого массива в управляемый #16
MrCold, да, я понял, что пора заканчивать мутотень с CLI. еще чуток покопаюсь и пора на c#.
еще смотрел в сторону qt. имеет смысл, по-вашему?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2013, 00:36     перевод значений неуправляемого массива в управляемый
Еще ссылки по теме:

C++ Управляемый value union
C++ Член класса управляемый не может относиться к типу класса не управляемый
C++ Управляемый препроцессинг

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

Или воспользуйтесь поиском по форуму:
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
05.08.2013, 00:36     перевод значений неуправляемого массива в управляемый #17
Цитата Сообщение от hamster28 Посмотреть сообщение
по-вашему?
До него еще не дошел Пока c# хватает
Но думаю что qt отличный выбор
Yandex
Объявления
05.08.2013, 00:36     перевод значений неуправляемого массива в управляемый
Ответ Создать тему
Опции темы

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