![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| PandaRus |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 27.12.2006 Репутация: нет Всего: нет |
...Извините за название темы.
Добрый день. Моя первая программа на Си.
Вопросы: Почему переменная r=0, при выполнении строки 75? Где она обнуляется? Как исправить? Почему не считается строка 86 (если предварительно r=30 (74 строка))? Как исправить? Во всем виновато динамическое выделение памяти? Если да - как исправить? Как прогонять программу построчно с выводом значений каждой переменной? Очень требуется ваша помощь! С уважением, Иван. Модератор: Название темы должно отражать ее суть! Это сообщение отредактировал(а) MAKCim - 24.3.2007, 18:06 |
|||
|
||||
| zkv |
|
||||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
а почему вы решили, что там она равна 0?
еще бы знать что вы там пытаетесь получить с чего вдруг?
скажите хоть, что за компилятор у вас? |
||||
|
|||||
| threef |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 27.10.2005 Где: Запорожье Репутация: 9 Всего: 10 |
Вряд ли кто будет изучать 238 строк Вашего кода. Необходимо пользоваться функциями - так Вы быстрее сможете локализовать ошибку. Для поиска ответа на Ваши вопросы попытайтесь 1 - использовать отладчик 2 - использовать отладочную промежуточную печать значений переменных. Успехов.
|
|||
|
||||
| PandaRus |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 27.12.2006 Репутация: нет Всего: нет |
Саму программу проверять не надо, прошу обратить внимание на текст программы до 86 строки включительно.
Пишу на Вижуал Си++ 6.0 Интересует, почему при проходе программы с 41 на 42 (нашел функцию Run to Cursor) строку каким-то не понятным мне образом обнуляется r и некоторые другие переменные - что их обнуляет и как с этим бороться?
- простое суммирование элементов. Интересует, почему не работает, и почему начинает работать, как только убрать все слогаемые-массивы и заместо их присваивать просто числа? |
||||
|
|||||
| zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
вы наверное имеете ввиду, просмотр значений переменной под отладчиком в окне watch? К сожалению, ему нельзя доверять на 100%. Если хотите установить истину, используйте макрос TRACE() - пример:
ставите это на 41 строку в вашей проге и смотрите в окно Output. Можно конечно использовать обычные средства вывода при трассировке, просто TRACE не придется выковыривать из проги после отладки. Вообще, судя по коду, переменная r у вас нигде не обнуляется (хотя это только первичный осмотр). хм, ну посмотрите, что у вас в слагаемых - массивах перед суммированием. |
|||
|
||||
| BigHeart |
|
||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 17.3.2007 Репутация: нет Всего: нет |
PandaRus, я бы на твоём месте во первых написал бы что это программа должна делать для начала, чтобы в ней легче было разобраться, а вообще ясно только что работа с трёхмерной матрицей. во вторых не следует объявлять ткую кучу int'ов в самом начале, их можно объявить в каждом цикле - это тебе же упростит жизнь.
тебе не доступно столько статической памяти
outfile = fopen ("D:\\1.txt","w") //(например)
если у тебя Visual Studio 2003 или 2005, то F5. выход Shift+F5. я так понимаю, что проблема в делении на 0? |
||||||||
|
|||||||||
| PandaRus |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 27.12.2006 Репутация: нет Всего: нет |
Программа.
Задача. Кубическое тело виртуально бьется на кубики. Углы кубов - узлы в теле (sxrxh), их ребра - значения проводимостей между узлами в теле (Ps,Pr,Ph). Получается виртуальная сетка. Программа ищет напряжение в каждом узле при подключении источника тока к любым узлам. Затем в МатЛабе смотрю распространение тока (градиент напряжения). Метод. Каждому узлу присваивается свой номер (от 1 до i=sxrxh). Составляется матрица проводимостей G(ixj). Если i=j, то элемент матрицы равен сумме проводимостей между узлом и соседними узлами. Остальные элементы i,j равны проводимости, соединяющей узлы i и j. То-есть практически все элементры матрицы равны 0, так как любой узел соединяется проводимостью максимум с 6 другими узлами. Составляется столбец I[1xi], где все элементы равны 0 кроме тех, чьи порядковые номера равны номерам узлов, подключенных к источникам тока. Затем решается GxFi=I, в результате чего находим Fi - напряжение в каждой точке. Точно такая-же программа, более простая, для плоскости работает. Меня именно удручает непонятные для меня процессы при прогоне программы (в программе для 2D таким и не пахло): Строка 75: деление на ноль (почему r=0)? Помогите. Строка 86: не вычисляется (если разкоментирована строка 74 для обхода ДЕЛНИЕ НА НОЛЬ) (видимо слагаемые становятся нехорошими, аналогично, как и с r). Помогите. Меня интересует именно эти два момента. Как избавиться? |
|||
|
||||
| nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Несколько замечаний к коду.
Массивы float Ps[15][15][31], Pr[15][16][30], Ph[16][15][30] разного размера. Это так и задумано? В любом случае во всех for-ах используются s=15; r=30; h=15 как границы, причём то с 0 то с 1, то до <=r то <=r-1 вперемешку, в результате несколько раз происходит запись за пределы массивов (кстати инициализировать всё 0, а потом сразу 1 не очень эфективно Так как массивы в стеке, при этом затирается половина локальных переменных и еще бог знает что, так что разберись сначала с границами, а потом уже со всем остальным. Это сообщение отредактировал(а) nickless - 25.3.2007, 18:04 -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
| PandaRus |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 27.12.2006 Репутация: нет Всего: нет |
Всем большое спасибо. Кроме того, что я нашел ошибки, которые не позволяли мне продвигаться вот уже более 2 месяцев, так еще я научился выполнять программу построчно, или до курсора, что и позволило мне найти точное место, где появляется ошибка, снять значения переменных, и вручную посчитать и понять, как я тормознул...
Спасибо форумчанам за участие, превратившееся для меня в моральную поддержку. Это сообщение отредактировал(а) PandaRus - 25.3.2007, 20:33 |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Извините за оффтоп, но если это первая программа на Си, то какая же будет десятая... Мне просто интересно |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |