[C] Definiowanie tablicy przez typedef

Matiks21
Użytkownik
Użytkownik
Posty: 562
Rejestracja: 20 maja 2013, o 16:33
Płeć: Mężczyzna
Lokalizacja: Kielce
Podziękował: 98 razy

[C] Definiowanie tablicy przez typedef

Post autor: Matiks21 »

Hey,

Napisałem sobie program

Kod: Zaznacz cały

#include<stdio.h>

main()
{
	int n,i;
	scanf("%d",&n);
	
	typedef	int	C[n];
	
	C	a;
	puts("");
	srand(time(0)%99);
	for(i=0;i<n;i++)
		a[i]=rand()%99;
		
	for(i=0;i<n;i++)
		printf("%d
",a[i]);
}
i zastanawiam się czy takie postępownie jest właściwe? Nigdy nie uczono mnie tego, po prostu sam na to wpadłem i mam wątpliwości czy to nie zżera mi przypadkiem duzo pamięci.
Można traktować "a" to jak tablice statyczną?
Ostatnio zmieniony 31 sie 2015, o 08:18 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
MadJack
Użytkownik
Użytkownik
Posty: 270
Rejestracja: 21 lis 2010, o 22:23
Płeć: Mężczyzna
Podziękował: 5 razy
Pomógł: 35 razy

[C] Definiowanie tablicy przez typedef

Post autor: MadJack »

To się nie różni niczym od napisania po prostu

Kod: Zaznacz cały

int a[n]; 
Dopóki nie dodasz odpowiedniej flagi przy kompilacji, to powinno się skompilować (przynajmniej w C++, w C z tego co wiem też). Jednak raz, że ten typedef jest zupełnie bez sensu, dwa, że to bardzo mało eleganckie i niewskazane, trzy, że jest niebezpieczne z więcej niż jednego względu. Jeśli nie wiesz, ile pamięci potrzebujesz, to wskazanym, zwykle równie wygodnym i zdecydowanie bardziej bezpieczniejszym rozwiązaniem jest używanie kontenera

Kod: Zaznacz cały

std::vector
w C++, a w C zapewne dynamicznie alokowanych tablic.
Jeśli chcesz poczytać, jakie problemy mogą być z Twoim podejściem, to spójrz .
Matiks21
Użytkownik
Użytkownik
Posty: 562
Rejestracja: 20 maja 2013, o 16:33
Płeć: Mężczyzna
Lokalizacja: Kielce
Podziękował: 98 razy

[C] Definiowanie tablicy przez typedef

Post autor: Matiks21 »

MadJack pisze:

Kod: Zaznacz cały

int a[n]; 
przy zmiennej rozmiarowej kompilator wywala mi błąd.
Może to wina mojego kompilatora.


W C dynamiczne alokowanie przy pomocy malloc, calloc?
MadJack
Użytkownik
Użytkownik
Posty: 270
Rejestracja: 21 lis 2010, o 22:23
Płeć: Mężczyzna
Podziękował: 5 razy
Pomógł: 35 razy

[C] Definiowanie tablicy przez typedef

Post autor: MadJack »

przy zmiennej rozmiarowej kompilator wywala mi błąd.
Sprawdziłem, w standardzie C jest to zakazane, wielkość tablicy musi być stałą. Nie wiem, dlaczego trick z typedef przechodzi (pewnie zależy od kompilatora), ale to dalej nie zmienia faktu, że robienie czegoś takiego to niezbyt dobry pomysł.
W C tablice lokuje się zarówno przez malloc jak i calloc (to drugie wypełnia zaalokowaną pamięć zerami, co bywa przydatne). Pamiętaj, żeby zwolnić później zaalokowaną pamięć przez free.
Matiks21
Użytkownik
Użytkownik
Posty: 562
Rejestracja: 20 maja 2013, o 16:33
Płeć: Mężczyzna
Lokalizacja: Kielce
Podziękował: 98 razy

[C] Definiowanie tablicy przez typedef

Post autor: Matiks21 »

a jak za pomocą calloc zalokować od razu macierz np. \(\displaystyle{ 5 \times 6}\)?
Ostatnio zmieniony 1 wrz 2015, o 15:58 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
MadJack
Użytkownik
Użytkownik
Posty: 270
Rejestracja: 21 lis 2010, o 22:23
Płeć: Mężczyzna
Podziękował: 5 razy
Pomógł: 35 razy

[C] Definiowanie tablicy przez typedef

Post autor: MadJack »

Ale skoro wiesz, że chcesz macierz \(\displaystyle{ 5 \times 6}\), to dlaczego po prostu nie napiszesz

Kod: Zaznacz cały

double matrix[5][6]
Jeśli chcesz natomiast zaalokować tablicę \(\displaystyle{ n \times m}\)(gdzie \(\displaystyle{ n, m}\) to zmienne), to wtedy musisz wiedzieć, czym jest tablica dwuwymiarowa. Pierwsze musisz zaalokować tablicę wskaźników do double długości \(\displaystyle{ n}\), a potem przejść po tej tablicy i dla każdego wskaźnika zaalokować tablicę długości długości \(\displaystyle{ m}\).

Kod: Zaznacz cały

double ** dynamic_matrix = malloc(n * sizeof(double *));
int i;
for(i = 0; i < n; i++){
    dynamic_matrix[i] = malloc(n * sizeof(double));
}
Jedna uwaga- funkcja malloc zwraca przydzieloną pamięć typu void *. Z tego co czytam, w C jest ona rzutowana na odpowiedni typ automatycznie, w C++ musiałbyś dodatkowo rzutować ją na odpowiedni typ.
Alokacja callociem jest bardzo podobna.
ODPOWIEDZ