Tarea para crear una matriz flexible (asignación de memoria dinámica)
Frecuentes
Visto 451 veces
0
Nos han dado la tarea de escribir una estructura de datos dinámica en C. Todavía soy increíblemente nuevo en C y realmente agradecería si alguien pudiera darme algunos consejos (jajaja) sobre lo que estoy haciendo mal / lo que debería leer más sobre.
Esto es lo que tengo hasta ahora:
flexarray.h
#ifndef FLEXARRAY_H
#define FLEXARRAY_H
typedef struct flexarrayrec flexarray;
flexarray *flexarray_new();
extern void flexarray_add(flexarray *a, char item);
extern void flexarray_set(flexarray *a, char item, int index);
extern char flexarray_get(flexarray *a, int index);
extern void flexarray_trim(flexarray *a);
extern void flexarray_print(flexarray *a);
#endif /* FLEXARRAY_H */
flexarray.c
#include "flexarray.h"
#include "mylib.h"
#define DEFAULT_CAPACITY 10
typedef struct flexarray{
int size;
int capacity;
char *array;
};
flexarray *flexarray_new(){
flexarray a;
a->capacity = DEFAULT_CAPACITY;
a->size = 0;
a->array = (char*) erealloc (a ,a->capacity * sizeof(char));
return a;
}
void grow(flexarray a){
a->capacity = a->capacity * 2;
a->array = (int*) erealloc (a ,a->capacity * sizeof(int));
}
void flexarray_add(flexarray a, char item){
if(a->size == a->capacity) grow(a);
a->array[a->size - 1] = item;
a->size++;
}
void set(flexarray a, char c, int index){
if(index < 0 || index > a->size) return;
a->array[index] = c;
}
char get(flexarray a, int index){
if(index < 0 || index > a->size) return;
return a->array[index];
}
void flexarray_trim(flexarray a){
if(a->size == a->capacity) return;
a->capacity = a->size;
a->array = (char*) erealloc (a, a->capacity * sizeof(char));
}
void flexarray_print(flexarray a){
int i;
printf("[");
for(i = 0; i < a->size - 1; i++){
printf("%c,", a->array[i]);
}
printf("%c]\n", a->array[i + 1]);
}
¡Gracias
EDITAR Registro de compilación actual:
flexarray.c:10:1: warning: useless storage class specifier in empty declaration [enabled by default]
flexarray.c: In function 'flexarray_new':
flexarray.c:13:15: error: storage size of 'a' isn't known
flexarray.c: At top level:
flexarray.c:20:21: error: parameter 1 ('a') has incomplete type
flexarray.c:25:30: error: parameter 1 ('a') has incomplete type
flexarray.c:31:20: error: parameter 1 ('a') has incomplete type
make[2]: *** [build/Debug/MinGW_Actual-Windows/flexarray.o] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
BUILD FAILED (exit value 2, total time: 1s)
3 Respuestas
4
void flexarray_add(flexarray a, char item){
if(a->size == a->capacity) grow(a);
a->array[a->size - 1] = item;
a->size++;
}
Debería ser:
void flexarray_add(flexarray *a, char item){
if(a->size == a->capacity) grow(a);
a->array[a->size] = item;
a->size++;
}
Y:
void flexarray_print(flexarray a){
int i;
printf("[");
for(i = 0; i < a->size - 1; i++){
printf("%c,", a->array[i]);
}
printf("%c]\n", a->array[i + 1]);
}
Podría ser:
void flexarray_print(flexarray *a){
int i;
printf("[");
for(i = 0; i < a->size; i++){
printf("%c,", a->array[i]);
}
printf("]\n" );
}
Consejos de estilo adicionales: para tamaños e índices, intente usar no firmado escribe todo lo que puedas.
struct buff {
size_t size;
size_t used;
char *data;
};
La ventaja de esto es que los intentos de utilizar índices negativos ( b->data[b->used - 1] = item;
) fallará miserablemente y rápido (en lugar de corromper tu memoria lentamente).
Además: debe probar el éxito/fracaso de realloc()
ACTUALIZACIÓN 2: también parece que faltan algunos asteriscos.
contestado el 03 de mayo de 12 a las 17:05
1
flexarray *flexarray_new(){
flexarray a;
return a; // not a flexarray *
}
..y
a->array = (char*) erealloc (a ,a->capacity * sizeof(char));
¿Qué hace 'erealloc()'?
contestado el 03 de mayo de 12 a las 17:05
@wildplasser - hay bastantes para ir :) - Martín James
0
tu typedef
s están mal -- o quieres escribir
typedef struct flexarray { ... } flexarray;
y quitar el typedef
del encabezado, o
struct flexarrayrec { ... }; // no typedef
y mantener el tyepdef struct flexarrayrec flexarray;
en el encabezado
contestado el 03 de mayo de 12 a las 17:05
Brillante, esta fue una de las principales cosas que me confundió. - rtheunissen
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas c or haz tu propia pregunta.
¿Cuál es la pregunta? ¿Qué no funciona? ¿Qué no compila? - unexpectedvalue
Probablemente tenga que escribir una pequeña función main() que probará su estructura de datos. Con ese main puedes probar la compilación y depurar... - eyalm
@eyalm He excluido la función principal, ya que no es relevante para la pregunta. - rtheunissen
@ssteinberg Recibo una variedad de errores de compilación (que agregaré a la pregunta ahora). - rtheunissen