Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Alimkulov, SashaMercury, Солтер Н.А. и Клепер С.Дж. (С++ для профессионалов) написали, как корректно выделить память для двумерного массива: int x,y; int** myArray = new int*[x]; //Выделяем для первой размерности массива for (int i=0; i<x; i++) myArray[i]=new int[x]; //Выделяем для i-го подмассива. Это код, мне кажется самый корректный! это не многомерный массив, это массив указателей на массивы. это разные вещи. в памяти элементы располагаются совсем по другому. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 11:23 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
столько бреда понаписали в топике... вечером буду наводить порядок... 1 отличайте массивы указателей от многомерных массивов. 2 отличайте указатели от массивов, массив выделяет память под все элементы, N*sizeof(elementtype), указатель - только sizeof(void*). в с++ имеет смысл использовать ссылки на массивы, они могут сохранять размерность, или вектор верторов. в последнем случае вообще все автоматом делается. если же ты используешь функцию, надо использовать указатель на первый элемент массива и смещения в массиве вычислять самому. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 11:35 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Alimkulov, Код: plaintext 1. 2. 3. 4. 5. так вот a и b совсем по разному лежат в памяти, хотя для тебя это оба двухмерных массива. b линейно располагает свои элементы Код: plaintext тогда как a Код: plaintext 1. 2. по сути a - это набор из разрозненных участком динамической памяти - один под a, и два под a[0], a[1] SashaMercury никогда не смешивайте массив и указатель. массив приводится к указателю на свой первый элемент, но сущности это совершенном разные. например, Код: plaintext 1. 2. нука сдвиньте мне a на второй элемент? нет, не выйдет, поскольку a это не указатель. тогда как с b все достаточно тривиально Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 15:25 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Ещё интересно: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 15:34 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Ну и я бы не называл это "массив массивов", на мой взгляд, массив массивов -- это многомерный массив. Я бы называл это лучше "массив указателей", можно уточнить (но это не всегда так) "на динамически выделенные массивы". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 15:37 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Прочитал книги и сделал такой вывод: В языке С/С++ предусмотрены многомерные массивы. Простейшим из них является двухмерный. По существу, двухмерный массив – это массив одномерных массивов. В языке С/С++ указатели и массивы тесно связаны друг с другом. Имя массива без индекса – это указатель на его первый элемент. Код: plaintext 1. 2. 3. 4. 5. 6. Значит, адрес первого элемента массива совпадает с адресом всего массива. Этого можно применять и к многомерным массивам. Следующие два оператора будут эквивалентными: Код: plaintext 1. 2. Двухмерный массив можно представить с помощью указателя на массив одномерных массивов. Опираясь на эти и на Ваши мнения, написал вот такой код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. Результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 17:19 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Далее буду разбираться передачи массивов на функции! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 17:21 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Alimkulov, В целом выглядит ок, но есть замечания. 1) Код: plaintext 1. А почему не Код: plaintext 1. ? Вообще выделение локальных массивов заранее неизвестным размером, это нестандартная фича вашего компилятора. В С++ такого нет. Не гоовря уже о том что выделять массивы в стеке опасно, т.к. размер стека ограничен. 2) Код: plaintext 1. Комментарий - бред. Не только не быстрее, но еще и код становится нечитаемым - не делайте так никогда 3) Каждому выделению памяти чере new должно соответствовать удаление через оператор delete. В этой простой программе которая сразу завершается это может и не имеет смысла, а вот в реальных программах будет утечка памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 17:31 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, Спасибо! Да Вы совершенно правы! Anatoly Moskovsky2) cout << *(int*) &myArray[i][j] << " "; //Это операция выполняется быстрее, чем индексация. Комментарий - бред. Не только не быстрее, но еще и код становится нечитаемым - не делайте так никогда А как можно осуществлять доступ к элементам массива указателя? Anatoly Moskovsky3) Каждому выделению памяти чере new должно соответствовать удаление через оператор delete. Я с Вами согласен! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 17:49 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
AlimkulovА как можно осуществлять доступ к элементам массива указателя? Ну вот вы написали Код: plaintext 1. а надо было Код: plaintext 1. А разыменование, *, применяется если у вас уже есть указатель и вы хотите по нему прочесть или записать. А специально получать адрес через & чтобы потом его тут же разыменовать - не надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 18:08 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
AlimkulovВ языке С/С++ указатели и массивы тесно связаны друг с другом. Имя массива без индекса – это указатель на его первый элемент. Массивы и указатели никак не связаны друг с другом, кроме двух вещей: и то, и другое подразумевает использование адресной арифметики. имя массива неявно приводится компилятором к типу "указатель на первый элемент массива", если это нужно. Более указатели и массивы никак не связаны вроде бы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 18:12 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky Код: plaintext 1. А почему не Код: plaintext 1. ? Вообще выделение локальных массивов заранее неизвестным размером, это нестандартная фича вашего компилятора. В С++ такого нет. Не гоовря уже о том что выделять массивы в стеке опасно, т.к. размер стека ограничен. Такое есть в С99, который, очевидно, поддерживается его компилятором (MINGW). Но если включить strict ansi режим (ключ -ansi, если я правильно помню), то ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 18:21 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky 3) Каждому выделению памяти чере new должно соответствовать удаление через оператор delete. В этой простой программе которая сразу завершается это может и не имеет смысла, а вот в реальных программах будет утечка памяти. Анатолий, здеть ТОЖЕ ЕСТЬ утечка памяти, только тут на неё можно наплевать. Потому что код неценен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 18:23 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
MasterZivТакое есть в С99 В режиме С да. А в С++ нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 19:42 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Alimkulov, И все же, в реальных задачах, особенно связанных с вычислениями и частыми обращениями к матрице, лучше когда матрица лежит в памяти в непрерывном пространстве, а не рабросана кусками по хипу. Поэтому линейная развертка рулит по сравнению с массивом массивов. Ты наверняка слышал такое понятие как "фрагментация" применительно к дискам. Так вот оно в равной степени относится и куче. Чем больше у тебя фрагментов, тем больше происходит перезагрузок кэша процессора, что сказывается на производительности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 21:34 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Анатолий Широков, Я буду имеет ввиду Вашего мнений. Но пока моя цель - постепенно освоит все тонкости языка С++. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 23:12 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
AlimkulovАнатолий Широков, Я буду имеет ввиду Вашего мнений. Но пока моя цель - постепенно освоит все тонкости языка С++. Я буду учитывать Вашего мнения. Но пока моя цель - постепенно освоит все тонкости языка С++ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 23:21 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковAlimkulov, И все же, в реальных задачах, особенно связанных с вычислениями и частыми обращениями к матрице, лучше когда матрица лежит в памяти в непрерывном пространстве, а не рабросана кусками по хипу. Поэтому линейная развертка рулит по сравнению с массивом массивов. Ты наверняка слышал такое понятие как "фрагментация" применительно к дискам. Так вот оно в равной степени относится и куче. Чем больше у тебя фрагментов, тем больше происходит перезагрузок кэша процессора, что сказывается на производительности. Толя, еще и NUMA радости в этом отношении добавляет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 00:29 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
AlimkulovAlimkulovАнатолий Широков, Я буду имеет ввиду Вашего мнений. Но пока моя цель - постепенно освоит все тонкости языка С++. Я буду учитывать Вашего мнения. Но пока моя цель - постепенно освоит все тонкости языка С++ так в смысле тонкости самому адресацию в многомерном массиве сложнее написать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 00:32 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
AlimkulovА как можно осуществлять доступ к элементам массива указателя? Ты так пишешь "указатель", будто считаешь его чем-то большим, чем порядковым номером ячейки памяти, почти мистической сущностью... Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 01:26 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
MasterZivSashaMercury, Если я не ошибаюсь, то K&R пишут что указатели в частности предназначены для возврата нескольких значений из функции. ты ошибаешься. Старница 98. Строчки 1-2. K&RУказатели в качестве аргументов обычно используются в функциях, которые должны возвращать более одного значения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 01:44 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
MasterZivВообще, насколько я понял, объявление массива, например: int a[10] значит, что вы объявили int* a че за бред? int* 4 байта, int [10] - 40. есть разница? не вырывайте из контекста, пожалуйста. я написал: SВообще, насколько я понял, объявление массива, например: int a[10] значит, что вы объявили int* a(K&R пишут что имя массива является указательным выражением-страница 100), и это указательное выражение, хранит в себе адрес начала массива, и далее мы говорим, что одно значение будет занимать 4 байта(в зависимости от архитектуры), и гарантировано таких значений будет 10(впрочем с этим я не уверен, может он их все будет индексировать и считывать значения с 4 байт). Про гарантированных 40 байт я написал. MasterZivSПотому, как мне кажется, массив это такое вымышленное понятие, несколько искусственное, вообще ошибка, если кто-то говорит о них, это только кажется. а когда кажется, надо креститься, тогда нечисть сгинет... А разве не вымышленное ? Абстракция, накрученная. В K&R до 102 страницы я не встретил чёткого определения массива, и возможно это неопределяемое понятие в C, как и понятие множества в математике. Не буду приводить ссылки на функан, википедии вам хватит link_for_MasterZiv и, ВЫ снова вырываете из контекста.Вы разорвали мою фразу я написал, SПотому, как мне кажется, массив это такое вымышленное понятие, несколько искусственное, вообще ошибка, если кто-то говорит о них, без указателей, нужно начинать объяснение с указателей, и как частный случай их использования рассказывать про массивы MasterZivS без указателей, нужно начинать объяснение с указателей, и как частный случай их использования рассказывать про массивы. И вообще, может быть не стоит в качестве принимаемых параметров использовать массивы, если есть указатели. вот это единственное нормальное замечание в посте. только есть одно но: в параметрах функции массив и указатель это одно и то же. Одно из трёх утверждений вам понравилось ?Уже неплохо. не одно и то же. Указатель понятие фундаментальное в фон-неймановской архитектуре, а массив абстракция ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 02:05 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
SashaMercuryMasterZivSashaMercury, Если я не ошибаюсь, то K&R пишут что указатели в частности предназначены для возврата нескольких значений из функции. ты ошибаешься. Старница 98. Строчки 1-2. K&RУказатели в качестве аргументов обычно используются в функциях, которые должны возвращать более одного значения. У вас какой K&R. Тут у меня на странице №98 речь идет о функции а не массивах. Может я читаю не тот изданию? Можете написать конкретно, у вас какое издание и ссылки. У меня 3-е издание (2003г.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 03:26 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
SashaMercuryMasterZivSashaMercury, Если я не ошибаюсь, то K&R пишут что указатели в частности предназначены для возврата нескольких значений из функции. ты ошибаешься. Старница 98. Строчки 1-2. K&RУказатели в качестве аргументов обычно используются в функциях, которые должны возвращать более одного значения. Видимо должен быть какой-то контекст, который бы придал этим словам суть. Я полагаю, что речь идет как раз о модификации в функции внешнего массива, как бы "возврата из функции массива". "Как бы" -потому что естественно вернуть массив из функции невозможно в С. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 06:02 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38541418&tid=2019725]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
161ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 15ms |
| total: | 273ms |

| 0 / 0 |
