Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

динамическое выделение памяти

6.7K
19 октября 2006 года
Ginza9
96 / / 30.06.2006
Вообщем размерность вводится с клавиатуры, таким образом надо динамически выделять память...Делаю массив указателей, элементами которого являются одномерные динамические массивы(строки матрицы). При n<=4 все работает. Если же ввести n=5 и выше, то программа вылетает с ошибкой(вроде, Access violation error). Код:

Код:
.
.
.
void enter_the_matrix(double **pmatrix,int k) {
    for(int p=0;p<k;p++) {
        pmatrix=(double *)malloc(sizeof(double)*k);
    }
    for(int i=0;i<k;i++) {
        for(int j=0;j<k;j++) {
            pmatrix[j]=element_value(i+1,j+1);
        }
    }
}
void destroy_memory_block(double **pmatrix) {
    free(pmatrix);
}
void main() {
    double **pmatrix,**pstart;
    int n;
    cout << "n=";
    cin >> n;
    pmatrix=pstart=(double **)malloc(sizeof(double *));
    enter_the_matrix(pmatrix,n);
    destroy_memory_block(pstart);
}


Ну код я не полностью привел...Ошибка, ИМХО, где-то здесь..
3
19 октября 2006 года
Green
4.8K / / 20.01.2000
Для начала разберись с термином "динамическое программирование".
Ты его неверно применяешь, поэтому я изменил название топика.

Далее ты выделяешь память под один указатель:
pmatrix=pstart=(double **)malloc(sizeof(double *));
а пытаешься запихнуть туда n указателей:
for(int p=0;p<k;p++) {
pmatrix

=(double *)malloc(sizeof(double)*k);
}



Далее, если ты используешь С++, то почему бы не использовать new[] ?Будет значительно проще.

Далее, если ты используешь С++, то тебе принципиально самому городить контейнеры, почему бы не воспользоваться готовыми?

Твоя задача, написанная с использованиес С++ выглядит так:
Код:
int main()
{
    int n;
    cout << "n=";
    cin >> n;

    vector< vector<double> > matrix( n, vector<double>() );

    for(int i=0; i<k; i++) {
        for(int j=0; j<k; j++) {
            matrix[j] = element_value(i+1, j+1);
        }
    }

    return 0;
}
6.7K
19 октября 2006 года
Ginza9
96 / / 30.06.2006
Да, Green..Я просто ошибся. Только что пересмотрел исходник и удивился, почему там выделение места под 1 указатель))Все равно спасибо
6.7K
19 октября 2006 года
Ginza9
96 / / 30.06.2006
кстати, я использую СИ. Есть какой-нибудь другой источник на тему "Динамическое программирование"? Просто хочется в этом до конца разобраться.
3
19 октября 2006 года
Green
4.8K / / 20.01.2000
неа... ты пишешь на С++, хотя его и не используешь... :)

что ты подразумеваешь под "Динамическое программирование" ?
этот термин никак не относиться к тому коду, который ты здесь привел

[quote=Wikipedia]
Идея динамического программирования состоит в разбиении задачи на несколько независимых подзадач, решении каждой из них, а затем вычислении исходного результата. Для решения подзадач этот же алгоритм применяется рекурсивно. При этом для каждой подзадачи запоминается вычисленный ответ, и если на каком-то шаге встретилась подзадача второй раз, то вычисления для нее не производятся. За счет большого количества пересекающихся подзадач это значительно уменьшает время работы.
[/quote]
6.7K
19 октября 2006 года
Ginza9
96 / / 30.06.2006
Ой...Я действительно спутал термины.
А вот об этом: "неа... ты пишешь на С++, хотя его и не используешь... " - можно поподробней.
12K
19 октября 2006 года
rjx
55 / / 11.03.2006
[QUOTE=Ginza9]
А вот об этом: "неа... ты пишешь на С++, хотя его и не используешь... " - можно поподробней.
[/QUOTE]
Можно, конечно:
 
Код:
void enter_the_matrix(double **pmatrix,int k)

и
 
Код:
for(int p=0;p<k;p++)

- это не C.
3
19 октября 2006 года
Green
4.8K / / 20.01.2000
Это тоже не C:
cout << "n=";
cin >> n;
6.7K
19 октября 2006 года
Ginza9
96 / / 30.06.2006
Ну я иногда использую потоки, ибо писать легче.
20K
20 октября 2006 года
Ich
18 / / 02.10.2006
[QUOTE=rjx]Можно, конечно:
 
