Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
sterkh
5 / 5 / 8
Регистрация: 06.04.2013
Сообщений: 99
#1

Если выделение памяти для динамического массива задать void-функцией, можно ли будет оперировать с ним в main?

10.08.2014, 18:00. Просмотров 1359. Ответов 40
Метки нет (Все метки)

Если выделение памяти для дин.массива задать void-функцией, можно ли будет оперировать с ним в main или придётся отдельно выделять память в main?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.08.2014, 18:00
Ответы с готовыми решениями:

Выделение памяти для динамического двумерного массива внутри функции
Имеется вот такой код : #include <iostream> void allocateMemory(int...

что плохого если я делаю ф-ю main типа void
привет всем, кто может объяснить, что плохого если я делаю ф-ю main типа void ?

Как в отдельной функции выделить память для динамического массива, объявленного в main
Доброго времени суток. Передо мной стоит задача выделения памяти для...

Выделение памяти для динамического массива
Как выделить память для динамического массива так, чтобы индексация начиналась...

Использование типа void в качестве возвращаемого значения функцией main
Здравствуйте. Надеюсь получить внятный ответ на то, почему все категорически...

40
NeonLost
Пес войны
110 / 87 / 22
Регистрация: 23.02.2012
Сообщений: 653
10.08.2014, 18:02 #2
Цитата Сообщение от sterkh Посмотреть сообщение
Если выделение памяти для дин.массива задать void-функцией, можно ли будет оперировать с ним в main или придётся отдельно выделять память в main?
можно
не прийдется
1
sterkh
5 / 5 / 8
Регистрация: 06.04.2013
Сообщений: 99
10.08.2014, 18:03  [ТС] #3
Спасибо
0
Tulosba
:)
Эксперт С++
4748 / 3242 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
10.08.2014, 19:09 #4
Цитата Сообщение от sterkh Посмотреть сообщение
Если выделение памяти для дин.массива задать void-функцией
Что здесь имеется в виду вообще?
0
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 869
Записей в блоге: 1
10.08.2014, 19:16 #5
Tulosba, видимо что-то типа
C++
1
2
3
4
5
6
7
8
9
10
11
12
void foo(int* a, int n)
{
a = new int [n];
}
 
int main()
{
int* a;
foo(a, 5);
// работа с a - надо ли писать a = new int [5];
return 0;
}
1
Tulosba
:)
Эксперт С++
4748 / 3242 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
10.08.2014, 19:23 #6
CyberSolver, в таком варианте указатель на выделенную память не вернется. Если хочется вернуть значение через аргумент-указатель, то уровень указателя (грубо говоря, количество звездочек *) должен быть на 1 больше, чем тип обрабатываемого объекта. Т.е.
C++
1
2
3
4
5
6
7
void foo(int** a, int n)
{
   *a = new int [n];
}
...
int* a;
foo( &a, 5 );
2
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 869
Записей в блоге: 1
10.08.2014, 19:36 #7
Tulosba, ключевыми словами были «что-то типа». И если бы человек написал ваш код, то и вопроса бы не возникло, верно?
0
sterkh
5 / 5 / 8
Регистрация: 06.04.2013
Сообщений: 99
10.08.2014, 20:42  [ТС] #8
C++
1
2
3
4
5
6
7
8
9
10
void freeb(int ***b, int n){
    int i;
    *b = (int**)calloc(n, sizeof(int*));
    for (int i = 0; i < n; i++) {
        *b[i] = (int*)calloc(n, sizeof(int));
    }
}
 
int **b;
freeb(&b,n);
То есть вот так будет выглядеть для двумерного массива nxn?
0
Tulosba
:)
Эксперт С++
4748 / 3242 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
10.08.2014, 23:39 #9
Цитата Сообщение от sterkh Посмотреть сообщение
То есть вот так будет выглядеть для двумерного массива nxn?
Если опираться на сишные функции, то что-то в этом духе.
1
gromo
372 / 271 / 30
Регистрация: 04.09.2009
Сообщений: 1,214
11.08.2014, 00:00 #10
Лучший ответ Сообщение было отмечено sterkh как решение

Решение

sterkh, а если опираться на С++, то лучше передать ссылку на указатель
C++
1
2
3
4
void freeb(int *&b, int n)
{
    // здесь можно присваивать укзателю
}
1
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
11.08.2014, 00:16 #11
Лучше уж возвращать указатель. Передавать по не-const ссылке - плохо.
0
DrOffset
8013 / 4650 / 1131
Регистрация: 30.01.2014
Сообщений: 7,555
11.08.2014, 00:42 #12
Цитата Сообщение от Toshkarik Посмотреть сообщение
Передавать по не-const ссылке - плохо.
Твое мнение, чем?
0
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
11.08.2014, 00:44 #13
Очевидно же, что неочевидно
0
DrOffset
8013 / 4650 / 1131
Регистрация: 30.01.2014
Сообщений: 7,555
11.08.2014, 01:38 #14
Цитата Сообщение от Toshkarik Посмотреть сообщение
Очевидно же, что неочевидно
Это спорно.
Довод, что, мол, понятно становится по операции взятия адреса, что внутри функции объект изменяется в большинстве случаев рассыпается о факт того, что программисту все равно придется смотреть определение (хотя бы чтобы выяснить константность указателя). А раз он посмотрел определение, то ссылка там или указатель уже не важно - программист уже все понял.

