Как очистить структуру c
Перейти к содержимому

Как очистить структуру c

  • автор:

Как очистить структуру c

Профиль
Группа: Участник
Сообщений: 58
Регистрация: 12.6.2008

Репутация: нет
Всего: нет

Может эта тема в раздел «Для новичков».

Код
1.
struct GlobalHistoryOwners
int counter;
int id_owner;
int id_garage;
AnsiString own_from;
AnsiString own_to;
>;
extern GlobalHistoryOwners *GlbHistoryOwners;

Всем известно что memset(gHistOwnGar,0,sizeof(gHistOwnGar)); должно очистить всю структуру, но оно очищает только поле counter.
memset(gHistOwnGar,0,1000); — очищает всю структуру. ну мне кажется, что это в корень неправильно!

Просветите как правильно очистить структуру

Добавлено через 6 минут и 35 секунд
Ой оно не работает, тоисть очищает и тогда критикует .

Профиль
Группа: Участник
Сообщений: 269
Регистрация: 31.8.2007
Где: Санкт-Петербург

Репутация: 2
Всего: 1

Код
struct GlobalHistoryOwners
< int counter;
int id_owner;
int id_garage;
AnsiString own_from;
AnsiString own_to;
>sss;
sss.counter=13;
sss.id_owner=333;
sss.id_garage=555;
sss.own_from=»sdasd»;
sss.own_to=»weqweqwe»;
ShowMessage(IntToStr(sss.counter)+»\r\n»+IntToStr(sss.id_owner)+»\r\n»+IntToStr(sss.id_garage)+»\r\n»+sss.own_from+»\r\n»+sss.own_to);
memset(&sss,0,sizeof(sss));//Можешь и этой функцией ZeroMemory(&sss,sizeof(sss));

Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50

Цитата
Код
memset(gHistOwnGar,0,sizeof(gHistOwnGar)); //gHistOwnGar — поинтер

Я так понял gHistOwnGar эт указатель,
а размер указателя равен 4 (32-bit) и 8 (64-bit).
Так типа будет вернее:

Код
memset((void *)&sss,0,sizeof(GlobalHistoryOwners));

Это сообщение отредактировал(а) Alca — 11.2.2009, 19:05

Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 14
Всего: 39

osmus,
Юзай структуры так, не будешь путаться

Код
typedef struct _DATA DWORD dwSize;
DWORD dwICC;
char str[1];
> DATA, *PDATA;

.
DATA data;
.
PDATA pdata;
pdata = new DATA;

И считаю что пользоваться AnsiString внутри структуры это не кошерно.

Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют «Твой зайка написал» («Yоur bunnу wrоte»)

Профиль
Группа: Участник
Сообщений: 58
Регистрация: 12.6.2008

Репутация: нет
Всего: нет

Код
Файл glb_init.h

struct garage_struct
int id;
int number;
int street_id;
char g_type[2];
char gos_num_meter[20];
char date_vvoda_exp_meter[10];
int nach_pokaz_meter;

#include
#pragma hdrstop

void __fastcall TAEDGarage::InitGar(void)

Ошибка: [C++ Error] OperGarages.cpp(261): E2277 Lvalue required
На строки:
OldGarage.g_type = DBLookupComboBox1->Text.c_str();
OldGarage.date_vvoda_exp_meter = date_str.c_str();
OldGarage.gos_num_meter = Edit3->Text.c_str();

Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50

Учи матчасть

Профиль
Группа: Участник
Сообщений: 269
Регистрация: 31.8.2007
Где: Санкт-Петербург

Репутация: 2
Всего: 1

Цитата
Ошибка: [C++ Error] OperGarages.cpp(261): E2277 Lvalue required
На строки:
OldGarage.g_type = DBLookupComboBox1->Text.c_str();
OldGarage.date_vvoda_exp_meter = date_str.c_str();
OldGarage.gos_num_meter = Edit3->Text.c_str();

С типом char* такой способ присвоения не прокатывает))

Код
strcpy(OldGarage.g_type,DBLookupComboBox1->Text.c_str());

Это сообщение отредактировал(а) Comm — 12.2.2009, 01:03

Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 4
Всего: 72

Код
#include
#pragma hdrstop