Код:
void enter_the_matrix(double **pmatrix,int k)

и
 
Код:
for(int p=0;p<k;p++)

- это не C.[/QUOTE]


Не совсем согласен....
Это конечно уже не Pure С, но ещё и не С++...
Судя по всему он использует вещь под названием С с классами(по классификации Страуструпа).
По крайней мере очень на то похоже.
Ужасно глючная вещь, Очень сырая...
3.3K
21 октября 2006 года
ShadyMan
191 / / 15.07.2006
[QUOTE=Ich]Это конечно уже не Pure С, но ещё и не С++...
Судя по всему он использует вещь под названием С с классами(по классификации Страуструпа).[/QUOTE]
Объявление переменных внутри блоков (for(int p=0;p<k;p++)) - современный стандарт языка С. А что тут
Цитата:
void enter_the_matrix(double **pmatrix,int k)


rjx'у не понравилось, вообще не понятно.

3
21 октября 2006 года
Green
4.8K / / 20.01.2000
[QUOTE=ShadyMan]Объявление переменных внутри блоков (for(int p=0;p<k;p++)) - современный стандарт языка С.
[/QUOTE]
Я не знаток стандарта C, можно конкретную ссылочку или цитату по данному моменту?

Использование operator<< всё же явно свидетельствует о C++.
3.3K
21 октября 2006 года
ShadyMan
191 / / 15.07.2006
Стандарт С 1999 года с сайта, на который ты же недавно и указывал, помнишь?
Из раздела 6.2.1 Scopes of identifiers:
Цитата:
If the declarator or type specifier that
declares the identifier appears inside a block or within the list of parameter declarations in
a function definition, the identifier has block scope, which terminates at the end of the
associated block.


Из раздела 6.8.5 Iteration statements:

Цитата:
Syntax
iteration-statement:
while ( expression ) statement
do statement while ( expression ) ;
for ( expressionopt ; expressionopt ; expressionopt ) statement
for ( declaration expressionopt ; expressionopt ) statement


Где-то бы в недрах этого талмуда хорошо бы было найти специальный раздел именно по данному вопросу, но мне пока попалось только это. А вообще я об этом читал ещё раньше где-то в документации к моему любимому LCC и именно поэтому был очень удивлен, когда Бильдер меня впервые обматерил за такие конструкции.

3.3K
21 октября 2006 года
ShadyMan
191 / / 15.07.2006
P. S. А на счёт перегруженного оператора <<, то это конечно только С++. Просто меня возмущает, когда о языке С судят по его реализациям начала 90-х.
12K
21 октября 2006 года
rjx
55 / / 11.03.2006
[QUOTE=ShadyMan]P. S. А на счёт перегруженного оператора <<, то это конечно только С++. Просто меня возмущает, когда о языке С судят по его реализациям начала 90-х.[/QUOTE]

Согласен, есть такой косяк... :) видимо, сказываются старые привычки.

Учту твоё возмущение, и буду включать, наконец, опцию "-std=c99" ;)
Хотя на "Pure C" (как его тут однажды назвали) пишу довольно редко.

З.Ы. Отошли немного от темы, IMHO...
3
21 октября 2006 года
Green
4.8K / / 20.01.2000
За то много интересного узнали.
Надо будет заняться стандартом С на досуге... :)
6.7K
21 октября 2006 года
Ginza9
96 / / 30.06.2006
Так что, господа, я не врал, говоря, что использую С. А потоковый ввод/вывод лишь для простоты во время отладки.
3
21 октября 2006 года
Green
4.8K / / 20.01.2000
М-да... ты так ничего и не понял... :D
Но ты не врал, ты просто не не знаешь истины. :)
20K
21 октября 2006 года
Ich
18 / / 02.10.2006
[QUOTE=Ginza9]Так что, господа, я не врал, говоря, что использую С. А потоковый ввод/вывод лишь для простоты во время отладки.[/QUOTE]

Наверняка используешь что-то типа Borland С 3.1(1)
20K
24 октября 2006 года
Aumn
9 / / 24.10.2006
Господин Ich! Я вобщем то себя считаю продвинутым в Си, и знаю чем отличается Си от Си++. Я писал на чистом Си в Линуксе используя gcc. И на Си++ писал. Но вот че то я не могу въехать, что в строке:
 
Код:
void enter_the_matrix(double **pmatrix,int k)

Вы нашли Си++ного? Если она все же Си++ая и на Си не отработает для меня будет это откровением
7
28 октября 2006 года
@pixo $oft
3.4K / / 20.09.2006
Кстати,есть такая вещь как хип,если вы не знали.Ну,или кучи,если по-русски
3
28 октября 2006 года
Green
4.8K / / 20.01.2000
Ну так и?
Есть ещё такая вещь, как диарея... :)
7
28 октября 2006 года
@pixo $oft
3.4K / / 20.09.2006
Ну хотя бы то,что напрямую вызвать хиповые функции будет быстрее,чем через MSVCRT или ещё что-то.Вы в курсе,что MAlloc как раз таки с помощью хипа работает?Кстати,вдруг у юзера не будет этого сишного рантайма,что тогда?
3
28 октября 2006 года
Green
4.8K / / 20.01.2000
[QUOTE=@pixo $oft]Ну хотя бы то,что напрямую вызвать хиповые функции будет быстрее,чем через MSVCRT или ещё что-то.
[/QUOTE]
Ну и что? Куда-то спешим? :)
А напрямую работать с физической памятью ещё быстрее. Пишем драйвер, чтоб создать в своей программе двумерный массив? :)

[QUOTE=@pixo $oft]
Вы в курсе,что MAlloc как раз таки с помощью хипа работает?
[/QUOTE]
Всё зависит от реализации.

[QUOTE=@pixo $oft]
Кстати,вдруг у юзера не будет этого сишного рантайма,что тогда?[/QUOTE]
А если у юзера вообще не будет компьютера, что тогда?

P.S. Тебя, я вижу, распирает поделиться своими знаниями? Похвально, только делай это в тему.
7
28 октября 2006 года
@pixo $oft
3.4K / / 20.09.2006
За совет спасибо
Ну а вдруг кому-то скорость нужна?Вот лучше прямой вызов использовать.А насчёт самодельного драйвера-это будут лишние затраты,малец загнул ты(хотя идея неплохая:) )
Случай с отсутствием компа не рассматривается
7
11 ноября 2006 года
@pixo $oft
3.4K / / 20.09.2006
[QUOTE=Green]А если у юзера вообще не будет компьютера, что тогда?[/QUOTE]
Тогда это уже не юзер
63
19 ноября 2006 года
Zorkus
2.6K / / 04.11.2006
Насчет сравнения функции выделения памяти и оператора new где то тут уже писали:). Как раз про нашу всеми любимую оптимальность. Еще раз зацепим эту тему?;)
309
20 ноября 2006 года
el scorpio
1.1K / / 19.09.2006
[QUOTE=Zorkus]Насчет сравнения функции выделения памяти и оператора new где то тут уже писали:). Как раз про нашу всеми любимую оптимальность. Еще раз зацепим эту тему?;)[/QUOTE]
new - выделяет память, производит вызов конструктора и освобождает память, если конструктор кинул исключение.
malloc - выделяет область памяти. И всё. Конструктор придётся вызывать ручками, естественно, с перехватом и повторной генерацией исключений.

С точки зрения контроля целостности кода, вызовы new|delete отличаются от malloc|realloc|free. По-крайней мере, путаница в их использовании приводит к матюкам со стороны компонетов отладки.
63
21 ноября 2006 года
Zorkus
2.6K / / 04.11.2006
Цитата: el scorpio

С точки зрения контроля целостности кода, вызовы new|delete отличаются от malloc|realloc|free. По-крайней мере, путаница в их использовании приводит к матюкам со стороны компонетов отладки.


Путаница и возможные матюки будут если использовать в одной программе и тот и другой способ. А так, чтобы использование new кому-то не нравилось, такого не помню.

309
21 ноября 2006 года
el scorpio
1.1K / / 19.09.2006
[QUOTE=Zorkus]Путаница и возможные матюки будут если использовать в одной программе и тот и другой способ. А так, чтобы использование new кому-то не нравилось, такого не помню.[/QUOTE]
Матюки будут, когда эти команды будут применяться к одному объекту. А к различающимся областям памяти можно применять разные методы выделения/освобожденич
63
21 ноября 2006 года
Zorkus
2.6K / / 04.11.2006
Да, я так и имел в виду, просто выразился неточно, прошу прощения:)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог