Этот баннер — требование Роскомнадзора для исполнения 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 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38539879&tid=2019725]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
61ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 15ms |
| total: | 173ms |

| 0 / 0 |
