![]() |
Пожалуй, что и так. Я-то читал его уже кое-как зная Си. В принципе можно начинать с любой более-менее популярной книги. Ну а Си изучать лучше, уже имея в запасе знание другого ЯП.
|
Поставил себе Эмбаркодеровскую РЭД студио последнюю) буду заценивать:)
SpellCaster, ты ее сейчас юзаешь? |
Если ты про ХЕ, то нет, я на 2010й. ХЕ особо ничем не отличается, а 2010я у нас купленная :)
|
Цитата:
|
Ламерский вопрос, который почему-то только что пришел мне в голову: кто знает как открепить форму в Embarcadero Rad Studio? То есть, чтобы ее можно было свободно елозить как в Delphi 7?
http://s41.radikal.ru/i091/1104/00/37eb30533ede.png |
|
Требуется помощь в нахождении ошибки.
Вкратце объясняю поставленную задачу. Надо создать бинарный файл, внести в него некоторые данные (работа ведется посредством структур), потом открыть его, внести еще данные, и напоследок поработать с даннными из файла (за последнее пока не брался). Всё это надо реализовать с помощью функций. Скрытый текст - Вот, то что было сделано: И вот теперь о проблеме. При вводе значения веса багажа (или после ввода количества) программа вылетает... Обнаружить косяк в программе не могу, сколько ни пытаюсь. Может кто чего подскажет, где здесь ошибка? |
Цитата:
не связано с главной проблемой, но [PHP]void create(FILE *tf) { char ch; ... getch(); // должно быть ch = getch(); //В void open(FILE *tf) даже переменная под это не декларирована ... while(!feof(tf)) { printf("\n %3d Name %20s with %2d items has %6.2f kilo of luggage \n",i,t1.name,t1.number,t1.weight); fread(&t1,sizeof(t1),1,tf); i++; //должен использоваться для перемешения указателя tf скачками длиной в t1 }[/PHP] |
Цитата:
Цитата:
Кроме того, Цитата:
|
Цитата:
Цитата:
|
Waterplz, ну, по написанному можно только судить, после каких действий она вылетает, а ведь это не одно и то же.
Если на scanf("%f",t1.weight); - это одно дело, а если на fwrite(&t1,sizeof(t1),1,tf); - другое. Кстати, точно ли нужно &t1, а не *t1? Я уже подзабыл это сишное безумие с указателями/ссылками. Да, и как она вылетает-то? Вроде как должно быть некое сообщение об ошибке. |
Цитата:
|
Цитата:
Цитата:
А вот с отладкой до сих пор не могу разобраться - использую Dev-C++, а отладчик там какой-то непонятный. Вроде пробегаю по строкам, но вот ничего толком он не выдает... Так, решил проверить первую функции отдельно: Скрытый текст - Открытие файла для записи: Вылетает уже после ввода веса багажа (Weight), причем во время отладки выдает ошибку "Ваша программа вызвала нарушение доступа (ошибка сегментации)". Подозреваю баг связан со строчкой fwrite(&t1,sizeof(t1),1,tf); |
Цитата:
Gligarr, ну ты даешь, блин! Между "Зависает" и "Вылетает" - огромная разница! И разные причины бага. Тем не менее, всё-таки выясни строчку. Это можно сделать, поставив после каждой строчки вывод чего-нибудь на консоль. Я обычно делаю так (псевдокод): int step = 0; ...do smth... writeln(step++); ...do smth... writeln(step++); ...do smth... writeln(step++); - это сразу покажет, на каком моменте затык |
SpellCaster, попробовал так проверить. Сбой происходит при выполнении команды (!) scanf("%f",t1.weight);
Теперь вот думаю, к чему бы это... Ведь получается программа просто не может по какой-то причине принять ввод значения с клавиатуры... Upd, всё разобрался, походу нужен имперсант... Всё, основная программа теперь заработала как надо! Вся ошибка заключалась в том что ввод с клавиатуры уходил по сути "в никуда"... Да, это была глупая ошибка с моей стороны не расставить знак & перед численными значениями из структур) |
Цитата:
|
Цитата:
А вот здесь почему то не получается удалить структуру... Как раз переходит или в бесконечный цикл, или не даёт нужного эффекта. Баг происходит после нажатия клавиши "Y", если верить отладчику... Вообще, как можно организовать удаление определенной структуры? Скрытый текст - Удаление структур с t1.weight<10: По выполнении программы обнуляется (а нужно чтоб удалилась) первая строчка удовлетворяющая заданному условию. А остальные, тоже удовлетворяющие, почему-то остаются без изменений (хотя тоже должны удалиться)... Вот программа целиком: Скрытый текст - Программа: |
Цитата:
1) Прочитать структуру t1 2) Проверить условия, спросить 3) Если удовлетворяет условию, цикл: * Прочитать следующую структуру t2 * Переместиться на 2*SizeOf(luggage) назад (потому что к этому моменту указатель в файле будет у начала второй структуры после удаляемой t1 - назовем ее t3) * Записать в текущее место t2 * Переместиться на SizeOf(luggage) вперед * Повторить цикл 5) В конце обрезать файл на SizeOf(luggage) байт То есть, проще говоря, по кусочкам "подтащить" структуры, заполнив свободную ячейку в файле Что же касается твоего кода "Удаление структур с t1.weight<10", то ты там вообще что-то непонятное творишь. В случае утвердительного ответа перезаписываешь структуру, которую надо удалять, причем на ту же позицию, где она и есть в файле, а потом еще и зачем-то закрываешь файл |
Цитата:
1) добавить в структуру поле bool deleted, по умолчанию присваивать false 2) при согласии пользователя на удаление структуры, менять её в true 3) вывод и обработку производить только если !deleted 4) создать отдельную утилитку, которая будет: 4.1) читать структуры исходного файла 4.2) если !deleted записывать их во временный 4.3) по окончании, проверить, что временный файл существует и непуст 4.4) если это так, то переместить исходный файл в архив, а временный переименовать в исходный 5) запускать эту утилитку, скажем, еженедельно |
Это всё, конечно, верно, но для случая реального применения. А тут, вроде бы, была лаба.
|
| Текущее время: 09:56. Часовой пояс GMT +3. |
Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.