Chciałbym napisać program, który będzie pobierał liczby od użytkownika i dodawał je do tablicy, tak długo aż ten nie poda liczby 100. Z tego co się orientuję to rozmiar tablicy trzeba zdefiniować na początku, więc jak rozwiązać ten problem?
Dynamiczna alokacja i realloc
Przeczytałem, napisałem 2 programy, które robią to samo i działają tak jak oczekiwałem. Teraz mam pytanie co powinno się poprawić w tym kodzie, bo działać działa, ale czy wszystko jest ok to już nie wiem.
#include <stdio.h>
#include <stdlib.h>
int main(void){
int rozmiar=0, i;
int *tablica;
tablica = (int*) malloc(rozmiar * sizeof(*tablica));
do{
rozmiar++;
scanf("%d", &tablica[rozmiar-1]);
}while(tablica[rozmiar-1]!=100);
for(i=0; i<rozmiar; i++){
printf("%d ", tablica[i]);
}
printf("\n%d", rozmiar);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main(void){
int rozmiar=0, j;
int *tablica;
tablica = (int*) malloc(sizeof(*tablica));
do{
tablica=realloc(tablica, (rozmiar+1)*sizeof(*tablica));
scanf("%d", &tablica[rozmiar]);
rozmiar++;
}while(tablica[rozmiar-1]!=100);
for(j=0; j<rozmiar; j++){
printf("%d ", tablica[j]);
}
printf("\n%d", rozmiar);
return 0;
}
W pierwszym programie masz UB - alokujesz 0 bajtów a korzystasz z otrzymanego wskaźnika.
Drugi wydaje się poprawny.
Dalej mam z tym problem. Teraz dodałem instrukcję sortowania, ale to działa, albo nie działa. Np. przy wprowadzeniu 3 1 2 100 wyrzuca błąd.
Można to naprawić jeśli wpisałbym w pętli do while
tablica=realloc(tablica, 111*(rozmiar+1)*sizeof(*tablica));
, ale to raczej nie jest najpiękniejsza i poprawna metoda. Jak to należy poprawić i z czego wynika ten błąd?
#include <stdio.h>
#include <stdlib.h>
void sortuj(int j, int i, int tablica[],int min,int max, int rozmiar){
for(j=0;j<rozmiar;j++){
for(i=0; i<rozmiar; i++){
if(tablica[i]>tablica[i+1]){
min=tablica[i+1];
max=tablica[i];
tablica[i]=min;
tablica[i+1]=max;
}
}
}
}
int main(void){
int rozmiar=0, j, min, max, i;
int *tablica;
tablica = (int*) malloc(sizeof(*tablica));
do{
tablica=realloc(tablica, (rozmiar+1)*sizeof(*tablica));
scanf("%d", &tablica[rozmiar]);
rozmiar++;
}while(tablica[rozmiar-1]!=100);
sortuj(j, i, tablica, min, max, rozmiar);
for(j=0; j<rozmiar; j++){
printf("%d ", tablica[j]);
}
printf("\n%d", rozmiar);
return 0;
}
Może się przyda:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char *data;
size_t capacity;
size_t size;
const size_t element_size;
} vector;
vector vector_init(size_t initial_capacity, size_t element_size) {
if(!initial_capacity) {
initial_capacity = 1;
}
vector result = {
malloc(initial_capacity*element_size),
initial_capacity,
0,
element_size
};
return result;
}
char *vector_get(vector *vec, size_t idx) {
return vec->size > idx
? vec->data + idx*vec->element_size
: NULL;
}
void vector_reserve(vector *vec, size_t size) {
if(vec->capacity >= size) {
return;
}
vec->capacity = size;
vec->data = realloc(vec->data, vec->capacity*size);
}
void vector_push(vector *vec, void *data) {
if(vec->size >= vec->capacity) {
vector_reserve(vec, vec->capacity*2);
}
memcpy(vec->data + vec->size*vec->element_size, data, vec->element_size);
vec->size += 1;
}
size_t vector_size(vector const *vec) {
return vec->size;
}
size_t vector_capacity(vector const *vec) {
return vec->capacity;
}
void vector_free(vector *vec) {
free(vec->data);
}
int main(void) {
int initial_capacity = 0;
vector vec = vector_init(initial_capacity, sizeof(int));
int i = 10;
while(i --> 0) {
vector_push(&vec, &i);
}
printf("vector size: %d\n", vector_size(&vec));
printf("vector capacity: %d\n", vector_capacity(&vec));
printf("vector values:\n");
for(i = 0; i < vector_size(&vec); ++i) {
printf(" vec[%d]: %d\n", i, *(int*)vector_get(&vec, i));
}
vector_free(&vec);
return 0;
}
output
:
vector size: 10
vector capacity: 16
vector values:
vec[0]: 9
vec[1]: 8
vec[2]: 7
vec[3]: 6
vec[4]: 5
vec[5]: 4
vec[6]: 3
vec[7]: 2
vec[8]: 1
vec[9]: 0
Może kiedyś mi się to przyda, ale w tej chwili chciałbym rozwiązanie obecnego problemu ;)
EDIT:
Dobra mam, dla potomnych:
W drugiej pętli for czytając od góry powinno być
for(i=0; i<rozmiar-1; i++)
.
Gdy nie było -1 to program porównywałby ostatni element z nieistniejącym elementem tablicy i stąd błędy.