Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка при создании двумерного массива 
:(
    Опции темы
Trurl
Дата 28.12.2007, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 2.11.2007

Репутация: нет
Всего: нет



Подскажите, пожалуйста, в чём ошибка?

Код

 int * B = new int[N];

компилируется без проблем

Код

 int * B = new int[N][N];

возникает ошибка:
test.cpp(15) : error C2440: 'initializing' : cannot convert from 'int (*)[10]' to 'int *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

как можно тогда создать двумерный массив в динамической памяти?

С уважением.



PM MAIL   Вверх
Alexeis
Дата 28.12.2007, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Думаю примерно так 
Код

int **B = new int*[N]; // сначала массив указателей, потом отдельно память для каждого
for (int i = 0; i < N; i++){B[i] = new int[N];};



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Trurl
Дата 28.12.2007, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 2.11.2007

Репутация: нет
Всего: нет



Спасибо, не уверен, что мне это подойдёт.

Мне нужно сделать нечто следующее, но компилятор это не пропускает, хотя в одномерном случае всё ок.

Код

// test.cpp

#include <iostream>
#include <iomanip>

using namespace std;

# define N 10
void my_func(int * my_array);

int main()
{
 int * B = new int[N][N];

 my_func(B);

 delete [] B;
 
 return 0;
}

void my_func( int * my_array )
{
    for (int i = 0; i < N; i++)
    {
     for (int j = 0; j < N; j++)
     {
      my_array[i][j] = i + j + 1;
      cout << my_array[i][j] <<  "\t";
     }
     cout << endl;
    }
}



PM MAIL   Вверх
JackYF
Дата 28.12.2007, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 6
Всего: 162



Цитата(Trurl @  28.12.2007,  19:11 Найти цитируемый пост)
int * B

int** B, будь внимательней


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Alexeis
Дата 28.12.2007, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Цитата(JackYF @  28.12.2007,  19:15 Найти цитируемый пост)
int** B, будь внимательней 

  Так и чего? Все равно разом нельзя так объявлять двумерный массив. Компилятор же не знает длину одной строки, как он сможет обратиться. Не тут только массив указателей.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
archimed7592
Дата 28.12.2007, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Цитата(Trurl @  28.12.2007,  19:11 Найти цитируемый пост)
Мне нужно сделать нечто следующее
Цитата(Trurl @  28.12.2007,  19:11 Найти цитируемый пост)
# define N 10
Цитата(Trurl @  28.12.2007,  19:11 Найти цитируемый пост)
 int * B = new int[N][N];

Код

int (*B)[N] = new int[N][N];
// ...
delete [] B;


Добавлено через 1 минуту и 7 секунд
Цитата(Alexeis @  28.12.2007,  14:48 Найти цитируемый пост)
int **B
Цитата(Alexeis @  28.12.2007,  14:48 Найти цитируемый пост)
b[i] = new int[N];

С++ чуствителен к регистру smile.

Добавлено через 2 минуты и 17 секунд
Цитата(Trurl @  28.12.2007,  19:11 Найти цитируемый пост)
void my_func(int * my_array)

Код

void my_func(int (* my_array)[N])




--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alexeis
Дата 29.12.2007, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



  У варианта 
Цитата

int (*B)[N] = new int[N][N];
// ...
delete [] B;

  Только одно измерение динамическое.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
archimed7592
Дата 29.12.2007, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Цитата(Alexeis @  29.12.2007,  00:13 Найти цитируемый пост)
 Только одно измерение динамическое. 

Я не зря наверное процитировал то, что N определено define'ом и представляет из себя константу smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Dov
Дата 29.12.2007, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



Цитата(archimed7592 @  29.12.2007,  09:39 Найти цитируемый пост)
Я не зря наверное процитировал то, что N определено define'ом и представляет из себя константу 

В таком случае всё, что ты написал дальше, абсолютно лишнее, так как в этом случае динамическая квадратная матрица не нужна.  smile  



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
archimed7592
Дата 29.12.2007, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Цитата(Dov @  29.12.2007,  11:24 Найти цитируемый пост)
В таком случае всё, что ты написал дальше, абсолютно лишнее, так как в этом случае динамическая квадратная матрица не нужна.  smile  

На вашем месте я не был бы настолько категоричен.
1. N * N * sizeof(int) может оказаться в районе нескольких гигабайт.
2. Может оказаться необходимым продлить время жизни такого массива дальше чем конец текущего блока.

Если подумать, то, думаю, можно будет придумать ещё несколько примеров.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Dov
Дата 29.12.2007, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



Цитата(archimed7592 @  29.12.2007,  11:09 Найти цитируемый пост)
1. N * N * sizeof(int) может оказаться в районе нескольких гигабайт.

 smile 
А почему не в районе нескольких сотен тысяч гигабайт?  smile 


archimed7592, ты же прекрасно понял о чём я сказал.  smile 

Или, всё-таки, не понял?  smile 


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Fazil6
Дата 29.12.2007, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 7
Всего: 60



Цитата(Dov @  29.12.2007,  12:25 Найти цитируемый пост)
archimed7592, ты же прекрасно понял о чём я сказал.

ну и что? Я, например, тоже понял, но согласен с archimed7592. Динамический массив может требоваться не только исключительно незнанием его размера во время компилляции
PM MAIL   Вверх
archimed7592
Дата 29.12.2007, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Цитата(Dov @  29.12.2007,  12:25 Найти цитируемый пост)
А почему не в районе нескольких сотен тысяч гигабайт?  smile 

Может быть и в этом районе. Суть в том, что такие объёмы выделять на стеке не рационально.

Цитата(Dov @  29.12.2007,  12:25 Найти цитируемый пост)
Или, всё-таки, не понял?  smile  

Если честно, не особо понимаю.



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
MAKCim
Дата 29.12.2007, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 2
Всего: 207



Цитата(archimed7592 @  29.12.2007,  12:32 Найти цитируемый пост)
Суть в том, что такие объёмы выделять на стеке не рационально.

как раз таки рационально, в смысле в разы быстрее
другое дело, что таких больших стеков не бывает  smile

Добавлено через 4 минуты и 21 секунду
как вариант можно использовать
Код

void function() {
    static char array[N][N]
...
}


Это сообщение отредактировал(а) MAKCim - 29.12.2007, 12:38


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
archimed7592
Дата 29.12.2007, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Цитата(MAKCim @  29.12.2007,  12:37 Найти цитируемый пост)
как раз таки рационально, в смысле в разы быстрее

Замечу, что я ни разу не упомянул о скорости smile.


Цитата(MAKCim @  29.12.2007,  12:37 Найти цитируемый пост)
другое дело, что таких больших стеков не бывает  smile

Об том и речь. Ну и время жизни для таких огромных объектов нет смысла делать автоматическим.


Цитата(MAKCim @  29.12.2007,  12:37 Найти цитируемый пост)
как вариант можно использовать

Это не совсем стек ;).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0708 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.