Доброе время суток.
Господа, как с помощью оператора 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 ?
Здравствуйте, Flex2, Вы писали:
F> Доброе время суток. F>Господа, как с помощью оператора new организовать 2-x мерный массив и как его потом "убить" ? F>Например : F>BYTE _cmd[120][10]; Как это организовать с помощью new ?
Здравствуйте, _nn_, Вы писали:
__>Здравствуйте, Flex2, Вы писали:
F>> Доброе время суток. F>>Господа, как с помощью оператора new организовать 2-x мерный массив и как его потом "убить" ? F>>Например : F>>BYTE _cmd[120][10]; Как это организовать с помощью new ?
Здравствуйте, Нахлобуч, Вы писали:
Н>Здравствуйте, _nn_, Вы писали:
__>>Здравствуйте, Flex2, Вы писали:
F>>> Доброе время суток. F>>>Господа, как с помощью оператора new организовать 2-x мерный массив и как его потом "убить" ? F>>>Например : F>>>BYTE _cmd[120][10]; Как это организовать с помощью new ?
Н>Вариант 4 : Н>
Спасибо, вот так работает. А доступ к конкретному элементу массива будет осуществляться как обычно? BYTE tmp_val = pcmd[5][2] — так пойдет ?
Или BYTE tmp_val = pcmd[5*2] ?;
Здравствуйте, Flex2, Вы писали:
F> Доброе время суток. F>Господа, как с помощью оператора new организовать 2-x мерный массив и как его потом "убить" ? F>Например : F>BYTE _cmd[120][10]; Как это организовать с помощью new ?
Это нужно для дела или просто интересно ? Если для дела то ни в коем случае не делай "голый" двумерный массив — напиши класс который проинкапсулирует все эти операции, если нужно могу подкинуть сурцы простеньких классов матриц/векторов
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
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, 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 ему подсунуть. Вообщем борьба за живучесть.
Здравствуйте, Flex2, Вы писали:
F>Ага, для дела. Это буфер команд для железяки на ком- порту. Отправляю команду, она помещается в буфер, а поток этот буфер циклически читает. Через объявление массива буфера , напрмер _сmd[120,20] тож работает, но этот буфер 1 для 1 ком порта, а каждый порт обслуживает 4 устройства ввода-вывода, тоесть для процесса обслуживающий порт он у меня глобальный, вот хочу его сделать volatile, через malloc процесс падает, через объявление буфера как массива работает нормально и правильно инициализируется, а вот чтние — запись временами глючит. Попробовал с 1 массивом через new ( он сам знает в зависимости от выделяемого объма что как и кому выделить), все окейно пашет, теперь F>нужно первести этот буфер тож на new, к тому же можно volatile ему подсунуть. Вообщем борьба за живучесть.
Здравствуйте, Нахлобуч, Вы писали:
Н>Здравствуйте, Flex2, Вы писали:
F>>Ага, для дела. Это буфер команд для железяки на ком- порту. Отправляю команду, она помещается в буфер, а поток этот буфер циклически читает. Через объявление массива буфера , напрмер _сmd[120,20] тож работает, но этот буфер 1 для 1 ком порта, а каждый порт обслуживает 4 устройства ввода-вывода, тоесть для процесса обслуживающий порт он у меня глобальный, вот хочу его сделать volatile, через malloc процесс падает, через объявление буфера как массива работает нормально и правильно инициализируется, а вот чтние — запись временами глючит. Попробовал с 1 массивом через new ( он сам знает в зависимости от выделяемого объма что как и кому выделить), все окейно пашет, теперь F>>нужно первести этот буфер тож на new, к тому же можно volatile ему подсунуть. Вообщем борьба за живучесть.
Н>А, пардон, словосочетание "синхронизация потоков" вам знакомо?
С этим все нормально. И ожидающие функции и критические секции и интерлокед функции
при изменении указателей текущей позиции считанных и записанных данных и отлаженный алгоритм циклического чтения все ОК! Но ведь при таком выделении глючит а при экспериментах над new не глючит. Что прикажете делать-то ? Переводиться на new. Причем тут такая особенносить, по Win 2000 глучит реже чем по XP.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Flex2, Вы писали:
F>> Доброе время суток. F>>Господа, как с помощью оператора new организовать 2-x мерный массив и как его потом "убить" ? F>>Например : F>>BYTE _cmd[120][10]; Как это организовать с помощью new ?
А>Это нужно для дела или просто интересно ? Если для дела то ни в коем случае не делай "голый" двумерный массив — напиши класс который проинкапсулирует все эти операции, если нужно могу подкинуть сурцы простеньких классов матриц/векторов
Здравствуйте, 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;
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 лучше нежели массив.