Ograniczenie zajmowanej pamięci w danej strukturze

0

Witam, chciałbym prosić o poradę, w języku C muszę skonstruować prosty program, który realizuje wprowadzenie danych i wyświetlenie tych danych. Powstaje baza sklepu, dane są określony, jest ich bardzo mało, np. kolor płytek ciemny, jasny, producent etc. Jak można to zrobić, aby zajmowało to jak najmniej miejsca? Czy może wykorzystać w strukturze dynamiczną alokację pamięci, a może pole? Pytanie tylko, czy da się zmniejszyć pamieć zajmowaną przez chary, bo przecież za ich pomocą zakoduje litery, cyfr w tym programie nie ma. Pozdrawiam.

5

Odpuść sobie, z opisu to jest problem XY. Strzelam, że żadnej optymalizacji na tym poziomie nie potrzebujesz.

0

@kq: Tak, wiem, że nie ma sensu optymalizować takich małych programów, rzecz w tym, że chciałbym to zrobić, żeby wiedzieć jak korzystać z takiego ograniczania zajmowanej pamięci w przyszłości. Czy sensowne jest wykorzystanie funkcji malloc do obiektów w strukturze, czy może pole struktury?

4
  1. Doczytaj co to jest problem XY (źle zadane pytanie)
  2. Nie mamy kryształowej kuli, wiec nie wiemy co robisz źle i czemu nie jest "optymalnie". Podaj tręść zdania jaką rozwiązujesz (wymagania programu) i sam kod - to wtedy powiemy co jest dobrze, a co źle.
2

W pierwszej kolejności to trzeba mieć co optymalizować. Napisz kod, który realizuje zadanie a potem można się zastanawiać w jaki sposób zmniejszyć zużycie pamięci. Bez programu dyskusja będzie jałowa i do niczego nie doprowadzi.

1

Podejrzewam że masz debiliczne ... przepraszam dydaktyczne zadanie "baza danych" gdzie musisz dodawać rekordy, usuwać, modyfikować, sortować, zapisawać do pliku oraz odczytywać z pliku. Normalnie takie zadanie rozwiązują się za pomocą zwykłej bazy danych.
Zaś w tym rodzaju zadań trzeba to robić ręcznie:

  • niczemu pożytecznemu to nie uczy
  • jest milion rozwiązań tego w sieci wystarczy ściągnąć i zaadaptować
  • w taki sposób jaki się proponuje to zrobić - nigdy się nie robi

więc zadanie w sumie jest antydydaktyczne.

Generalna najprostszą do zrozumienia strukturą danych jest:

struct Data { char *Nazwisko,*Imie; int Pesel; /* inne pola */ };
struct Container { Data *data; size_t count; };

Aczkolwiek struktura która prowadzi do najkrótszego kodu:

const struct Field { char *Name,*Format; size_t Size; } tb[]=
{
    {"Nazwisko","%63s",64},
    {"Imie","%31s",32},
    {"Pesel","%11s",12},
    /* inne pola */
};
const size_t FieldCount=sizeof(Field)/sizeof(*Field);
struct Record { const char *Text[FieldCount]; };
struct Container { Record *data; size_t count; };
0

Wypowiedź wyżej nie do końca rozumiem, ale pomyślałem trochę i zrobiłem tak:
`#include <stdlib.h>
#include <stdio.h>

struct sklep {
unsigned char wielkosc : 2;
unsigned char grubosc : 1;
unsigned char producent : 1;
unsigned char kolor : 4;
}; struct sklep w;

enum wielkosc {
kwadratowe = 0,
prostokatne_male = 1,
prostokatne_duze = 2

}; wielkosc;
enum grubosc {
cienkie = 0,
grube = 1
}; grubosc;
enum producent {
Producent1 = 0,
Producent2 = 1
}; producent;
enum kolor {
bialy = 0,
czarny = 1,
niebieski = 2,
zielony = 3,
czerwony = 4,
granatowy = 5,
jasny = 6,
bezowy = 7,
purpurowy = 8,
blekitny = 9,
rozowy = 10,
miedziany = 11,
zolty = 12,
pomaranczowy = 13
}; kolor;

void nadaj_wartosc() {
w.wielkosc = kwadratowe, prostokatne_male, prostokatne_duze;
w.producent = Producent1, Producent2;
w.grubosc = cienkie, grube;
w.kolor = bialy, czarny, niebieski, zielony, czerwony, granatowy, jasny, bezowy, purpurowy, blekitny, rozowy, miedziany, zolty, pomaranczowy;
}
void wyswietl_wartosc() {
printf("Witaj w bazie danych sklepu C.\nDostepne wielkosci plytek = %d\nDostepne grubosci = %d\nDostepni producenci = %d\nDostepne kolory = %d\n", w.wielkosc, w.grubosc, w.producent, w.kolor);
}

int main()
{
nadaj_wartosc();
wyswietl_wartosc();
system("pause");
}`
Jak mogę przypisać wszystkie wartości np z enum wielkosc, czyli 0 i 1 do w.wielkosc ze struktury, a potem printfem wyświetlić wartość w.wielkosc, aby wszystkie wielkosci sie pokazaly na ekranie?

0

Bezpośrednia odpowiedź:

#include <stdio.h>

enum grubosc
{
	cienkie,
	grube,
};
const char *Grubosc[]
{
	"cienkie",
	"grube"
};

int main()
{
	enum grubosc g;
	g=cienkie;
	printf("%s\n",Grubosc[g]);
	g=grube;
	printf("%s\n",Grubosc[g]);
	return 0;
}

Z tym że nie ma sensu ścibolić się o kilka bajtów w takim programie.
Tak czy owak nie zrobisz z tego wielodostępny, a jednemu człowiekowi aby zapchać pamięć średniego komputera nie starczy życia.

2

@Piotr Zajkowski:

To jest chore.

Najpierw naucz się programować, naucz się DOKŁADNIE języka, a nie tylko klamerki, potem pisać nie na zmiennych globalnych, potem wyrażać swoje cele w kodzie .... a kiedyś kiedyś niektóre fragmenty będziesz optymalizować (licząc bity? wątpię).

Po drodze nauczysz się wklejać kod jak człowiek

Ten kod NA PEWNO nie robi tego, co myślisz, choć jest formalnie poprawny (nie sprawdzałem kompilatorem)

void nadaj_wartosc() {
w.wielkosc = kwadratowe, prostokatne_male, prostokatne_duze;
w.producent = Producent1, Producent2;
w.grubosc = cienkie, grube;
w.kolor = bialy, czarny, niebieski, zielony, czerwony, granatowy, jasny, bezowy, purpurowy, blekitny, rozowy, miedziany, zolty, pomaranczowy;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1