лучше ничего не вставлять, кроме комментариев, иначе это ведёт к разрастанию файла прекомпилированных заголовков.
Если в структуре есть AnsiString или поля, имеющие конструкторы, она сама должна инициализироваться конструктором, а не с помощью memset.
Если в структуре есть поля типа char[], они заполняются strcpy() или strncpy().

Код
struct S char name[10];
>;

Это сообщение отредактировал(а) math64 — 12.2.2009, 08:28

Профиль
Группа: Участник
Сообщений: 58
Регистрация: 12.6.2008

Репутация: нет
Всего: нет

А как быть с представлением дат в структуре? Их тоже можно держать в char? пример:

Код
struct S char date[10];
>;

S s;
memset (&s, 0, sizeof(S));
AnsiString str = DateToSrt(DateTimePicker1->Date);
strncpy(s.name. str.c_str(), sizeof(S) — 1);

Или есть какие то лучшие методы?

Это сообщение отредактировал(а) osmus — 12.2.2009, 08:44

Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 4
Всего: 72

Даты можно хранить в time_t (число секунд прошедших от 01.01.1970 00:00:00 GMT), в Visual C++ это 64-битная переменная, в старых компиляторах 32-битная (32 бит после 2037 будет не хватать). Есть ещё SYSTEMTIME, FILETIME

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) — крупнейший в рунете сборник материалов по Дельфи
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »

[ Время генерации скрипта: 0.1487 ] [ Использовано запросов: 21 ] [ GZIP включён ]

[C] Освободить память занятую структурой.

man getgrgid

RETURN VALUE

.

The return value may point to a static area which is overwritten by a subsequent call to getgrent(), getgrgid(), or getgrnam().

Попробуй юзать getgrgid_r

anonymous
( 16.08.10 13:04:37 MSD )

А как у вас выглядит getgrgid? И да, разве не надо до free(gr) сделать free(gr->gr_name) и т.д.?

Eddy_Em ☆☆☆☆☆
( 16.08.10 13:04:45 MSD )

Ты ее не выделил

Boy_from_Jungle ★★★★
( 16.08.10 13:06:23 MSD )
Ответ на: комментарий от Boy_from_Jungle 16.08.10 13:06:23 MSD
anonymous
( 16.08.10 13:07:25 MSD )
Ответ на: комментарий от Eddy_Em 16.08.10 13:04:45 MSD

[C] Освободить память занятую структурой.

При попытке освобождать сначала поля структуры:
free(gr->gr_name);
free(gr->gr_passwd);
Та же история:
*** glibc detected *** ./gr: free(): invalid pointer: 0x0000000012d26016 ***

milton
( 16.08.10 13:10:42 MSD ) автор топика
Ответ на: [C] Освободить память занятую структурой. от milton 16.08.10 13:10:42 MSD

Посмотрел man. Согласен с самым первым ответом. Вы вообще уверены, что тому, что возвращает getgrgid можно делать free?

А список gr_mem вы как освобождать собираетесь?

Eddy_Em ☆☆☆☆☆
( 16.08.10 13:19:28 MSD )
Ответ на: [C] Освободить память занятую структурой. от milton 16.08.10 13:10:42 MSD

Re: [C] Освободить память занятую структурой.

Бл*дь, ты ман то уже почитай по этой функции, что тебе указатель на структуру возвращает. Я тебе в первом посте уже процитировал, что далеко не факт, что там память вообще динамически аллоцируется, чтобы потом её free подсовывать.

anonymous
( 16.08.10 13:19:55 MSD )

if( (gr=getgrgid(gid)) == NULL) perror("GetGrGid "); fprintf(stdout,"Name: %s\n",gr->gr_name); free(gr); return 0; >

а можно вопрос? данная ветка кода выполняется только в том случае если у Вас (gr == NULL), то есть структура не создана, вот нафига её удалять?

и да, на будущее по code style, free() освобождает память, но не чистит значение указателя и он указывает, после free(), туда же куда и указывал, так что, хоть free() и проверяет на то что значение указателя не NULL, при попытке почистить второй раз будете получать ошибку

free(gr); gr = NULL;

shty ★★★★★
( 16.08.10 13:24:12 MSD )
Ответ на: комментарий от shty 16.08.10 13:24:12 MSD

если у Вас (gr == NULL), то есть структура не создана, вот нафига её удалять?

Это он просто так код оформил красиво, под if там только perror стоит.

dmsh
( 16.08.10 13:31:07 MSD )
Ответ на: комментарий от shty 16.08.10 13:24:12 MSD

и да, судя по отсутствию специализированной функции для удаления данной структуры, её чистка вообще не предполагается, то есть это просто набор указателей на внутренние структуры данных

shty ★★★★★
( 16.08.10 13:31:53 MSD )
Ответ на: Re: [C] Освободить память занятую структурой. от anonymous 16.08.10 13:19:55 MSD

Re: [C] Освободить память занятую структурой.

>>Бл*дь, ты ман то уже почитай по этой функции, что тебе указатель на структуру возвращает.
Бл*дь, спасибо, открыл глаза!

milton
( 16.08.10 13:33:52 MSD ) автор топика
Ответ на: комментарий от dmsh 16.08.10 13:31:07 MSD

если у Вас (gr == NULL), то есть структура не создана, вот нафига её удалять?

Это он просто так код оформил красиво, под if там только perror стоит.

от же блджад! с набегу подумал что опечатка, вообще я за такое по чайнику бил, виртуально конечно

Очистка структуры

Если нужно заполнить её нулями при создании тогда так:

RGB rgb = <>; 

Это эквивалентно следующему:

RGB rgb = ; 

Если нужно обнулить существующий объект структуры, тогда используем memset :

RGB rgb; memset(&rgb, 0, sizeof(RGB)); 

Если нужно обнулить массив структур, тоггда делаем так:

memset(img, 0, sizeof(img)) 

Отслеживать
ответ дан 4 мая 2015 в 4:35
23.8k 3 3 золотых знака 47 47 серебряных знаков 61 61 бронзовый знак

Я думаю, вместо последней строчки имеловь в виду вот это: memset(img, 0, sizeof(RGB) * 512 * 512) — или это: memset(img, 0, sizeof(img)) (первый способ работает в том числе с указателем на первый элемент, второй же — только с массивами).

4 мая 2015 в 5:46
@PavelMayorov, я просто описался с img . Спасибо — поправил.
4 мая 2015 в 5:53

Так как у нас C++, а не C, предлагаю нормальное ООПное решение, а не «сишный путь» с обнулениями памяти по указателю.

Всё, что нужно сделать — это добавить конструктор:

struct RGB < BYTE rgbtBlue; BYTE rgbtGreen; BYTE rgbtRed; RGB() : rgbtBlue(0), rgbtGreen(0), rgbtRed(0) < >>; RGB img[512*512]; 

Если вы пользуетесь современным компилятором, то можете записать проще:

struct RGB < BYTE rgbtBlue = 0; BYTE rgbtGreen = 0; BYTE rgbtRed = 0; >; 

Ну а если вы хотите сэкономить на конструкторе, то просто запишите:

RGB img[512*512] = <>; 

Если вам нужно обнулить имеющуюся структуру, то можете воспользоваться std::fill :

std::fill(std::begin(img), std::end(img), RGB()); // идеально std::fill(img, std::end(img), RGB()); // тоже сойдёт std::fill(img, img + _countof(img), RGB()); // старый VC++ 

memset — это наследие от C. В C++ можно использовать языковые средства, а не полагаться на низкоуровневые операции с указателями и байтами.

Кроме того, memset не обладает идеальной кросс-платформенностью (впрочем, вы вряд ли встретитесь с таким железом), вы можете столкнуться с «неожиданностями» при добавлении полей сложных типов и так далее.

Удаление памяти (структура)

Структура Си. Удаление информации
Как в программе написать НОВУЮ СТРУКТУРУ, чтобы с указаныым возрастом информация исчезла #include.

Структура государства — Удаление со сдвигом влево
Здравствуйте. Вот выполнил структуру на тему государства. Организовал вывод, добавление со сдвигом.

Представление и структура указателя в памяти
Указатель занимает 4 байта памяти. Если судить по определению "указатель — это переменная, которая.

Логическая структура памяти в IBM PC
Пережовывая википедию, в статье про оперативную память наткнулся на следующую структуру: В.

Супер-модератор

Эксперт Pascal/DelphiАвтор FAQ

32791 / 21132 / 8143
Регистрация: 22.10.2011
Сообщений: 36,392
Записей в блоге: 8

А как ты выделял память под эту структуру (или массив структур)? Показывай — будем знать, как освобождать.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *