Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: new  (Прочитано 16208 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


new
« : 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++ » Записан

Алик
Постоялец

kz
Offline Offline

new
« Ответ #1 : 08-07-2004 10:25 » 

Да, наверное, оба живут, только в первом случае все массивы будут гарантированно расположены друг за другом, тогда как во втором - это могут быть 6 разных кусков памяти.
И, опять же во втором случае delete надо 6 раз вызывать, а в первом - 1.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
new
« Ответ #2 : 08-07-2004 10:56 » 

Первый пример работать не будет, т.к. A - массив из 6-ти указателей, и ты присваиваешь A[0] адрес массива BYTE[6000], а другие пять указателей тут не при чем.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алик
Постоялец

kz
Offline Offline

new
« Ответ #3 : 08-07-2004 11:06 » 

Работает, я проверил.
просто каждый следующий указатель указывает на следующие 1000 байт.
Записан
Алик
Постоялец

kz
Offline Offline

new
« Ответ #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
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
new
« Ответ #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
Молодой специалист

ru
Offline Offline

new
« Ответ #6 : 08-07-2004 13:05 » 

Чего это RLX даже я тебя не понял .... в чем твоя проверка то... где в твоей проверке вот этот кусок кода
Цитата

for(i=1;i<6;i++)
{
   A=A[i-1]+N;
}

вот ты его добавь и погляди на результат
Записан

С уважением Lapulya
lapulya
Молодой специалист

ru
Offline Offline

new
« Ответ #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
Молодой специалист

ru
Offline Offline

new
« Ответ #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
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
new
« Ответ #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
Гость
new
« Ответ #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
Молодой специалист

ru
Offline Offline

new
« Ответ #11 : 08-07-2004 14:03 » 

это я просто не зарегился... Отлично
обращение к a[1][0] на чтение и запись проходит на ура...
Записан

С уважением Lapulya
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


new
« Ответ #12 : 08-07-2004 17:14 » 

RXL,

Цитата

а другие пять указателей тут не при чем.


 так ведь мне и надо 6 массивов и ещё плюс массив указателей на эти шесть. Они как бы "синхронизированны" - т.е. все i-е элементы всех шести массивов "произошли в одно и то же время" Улыбаюсь

в принципе можно было обойтись и без массива указателей (была бы матрица), но тут вектора могут разной длины
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


new
« Ответ #13 : 08-07-2004 17:17 » 

хотя... тогда - только второй вариант
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
new
« Ответ #14 : 08-07-2004 19:46 » 

Признаю, был не прав и не внимателен. Получается, что оба варианта работают. Причем, первый будет немного быстрее.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Papercut
Гость
new
« Ответ #15 : 14-07-2004 19:53 » 

Алексей1153, а если тебе станет не нужен, например, 6-й массив и ты захочешь его удалить? (В первом варианте кода)
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
new
« Ответ #16 : 14-07-2004 21:19 » new

Papercut, этот изъян достаточно явный. Я, да и другие наверно то же (а уж 1153 точно), его хорошо знаем. Понятно, что такой метод можно практиковать только целыми буферами, а, если требуется надежность (напр.: модификкация кода другими разработчиками), то лучше принцип: один указатель - один запрошеный блок памяти.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines