|
|
|
Динамический массива
|
|||
|---|---|---|---|
|
#18+
Привет всем программиста С/C++. Напишите плиз как правильно создавать массив массива. Динамический. Динамический потому что заранее не знаю какого размера должен быть. Например int mas[10][5]; не подходит, так как через переменную я не могу ему указать кол. элементов. Вот одномерный - динамический массив int *mas=new int[kolelementov]; А как сделать двумерный? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2006, 16:03 |
|
||
|
Динамический массива
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. There Ain't No Such Thing As A Free Lunch ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2006, 16:44 |
|
||
|
Динамический массива
|
|||
|---|---|---|---|
|
#18+
Спаисбо BlackStar. Но это по сути есть одномерный масив. Я уже нашел, вот как: int**tmp = new int*[SIZE]; for (int i=0; i!= SIZE; ++i) tmp = new int[SIZE]; А вот где нашел сылка. http://forum.sources.ru/index.php?showtopic=65902 Админы простите я не пытаюсь рекламировать что-то. Если нужно можите удалить ссылку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2006, 17:12 |
|
||
|
Динамический массива
|
|||
|---|---|---|---|
|
#18+
Гы-гы-гы! memory leak в вашем решении. И не работает оно. А я вот поэксперементировал с С++. Как всегда STL рулит. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. There Ain't No Such Thing As A Free Lunch ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2006, 17:25 |
|
||
|
Динамический массива
|
|||
|---|---|---|---|
|
#18+
А кто нибудь приведет определение динамического массива? У BlackStar код то работает. Но почему массив динамический? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2006, 18:08 |
|
||
|
Динамический массива
|
|||
|---|---|---|---|
|
#18+
Создайте вектор m x n и вспомогательный класс XY со статическими членами - размерность массива Тогда (int) XY(x,y) == адресу в векторе. Разумеется оператор int придётся написать. XY MyDim(100,200); vector<double> v(MyDim.size(),0); v[XY(1,2)] = 1; ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2006, 18:36 |
|
||
|
Динамический массива
|
|||
|---|---|---|---|
|
#18+
TeemА кто нибудь приведет определение динамического массива? У BlackStar код то работает. Но почему массив динамический? Все очень просто, статический - значит размерность массива определяется на этапе компиляции, динамический - на этапе исполнения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2006, 18:42 |
|
||
|
Динамический массива
|
|||
|---|---|---|---|
|
#18+
Облажался. Нужен ещё оператор () и тогда v[XY(100,200)(1,2)] = 2 или v[myAddr(1,2)] = 2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2006, 19:07 |
|
||
|
Динамический массива
|
|||
|---|---|---|---|
|
#18+
BlackStarА я вот поэксперементировал с С++. Как всегда STL рулит. #include <vector> #include <stdio.h> int main() { int X = 4, Y = 3; std::vector< std::vector<int> > a( Y, std::vector<int>(X) ); for( int y = 0, n = 0; y < Y; y++ ) for( int x = 0; x < X; x++ ) a[y][x] = n++; for( int y = 0; y < Y; y++ ) for( int x = 0; x < X; x++ ) printf( "arr[%d][%d] = %d\n", y, x, a[y][x] ); return 0; } А Си уже не рулит что ли ? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2006, 20:28 |
|
||
|
Динамический массива
|
|||
|---|---|---|---|
|
#18+
suzum А Си уже не рулит что ли ? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Си конечно тоже рулит. :) Однако, 1) malloc на каждый элемент массива - не жирно будет? да и тормозно... 2) данный код будет работать только там где sizeof(int) == sizeof(int*) 3) опять таки memory leak в вашем коде, перед free(data); надо бы вписать Код: plaintext 1. N'est-ce pas? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2006, 11:50 |
|
||
|
Динамический массива
|
|||
|---|---|---|---|
|
#18+
Всё нормально, работает какая ещё утечька памяти. Только в конце надо удалить этот массив из памяти. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2006, 15:12 |
|
||
|
Динамический массива
|
|||
|---|---|---|---|
|
#18+
Ой забыл кое что. Вот ето точно работает. Только что из консоли вылиз. :) Всё нормально, работает какая ещё утечька памяти. Только в конце надо удалить этот массив из памяти. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2006, 15:28 |
|
||
|
Динамический массива
|
|||
|---|---|---|---|
|
#18+
Админы красавцы, я понял почему мой первый пример с ошибкой. Потому что если писать mas[ЗДЕСЬ ЛАТИНСКАЯ И] то форум её удаляет получается ошибка. А ещё форум по программированию. А вот так не трогает mas[w] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2006, 15:31 |
|
||
|
Динамический массива
|
|||
|---|---|---|---|
|
#18+
Дружище! Попробуте обрамлят текс исходников тегами SRC и ваши волосы будут... Когда набираете сообщение, обратите внимание на кнопочки который расположены под темой... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2006, 15:57 |
|
||
|
Динамический массива
|
|||
|---|---|---|---|
|
#18+
BlackStarДружище! Попробуте обрамлят текс исходников тегами SRC и ваши волосы будут... Когда набираете сообщение, обратите внимание на кнопочки который расположены под темой... Спасибо за совет. Я про админов вшутку. Клёвый сайт!!! Как незайду, всегда помогут. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2006, 16:09 |
|
||
|
Динамический массива
|
|||
|---|---|---|---|
|
#18+
Если уж так сильно хочется обращаться к массиву [x][y], то лучше наверное сделать так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. PS alex83_sql, я вас умоляю, не надо в цикле перебора массива писать <=. Просто, меньше! Иначе выход за границу массива получается. А это сильно чревато. -- There Ain't No Such Thing As A Free Lunch ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2006, 16:32 |
|
||
|
Динамический массива
|
|||
|---|---|---|---|
|
#18+
BlackStarСи конечно тоже рулит. :) Однако, 1) malloc на каждый элемент массива - не жирно будет? да и тормозно... 2) данный код будет работать только там где sizeof(int) == sizeof(int*) 3) опять таки memory leak в вашем коде, перед free(data); надо бы вписать Код: plaintext N'est-ce pas? Меня терзают смутные сомнения, что Код: plaintext BlackStar#include <iostream> int main() { int rows=3, cols=5, i, j, n=0; int** arr = new int*[ rows ]; arr[0] = new int[ rows*cols ]; // выделяем память сразу под все строки for( i = 1; i < rows; i++ ) arr = arr[0]+cols*i; // формируем др.указатели for( i = 0; i < rows; i++ ) for( j = 0; j < cols; j++ ) arr[j] = n++; for( i = 0; i < rows; i++ ) for( j = 0; j < cols; j++ ) std::cout << "arr[" << i << "][" << j << "] = " << arr[j] << std::endl; delete arr[0]; // удалим собственно массив строк delete arr; // и массив указателей на строки этого массива return 0; } К моему глубокому сожалению ни черта не понимаю в этом сипипи, поэтому вопрос к BlackStar, как к человеку серьёзному: вот это то же самое или нет (продолжаю изучать C++ ) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. P.S. Если что не так, то pardon (дико извиняюсь, французского не знаю и немного не в форме сегодня ). Так трудно писАть - 10 раз, наверное, редактировал :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2006, 22:08 |
|
||
|
Динамический массива
|
|||
|---|---|---|---|
|
#18+
suzum BlackStarСи конечно тоже рулит. :) Однако, 1) malloc на каждый элемент массива - не жирно будет? да и тормозно... 2) данный код будет работать только там где sizeof(int) == sizeof(int*) 3) опять таки memory leak в вашем коде, перед free(data); надо бы вписать Код: plaintext N'est-ce pas? Меня терзают смутные сомнения, что Код: plaintext С чего бы? Вы ведь перед этим запихивали в data[n] указатель на память выданную (int *) malloc(sizeof(int *)). suzum К моему глубокому сожалению ни черта не понимаю в этом сипипи, поэтому вопрос к BlackStar, как к человеку серьёзному: вот это то же самое или нет (продолжаю изучать C++ ) не совсем. вернее совсем не то :) разберем по строкам Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. вот окончательная версия Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2006, 12:17 |
|
||
|
Динамический массива
|
|||
|---|---|---|---|
|
#18+
BlackStar перед free(data); надо бы вписать Код: plaintext N'est-ce pas? suzumМеня терзают смутные сомнения, что Код: plaintext BlackStarС чего бы? Сам не пойму с чего, но тем не менее именно так получаем AV (BCB 6). BlackStarразберем по строкам Код: plaintext 1. 2. 3. Нет... Код: plaintext 1. 2. 3. BlackStarвот окончательная версия Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Здесь я не понял, зачем тогда вообще нужен arr_elems, если можно просто: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2006, 15:20 |
|
||
|
Динамический массива
|
|||
|---|---|---|---|
|
#18+
люди, зачем лезть в дебри? вот на с int **mas; mas = (int **)malloc(sizeof(int)*N); for(int i=0;i<N;i++) mas = (int *)malloc(sizeof(int)*M); for(int i=0;i<N;i++) free(mas); free(mass); на с++ int **mas; mas = new int*[N]; for (int i=0; i<N; i++) mas=new int[M]; for (int i=0; i<N; i++) delete []mas; delete []mas; кстати вы полностью не освобождали память, а потому мусора там буд немеряно! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2006, 15:29 |
|
||
|
Динамический массива
|
|||
|---|---|---|---|
|
#18+
сори.. это таки комбинации символов, знач вы писали прально... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2006, 15:38 |
|
||
|
Динамический массива
|
|||
|---|---|---|---|
|
#18+
suzum BlackStar перед free(data); надо бы вписать Код: plaintext N'est-ce pas? suzumМеня терзают смутные сомнения, что Код: plaintext BlackStarС чего бы? Сам не пойму с чего, но тем не менее именно так получаем AV (BCB 6). Ну, начнем с того что тот код просто ужасен и не выполняет своей задачи. И там стрельнуть может уже на уровне Код: plaintext suzum Нет... Код: plaintext 1. 2. 3. Масло масленное. Сначала размещаем место под даанные, а потом еще место под указатели на эти данные, и в результате к этим данным все равно по человечески (arr[x][y]) обратится не можем. suzum Здесь я не понял, зачем тогда вообще нужен arr_elems, если можно просто: [ skip ] А одномерный массив или многомерный - это как на него взглянуть... Цель была: создать динамический многомерный массив, и видимо иметь возможность обращаться к его элементам в виде [x][y]. В статическом массиве n-мерность это метафора, физически в памяти все это располагается как одномерный массив, просто компилятор на знает на сколько нужно сдвигать указатель в момент обращения, т.к. размер массива известен на момент компиляции. Идем далее. Мы хотим смоделировать подобное поведение для динамического массива. Для этого мы создаем опять таки плоский массив для размещения всех элементов (data) и массив указателей на указатели для доступа к строкам (arr_elems). Далее мы в каждый элемент этого массива (указатель на массив), прописываем указатель на некоторую область массива данных. arr_elems[0] = &data[0], arr_elems[1] = &data[50] и т.д. Это нам дает возможность адресовать данные обычным способом. arr_elems[2] дает нам адрес сотого элемента в массиве data или просто говоря начала третей строки массива. Далее применив к этому указателю [x] мы получаем 100+х элемент массива data или x'овый элемент в третей сроке. Так понятнее? Теперь объясню почему надо сразу создавать весь массив под данные, а не отдельный malloc или new на каждую строку массива. Дело в том, что эти операции (выделения памяти) очень дороги с точки зрения производительности системы, вносят дополнительные расходы памяти и способствуют ее фрагментации. Поэтому память лучше распределять большими блоками, а уж потом с ними управляться по своему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2006, 16:32 |
|
||
|
Динамический массива
|
|||
|---|---|---|---|
|
#18+
BlackStarВ статическом массиве n-мерность это метафора, физически в памяти все это располагается как одномерный массив Я и говорю: suzumА одномерный массив или многомерный - это как на него взглянуть... BlackStarТеперь объясню почему надо сразу создавать весь массив под данные, а не отдельный malloc или new на каждую строку массива. Sorry, видимо Вы не обратили внимания: suzumЗдесь я не понял, зачем тогда вообще нужен arr_elems, если можно просто: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Здесь нет никакого отдельного malloc или new на каждую строку массива, память выделяется одним куском и за один приём. А спрашивал я в последнем посте о другом: зачем вообще нужен предлагаемый Вами массив указателей на строки, если можно сделать как в приведённом выше примере ? Есть область памяти, в которой будут размещены значения элементов массива; адрес этой области памяти нам известен (data). Тогда какой смысл в массиве указателей arr_elems ? Если только в том, чтобы иметь возможность обращаться к элементам массива как arr_elems [j], то Вы и сами говорите, что BlackStarДело в том, что эти операции (выделения памяти) очень дороги с точки зрения производительности системы, вносят дополнительные расходы памяти и способствуют ее фрагментации. PS: извините, пойду в гости (тут рядом) отмечу Рождество ;) Буду часа через 3 - 4 (надеюсь). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2006, 17:27 |
|
||
|
Динамический массива
|
|||
|---|---|---|---|
|
#18+
Я немного перепишу ваш пример и продемонстрирую вывод. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Код: plaintext 1. 2. 3. 4. теперь чуть изменим код Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Код: plaintext 1. 2. 3. 4. Идем дальше. Зачем нужен int** arr; Для адресации по строкам массива, т.е. ИСКЛЮЧИТЕЛЬНО ДЛЯ УДОБСТВА ЧТЕНИЯ И НАПИСАНИЯ КОДА. Это абсолютная потеря памяти. НО! Иногда на нее можно пойти ради читабельности. Проще читать arr[x][y], чем arr[ y + y*x ]. Два вызова new или malloc делаются исключительно для наглядности изложения. При желании все это переписывается следующим образом: Код: plaintext 1. 2. 3. 4. -- There Ain't No Such Thing As A Free Lunch ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2006, 18:36 |
|
||
|
Динамический массива
|
|||
|---|---|---|---|
|
#18+
+1. Кстати, наблюдение: беседа с трезво мыслящим человеком, сочетаемая с умеренным употреблением спиртных напитков, чрезвычайно эффективно просветляет сознание. И ещё: сейчас посмотрел первый пост BlackStar (как я его проглядел ?) и долго смеялся Круг замкнулся (хотя правильнее, наверное, окружность ), ответ был дан на 41-й минуте существования сего топика. BlackStarThere Ain't No Such Thing As A Free Lunch Это о том сыре, который в мышеловке ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2006, 13:48 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33469300&tid=2032177]: |
0ms |
get settings: |
8ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
51ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
76ms |
get tp. blocked users: |
2ms |
| others: | 234ms |
| total: | 407ms |

| 0 / 0 |