Чтобы у тебя не сложилось ошибочное мнение, что, мол, я не согласен и везде хочу писать ссылки - сразу скажу: это не так. Всего лишь хотел подчеркнуть, что тема весьма спорная и, принимая это во внимание, так однозначно утверждать про "плохо" или "хорошо" нельзя.
Что касается моего мнения на сложившуюся ситуацию, то оно совпадает с первым ответом вот здесь.
1
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
11.08.2014, 02:26 #15
Если нужно смотреть большой чужой код и соблюдается данное соглашение, то будет намного легче. Если в функцию передается адрес, то объект может быть её изменен. В остальных случаях, будь то передача по константной ссылке или же по значение, - объект не изменяется. Не нужно будет лишний раз лезть в заголовок за прототипом. Поэтому, я бы отдал предпочтение вот этому соглашению:
http://google-styleguide.googlecode....ence_Arguments
1
Voivoid
708 / 280 / 16
Регистрация: 31.03.2013
Сообщений: 1,339
11.08.2014, 03:20 #16
Цитата Сообщение от Toshkarik Посмотреть сообщение
http://google-styleguide.googlecode....ence_Arguments
Когда участвовал в разработке яндекс.браузера приходилось следовать всем этим стайл-гайдам. Жутко припекало в особенности от этого правила. Нафига передавать что-то по указателю, когда можно передать это по ссылке. Ведь и в том и в другом случае очевидно, что объект может быть изменен. Пояснение просто убивает: "References can be confusing, as they have value syntax but pointer semantics". Для кого они confusing, для C'шников что-ли, которые в первый раз ссылки увидели?
0
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
11.08.2014, 03:30 #17
Множество людей - множество стилей. Если каждый будет писать как захочет, то будет хаос. Для больших проектов это неприемлемо. Да что там больших, для средних даже. Это мое мнение.
0
Voivoid
708 / 280 / 16
Регистрация: 31.03.2013
Сообщений: 1,339
11.08.2014, 03:33 #18
Да очевидно, что надо придерживаться установленных правил, даже если они совершенно не по душе. Мне интересна была аргументация по тому конкретному правилу. Те доводы, которые приводит гугл, по мне так скажем весьма не убедительны
0
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
11.08.2014, 03:41 #19
Ну мне тоже думается, что основной причиной являются C'шники. Даже не сами C`шники, сколько сам C, который все еще используется в перемешку с C++. Видел его где то в исходниках Chromium`а.
0
DrOffset
8013 / 4650 / 1131
Регистрация: 30.01.2014
Сообщений: 7,555
11.08.2014, 08:37 #20
Цитата Сообщение от Toshkarik Посмотреть сообщение
Если нужно смотреть большой чужой код и соблюдается данное соглашение, то будет намного легче.
Лично я постоянно смотрю большой код. Большая часть моей работы сводится к рефакторингу и сопровождению большого количества legacy кода. И по опыту скажу, что в прототип нужно лазить постоянно. Это соглашение не работает в моем случае. Т.к. по нему нельзя отличить константный указатель от неконстантного (я об этом уже писал выше).

Не по теме:

В гуглекстати решили эту проблему просто сделав запись const T * менее предпочтительной.

Remember that most of the time input parameters are going to be specified as const T&.
Но их гайдлайн точно подходит далеко не для всех типов контор.


Это происходит хотя бы потому, что код, особенно такой старый (в смысле с большой историей), как в моем случае, не обязательно написан одной и той же командой (и не обязательно из одной и той же организации). Следовательно запросто могут быть разные гайдлайны (и это часто действительно так: в одной части системы серьезный ООП и полиморфизм, в другой С стиль и процедурное программирование - и вот одна часть кода вызывает другую). Следовательно, в общем случае никаких гарантий нет.

Опять же, я не спорю с тобой. Цель поста показать, что есть еще и другие ситуации. Их надо учитывать когда делается общий вывод.
1
11.08.2014, 08:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2014, 08:37

Как задать размеры массива пользователем, не используя динамическое выделение памяти
хм...интересный &quot;финт ушами&quot;: #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; int...

Прошу объяснить, почему перед функцией main, которая ничего не возращает, мы должны писать int, а не void?
Как пример: }#include &lt;stdio.h&gt; * ... main() { float fahr, celsius; *...

Вызов функции динамического выделение памяти
Здравствуйте! Нужна помощь! Написал функцию выделение памяти под...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru