last day (15 days later) » 

05:46
0
Q: Вектор бьёт данные

ps1vРешал задачу на C++ следующего содержания: Необходимо создать базу данных - Работник, с определёнными условиями. Решил не париться с перевыделением памяти и реализовать всё через векторы (все записи в базе данных хранятся в векторе). Запись в вектор происходит успешно, перепроверял всё, выводил...

В функции чтения базы вы записываете в вектор и потом память удаляете delete[] Note.SecondName, Note.Name; - зачем ? Указатели уже станут неликвидными. И delete с запятой никогда не пишите. У запятой своя функция и не такая как вы предполагаете.
Используйте для этого классы. Всё же на плюсах пишите, а не си.
я бы с удовольствием использовал бы классы, но по заданию (да, я студент) их нельзя ещё использовать:(
AlexGelebe, Можете подсказать тогда, пожалуйста. В конце концов, когда я буду завершать работу программы и буду удалять вектор с помощью команды vec.clean(). Удалятся ли все данные из памяти пк? мне не надо удалять их вручную? т.е. каждую фамилию, каждое имя каждой структуры
Если в задании не было условия, что имена должны храниться в char-массивах, выделяемых new, используйте std::string, там все гораздо проще. Да, в операторе vec.clear() массивы выделенные по new сами не удалятся, без использования классов надо пробежать по вектору и вызвать delete[]. И, кстати, используйте в функциях параметр int &NumOfNotes, тогда и массив из одного элемента не надо заводить, и использование внутри функций без оператора *.
Alex Titov, Здравствуйте. Когда пытаюсь пробежаться по вектору и вызываю delete[], то ловлю ошибку работы с памятью( Код пробега: for (int i = 0; i < NumOfNotes; i++) { delete[] AllEmployees[i].SecondName; delete[] AllEmployees[i].Name; }
и прошу прощения, я не знаю как нормально вставить код в комментарий на stackoverflow
05:46
про for (int i = 0; i < NumOfNotes; - потому-что NumOfNotes это указатель. Вы забыли поставить звёздочку for (int i = 0; i < * NumOfNotes;
про удаление памяти : за ручное выделение памяти с помощью new программист должен следить сам и удалять память тоже. Чтобы написать комментарии пользователю нужно перед именем поставить собачку @
@AlexGlebe, Дело не в звёздочке - точно, т.к. я переправил в функции с *NumOfNotes на &NumOfNotes. Я точно передаю число, мне выдаётся какая-то ошибка не на вызове функции, а на удалении данных
ссылка на ошибку Она же, только не гиперссылкой: imgur.com/a/CKhhcfh
Внесите в код все изменения, которые вы сделали (про которые пишете в комментариях).
@DmitryK внёс все изменения
В LoadDatabase выделение памяти new char(strlen(Buff) + 1) выделяет её только для одной буквы с определённым кодом. Чтобы выделить для массива букв нужно использовать квадратные скобки new char[strlen(Buff) + 1]
Запись PrintTableForNotes; означает взять адрес функции и вернуть никуда. Чтобы вызвать функцию нужно добавлять скобки PrintTableForNotes ( ) ;
Все ошибки должен показывать компилятор. Вы игнорируете их, записав #define _CRT_SECURE_NO_WARNINGS. Уберите эту чушь.
@AlexGlebe, Добрый вечер. Всё переделал. Всё получилось, кроме одного момента: Как только я убираю #define _CRT_SECURE_NO_WARNINGS, то сразу получаю сообщение о том, что функции strcpy и fopen могут быть небезопасны. Можете пожалуйста подсказать, что с этим делать, как с этим жить?
avp
avp
05:46
_CRT_SECURE_NO_WARNINGS ? -- уйти с винды в линукс
насчёт функции strcpy есть безопасная замена strncpy. А для fopen кажется в винде должна быть fopen_s - точно не знаю. Можно с этим спокойно жить если вы уверены, что аргументы строк имеют окончание нулевой буквой. '\00'
@AlexGlebe, всё понял, почитаю ещё какую-нибудь литературу по этому поводу. Спасибо большое за помощь.
Вопрос закрыт, всем спасибо за помощь.

last day (15 days later) »