Antananarivu
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору А у меня сработало ксати, я не говорю что вы не правы, я понимаю, что криво, но ведь сработало. После того как я переделал размер, те поля которые вышли за границы новой матрицы заполнились случайными цифрами, те поля которые и в новой и в старой матрице совпадали - цифры в них сохранились, а в новые поля я после добавил свои цифры и затем эта матрица при дальнейших вычислениях отработала как надо, без глюков. Видимо, мне просто повезло. Добавлено: А если переделать не так: Код: а вот так: Код: int N=5; int M=8; A.nx=N; A.mx=M; A.data=(LDouble*)malloc(N*M*sizeof(LDouble)); for (int i=0; i < A.nx*A.mx; i++) A.data[i]=0; | То есть тупо переразметить все заново - а потом всю матрицу заново забить новыми цифрами - все равно ужасно? Нет, я понимаю, что легче создать новую матрицу и что практического эффекта от вот такого выкаблучивания мало, но просто для понимания процессов. Я оставляю какие-то куски памяти за бортом при новой разметке, какие-то наоборот добавляю. Вот такая искуственная переразметка уже размеченной конструктором памяти чем чревата? Или все же все корректно в данном случае, нерационально, некрасиво, но коректно? Или все же нет? В общем, как это было бы сделать корректно? Как корректно переразметить память... Чтобы конкретезировать задачу: у меня есть NMTMatrix A(3,3), мне надо сделать A(6,6). А еще лучше для общего случая - было A(N,M), должно стать A(P,Q). Как это корректно сделать? Мало работал с динамической памятью... если кто поможет и напишет хотя бы примерный вид метода - буду премного благодарен. Ну или где про такое почитать. Именно про такое... P.S. По моему в моем последнем примере все корректно. Выделена новая область памяти, nx и mx изменены, data теперь указывает на новую выделенную область памяти. Все это дело забито нулями, потому что перенос значений из старой памяти в данном случае мне не нужен. По-моему все верно. Правда я не знаю... старая область памяти автоматически освободилась когда я data присвоил новую область памяти.. а если нет, то как ее корректно вернуть? Может быть, тогда так: Код: int N=5; int M=8; A.nx=N; A.mx=M; free(data); A.data=(LDouble*)malloc(N*M*sizeof(LDouble)); for (int i=0; i < A.nx*A.mx; i++) A.data[i]=0; | ??? В общем если лень на всю мою мазню отвечать, ответьте хотя бы на такой вопрос: как правильнее так: Код: A.data=(LDouble*)malloc(N*M*sizeof(LDouble)); A.data=(LDouble*)malloc(M*sizeof(LDouble)); free(data); | или так: Код: A.data=(LDouble*)malloc(N*M*sizeof(LDouble)); free(data) A.data=(LDouble*)malloc(M*sizeof(LDouble)); free(data); | ну то есть надо ли каждый раз явно освобождать память при присвоению указателю разных областей памяти или достаточно освободить память в самом конце? Сам нашел уже... последний вариант верный, после malloc всегда должен следовать free. |