EvilMax
Администратор
Завкаф
Карма: +59/-0
Offline
Пол:
Сообщений: 1072
Злой и страшный :)
|
|
« Ответ #60 : Март 11, 2008, 10:55:23 » |
|
Вот программа польностью 1. Ты очень невнимательный. Проверь программу еще раз (я ошибку уже нашел). 2. Пока что много мешанины - используешь класс совершенно неправильно. Зачем передавать в методы данные, которые и так отражают состояние класса, т.е. хранятся в атрибутах? Это делает применение ООП в этой программе бессмысленным. 3. Будь внимательнее с объявлением методов. Есть отклонения от стандарта. 4. Напоминаю, здесь задаём вопросы по языку, а не "у меня не работает лаба, где ошибка?"Ищите, исправляйте. Только так научитесь. PS: назревает тема онлайн-консультаций?
|
|
|
Записан
|
Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач... --- Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
|
|
|
TARAKAN
Tifon
Бакалавр
Карма: +0/-0
Offline
Пол:
Сообщений: 134
|
|
« Ответ #61 : Март 12, 2008, 12:59:22 » |
|
Напоминаю, здесь задаём вопросы по языку Тогда такой вопрос... #include <iostream.h> #include <stdio.h> #include <conio.h> #include <math.h>
class vektor { private: int sizex; double *x; public: vektor(int size);
~vektor(); }; vektor::vektor(int size): sizex(size) { x=new double[sizex]; printf("create vector \n"); } vektor::~vektor() { delete x; printf("destroyed vector \n"); }
class matrix { private: int nmas,mmas; vektor **mas; public: matrix(int n,int m); ~matrix(); zapol();
}; matrix::matrix(int n,int m): nmas(n),mmas(m) { int i; mas = new vektor* [nmas]; for (i=0;i<nmas;i++) { *(mas+i) = new vektor(mmas); } printf("create matrix \n");
}
matrix::zapol() { int i,j; for (i=0; i<nmas; i++) for (j=0; j<mmas; j++) *(*(mas+i)+j)=123;
/* for (i=0; i<nmas; i++) { printf("\n"); for (j=0; j<mmas; j++) printf("%.3f ",*(*(mas+i)+j)); } */ printf("\n 123 \n"); }
matrix::~matrix() { int i; for (i=0; i<nmas; i++) { delete *(mas+i); } delete []mas; printf("\n free memory \n"); printf("destroyed matrix \n"); }
main() { int n,m; printf("vvedite n\n"); scanf("%d",&n); printf("vvedite m\n"); scanf("%d",&m); vektor x(n); matrix a(n,m); getch(); a.zapol(); getch(); return 0; }
Если закомментировать всю функцию zapol все нормально получается вот такой результат vvedite n 2 vvedite m 2 create vector create vector create vector create matrix
123 destroyed vector destroyed vector
free memory destroyed matrix destroyed vector Press any key to continue Но если убрать комментарий с заполнения, то получается вот такое vvedite n 2 vvedite m 2 create vector create vector create vector create matrix create vector destroyed vector create vector destroyed vector create vector destroyed vector create vector destroyed vector
123 Дальше программа вылетает... Вопрос такой. Почему заполнение массива matrix::zapol() { int i,j; for (i=0; i<nmas; i++) for (j=0; j<mmas; j++) *(*(mas+i)+j)=123; вызывает вот это create vector destroyed vector create vector destroyed vector create vector destroyed vector create vector destroyed vector Т е вместо заполнения получается выделение памяти и ее освобождение сразу ... Правильно ли Artem90 дал подсказку на счет указателей ? Или надо както подругому обращаться ? Как я понял из-за этого в последствии и вылетает программа, тк пытается освободить память, которую уже освободили ... другой "причины" найти не могу
|
|
|
Записан
|
Студент: По моему легче использовать printf... EvilMax: Зато cout - это тру! = ))
|
|
|
LazarusLong
Ирландский доброволец
Проректор
Карма: +181/-7
Offline
Пол: Награды:
Сообщений: 6134
Ukrainian by birth, Irish by the grace of God
|
|
« Ответ #62 : Март 12, 2008, 01:17:03 » |
|
Потому что *(*(mas+i)+j) - это вектор. А не его элемент.
|
|
|
Записан
|
Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.
"...Он любил говорить факин щит Когда что-то не так ему Принимал он свой самый ирландский вид И кидался трубкой в жену..."
|
|
|
TARAKAN
Tifon
Бакалавр
Карма: +0/-0
Offline
Пол:
Сообщений: 134
|
|
« Ответ #63 : Март 12, 2008, 01:24:12 » |
|
LazarusLong А как обратиться к эл-ту ? Из-за этого двойного указателя не пойму ничего =\
|
|
|
Записан
|
Студент: По моему легче использовать printf... EvilMax: Зато cout - это тру! = ))
|
|
|
LazarusLong
Ирландский доброволец
Проректор
Карма: +181/-7
Offline
Пол: Награды:
Сообщений: 6134
Ukrainian by birth, Irish by the grace of God
|
|
« Ответ #64 : Март 12, 2008, 01:38:17 » |
|
Обрати внимание на то, что элементы массива внутри класса вектор у тебя хранятся в double *x. Ты же этот икс в обращении вообще не используешь. Ну и по структуре у меня есть замечания, но здесь - не лучшее место что бы их писать ))). Думайте, господа студенты ))))
|
|
|
Записан
|
Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.
"...Он любил говорить факин щит Когда что-то не так ему Принимал он свой самый ирландский вид И кидался трубкой в жену..."
|
|
|
TARAKAN
Tifon
Бакалавр
Карма: +0/-0
Offline
Пол:
Сообщений: 134
|
|
« Ответ #65 : Март 12, 2008, 01:22:22 » |
|
В общем то, что кидал перед этим, переделал вот так... хотя бы не вылетает и освобождает память ... конечно много чего можно подругому сделать, сейчас хотя бы чтоб работало делаю #include <iostream.h> #include <stdio.h> #include <conio.h> #include <math.h>
class vektor { private: int sizex; double *x; public: vektor(int size); void setelem(int j,double num) { *(x+j)=num; } double getelem(int j) { return *(x+j); } ~vektor(); }; vektor::vektor(int size): sizex(size) { x=new double[sizex]; printf("create vector \n"); } vektor::~vektor() { delete x; printf("destroyed vector \n"); }
class matrix { private: int nmas,mmas; vektor **mas; public: matrix(int n,int m); ~matrix(); zapol();
}; matrix::matrix(int n,int m): nmas(n),mmas(m) { int i; mas = new vektor* [nmas]; for (i=0;i<nmas;i++) { *(mas+i) = new vektor(mmas); } printf("create matrix \n");
}
matrix::zapol() { int i,j; for (i=0; i<nmas; i++) for (j=0; j<mmas; j++) (*(mas+i))->setelem(j,123.321);
for (i=0; i<nmas; i++) { printf("\n"); for (j=0; j<mmas; j++) printf("%.3f ",(*(mas+i))->getelem(j)); }
printf("\n 123 \n"); }
matrix::~matrix() { int i; for (i=0; i<nmas; i++) { delete *(mas+i); } delete []mas; printf("\n free memory \n"); printf("destroyed matrix \n"); }
main() { int n,m; printf("vvedite n\n"); scanf("%d",&n); printf("vvedite m\n"); scanf("%d",&m); vektor x(n); matrix a(n,m); getch(); a.zapol(); getch(); return 0; }
vimmaxЕсли выделяешь память new[] то и удалять ты должен через delete[]
Ну, я освобождаю сначала то, что выделил последнее, т е delete *(mas+i);, а потом delete []mas; ... запустил раз 10 программу с параметрами 1000х1000 вроде все нормально ... (Отправлено в: 12 Марта 2008, 12:00:06)Спасибо, не заметил в vektor []x;
|
|
|
Записан
|
Студент: По моему легче использовать printf... EvilMax: Зато cout - это тру! = ))
|
|
|
EvilMax
Администратор
Завкаф
Карма: +59/-0
Offline
Пол:
Сообщений: 1072
Злой и страшный :)
|
|
« Ответ #66 : Март 12, 2008, 07:04:54 » |
|
vimmax, ну что ж, тема назрела - будем и онлайн-консультации устраивать Надо только подумать, как разнести по темам вопрсы по языку и консультации по программам/лабам. Где там наш модератор раздела "Программирование"? Да, vimmax, еще вопрос: что происходит при удалении массива с помощью delete[] ? Проверял - память в кучу возвращается. Знаю, что delete[] гарантирует вызов деструктора для каждого элемента, а вот как быть с необъектным типом? ЗЫ: думал, это допускает только старый Борланд, но вот что получил от профайлера KDevelop для такого кода: #ifdef HAVE_CONFIG_H #include <config.h> #endif
#include <iostream> #include <cstdlib>
using namespace std;
main(int argc, char *argv[]) { long *x; for (int i=0; i<1000; i++) { x=new long[1000]; x[i]=11; delete x; }
cout << "Success" << endl;
return EXIT_SUCCESS; }
All heap blocks were freed -- no leaks are possible.
gcc версия 4.2.2 20071128 (prerelease) (4.2.2-3.1mdv2008.0) И еще, вопрос к читателям: у кого-нибудь есть откорректированный релиз 2003 года стандартов C/C++, и какие компиляторы их поддерживают? У меня они есть, но старенькие: 1998 года, без коррекций 2003-го.
|
|
« Последнее редактирование: Март 12, 2008, 07:36:45 от EvilMax »
|
Записан
|
Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач... --- Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
|
|
|
Sochin
Злой модератор
Декан
Карма: +108/-6
Offline
Пол:
Сообщений: 1518
|
|
« Ответ #67 : Март 12, 2008, 11:32:32 » |
|
EvilMax
Имеется черновик стандарта С++. Финальная версия документа платная.
|
|
|
Записан
|
Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил... 壯鎭
|
|
|
EvilMax
Администратор
Завкаф
Карма: +59/-0
Offline
Пол:
Сообщений: 1072
Злой и страшный :)
|
|
« Ответ #68 : Март 12, 2008, 11:41:33 » |
|
Имеется черновик стандарта С++. Финальная версия документа платная. Ок, спасибо. Остальное - через личку.
|
|
|
Записан
|
Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач... --- Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
|
|
|
zer_owlet
Необычные пользователи
Проректор
Карма: +103/-16
Offline
Пол:
Сообщений: 2399
|
|
« Ответ #69 : Март 13, 2008, 01:42:34 » |
|
Я пишу максимум на VB.NET, но может таки http://www.cplusplus.com/doc/tutorial/ вот это поможет? Найдено в гугле по "C++ manual"... Если еще и вопрос подгадать, то вообще будет отлично...
|
|
|
Записан
|
Если бы те, кто злословит обо мне, знали, что я о них думаю, они бы ещё не то говорили. Так хочется быть добрым и порядочным, особенно, когда понимаешь, что патронов на всех никогда не хватит.. Памятка женщинам: если ты хочешь, чтоб мужчина встал на колени - разденься и встань на четвереньки.
|
|
|
Артем
sprata
Mодератор
Завкаф
Карма: +40/-5
Offline
Пол:
Сообщений: 1107
|
|
« Ответ #70 : Март 13, 2008, 01:33:49 » |
|
Здравствуйте, у меня компилятор Borland C++ 3.11, не подскажите есть ли какая-нибудь библиотечная ф-ия для создания каталога (Отправлено в: 13 Марта 2008, 12:19:23)Спасибо! Интересная информация о работе с файлами, но к сожалению о каталогох ни слова...
|
|
|
Записан
|
|
|
|
TARAKAN
Tifon
Бакалавр
Карма: +0/-0
Offline
Пол:
Сообщений: 134
|
|
« Ответ #71 : Март 13, 2008, 01:34:50 » |
|
artem90гугль Создание папки(Отправлено в: 13 Марта 2008, 12:34:14)Я перепутал немного ссылки ... Помоему на такие вопросы быстрее найти ответ в поисковике можно, а не ждать ответа на форуме ... З.Ы. кнопка дабл пост есть
|
|
|
Записан
|
Студент: По моему легче использовать printf... EvilMax: Зато cout - это тру! = ))
|
|
|
Артем
sprata
Mодератор
Завкаф
Карма: +40/-5
Offline
Пол:
Сообщений: 1107
|
|
« Ответ #72 : Март 13, 2008, 03:06:54 » |
|
Google руулит! Я наше создание каталога и работа сним. Может кому нибудь пригодиться: http://www.codenet.ru/progr/cpp/spr/296.php
|
|
|
Записан
|
|
|
|
zer_owlet
Необычные пользователи
Проректор
Карма: +103/-16
Offline
Пол:
Сообщений: 2399
|
|
« Ответ #73 : Март 13, 2008, 11:52:17 » |
|
Гугль -- это один из основных инструментов разработчика. Если после часа поиска вы так ничего и не нашли -- вот тогда кидайте сюда свой "очень сложные" вопросы... ИМХО, это и в правила раздела можно запихать....
|
|
|
Записан
|
Если бы те, кто злословит обо мне, знали, что я о них думаю, они бы ещё не то говорили. Так хочется быть добрым и порядочным, особенно, когда понимаешь, что патронов на всех никогда не хватит.. Памятка женщинам: если ты хочешь, чтоб мужчина встал на колени - разденься и встань на четвереньки.
|
|
|
vimmax
Mодератор
Декан
Карма: +42/-3
Offline
Пол: Награды:
Сообщений: 1713
♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪
|
|
« Ответ #74 : Март 18, 2008, 12:07:06 » |
|
Хочу тут один вариант выложить. Как при помощи шаблонов организовать многомерный массив чисел. может студентам пригодится. template <class TempClass> class vektor {
private: int sizeX; TempClass *X; public: vektor(int size): sizeX(size) { X=new TempClass[sizeX]; }
vektor() { X=NULL; sizeX=0; };
void Init(int size) { sizeX = size; if(X != NULL) delete[] X; X=new TempClass[sizeX]; }
TempClass& operator[](int i) { return X[i]; }
~vektor() { if(X != NULL) delete[] X; }
};
int main(int argc, char* argv[]) { vektor < vektor < int > > A; // создание объекта
A.Init(1); // инициализация строк A[0].Init(3); // инициализация кол-ва элементов 1-ой строки
A[0][0] = 0; // обращение к элементам класса A[0][1] = 1; A[0][2] = 2; return 0; }
|
|
|
Записан
|
♪♪ ♫ LET FOREVER BE ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
|
|
|
naxellar
Главный флудер
Проректор
Карма: +101/-52
Offline
Пол:
Сообщений: 5015
Главный флудер
|
|
« Ответ #75 : Март 18, 2008, 03:23:49 » |
|
Дайте ссылки на информацию о создании форм и их использовании на Microsoft Visual Studio (если важно, то версия 2008) для языка C++
|
|
|
Записан
|
|
|
|
zer_owlet
Необычные пользователи
Проректор
Карма: +103/-16
Offline
Пол:
Сообщений: 2399
|
|
« Ответ #76 : Март 18, 2008, 03:44:55 » |
|
Дайте ссылки на информацию о создании форм и их использовании на Microsoft Visual Studio (если важно, то версия 2008) для языка C++
Просто ради интереса... а какие ты поисковые фразы юзал чтобы найти? Вот тут смотрел? ЗЫ: ну хоть вводи что-то типа пароля для лентяев -- чтобы ответили на их вопрос, нужно предъявить поисковые фразы для гугля... мож тогда пропадут вопросы, которые в MSDN найти можно... если инет хороший, попробуй тут порыться: http://www.knigka.info/category/win32. бывают хорошие штуки
|
|
« Последнее редактирование: Март 18, 2008, 04:30:24 от Романыч »
|
Записан
|
Если бы те, кто злословит обо мне, знали, что я о них думаю, они бы ещё не то говорили. Так хочется быть добрым и порядочным, особенно, когда понимаешь, что патронов на всех никогда не хватит.. Памятка женщинам: если ты хочешь, чтоб мужчина встал на колени - разденься и встань на четвереньки.
|
|
|
Романыч
Я Романов!
Завкаф
Карма: +34/-2
Offline
Пол: Награды:
Сообщений: 1068
Я Русский!
|
|
« Ответ #77 : Март 18, 2008, 04:28:42 » |
|
|
|
« Последнее редактирование: Март 18, 2008, 04:39:31 от Романыч »
|
Записан
|
Freelance, web designer, front-end & back-end developer, java developer, php developer. A person who enjoys designing software and building programs.
|
|
|
Sochin
Злой модератор
Декан
Карма: +108/-6
Offline
Пол:
Сообщений: 1518
|
|
« Ответ #78 : Март 18, 2008, 04:36:53 » |
|
naxellarMicrosoft Visual Studio 2008, а значит и .NET Framework, в плане UI это: Windows Forms или Windows Presentation Foundation на выбор. Создание и использование форм ничем не отличается от создания и использования объектов других классов. Вызовы Win32 API хоть и поддерживаются, но смысла их использовать для создания форм не вижу никакого. Во-первых, .NET Framework уже содержит нативные средства для построения UI. А во-вторых, на целевой платформе никакого Win32 API может и не быть в принципе.
|
|
|
Записан
|
Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил... 壯鎭
|
|
|
vimmax
Mодератор
Декан
Карма: +42/-3
Offline
Пол: Награды:
Сообщений: 1713
♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪
|
|
« Ответ #79 : Март 18, 2008, 04:46:34 » |
|
Sochin не совсем понял, что ты имеешь ввиду. Вызовы Win32 API хоть и поддерживаются, но смысла их использовать для создания форм не вижу никакого ведь Win32 API это сист. библиотеки Windows почему бы их не использовать ? или ты имеешь ввиду что MFC лучше ? А во-вторых, на целевой платформе никакого Win32 API может и не быть в принципе. но ведь .NET Framework не кроссплатформенная ? можешь поподробнее ?
|
|
|
Записан
|
♪♪ ♫ LET FOREVER BE ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
|
|
|
|