![]() |
|
Модераторы: Poseidon |
![]()
|
|
| KyKy |
|
||||||||||||
![]() КуКу Профиль Группа: Участник Сообщений: 39 Регистрация: 2.1.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Написал прогу, но препод сказал что неверно помогите исправить?
Добавлено @ 02:17 Ошибка в первом файле PR_HIPER_ALL.CPP сторока 35. Ошибка в том что я считываю по индексу и при вводе например 10 чисел ошибки не будет,а я должен считать количество элементов и проверить их, следствие логическая ошибка.Вторая ошибка в том,что если в файл outdata.txt забить например 100 чисел будет ошибка это естественно,но преподу не нравиться то что я занимаю у компа лишнюю память этими числами. Пербив вот так получается вроде как нормально, но считает толька 9 чисел, а 3,4,5 и более не может.
Как вы считаете ? |
||||||||||||
|
|||||||||||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 1 Всего: 12 |
Так. Вижу, ошибку с индексами массива "a[9]" ты нашел. Надеюсь, исправил правильно.
Об остальном подумаю позже, а пока вот еще плохая вещь. ты делаешь return, не закрывая открытый тобой файл.
Как говорится это как в ресторане, поел - заплати, а не вскакивай из-за стола и убегай.Поймают - накажут ;) Кстати. Для наглядности советую привыкнуть избавляться от явных заданий всех числовых констант (как у тебя например "9"), а задавать их дефайнами, и работать только через их обозначения. Поверь, в дальнейшем предохранит от массы неприятностей. То есть определить #define N_ELEM 9 и далее вместо твоей девяти писать N_ELEM. Потому что вдруг тебя попросят переделать программу на 10 элементов? Ты ж с ума сойдешь. Видишь, я прочитал только пловину твоего первого файла, а уже столько ошибок и недочетов накопал. Чуть попозже гляну остальной код, как время будет,а пока исправляй это. Это сообщение отредактировал(а) Dreamer_0x01 - 5.2.2006, 12:24 -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| Dreamer_0x01 |
|
||||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 1 Всего: 12 |
Вот здесь будет ошибка при повторнм использовании этой функции. Если ты действительно хочешь ее использовать для подсчета только этого выражения, то s=0 лучше сделть в самой функции. Потому что иначе тебе придется это делать каждый раз перед вызовом функции. Вот. Еще я вижу ты сделал проверку открытия файла, определив функцию open(). Все хорошо, но в коде тем не менее ты вызываешь не ее, а fopen().
А вот эту фразу не понял
может быть, речь идет все-таки о входном файле, а не о выходном? Правильно говорит препод. Правда, если забъешь 100 чисел, то ничего страшного. А вот если 100000, то тогда уже чуть похуже. Видимо он хочет, чтобы ты считывал числа из файла либо поблочно, либо, что проще, но медленнее - поэлементно. То есть не считывал их в массив, а вообще отказался от массива, а лишь при каждом считанном числе прибавлял сумму с нужным знаком. -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
||||
|
|||||
| KyKy |
|
|||
![]() КуКу Профиль Группа: Участник Сообщений: 39 Регистрация: 2.1.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Да с файлом я перепутал, а насчёт 3,4,5 чисел попробуй в мой самый нижний исправленный файл подставить 3 числа их сумму и разность он не подсчитает, потому как расчитан на подсчёт толька 9 чисел в массиве. Меня больше интересует вопрос про индексы? |
|||
|
||||
| Dreamer_0x01 |
|
||||||||||||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 1 Всего: 12 |
[censored 2] ... думал, ты это исправил, не посмотрел. Ан нет. Опять ты допусил ту же самую ошибку,очень грубую!
знаешь, к чему приводят подобные конструкции? У тебя а - это
Что будет, если в файле больше девяти элементов? Ты будешь уже читать не в ячейки памяти, отведенные под массив а[],а бог знает куда, в "чужую" память. В лучшем случае ты получишь рано или поздно вопрос об отсылании отчета дядюшке Билли, в худшем - глюк в совершенно непредсказуемом и неожиданном месте. Читать нужно с проверкой, допустимо ли такое чтение. То есть хотя бы так
В этом случае ты не будешь портить память за границами массива.
А в чем проблема-то? Кто тебе мешает перед открытием файла попросить пользователя ввести количество элементов? Кстати, раз уж так хочется читать в массив, а не поэлементно (несморя на уговоры препода), то объявить тебе его уже придется не как int a[9], а пожалуй лучше как int *a. Потом, когда пользователь ввел нужное количество элементов, анализируешь его на допустимость (чтоб не отрицательное, не слишком большое, не ноль и т.д.), если устраивает - выделяешь под массив память. Допустим, пользоватль вводит количество элементов, которое момещается в переменную N.
Это сообщение отредактировал(а) Dreamer_0x01 - 5.2.2006, 14:29 -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
||||||||||||
|
|||||||||||||
| KyKy |
|
|||
![]() КуКу Профиль Группа: Участник Сообщений: 39 Регистрация: 2.1.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Вот глянь что получилось толька без new
Это сообщение отредактировал(а) KyKy - 5.2.2006, 15:41 |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 1 Всего: 12 |
Убирай, убирай эти числа. Замучаешься потом по всей программе их искать. раз определил N_ELEM - везде и используй его, где можно. Добавлено @ 16:20 файл-то кто закрывать будет? Вообще, на будущее - чтобы избегать подобных ошибок, полезно открытие/закрытие файлов, общение с объектами синхронизации (вход/выход из критических секций), выделение/освобождение памяти и другие вещи, требующие обязательного применения пары каких-либо действий, выносить за пределы функций вход из которых в случае ошибок определяется по return. Но в данном случае это не обязательно, достаточно перед возвратом вписать закрытие файла, если такие вещи слишком часто у тебя не будут встречаться. Если же твой код сильно разрастется - полезно сделать вышеперечисленное. -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 1 Всего: 12 |
Если честно, я забыл, есть ли определенный порядок выполнения действий вида ()&&()&&()&&(), и не помню также,будет ли выполняться каждое выражение в скобках, или условие не сработает на первом же неподходящем условии. Подозреваю, что и эта запись тоже некорректна. Хотя, повторяю, не уверен. Причина в том, что я такие конструкции уже давно не использую. Чтобы в этом не путаться, и лишний раз при чтении кода не напрягать мозг, я бы все-таки сделал нечто подобное, пусть более громоздкое по коду, но зато более явно читаемое:
-------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| KyKy |
|
|||
![]() КуКу Профиль Группа: Участник Сообщений: 39 Регистрация: 2.1.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Да какраз это и происходит.Щас проверю исправленное. |
|||
|
||||
![]()
|
| Правила форума "Центр помощи" | |
|
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Центр помощи | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |