Двухмерный массив
От: Flex2 Россия  
Дата: 11.10.04 11:18
Оценка:
Доброе время суток.
Господа, как с помощью оператора new организовать 2-x мерный массив и как его потом "убить" ?
Например :
BYTE _cmd[120][10]; Как это организовать с помощью new ?
Re: Двухмерный массив
От: Аноним  
Дата: 11.10.04 11:25
Оценка:
Здравствуйте, Flex2, Вы писали:

F> Доброе время суток.

F>Господа, как с помощью оператора new организовать 2-x мерный массив и как его потом "убить" ?
F>Например :
F>BYTE _cmd[120][10]; Как это организовать с помощью new ?

Вот так BYTE _cmd = new BYTE[120][10]; — никак
Re: Двухмерный массив
От: _nn_ www.nemerleweb.com
Дата: 11.10.04 11:26
Оценка:
Здравствуйте, Flex2, Вы писали:

F> Доброе время суток.

F>Господа, как с помощью оператора new организовать 2-x мерный массив и как его потом "убить" ?
F>Например :
F>BYTE _cmd[120][10]; Как это организовать с помощью new ?

Поиском воспользуйтесь

Вариант 1:
BYTE** pcmd;

// new
pcmd=new BYTE*[120];
for(int i=0;i<120;i++)
 pcmd[i]=new BYTE[120];

// delete
for(int i=0;i<120;i++)
 delete pcmd[i];
delete pcmd;


Вариант 2:
#include <vector>

std::vector<std::vector<BYTE> > cmd;

cmd.resize(120);
for(int i=0;i<cdm.size();i++)
 cmd[i].resize(120);

// delete вызовется автоматически


Вариант 3 — свое изобретение %)
myinvention::array_2dim<BYTE> cmd(120,120);
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Двухмерный массив
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 11.10.04 11:29
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Здравствуйте, Flex2, Вы писали:


F>> Доброе время суток.

F>>Господа, как с помощью оператора new организовать 2-x мерный массив и как его потом "убить" ?
F>>Например :
F>>BYTE _cmd[120][10]; Как это организовать с помощью new ?

Вариант 4 :
BYTE *pcmd = new BYTE[120 * 10];
BYTE cell = pcmd[row * 120 + column];

delete [] pcmd;
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
HgLab: Mercurial Server and Repository Management for Windows
Re[3]: Двухмерный массив
От: Flex2 Россия  
Дата: 11.10.04 11:33
Оценка:
Здравствуйте, Нахлобуч, Вы писали:

Н>Здравствуйте, _nn_, Вы писали:


__>>Здравствуйте, Flex2, Вы писали:


F>>> Доброе время суток.

F>>>Господа, как с помощью оператора new организовать 2-x мерный массив и как его потом "убить" ?
F>>>Например :
F>>>BYTE _cmd[120][10]; Как это организовать с помощью new ?

Н>Вариант 4 :

Н>
Н>BYTE *pcmd = new BYTE[120 * 10];
Н>BYTE cell = pcmd[row * 120 + column];

Н>delete [] pcmd;
Н>

Спасибо, вот так работает. А доступ к конкретному элементу массива будет осуществляться как обычно? BYTE tmp_val = pcmd[5][2] — так пойдет ?
Или BYTE tmp_val = pcmd[5*2] ?;
Re[2]: Двухмерный массив
От: gribunin Россия  
Дата: 11.10.04 11:34
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Вариант 1:

__>
__>BYTE** pcmd;

__>// new
__>pcmd=new BYTE*[120];
__>for(int i=0;i<120;i++)
__> pcmd[i]=new BYTE[120];

__>// delete
__>for(int i=0;i<120;i++)
__> delete [] pcmd[i];
__>delete [] pcmd;
__>


Скобочки забыли
----------------
Кирилл Грибунин
Re: Двухмерный массив
От: Аноним  
Дата: 11.10.04 11:36
Оценка:
Здравствуйте, Flex2, Вы писали:

F> Доброе время суток.

F>Господа, как с помощью оператора new организовать 2-x мерный массив и как его потом "убить" ?
F>Например :
F>BYTE _cmd[120][10]; Как это организовать с помощью new ?

Это нужно для дела или просто интересно ? Если для дела то ни в коем случае не делай "голый" двумерный массив — напиши класс который проинкапсулирует все эти операции, если нужно могу подкинуть сурцы простеньких классов матриц/векторов
Re[4]: Двухмерный массив
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 11.10.04 11:40
Оценка:
Здравствуйте, Flex2, Вы писали:

F>Здравствуйте, Нахлобуч, Вы писали:


Н>>Вариант 4 :

Н>>
Н>>BYTE *pcmd = new BYTE[120 * 10];
Н>>BYTE cell = pcmd[row * 120 + column];

Н>>delete [] pcmd;
Н>>

F>Спасибо, вот так работает. А доступ к конкретному элементу массива будет осуществляться как обычно? BYTE tmp_val = pcmd[5][2] — так пойдет ?
F>Или BYTE tmp_val = pcmd[5*2] ?;

Вах! Подошло
Нет, не так немного. Пусть row — номер искомой строки, column — номер искомого столбца (оба zero-based), width — "ширина" массива,
height — его "высота". Тогда

BYTE *pcmd = new BYTE[width * height];
// ...
BYTE ItemAtRowColumn = pcmd[row * width + column]; // Получили column'ый элемент row'ной строки :)
// ...
delete [] pcmd;
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
HgLab: Mercurial Server and Repository Management for Windows
Re[3]: Двухмерный массив
От: _nn_ www.nemerleweb.com
Дата: 11.10.04 11:40
Оценка:
Здравствуйте, gribunin, Вы писали:

G>Здравствуйте, _nn_, Вы писали:


__>>Вариант 1:

__>>
__>>BYTE** pcmd;

__>>// new
__>>pcmd=new BYTE*[120];
__>>for(int i=0;i<120;i++)
__>> pcmd[i]=new BYTE[120];

__>>// delete
__>>for(int i=0;i<120;i++)
__>> delete [] pcmd[i];
__>>delete [] pcmd;
__>>


G>Скобочки забыли

Угу
Это наглядный показатель что лучше использовать обертки, а не голые указатели
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Двухмерный массив
От: Flex2 Россия  
Дата: 11.10.04 11:44
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Flex2, Вы писали:


F>> Доброе время суток.

F>>Господа, как с помощью оператора new организовать 2-x мерный массив и как его потом "убить" ?
F>>Например :
F>>BYTE _cmd[120][10]; Как это организовать с помощью new ?

А>Это нужно для дела или просто интересно ? Если для дела то ни в коем случае не делай "голый" двумерный массив — напиши класс который проинкапсулирует все эти операции, если нужно могу подкинуть сурцы простеньких классов матриц/векторов


Ага, для дела. Это буфер команд для железяки на ком- порту. Отправляю команду, она помещается в буфер, а поток этот буфер циклически читает. Через объявление массива буфера , напрмер _сmd[120,20] тож работает, но этот буфер 1 для 1 ком порта, а каждый порт обслуживает 4 устройства ввода-вывода, тоесть для процесса обслуживающий порт он у меня глобальный, вот хочу его сделать volatile, через malloc процесс падает, через объявление буфера как массива работает нормально и правильно инициализируется, а вот чтние — запись временами глючит. Попробовал с 1 массивом через new ( он сам знает в зависимости от выделяемого объма что как и кому выделить), все окейно пашет, теперь
нужно первести этот буфер тож на new, к тому же можно volatile ему подсунуть. Вообщем борьба за живучесть.
Re[3]: Двухмерный массив
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 11.10.04 11:53
Оценка:
Здравствуйте, Flex2, Вы писали:

F>Ага, для дела. Это буфер команд для железяки на ком- порту. Отправляю команду, она помещается в буфер, а поток этот буфер циклически читает. Через объявление массива буфера , напрмер _сmd[120,20] тож работает, но этот буфер 1 для 1 ком порта, а каждый порт обслуживает 4 устройства ввода-вывода, тоесть для процесса обслуживающий порт он у меня глобальный, вот хочу его сделать volatile, через malloc процесс падает, через объявление буфера как массива работает нормально и правильно инициализируется, а вот чтние — запись временами глючит. Попробовал с 1 массивом через new ( он сам знает в зависимости от выделяемого объма что как и кому выделить), все окейно пашет, теперь

F>нужно первести этот буфер тож на new, к тому же можно volatile ему подсунуть. Вообщем борьба за живучесть.

А, пардон, словосочетание "синхронизация потоков" вам знакомо?
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
HgLab: Mercurial Server and Repository Management for Windows
Re[4]: Двухмерный массив
От: Flex2 Россия  
Дата: 11.10.04 11:58
Оценка:
Здравствуйте, Нахлобуч, Вы писали:

Н>Здравствуйте, Flex2, Вы писали:


F>>Ага, для дела. Это буфер команд для железяки на ком- порту. Отправляю команду, она помещается в буфер, а поток этот буфер циклически читает. Через объявление массива буфера , напрмер _сmd[120,20] тож работает, но этот буфер 1 для 1 ком порта, а каждый порт обслуживает 4 устройства ввода-вывода, тоесть для процесса обслуживающий порт он у меня глобальный, вот хочу его сделать volatile, через malloc процесс падает, через объявление буфера как массива работает нормально и правильно инициализируется, а вот чтние — запись временами глючит. Попробовал с 1 массивом через new ( он сам знает в зависимости от выделяемого объма что как и кому выделить), все окейно пашет, теперь

F>>нужно первести этот буфер тож на new, к тому же можно volatile ему подсунуть. Вообщем борьба за живучесть.

Н>А, пардон, словосочетание "синхронизация потоков" вам знакомо?


С этим все нормально. И ожидающие функции и критические секции и интерлокед функции
при изменении указателей текущей позиции считанных и записанных данных и отлаженный алгоритм циклического чтения все ОК! Но ведь при таком выделении глючит а при экспериментах над new не глючит. Что прикажете делать-то ? Переводиться на new. Причем тут такая особенносить, по Win 2000 глучит реже чем по XP.
Re[2]: Двухмерный массив
От: Flex2 Россия  
Дата: 11.10.04 12:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Flex2, Вы писали:


F>> Доброе время суток.

F>>Господа, как с помощью оператора new организовать 2-x мерный массив и как его потом "убить" ?
F>>Например :
F>>BYTE _cmd[120][10]; Как это организовать с помощью new ?

А>Это нужно для дела или просто интересно ? Если для дела то ни в коем случае не делай "голый" двумерный массив — напиши класс который проинкапсулирует все эти операции, если нужно могу подкинуть сурцы простеньких классов матриц/векторов


Да, буду признателен. На lexmal@inbox.ru
Re: Двухмерный массив
От: vdimas Россия  
Дата: 11.10.04 23:20
Оценка:
Здравствуйте, Flex2, Вы писали:

F> Доброе время суток.

F>Господа, как с помощью оператора new организовать 2-x мерный массив и как его потом "убить" ?
F>Например :
F>BYTE _cmd[120][10]; Как это организовать с помощью new ?

так и организовать:

    typedef int arr_10x20[10][20];

    int (*arr)[20]=new arr_10x20;
    arr[1][5]=10;
    delete[] arr;


или, учитывая, что в двумерном массиве на момент компиляции должна быть известна только "ширина" пишем так:

    typedef int row_20[20];

    row_20  *arr=new row_20[10]; // 10 строк по 20 элементов
    a[1][5]=10;
    delete[] arr;
Re[2]: Двухмерный массив
От: vdimas Россия  
Дата: 11.10.04 23:24
Оценка:
блин, поторопился, надо в первом случае так::

V>
V>    typedef int arr_10x20[10][20];

V>    int (*arr)[20]=new arr_10x20;
V>    arr[1][5]=10;
V>    delete arr;
V>
Re[5]: Двухмерный массив
От: Аноним  
Дата: 12.10.04 06:34
Оценка:
Если пишешь дровину , лучше вообще VirtualAlloc какойнить юзай.
А в порт пиши out/in или используй соответствующие ресурсы hal.dll для ком порта скорость не критична.
Поэтому комманды для передачи массивов слов использовать не смысла.
Если же ты используешь обычное приложение 3-его кольца через DeviceIoControl обращаешься к символьной линке ,
тогда другое дело и твой подход оптимален,но всеже я бы использовал vector лучше нежели массив.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.