Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Всем привет! Хотел динамическое выделять памяти для массивов вот так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Теперь как можно отправить этого массива в функции? Мой вариант так: Код: 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. 34. 35. 36. 37. Как можно правильно организовать эту задачу? И еще как можно организовать возвращение массивов из функции? Заранее спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2014, 17:52 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Alimkulov, Так у тебя всё правильно написано, в чём проблема-то ? Хотя двумерные массивы не будут так легко работать, на сколько я помню. Т.е. в функции тебе придётся вычислять смещения в массиве руками. Ну, и если размерности массивов переменные, тебе нужно передавать и их. Так что я бы объявлял функцию так: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2014, 19:00 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Я ценю вашего мнении, но в этом случае функция не примут аргумент, так как определена одномерный массив, а отправляется двухмерный массив. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2014, 19:49 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Alimkulov, При передаче массивов любой размерности реально передаётся только указатель на первый элемент передаваемого массива. И при этом ему пофигу какая там размерность массива. Кстати, ты бы указал дополнительно, какой язык ты используешь -- C или C++... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2014, 20:06 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Хотя я могу про массивы что-то путать, поверь, очень редко в С++ используются многомерные массивы. Я перепроверю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2014, 20:08 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Да конечно, многомерные массивы может редко используются. Но это не значит, что на мой задачи нет решения!. P.S. Использую С++, компилятор Dev C++. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2014, 20:17 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
AlimkulovMasterZiv, Да конечно, многомерные массивы может редко используются. Но это не значит, что на мой задачи нет решения!.В С++ предпочитают использовать объекты хранящие списки (list, vector и подобные). Массивы напрямую предпочитают не использовать вообще. AlimkulovP.S. Использую С++, компилятор Dev C++.Это у тебя текстовый редактор Dev C++. А компилятор скорее всего GNU C++ из пакета MinGW. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2014, 20:22 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
White OwlAlimkulovMasterZiv, Массивы напрямую предпочитают не использовать вообще. Я с Вами не соглашаюсь! Массивы - это полезный тип данных, используемый в различных ситуациях. AlimkulovP.S. Использую С++, компилятор Dev C++.Это у тебя текстовый редактор Dev C++. А компилятор скорее всего GNU C++ из пакета MinGW. Да именно так! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2014, 20:38 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Alimkulov, вся штука в том, что у тебя создается видимость, что ты работаешь с двухмерными массивами. вот ты пишешь Код: plaintext 1. а на самом деле эта запись означает Код: plaintext 1. далее ты пишешь Код: plaintext 1. а на самом деле это Код: plaintext 1. мистика? нисколько, всего лишь оператор запятая. Итого, все твои потуги тщетно провалились. Но, ты всегда можешь работать с одномерными массивом как многомерным: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Ну, а чтобы выделить память под одномерный массив имитирующий двухмерный в функции, ничего особенного придумывать не надо: Код: plaintext 1. 2. 3. 4. Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 00:03 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Alimkulov, насколько я понимаю, вы можете объявить указатель на первый элемент массива , и работать с ним. То есть может отправлять указатель в функцию, и далее работать со значениями массива по принципу *(PA+i). Если я не ошибаюсь, то K&R пишут что указатели в частности предназначены для возврата нескольких значений из функции. В данном ответе я не уверен наверняка, но его прокомментируют, и вы будете знать прав ли я или нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 01:49 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Вообще, насколько я понял, объявление массива, например: Код: plaintext 1. значит, что вы объявили int* a(K&R пишут что имя массива является указательным выражением-страница 100), и это указательное выражение, хранит в себе адрес начала массива, и далее мы говорим, что одно значение будет занимать 4 байта(в зависимости от архитектуры), и гарантировано таких значений будет 10(впрочем с этим я не уверен, может он их все будет индексировать и считывать значения с 4 байт). Потому, как мне кажется, массив это такое вымышленное понятие, несколько искусственное, вообще ошибка, если кто-то говорит о них, без указателей, нужно начинать объяснение с указателей, и как частный случай их использования рассказывать про массивы. И вообще, может быть не стоит в качестве принимаемых параметров использовать массивы, если есть указатели. Или точнее сказать: так как есть указатели, мощнейший и чудеснейший инструмент C. Все эти рассуждения касаются C, но мне почему-то кажется что C++ недалеко ушёл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 02:01 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
SashaMercuryкак мне кажется, массив это такое вымышленное понятие, несколько искусственное, вообще ошибка, если кто-то говорит о них А что ты имеешь в виду, набирая слово "массив"? Давай согласуем термины, а то может оказаться, что мы говорим о разных вещах. Вот для меня "массив" это несколько однотипных переменных, расположенных в памяти одна за другой. А для тебя? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 02:16 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Для меня массив, это прежде всего указатель, который хранит адрес нулевого элемента, считывание данных будет происходить в объёме типа указателя, также определена операция *(A+i),i=0,1,..,n n belongs Z которая позволяет считывать значения в памяти через размерность типа указателя. В языке С. Возможно, я неправильно сформулировал что-то, но общий принцип по которому я считаю правильно давать определение массива понятен. Определения по типу " .. это несколько однотипных переменных, расположенных в памяти одна за другой " мне кажутся вымышленными, с одной стороны правильными, но некорректными. В языке С. Все рассуждения получены в качестве логических размышлений из K&R. PS Несколько однотипных переменных это Код: plaintext 1. судя по логике, запись Код: plaintext 1. должна либо на уровне препроцессора, что навряд ли конечно, либо на уровне транслятора/компилятора преобразовываться к виду Код: plaintext 1. Вот в таком случае это будет несколько однотипных переменных, но в данном случае далеко не факт что они будут расположены в памяти одна за другой. Потому мне кажется, что ваше утверждение, может быть некорректным и не до конца правильным. Или всё же я ошибаюсь ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 02:50 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Ну и очевидно что такие преобразования Код: plaintext 1. в С не происходят. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 02:52 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
SashaMercury, Солтер Н.А. и Клепер С.Дж. (С++ для профессионалов) написали, как корректно выделить память для двумерного массива: Код: plaintext 1. 2. 3. 4. 5. 6. Это код, мне кажется самый корректный! На основании это, я написал так: Код: 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. 34. У меня вот такой результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Почему идет печать именно адрес памяти ячейки? Не понятно вообще! Здесь С++ FAQ написали, что полностью отказаться надо от использования массивов-указатели в стиле С. Но новичок в мире С++ как я, не понимая массивов, как освоит других технологий С++?. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 03:16 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Alimkulov, Мне не очень нравится ваш цикл, где происходит присваивание. И в конце, на мой взгляд, правильно написать : Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 03:36 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
for (int i=0; i<array_i; i++) { for (int j=0; j<array_j; j++) cout << *myArray[i,j] << " "; cout << endl; } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 03:37 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Происходит печать адреса, потому что элемент myArray[i,j] является указателем. Для того чтобы получить значение по адресу необходимо использовать операцию *myArray[i,j]. K&R(p 95) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 03:41 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
SashaMercury, Да Вы правы! Код: plaintext 1. 2. 3. 4. 5. 6. 7. Теперь результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Как можно осуществлять присваиванию! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 03:50 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Скачал K&R (3-е издание 2003). Вот читаю главу 5 (Указатели и массивы). Постараюсь понят! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 03:55 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Alimkulov, SashaMercury, ну что за фантазии на вольную тему. Вам же выше Анатолий Широков написал, что myArray[i,j] это бессмысленная операция. Она эквивалентна myArray[j], а так как у вас в myArray хранятся указатели на подмассивы, то соответственно Код: plaintext 1. печатает адрес j-го подмассива. И по той же причине, добавление разыменования * не поможет Код: plaintext 1. Оно будет печатать только нулевые элементы j-го подмассива. Правильный код адресации такого массива такой Код: plaintext 1. Таким образом резюмируя - если у вас в коде встречается конструкция array[a, b], то это замаскированный баг стопроцентной жирности. Если не понятно почему - перечитывать учебники по основам С/С++ пока не придет понимание . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 07:47 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, мне стыдно конечно, что я сразу не заметил, но Alimkulov Почему идет печать именно адрес памяти ячейки? Не понятно вообще! Вопрос был почему адреса, я на этот вопрос и ответил, а на то как он обращается к элементам массива(неверно индексирует) внимания не обратил :C ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 08:07 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
SashaMercury, Если я не ошибаюсь, то K&R пишут что указатели в частности предназначены для возврата нескольких значений из функции. ты ошибаешься. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 11:06 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Вообще, насколько я понял, объявление массива, например: Код: plaintext 1. значит, что вы объявили int* a че за бред? int* 4 байта, int [10] - 40. есть разница? (K&R пишут что имя массива является указательным выражением-страница 100), и это указательное выражение, хранит в себе адрес начала массива, и далее мы говорим, что одно значение будет занимать 4 байта(в зависимости от архитектуры), и гарантировано таких значений будет 10(впрочем с этим я не уверен, может он их все будет индексировать и считывать значения с 4 байт). ИМЯ массива, а не объявление массива. Потому, как мне кажется, массив это такое вымышленное понятие, несколько искусственное, вообще ошибка, если кто-то говорит о них, это только кажется. а когда кажется, надо креститься, тогда нечисть сгинет... без указателей, нужно начинать объяснение с указателей, и как частный случай их использования рассказывать про массивы. И вообще, может быть не стоит в качестве принимаемых параметров использовать массивы, если есть указатели. вот это единственное нормальное замечание в посте. только есть одно но: в параметрах функции массив и указатель это одно и то же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 11:17 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#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 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Код: plaintext 1. Тут идет речь про такое: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 06:15 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
SashaMercuryЕсли я не ошибаюсь, то K&R пишут что указатели в частности предназначены для возврата нескольких значений из функции. Старница 98. Строчки 1-2. K&RУказатели в качестве аргументов обычно используются в функциях, которые должны возвращать более одного значения. Да, если хочется вернуть более одного значения из функции, можно воспользоваться указателями. Например деление с остатком: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 06:27 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
ребята, это не возврат из функции чего-то. Это - модификация параметров, переданных по ссылке. давайте не будем путать понятия, даже если у Кернигана так написано. В С вообще нельзя вернуть из функции несколько значений. одно или 0. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 08:02 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
MasterZiv давайте не будем путать понятия, даже если у Кернигана так написано. Простите, но если именовать книгу одной фамилией, то скорее :"если у Ритчи так написано", авторство языка принадлежит ему(и Кену Томпсону ). Может быть Вы хотели сказать что в определение слова "возврат из функции" авторы вложили более широкий смысл ? И что мы понимаем под возвратом значений из функции ? Я не знаю чёткого определения. f e: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Вы бы сделали аналогичные комментарии к этим двум функциям ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 08:37 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
SashaMercury Код: plaintext 1. 2. 3. 4. 5. 6. естественно функция smth_func_2 не возвращает значение, ведь тип возвращаемого значения у неё void . Другое дело, что она модифицирует свой входной параметр. Это называется побочным эффектом , а не возвращением значения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 09:55 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Я бы назвал это косвенный возврат значений, или ссылочный возврат значений. Нужно подумать, как лучше. В широком смысле этого слова функция возвращает значения, но неявно. Где первоисточник этого словосочетания "побочный эффект" ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 10:04 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Господа, опомнитесь, начали за C++, а кончаете за Ричи. Охота вернуть несколько значений - см. std::tuple tie make_tuple, правда в коде это все равно выродится скорее всего в заполнение функцией буфера по переданному ей адресу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 10:24 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
SashaMercury. Где первоисточник этого словосочетания "побочный эффект" ? там где определяется "чистая функция" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 10:48 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
SashaMercuryЯ бы назвал это косвенный возврат значений, или ссылочный возврат значений. Нужно подумать, как лучше. В широком смысле этого слова функция возвращает значения, но неявно. Где первоисточник этого словосочетания "побочный эффект" ? Функция --она на то и функция, чтобы возвращать. Вотэто она и возвращает. Явно. А всё остальное -- это побочные эффекты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 11:25 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
SashaMercuryMasterZiv давайте не будем путать понятия, даже если у Кернигана так написано. Простите, но если именовать книгу одной фамилией, то скорее :"если у Ритчи так написано", авторство языка принадлежит ему(и Кену Томпсону ). Может быть Вы хотели сказать что в определение слова "возврат из функции" авторы вложили более широкий смысл ? И что мы понимаем под возвратом значений из функции ? Я не знаю чёткого определения. f e: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Вы бы сделали аналогичные комментарии к этим двум функциям ? Да. Первая -- возвращает, вторая -- нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 11:27 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
SashaMercuryГде первоисточник этого словосочетания "побочный эффект" ?Я ссылку дал, чукча не-читатель? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 11:43 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
SashaMercury не вырывайте из контекста, пожалуйста. я написал: SВообще, насколько я понял, объявление массива, например: int a[10] значит, что вы объявили int* a(K&R пишут что имя массива является указательным выражением-страница 100), и это указательное выражение, хранит в себе адрес начала массива, и далее мы говорим, что одно значение будет занимать 4 байта(в зависимости от архитектуры), и гарантировано таких значений будет 10(впрочем с этим я не уверен, может он их все будет индексировать и считывать значения с 4 байт). Про гарантированных 40 байт я написал. Вот ведь блин... Вырываю я... Ничего я не вырываю, вот весь этот абзац и является полным бредом. "имя массива является указательным выражением" --- имя массива в виде выражения, а не выражение объявления переменной типа массива. Разницу чувствуешь ? Это два разных совсем выражения. Код: plaintext 1. объявляет массив из 10 элементов типа int, с именем 'a'. Это значит: выделяется 10*sizeof(int) последовательно идущих байт в области памяти, соответствующей данному классу памяти. в соответствующий словарь имён заносится имя 'a' в памать размещается значение согласно инициализатору (тут инициализатора нет, поэтому зависит от класса памяти) Код: plaintext 1. объявляет указатель на int, с именем 'b'. Это значит: выделяется sizeof(int*) - 4 или 8 байт. в соответствующий словарь имён заносится имя 'b' в указатель заносится адрес первого элемента массива 'a' И вот только тут (!!) срабатывает то самое, о чём ты пытался нам донести -- компилятор видит выражение, содержащее символ названия массива и преобразует это выражение в указатель на первый элемент этого массива. Еще раз, боле у указателей и массивов нет ничего общего. (А, не, ещё есть дурацкая нотация параметров функций-указателей в виде массива без указанной размерности, с которой начался топик, об этом -- отдельно). SashaMercuryMasterZivпропущено... это только кажется. а когда кажется, надо креститься, тогда нечисть сгинет... А разве не вымышленное ? Абстракция, накрученная. В K&R до 102 страницы я не встретил чёткого определения массива, и возможно это неопределяемое понятие в C, как и понятие множества в математике. Не буду приводить ссылки на функан, википедии вам хватит link_for_MasterZiv и, ВЫ снова вырываете из контекста.Вы разорвали мою фразу я написал, SПотому, как мне кажется, массив это такое вымышленное понятие, несколько искусственное, вообще ошибка, если кто-то говорит о них, без указателей, нужно начинать объяснение с указателей, и как частный случай их использования рассказывать про массивы Хочется ответить словами "поэта": "Ты суслика не видишь ? А суслик есть!" Так и тут. А определение массива я думаю ты легко найдёшь в стандарте языка (С, С++). SashaMercuryОдно из трёх утверждений вам понравилось ?Уже неплохо. не одно и то же. Указатель понятие фундаментальное в фон-неймановской архитектуре, а массив абстракция Указатель и массив -- в данном случае понятия языка программирования . В архитектуре есть адреса памяти и слова и байты памяти. И далеко не во всех языках программирования есть указатели и ссылки. Да и массивы тоже ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 11:46 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
MasterZivВообще, насколько я понял, объявление массива, например: Код: plaintext 1. значит, что вы объявили int* a че за бред? int* 4 байта, int [10] - 40. есть разница? Код: plaintext 1. значит, что вы объявили int* a Код: plaintext 1. Только память будет выделена возможно по разному ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 12:28 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
MasterZivИ далеко не во всех языках программирования есть указатели и ссылки. Да и массивы тоже Язык Элочки Людоедки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 12:31 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Macks Код: plaintext 1. значит, что вы объявили int* a Код: plaintext 1. нет, не значит. Это разные конструкции. В том числе и потому, что память ОБЯЗАТЕЛЬНО будет выделена по разному. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 14:00 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
MacksMasterZivВообще, насколько я понял, объявление массива, например: Код: plaintext 1. значит, что вы объявили int* a че за бред? int* 4 байта, int [10] - 40. есть разница? Код: plaintext 1. значит, что вы объявили int* a Код: plaintext 1. Только память будет выделена возможно по разному О, ещё один ... Ладно, переубеждать не буду, живите, до первого собеседования... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 14:11 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
MasterZivдо первого собеседования... там мож про деструкторы расскажут.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 14:47 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
egorych, вам нужно быть несколько более уравновешенным. если у вас какие-то проблемы в личной жизни, или на работе, не стоит своё чёрное настроение переводить сюда. +Изопропил первоисточник я встретил сегодня в K&R, старница 56, глава 2.12 Старшинство и порядок вычислений. Администраторы форума, я прошу вас обратить внимание на хамство egorych, его не стоит банить конечно, но обратить внимание, мне кажется, стоит Модератор: Обратили, обратили, не беспокойся. Лучше бы ты сам на него меньше внимания обращал. egorychЯ ссылку дал, чукча не-читатель? ваша ссылка не первоисточник. И описания в K&R и на том сайте различны, я больше доверяю K&R. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 05:00 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
egorychестественно функция smth_func_2 не возвращает значение, ведь тип возвращаемого значения у неё void . Другое дело, что она модифицирует свой входной параметр. Это называется побочным эффектом , а не возвращением значения. MasterZivФункция --она на то и функция, чтобы возвращать. Вотэто она и возвращает. Явно. А всё остальное -- это побочные эффекты. Вот вы докопались. Вы не видите что-ли разницу между алгоритмом и реализацией на языке программирования? Если я напишу программу которая выводит на экран картинку, то в языке С/С++ она тоже не выводит картинку, а вызывает функции, присваивает, читает переменные и т.д. Нету вывода картинок в С. Но если подняться на более высокий уровень, то все это вместе реализует алгоритм "вывод картинки". В исходной цитате К/Р речь идет о возврате нескольких значений алгоритмом, а не о возврате значений как синтаксической конструкции С. И о том, что на С, такой возврат обычно реализован через модификацию значений через аргументы-указатели. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 05:44 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
MasterZiv, я думаю что в данном случае вы правы. Но первоначально мне так не казалось. а по поводу побочного эффекта, не вижу смысла продолжать дискуссию. Мне понравилось слово "явно", значит моя мысль хотя бы немного, но имеет право на жизнь. И действительно, возможно у нас несколько разная грань между алгоритмом и программным кодом, в связи с этим разное понимание общих вопросов. Я стал понимать больше и шире, спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 07:34 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyВот вы докопались.я то думал, он разобраться хочет, а он, видишь ли, ябеда оказался )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 09:32 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
White OwlИ обязательно прочти Таненбаума!Абсолютно согласен. Уже официально признано классикой ИТ. Кстати, его книги свободно гуляют по Сети, так что их абсолютно без проблем можно найти и скачать совершенно бесплатно на множестве серверов. (Не сочтите за труд – поищите сами.) Если будут предлагать заплатить деньги или ввести номер телефона для скачивания – не соглашайтесь, ищите бесплатный ресурс с книгами, каковых есть множество. Если для проверки, что вы не робот, потребуется ввести ответ на какой-нибудь простой вопрос – это можно сделать, это совершенно бесплатно и совсем не трудно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 11:27 |
|
||
|
Передача массивов в функции
|
|||
|---|---|---|---|
|
#18+
Виноват, предыдущее сообщение не в той ветке опубликовал. Но, поскольку сообщение общего характера, а автор обеих веток один и тот же человек – думаю, он поймёт, к чему это. Другие товарищи, думаю, тоже сообразят – грамотные же люди… ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 11:39 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2019725]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
74ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
77ms |
get tp. blocked users: |
1ms |
| others: | 11ms |
| total: | 204ms |

| 0 / 0 |
