Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« : 08-07-2004 10:13 » |
|
допустим я собираюсь создать массив указателей на 6 массивов (на 1000 элементов каждый), которые создаю с помощью new. Какой из двух примеров ниже будет более корректен? Или оба живут? BYTE* A[6]; //массив указателей на 6 массивов int N=1000;
A[0]=new BYTE[N*6];
for(i=1;i<6;i++) { A[i]=A[i-1]+N; }
BYTE* A[6]; //массив указателей на 6 массивов int N=1000;
for(i=0;i<6;i++) { A[i]=new BYTE[N]; }
и ещё - в чём разница между (скобки) =new BYTE[N]; и =new BYTE(N);
|
|
« Последнее редактирование: 29-11-2007 21:35 от Алексей1153++ »
|
Записан
|
|
|
|
Алик
Постоялец
Offline
|
|
« Ответ #1 : 08-07-2004 10:25 » |
|
Да, наверное, оба живут, только в первом случае все массивы будут гарантированно расположены друг за другом, тогда как во втором - это могут быть 6 разных кусков памяти. И, опять же во втором случае delete надо 6 раз вызывать, а в первом - 1.
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #2 : 08-07-2004 10:56 » |
|
Первый пример работать не будет, т.к. A - массив из 6-ти указателей, и ты присваиваешь A[0] адрес массива BYTE[6000], а другие пять указателей тут не при чем.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алик
Постоялец
Offline
|
|
« Ответ #3 : 08-07-2004 11:06 » |
|
Работает, я проверил. просто каждый следующий указатель указывает на следующие 1000 байт.
|
|
|
Записан
|
|
|
|
Алик
Постоялец
Offline
|
|
« Ответ #4 : 08-07-2004 11:13 » |
|
и ещё - в чём разница между (скобки) =new BYTE[N]; и =new BYTE(N);
В книжки лезть лень , а так (на сколько помню): BYTE(6) размещает в памяти одну переменную BYTE и инициализирует ее значением 6. BYTE[6] - размещает в памяти массив из 6 элементов BYTE. При чем, если вместо BYTE стоит какой-то класс (MyClass[6]), то помимо размещения 6 экземпляров класса в памяти, для каждого из них вызвался бы конструктор.
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #5 : 08-07-2004 11:41 » |
|
Алик, очень интересно посмотреть на результат твоей проверки. Вот моя проверка: #include <stdio.h>
int main() { char * aaa[6]={0,0,0,0,0,0}; int i;
for(i=0;i<6;i++) printf("1) %i %08x=%08x\n",i,(int)&aaa[i],(int)aaa[i]);
aaa[0]=new char[6000];
for(i=0;i<6;i++) printf("2) %i %08x=%08x\n",i,(int)&aaa[i],(int)aaa[i]); return 0; } Результат: 1: 0 bffff7e0=00000000 1: 1 bffff7e4=00000000 1: 2 bffff7e8=00000000 1: 3 bffff7ec=00000000 1: 4 bffff7f0=00000000 1: 5 bffff7f4=00000000 2: 0 bffff7e0=08050bf8 2: 1 bffff7e4=00000000 2: 2 bffff7e8=00000000 2: 3 bffff7ec=00000000 2: 4 bffff7f0=00000000 2: 5 bffff7f4=00000000
|
|
« Последнее редактирование: 29-11-2007 21:38 от Алексей1153++ »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #6 : 08-07-2004 13:05 » |
|
Чего это RLX даже я тебя не понял .... в чем твоя проверка то... где в твоей проверке вот этот кусок кода for(i=1;i<6;i++) { A=A[i-1]+N; }
вот ты его добавь и погляди на результат
|
|
|
Записан
|
С уважением Lapulya
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #7 : 08-07-2004 13:07 » |
|
типа такого тестить надо #include <stdio.h>
int main() { char * aaa[6]={0,0,0,0,0,0}; int i;
for(i=0;i<6;i++) printf("1) %i %08x=%08x\n",i,(int)&aaa[i],(int)aaa[i]);
aaa[0]=new char[6000];
for(i=1;i<6;i++) { A[i]=A[i-1]+N; }
for(i=0;i<6;i++) printf("2) %i %08x=%08x\n",i,(int)&aaa[i],(int)aaa[i]); return 0; }
|
|
« Последнее редактирование: 29-11-2007 21:39 от Алексей1153++ »
|
Записан
|
С уважением Lapulya
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #8 : 08-07-2004 13:17 » |
|
точнее так ))))) типа ошибки)))))) #include <stdio.h>
int main() { char * aaa[6]={0,0,0,0,0,0}; int i;
for(i=0;i<6;i++) printf("1) %i %08x=%08x\n",i,(int)&aaa[i],(int)aaa[i]);
int N = 1000; aaa[0]=new char[6000];
for(i=1;i<6;i++) { aaa[i]=aaa[i-1]+N; }
for(i=0;i<6;i++) printf("2) %i %08x=%08x\n",i,(int)&aaa[i],(int)aaa[i]); return 0; }
|
|
« Последнее редактирование: 29-11-2007 21:41 от Алексей1153++ »
|
Записан
|
С уважением Lapulya
|
|
|
RXL
|
|
« Ответ #9 : 08-07-2004 13:52 » |
|
lapulya, ты наверно не понял смысл моего кода. В выводе следующие поля: номер проверки, индекс указателя в массиве, адрес этого указателя, содержимое указателя (адрес, на который он указывает). Я специально проинициализировал массив при объявлении - чтобы было видно, что указатели ==NULL. После new распечатка показывает, что изменился только aaa[0]. Если ты попытаешься использовать, например, aaa[1][0]=0 , то получишь ошибку защиты. 1: 0 bffff7e0=00000000 1: 1 bffff7e4=00000000 1: 2 bffff7e8=00000000 1: 3 bffff7ec=00000000 1: 4 bffff7f0=00000000 1: 5 bffff7f4=00000000 2: 0 bffff7e0=08050bf8 2: 1 bffff7e4=00000000 2: 2 bffff7e8=00000000 2: 3 bffff7ec=00000000 2: 4 bffff7f0=00000000 2: 5 bffff7f4=00000000
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Anonymous
Гость
|
|
« Ответ #10 : 08-07-2004 14:00 » |
|
нет не получу!!! смотри мои посты и код!!!результат совсем не тот который ты приводишь вот результат 1: 0 0012fec0=00000000 1: 1 0012fec4=00000000 1: 2 0012fec8=00000000 1: 3 0012fecc=00000000 1: 4 0012fed0=00000000 1: 5 0012fed4=00000000 2: 0 0012fec0=002f3fe8 2: 1 0012fec4=002f43d0 2: 2 0012fec8=002f47b8 2: 3 0012fecc=002f4ba0 2: 4 0012fed0=002f4f88 2: 5 0012fed4=002f5370
|
|
|
Записан
|
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #11 : 08-07-2004 14:03 » |
|
это я просто не зарегился... обращение к a[1][0] на чтение и запись проходит на ура...
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #12 : 08-07-2004 17:14 » |
|
RXL, а другие пять указателей тут не при чем.
так ведь мне и надо 6 массивов и ещё плюс массив указателей на эти шесть. Они как бы "синхронизированны" - т.е. все i-е элементы всех шести массивов "произошли в одно и то же время" в принципе можно было обойтись и без массива указателей (была бы матрица), но тут вектора могут разной длины
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #13 : 08-07-2004 17:17 » |
|
хотя... тогда - только второй вариант
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #14 : 08-07-2004 19:46 » |
|
Признаю, был не прав и не внимателен. Получается, что оба варианта работают. Причем, первый будет немного быстрее.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Papercut
Гость
|
|
« Ответ #15 : 14-07-2004 19:53 » |
|
Алексей1153, а если тебе станет не нужен, например, 6-й массив и ты захочешь его удалить? (В первом варианте кода)
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #16 : 14-07-2004 21:19 » |
|
Papercut, этот изъян достаточно явный. Я, да и другие наверно то же (а уж 1153 точно), его хорошо знаем. Понятно, что такой метод можно практиковать только целыми буферами, а, если требуется надежность (напр.: модификкация кода другими разработчиками), то лучше принцип: один указатель - один запрошеный блок памяти.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|