| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Ошибка при создании двумерного массива |
| Автор: Trurl 28.12.2007, 14:35 | ||||
Подскажите, пожалуйста, в чём ошибка?
компилируется без проблем
возникает ошибка: 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 как можно тогда создать двумерный массив в динамической памяти? С уважением. |
| Автор: Alexeis 28.12.2007, 14:48 | ||
Думаю примерно так
|
| Автор: Trurl 28.12.2007, 19:11 | ||
| Спасибо, не уверен, что мне это подойдёт. Мне нужно сделать нечто следующее, но компилятор это не пропускает, хотя в одномерном случае всё ок.
|
| Автор: JackYF 28.12.2007, 19:15 |
int** B, будь внимательней |
| Автор: Alexeis 28.12.2007, 20:22 |
Так и чего? Все равно разом нельзя так объявлять двумерный массив. Компилятор же не знает длину одной строки, как он сможет обратиться. Не тут только массив указателей. |
| Автор: archimed7592 28.12.2007, 21:56 | ||||
Добавлено через 1 минуту и 7 секунд С++ чуствителен к регистру Добавлено через 2 минуты и 17 секунд
|
| Автор: Alexeis 29.12.2007, 00:13 | ||
У варианта
Только одно измерение динамическое. |
| Автор: archimed7592 29.12.2007, 10:39 |
Я не зря наверное процитировал то, что N определено define'ом и представляет из себя константу |
| Автор: archimed7592 29.12.2007, 12:09 | ||
На вашем месте я не был бы настолько категоричен. 1. N * N * sizeof(int) может оказаться в районе нескольких гигабайт. 2. Может оказаться необходимым продлить время жизни такого массива дальше чем конец текущего блока. Если подумать, то, думаю, можно будет придумать ещё несколько примеров. |
| Автор: Dov 29.12.2007, 12:25 | ||
А почему не в районе нескольких сотен тысяч гигабайт? archimed7592, ты же прекрасно понял о чём я сказал. Или, всё-таки, не понял? |
| Автор: Fazil6 29.12.2007, 12:31 |
ну и что? Я, например, тоже понял, но согласен с archimed7592. Динамический массив может требоваться не только исключительно незнанием его размера во время компилляции |
| Автор: archimed7592 29.12.2007, 12:32 |
Может быть и в этом районе. Суть в том, что такие объёмы выделять на стеке не рационально. Если честно, не особо понимаю. |
| Автор: MAKCim 29.12.2007, 12:37 | ||||
как раз таки рационально, в смысле в разы быстрее другое дело, что таких больших стеков не бывает Добавлено через 4 минуты и 21 секунду как вариант можно использовать
|
| Автор: archimed7592 29.12.2007, 13:03 |
Замечу, что я ни разу не упомянул о скорости Об том и речь. Ну и время жизни для таких огромных объектов нет смысла делать автоматическим. Это не совсем стек ;). |
| Автор: Alexeis 29.12.2007, 13:57 | ||||
Насколько я знаю такой массив создаться точно также как обычная глобальная переменная, то только ее имя будет локализовано, потому для гигабайта не катит. В опциях проекта можно указать максимальный размер стека (под винду) Опять же если смотреть под винду то скорость создания будет примерно такой же, как и в стеке, потому что винда не дурная чтобы гиг стека без нужды с оперативе держать. Хотя пожалуй archimed7592 прав. Просто тут есть путаница, под динамическим массивом можно понимать массив динамической длинны или выделенный в куче |
| Автор: archimed7592 29.12.2007, 14:10 | ||||
Не совсем так. Есть три вида storage duration: automatic, dynamic и static. В общем случае для каждого из видов предусмотрена отдельная "область" памяти. Для автоматических объектов это стек, для динамических - куча, а для статических - точно сказать не могу, но, AFAICS это просто область в сегменте данных, выделяемая в момент старта программы.
Сколько раз указывал - винда разом не выделяла огромный объём под стек |
| Автор: Alexeis 29.12.2007, 14:20 | ||
В том то и дело если она начнет его наращивать, то быстрее не будет. |
| Автор: MAKCim 29.12.2007, 18:41 |
Замечу, что я ни разу не упомянул о стеке Добавлено через 2 минуты и 5 секунд очень даже катит причем это будет самый быстрый способ выделения памяти + данные будут располагаться в BSS секции, что не увеличивает размер выходного файла |
| Автор: Alexeis 29.12.2007, 18:46 | ||
Че это за секция такая? Т.е. в экзешнике не резерируется место под статик переменные? Они что создаются на этапе инициализации? |
| Автор: bsa 29.12.2007, 19:03 |
| Alexeis, думаю, только статические константы встроенных типов могут располагаться в сегменте кода. |
| Автор: MAKCim 29.12.2007, 19:05 | ||
неинициализированные глобальные (статические и не статические) и локальные статические данные располагаются в BSS секции я не знаком с форматом файлов PE однако могу сказать про реализацию BSS в формате ELF там есть такое понятие как таблица дескрипторов програмных сегментов каждый програмный сегмент имеет определенный тип особое положение занимают сегменты с типом PT_LOAD, т. е загружаемые програмные сегменты по ним осуществляется отображение образа программы (библиотеки) на адресное пространство процесса каждый дескриптор имеет два очень важных компонента: FileSiz и MemSiz разность значений MemSiz - FileSiz дает размер BSS секции образа программы (библиотеки) т. е, например, если где-то в коде определен неинициализированный массив размером в 1ГБ, то MemSiz = FileSiz + 1024 * 1024 * 1024 при этом значение FileSiz равно общему размеру всех инициализированных данных (явно определенных в коде или неявно создаваемых компилятором / компоновщиком) при динамической компоновке (загрузчиком ядра или пользовательского уровня (ld.so)) отображается FileSiz-часть образа программы (библиотеки) и выделяется MemSiz - FileSiz байт для BSS |
| Автор: archimed7592 29.12.2007, 19:20 | ||
Да, вообще говоря, на такие переменные и так не выделяется...
Ну, тебе виднее |