.
.
.
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);
}
динамическое выделение памяти
Вообщем размерность вводится с клавиатуры, таким образом надо динамически выделять память...Делаю массив указателей, элементами которого являются одномерные динамические массивы(строки матрицы). При n<=4 все работает. Если же ввести n=5 и выше, то программа вылетает с ошибкой(вроде, Access violation error). Код:
"динамическое программирование".
Ты его неверно применяешь, поэтому я изменил название топика.
Далее ты выделяешь память под один указатель:
pmatrix=pstart=(double **)malloc(sizeof(double *));
а пытаешься запихнуть туда n указателей:
for(int p=0;p<k;p++) {
pmatrix
Далее, если ты используешь С++, то почему бы не использовать new[] ?Будет значительно проще.
Далее, если ты используешь С++, то тебе принципиально самому городить контейнеры, почему бы не воспользоваться готовыми?
Твоя задача, написанная с использованиес С++ выглядит так:
Для начала разберись с термином
Ты его неверно применяешь, поэтому я изменил название топика.
Далее ты выделяешь память под один указатель:
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;
}
{
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;
}
Да, Green..Я просто ошибся. Только что пересмотрел исходник и удивился, почему там выделение места под 1 указатель))Все равно спасибо
кстати, я использую СИ. Есть какой-нибудь другой источник на тему "Динамическое программирование"? Просто хочется в этом до конца разобраться.
что ты подразумеваешь под "Динамическое программирование" ?
этот термин никак не относиться к тому коду, который ты здесь привел
[quote=Wikipedia]
Идея динамического программирования состоит в разбиении задачи на несколько независимых подзадач, решении каждой из них, а затем вычислении исходного результата. Для решения подзадач этот же алгоритм применяется рекурсивно. При этом для каждой подзадачи запоминается вычисленный ответ, и если на каком-то шаге встретилась подзадача второй раз, то вычисления для нее не производятся. За счет большого количества пересекающихся подзадач это значительно уменьшает время работы.
[/quote]
А вот об этом: "неа... ты пишешь на С++, хотя его и не используешь... " - можно поподробней.
А вот об этом: "неа... ты пишешь на С++, хотя его и не используешь... " - можно поподробней.
[/QUOTE]
Можно, конечно:
Код:
void enter_the_matrix(double **pmatrix,int k)
и
Код:
for(int p=0;p<k;p++)
- это не C.
cout << "n=";
cin >> n;
Ну я иногда использую потоки, ибо писать легче.
Код:
void enter_the_matrix(double **pmatrix,int k)
и
Код:
for(int p=0;p<k;p++)
- это не C.[/QUOTE]
Не совсем согласен....
Это конечно уже не Pure С, но ещё и не С++...
Судя по всему он использует вещь под названием С с классами(по классификации Страуструпа).
По крайней мере очень на то похоже.
Ужасно глючная вещь, Очень сырая...
Судя по всему он использует вещь под названием С с классами(по классификации Страуструпа).[/QUOTE]
Объявление переменных внутри блоков (for(int p=0;p<k;p++)) - современный стандарт языка С. А что тут
Цитата:
void enter_the_matrix(double **pmatrix,int k)
rjx'у не понравилось, вообще не понятно.
[/QUOTE]
Я не знаток стандарта C, можно конкретную ссылочку или цитату по данному моменту?
Использование operator<< всё же явно свидетельствует о C++.
Из раздела 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.
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
iteration-statement:
while ( expression ) statement
do statement while ( expression ) ;
for ( expressionopt ; expressionopt ; expressionopt ) statement
for ( declaration expressionopt ; expressionopt ) statement
Где-то бы в недрах этого талмуда хорошо бы было найти специальный раздел именно по данному вопросу, но мне пока попалось только это. А вообще я об этом читал ещё раньше где-то в документации к моему любимому LCC и именно поэтому был очень удивлен, когда Бильдер меня впервые обматерил за такие конструкции.
P. S. А на счёт перегруженного оператора <<, то это конечно только С++. Просто меня возмущает, когда о языке С судят по его реализациям начала 90-х.
Согласен, есть такой косяк... :) видимо, сказываются старые привычки.
Учту твоё возмущение, и буду включать, наконец, опцию "-std=c99" ;)
Хотя на "Pure C" (как его тут однажды назвали) пишу довольно редко.
З.Ы. Отошли немного от темы, IMHO...
Надо будет заняться стандартом С на досуге... :)
Так что, господа, я не врал, говоря, что использую С. А потоковый ввод/вывод лишь для простоты во время отладки.
Но ты не врал, ты просто не не знаешь истины. :)
Наверняка используешь что-то типа Borland С 3.1(1)
Код:
void enter_the_matrix(double **pmatrix,int k)
Вы нашли Си++ного? Если она все же Си++ая и на Си не отработает для меня будет это откровением
Кстати,есть такая вещь как хип,если вы не знали.Ну,или кучи,если по-русски
Есть ещё такая вещь, как диарея... :)
Ну хотя бы то,что напрямую вызвать хиповые функции будет быстрее,чем через MSVCRT или ещё что-то.Вы в курсе,что MAlloc как раз таки с помощью хипа работает?Кстати,вдруг у юзера не будет этого сишного рантайма,что тогда?
[/QUOTE]
Ну и что? Куда-то спешим? :)
А напрямую работать с физической памятью ещё быстрее. Пишем драйвер, чтоб создать в своей программе двумерный массив? :)
[QUOTE=@pixo $oft]
Вы в курсе,что MAlloc как раз таки с помощью хипа работает?
[/QUOTE]
Всё зависит от реализации.
[QUOTE=@pixo $oft]
Кстати,вдруг у юзера не будет этого сишного рантайма,что тогда?[/QUOTE]
А если у юзера вообще не будет компьютера, что тогда?
P.S. Тебя, я вижу, распирает поделиться своими знаниями? Похвально, только делай это в тему.
Ну а вдруг кому-то скорость нужна?Вот лучше прямой вызов использовать.А насчёт самодельного драйвера-это будут лишние затраты,малец загнул ты(хотя идея неплохая:) )
Случай с отсутствием компа не рассматривается
Тогда это уже не юзер
Насчет сравнения функции выделения памяти и оператора new где то тут уже писали:). Как раз про нашу всеми любимую оптимальность. Еще раз зацепим эту тему?;)
new - выделяет память, производит вызов конструктора и освобождает память, если конструктор кинул исключение.
malloc - выделяет область памяти. И всё. Конструктор придётся вызывать ручками, естественно, с перехватом и повторной генерацией исключений.
С точки зрения контроля целостности кода, вызовы new|delete отличаются от malloc|realloc|free. По-крайней мере, путаница в их использовании приводит к матюкам со стороны компонетов отладки.
Цитата: el scorpio
С точки зрения контроля целостности кода, вызовы new|delete отличаются от malloc|realloc|free. По-крайней мере, путаница в их использовании приводит к матюкам со стороны компонетов отладки.
Путаница и возможные матюки будут если использовать в одной программе и тот и другой способ. А так, чтобы использование new кому-то не нравилось, такого не помню.
Матюки будут, когда эти команды будут применяться к одному объекту. А к различающимся областям памяти можно применять разные методы выделения/освобожденич
Да, я так и имел в виду, просто выразился неточно, прошу прощения:)