Jak odczytać rozmiar dynamicznej tablicy

0

Cześć, mam problem, zadeklarowałem sobie dynamiczną tablicę w ten sposób

 
float *tablica;
int rozmiar_p=/*tutaj przykładowa wartość*/;
tablica=(float*)malloc(rozmiar_p*sizeof(float));

i kiedy kończy mi się w niej miejsce to robię

 
rozmiar_p*=2;
float *pointer=(float*)realloc(tablica,rozmiar_p*sizeof(float));
tablica=pointer;

Chciałbym na końcu działania programu odczytać ile pamięci przydzieliłem do tej tablicy. Jak można to zrobić ?

0

Najlepiej byłoby stworzyć strukturę w której przechowywałbyś tą tablicę, pojemność i rozmiar. Taki pojemnik. Wystarczyłoby się odnieść tylko do wypisania wartości m_size

0

Nie da się tego zrobić prościej ? Jeżeli nie to mógłbyś mi pokazać jak coś takiego zrobić ? :)

1

dokładnie tyle przydzieliłeś: rozmiar_p*sizeof(float) (w bajtach)

0

Wiem, cały problem polega na tym, że mam napisać program, w którym za każdym razem kiedy jest przydzielana pamięć jest pokazywane właśnie rozmiar_psizeof(float), a na samym końcu (nie wiem w jaki sposób) jest ogólnie pokazywany rozmiar tablicy i prowadzący sprawdza, czy suma wszystkich rozmiar_psizeof(float) i rozmiar tej tablicy na końcu się zgadzają.

Ok sorry, źle zrozumiałem polecenie, rzeczywiście mogę zrobić to w sposób rozmiar_p*sizeof(float). :)

0

Chodziło mi o imitację pojemników w C++.
Zastanów się jeszcze nad definicją funkcji które mogą Ci się przydać np usuwanie wartości, przez co mniejsza się size

#include <stdio.h>
typedef struct
{
	int capacity;
	int size;
	float* tablica;
} CTab;

void init_tab(CTab* T, int cap)
{
	T->capacity = cap;
	T->size = 0;
	T->tablica = (float*)malloc(cap * sizeof(float));
}

void reinit_tab(CTab* T, int cap)
{
	int i;

	T->capacity = cap;
	float* temp;
	temp = (float*)malloc(T->capacity * sizeof(float));

	for(i = 0; i < T->size; ++i)
		temp[i] = T->tablica[i];

	free(T->tablica);

	T->tablica = temp;
}

void add_value(CTab* T, float val)
{
	if(T->capacity <= T->size)
		reinit_tab(T, T->capacity + 5);

	T->tablica[T->size] = val;
	T->size += 1;
}

void delete_tab(CTab* T)
{
	free(T->tablica);
}
 
int main()
{
		int i;
		CTab nowy;

		init_tab(&nowy, 3);
		add_value(&nowy, 3.0f);
		add_value(&nowy, 5.4f);
		add_value(&nowy, 5.3f);
		add_value(&nowy, 5.2f);
		add_value(&nowy, 5.1f);
		add_value(&nowy, 5.0f);

		for(i = 0; i < nowy.size; ++i)
			printf("%d. %f\n", i + 1, nowy.tablica[i]);

		printf("poj = %d\n", nowy.capacity);
		printf("roz = %d\n", nowy.size);

		delete_tab(&nowy);

        getchar();
        return 0;
}
0

Dzięki, ale to dla mnie jeszcze zbyt skomplikowane :D

0
MJay napisał(a)

Chodziło mi o imitację pojemników w C++.
Zastanów się jeszcze nad definicją funkcji które mogą Ci się przydać np usuwanie wartości, przez co mniejsza się size

#include <stdio.h>
typedef struct
{
	int capacity;
	int size;
	float* tablica;
} CTab;

void init_tab(CTab* T, int cap)
{
	T->capacity = cap;
	T->size = 0;
	T->tablica = (float*)malloc(cap * sizeof(float));
}

void reinit_tab(CTab* T, int cap)
{
	int i;

	T->capacity = cap;
	float* temp;
	temp = (float*)malloc(T->capacity * sizeof(float));

	for(i = 0; i < T->size; ++i)
		temp[i] = T->tablica[i];

	free(T->tablica);

	T->tablica = temp;
}

void add_value(CTab* T, float val)
{
	if(T->capacity <= T->size)
		reinit_tab(T, T->capacity + 5);

	T->tablica[T->size] = val;
	T->size += 1;
}

void delete_tab(CTab* T)
{
	free(T->tablica);
}
 
int main()
{
		int i;
		CTab nowy;

		init_tab(&nowy, 3);
		add_value(&nowy, 3.0f);
		add_value(&nowy, 5.4f);
		add_value(&nowy, 5.3f);
		add_value(&nowy, 5.2f);
		add_value(&nowy, 5.1f);
		add_value(&nowy, 5.0f);

		for(i = 0; i < nowy.size; ++i)
			printf("%d. %f\n", i + 1, nowy.tablica[i]);

		printf("poj = %d\n", nowy.capacity);
		printf("roz = %d\n", nowy.size);

		delete_tab(&nowy);

        getchar();
        return 0;
}

trzymaj się jednej konwencji nazewnictwa. Albo nazywasz wszystko po nasymu albo po angielsku bo to zmieszane obleśnie wygląda.

0

Napiszę o tym bo możesz nie wiedzieć. Nie można odczytać rozmiaru tablicy dynamicznej ani żadnej w c. Innego sposobu niż zapamiętanie w jakiejś zmiennej nie ma.

0

@nieee, z ktorym językiem masz problemy? Rozumiem, że pisząc programy piszesz tylko w języku angielskim, a kiedy chcesz napisać program w jezyku polskim, to tworzysz makra, ktore zmienia choćby pętle for na dla, instrukcję if na jeżeli itd.

0

pola nazywam po angielsku lub po polsku, a nie capacity, size i tablica :] Jeśli masz problem z tłumaczeniem na angielski to albo pozostałe napisz po polsku albo otwórz słownik. Przyjmij na klatę jak facet, a nie pyskuj jak dzieciak.

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