33 / 33 / 17
Регистрация: 27.01.2013
Сообщений: 200
|
||||||
1 | ||||||
Динамическая память(толи я дурак, то ли правда лыжи не едут)08.09.2013, 11:03. Показов 1163. Ответов 18
Метки нет (Все метки)
Есть код программы:
И выводит то, что прилеплено в рисунке. Но, если я правильно пониаю, если sizeof(int) = 4, то sizeof(lin_d) должно быть равно 400 и тогда элементов в массиве будет как и положено NPOW. Короче говоря задача такая: создать динамический массив размером NPOW, обязательно через new. В чем моя ошибка? Добавлено через 8 минут ЗЫ Компилятор dev-c++ 5.4.2, набор настроек компилятора - TDM-GCC 4.7.1 64bit Release В строке "Добавить эти команды к командной строке компоновщика" по умолчанию стоит(я не менял) -static-libgcc Версия винды: семерка, 64бита, лицуха(оО)
0
|
08.09.2013, 11:03 | |
Ответы с готовыми решениями:
18
Проверьте пожалуйста,то ли я дурак,то ли лыжи не едут Select отслеживание псевдотерминала Я дурак или лыжи не едут? Или я дурак или лыжи не едут, склоняюсь к первому. Либо я дурак либо лыжи не едут |
33 / 33 / 17
Регистрация: 27.01.2013
Сообщений: 200
|
|
08.09.2013, 11:05 [ТС] | 2 |
ЗЗЫ обещанная картинка
0
|
Модератор
12438 / 7465 / 1749
Регистрация: 25.07.2009
Сообщений: 13,721
|
|||||||||||
09.09.2013, 03:30 | 3 | ||||||||||
Прежде всего в С нет оператора new, по этому тему перенесу в С++. Но в любом случае
1
|
75 / 75 / 10
Регистрация: 26.02.2013
Сообщений: 224
|
||||||
09.09.2013, 03:42 | 4 | |||||
RHB, а почему такой способ создания матрицы?
стандартно матрица mxn создается так:
0
|
33 / 33 / 17
Регистрация: 27.01.2013
Сообщений: 200
|
||||||
09.09.2013, 05:41 [ТС] | 6 | |||||
easybudda, спасибо) теперь я понял почем переключившись на 32-битный компиль увидел другой результат
Добавлено через 3 минуты Stella, собственно в чем принципиальная разница то?
Добавлено через 3 минуты easybudda, а тогда вопрос... как через sizeof или другим спсобом узнать под сколько элементов расчитан массив?
0
|
Модератор
12438 / 7465 / 1749
Регистрация: 25.07.2009
Сообщений: 13,721
|
|
09.09.2013, 10:27 | 8 |
RHB, если внутри какой-то функции, то никак, размер массива нужно передавать дополнительным параметром вместе с указателем на массив (читай - на первый элемент массива). А если вся возня в одной main происходит - смотри предыдущий пост...
0
|
Диссидент
27704 / 17320 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
|
||||||
09.09.2013, 10:49 | 9 | |||||
RHB, Ни Си, ни Си++ "не знают" размера динамического массива. Хотя есть "хакерский" способ, который я настоятельно рекомендую НЕ ПРИМЕНЯТЬ. Дело в том, что в куче хранится размер выделенной памяти. Представляется естественным, что этот размер хранится перед выделенной памятью в виде int (не проверял). И
0
|
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
|
|
09.09.2013, 10:55 | 10 |
0
|
Почетный модератор
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|
09.09.2013, 11:09 | 12 |
Прошу по поводу сего способа отписаться в этой теме. Особенно в свете второй части вот этого поста. Очень интересны ваши конкретные результаты.
1
|
Диссидент
27704 / 17320 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
|
||||||
09.09.2013, 12:09 | 13 | |||||
Сообщение было отмечено как решение
Решение
SatanaXIII, с интересом ознакомился с темой, но отписаться решил здесь, чтоб свои делетанством не раздражать уважаемых диспутантов. Уверенности, что мой "хакерский" способ сработает, у меня нет, как нет и уверенности, что m[-1] - размер массива. Просто, если бы мне заказали создать механизм кучи, я бы сделал так. Но экспериментов не проводил.
По поводу delete (как и free) могу сказать, что он делает очень важную вещь - присоединяет этот кусок памяти с списку свободной. И все! К сожалению, delete не обнуляет указатель, а мог бы (в отличии от free). Не знаю, что делает delete(NULL), просто стараюсь таких штук не допускать, как и повторного удаления. Для пущей безопасности сделал себе еще на Си такую функцию
Добавлено через 17 минут SatanaXIII, Хочу добавить по поводу вашего недоумения от отсутствия в языке средства типа sizeof для динамических массивов, что ваше недоумение полностью разделяю. Ведь еще K&R могли добавить в язык что-то вроде sizearray, который бы работал как sizeof для стековых и статических массивов, а для динамических доставал бы ту самую m[-1]. Хотя это слегка усложнило бы концепции языка, а они ж известные минималисты! Ну чтож, и на Солнце бывают пятна, а она все-таки вертится...
5
|
09.09.2013, 12:33 | 14 |
"Си" тем и хорош, что там все по минимуму и полная свобода действий. Хочешь "с размером" - создавай структуру из 2 (двух) полей и пользуйся! А если брать m[-1], то представим функцию, которая получает параметр - ссылку на массив и берет m[-1] для определения его размера. И все работает, пока некто не передаст ей ссылку не на 1-й элемент массива Кто будет крайний: тот кто написал функцию, некто, передавший не первый элемент или K&R, включившие требование "определения размеров массива" в стандарт?
Блин, ну есть же STL, зачем мечтать о 5-колесных велосипедах...
1
|
Комп_Оратор)
|
|
09.09.2013, 14:08 | 15 |
Первый это с индексом 0? Тогда всё будет нормально вроде, так как предложено в -1 писать размер.
Поскольку я в низкоуровневых вещах ни в чем не уверен, то примите как размышление. Самый короткий тип это байт (неважно со знаком ли), но аппаратно память пишется и читается в соответствии с размером машинного слова, то есть доступ к байту в массиве байт требует некоторых усилий, которые на уровне компилятора не видны. Данные действия скрывают некоторые вычисления для обеспечения видимости "прямой индексации". Если продолжить в приложении к массиву байт размышления о сохранении размера в -1 ячейку, получим ограничение размера, даже если беззнаковый использовать. Может писать unsigned long long? Допустим, но тогда для массивов разных типов, прямая индексация превратится в скрытую процедуру, которая будет предоставлять интерфейс индексирования от нуля и скрывать пересчёт для разных типов. Есть ещё проблема связанная с выравниванием для пользовательских сложных типов. В любом случае перерасход памяти, особенно для коротких записей, гарантирован, так как выравнивать пришлось бы на машинное слово? С другой стороны, можно сохранить прямую индексацию, как упрощенную запись "указательной" арифметики ( и её сохранив в первозданном виде), и в том числе тождественность указателя на одиночное значение указателю на массив, что немаловажно для С-совместимости, оставив решение о сохранении размера программисту. Это конечно пустая фраза, поскольку "неписанного" стандарта по этому вопросу нет даже для встроенных типов.
0
|
75 / 75 / 10
Регистрация: 26.02.2013
Сообщений: 224
|
|
09.09.2013, 14:40 | 16 |
просто не понимаю, зачем еще куча массивов lin_a, lin_b...
Наверное просто условие задачи такое...
0
|
09.09.2013, 15:03 | 17 |
Преположим функцию вызвали, передав ей адрес 10-го элемента. Функция считывает размер из -1, т.е. фактически из 9-го и что дальше будет никому неизвестно .
Вопрос - ради чего "ломать язык"? Ради того, чтобы раз в 10 лет сэкономить для себя пару строк, породив кучу головной боли для других? Резюмирую: если каждый захочет менять язык под свои хотелки, причем без анализа всех возможных последствий, язык просто уничтожат
0
|
Комп_Оратор)
|
|
09.09.2013, 16:39 | 18 |
С какого бы ни вызвали. Если механизм индексации скрыт, то она не знает про индекс -1, а получение размера - дело исполняющей среды. То есть размер получается неявно, допустим. В некоторых языках есть контроль выхода за границы, но за это плата производительностью. Поэтому с:
согласен. Это и хотел сказать. Сказал не ровно, вот уж действительно, - чуть язык не сломал.
0
|
33 / 33 / 17
Регистрация: 27.01.2013
Сообщений: 200
|
|
09.09.2013, 16:57 [ТС] | 19 |
Там в задаче просто сказано сделать обход матрицы разными
Матрицы(теоретическая загвоздка) Позвольте теперь и я присоединю свой голос к идущей дискуссии, хотя я, очевидно, задал вопрос не своего уровня но все же. Есть у нас в универе такой предмет как СиАОД(Структуры и алгоритмы обработки данных), так вот, если я не ошибаюсь, то на нем мы разбирали структуру адресов в языке СИ. Исходя из той теории что я там запомнил, если я ничего не путаю, то обычный адрес *а к примеру состоит из двух "слов" Первое слово несет в себе инфу о том, где в динамической памяти(она же куча) собственно говоря хранится указанный элемент. Второе слово уже несет в себе информацио О ТОМ какого размера информация там находится. Вот как бы возможно извлекая битовую инфу из адреса можно понять какого она размера?
0
|
09.09.2013, 16:57 | |
09.09.2013, 16:57 | |
Помогаю со студенческими работами здесь
19
SUBDATE (то ли лыжи не едут, то ли я .) То ли boot не пашет, то ли лыжи не едут либо лыжи у меня не едут То ли я баран, то ли лыжи не едут на laravel5 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |