Gama dinámica de enteros -- amp codereview Relacionados El problema

Dynamic array of integers


1
vote

problema

Español

Implementé una clase vectorial en C para enteros. Cualquier comentario bienvenido.

encabezado:

  #define DEFAULT_CAPACITY 1000  // Define a vector type typedef struct  {   int nrOfElements;     // Current number of elements.   int capacity; // Possible capacity.     int *data;    // Pointer to array elements.     } CVectorInt;  typedef enum {VECTOR_SUCCESS, VECTOR_OUTOFBOUNDS, VECTOR_MEMORYERROR} vector_error;  vector_error CVectorInit(CVectorInt *vector); vector_error CVectorAppend(CVectorInt *vector, int value); vector_error CVectorGet(CVectorInt *vector, int index, int * value); vector_error CVectorSet(CVectorInt *vector, int index, int value); void CVectorFree(CVectorInt *vector);   

.c:

  #include "CVectorInt.h" #include <stdio.h> #include <stdlib.h>   vector_error CVectorInit(CVectorInt *vector) {     int i = 0;      vector->capacity = DEFAULT_CAPACITY;     vector->nrOfElements = 0;     vector->data = malloc(sizeof(int) * vector->capacity);     if(vector->data == NULL)         return VECTOR_MEMORYERROR;      // Initialization in C never hurts.     for(i = 0; i<DEFAULT_CAPACITY; i++)         vector->data[i] = 0;      return VECTOR_SUCCESS; }  vector_error CVectorAppend(CVectorInt *vector, int value)  {     int * ptr = NULL;     int i = 0;      // Resize vector if there is no space for more elements.     if(vector->capacity == vector->nrOfElements)     {         vector->capacity *= 2;         ptr = realloc(vector->data, vector->capacity * sizeof(int));         if(ptr == NULL)                   {                    return VECTOR_MEMORYERROR;         }         else         {             vector->data = ptr;               // Initialize new elements to 0.             for(i = vector->nrOfElements; i<vector->capacity; i++)                 vector->data[i] = 0;         }     }      vector->data[vector->nrOfElements++] = value;      return VECTOR_SUCCESS;   }  vector_error CVectorGet(CVectorInt *vector, int index, int * value) {     if(index < vector->nrOfElements && index >= 0)     {         // Pass value at given index.         *value = vector->data[index];         return VECTOR_SUCCESS;     }else     {         return VECTOR_OUTOFBOUNDS;     } }  vector_error CVectorSet(CVectorInt *vector, int index, int value) {     if(index >= vector->capacity)         return VECTOR_OUTOFBOUNDS;      vector->data[index] = value;      return VECTOR_SUCCESS;  }   void CVectorFree(CVectorInt *vector) {   free(vector->data); }   

Uso:

  #include <stdio.h> #include <stdlib.h> #include "CVectorInt.h"  int main(void)  {     //error handling omitted for simplicity      CVectorInt v;     int i = 0, temp = 0;      CVectorInit(&v);     for(i = 0; i<100; i++)     {         CVectorAppend(&v, i*2);     }      for(i = 0; i<100; i++)     {         CVectorGet(&v, i, &temp);         printf("%d ", temp);     }      CVectorFree(&v);      return 0; }   
Original en ingles

I implemented a vector class in C for integers. Any feedback welcome.

header:

#define DEFAULT_CAPACITY 1000  // Define a vector type typedef struct  {   int nrOfElements;     // Current number of elements.   int capacity; // Possible capacity.     int *data;    // Pointer to array elements.     } CVectorInt;  typedef enum {VECTOR_SUCCESS, VECTOR_OUTOFBOUNDS, VECTOR_MEMORYERROR} vector_error;  vector_error CVectorInit(CVectorInt *vector); vector_error CVectorAppend(CVectorInt *vector, int value); vector_error CVectorGet(CVectorInt *vector, int index, int * value); vector_error CVectorSet(CVectorInt *vector, int index, int value); void CVectorFree(CVectorInt *vector); 

.c:

#include "CVectorInt.h" #include <stdio.h> #include <stdlib.h>   vector_error CVectorInit(CVectorInt *vector) {     int i = 0;      vector->capacity = DEFAULT_CAPACITY;     vector->nrOfElements = 0;     vector->data = malloc(sizeof(int) * vector->capacity);     if(vector->data == NULL)         return VECTOR_MEMORYERROR;      // Initialization in C never hurts.     for(i = 0; i<DEFAULT_CAPACITY; i++)         vector->data[i] = 0;      return VECTOR_SUCCESS; }  vector_error CVectorAppend(CVectorInt *vector, int value)  {     int * ptr = NULL;     int i = 0;      // Resize vector if there is no space for more elements.     if(vector->capacity == vector->nrOfElements)     {         vector->capacity *= 2;         ptr = realloc(vector->data, vector->capacity * sizeof(int));         if(ptr == NULL)                   {                    return VECTOR_MEMORYERROR;         }         else         {             vector->data = ptr;               // Initialize new elements to 0.             for(i = vector->nrOfElements; i<vector->capacity; i++)                 vector->data[i] = 0;         }     }      vector->data[vector->nrOfElements++] = value;      return VECTOR_SUCCESS;   }  vector_error CVectorGet(CVectorInt *vector, int index, int * value) {     if(index < vector->nrOfElements && index >= 0)     {         // Pass value at given index.         *value = vector->data[index];         return VECTOR_SUCCESS;     }else     {         return VECTOR_OUTOFBOUNDS;     } }  vector_error CVectorSet(CVectorInt *vector, int index, int value) {     if(index >= vector->capacity)         return VECTOR_OUTOFBOUNDS;      vector->data[index] = value;      return VECTOR_SUCCESS;  }   void CVectorFree(CVectorInt *vector) {   free(vector->data); } 

Usage:

#include <stdio.h> #include <stdlib.h> #include "CVectorInt.h"  int main(void)  {     //error handling omitted for simplicity      CVectorInt v;     int i = 0, temp = 0;      CVectorInit(&v);     for(i = 0; i<100; i++)     {         CVectorAppend(&v, i*2);     }      for(i = 0; i<100; i++)     {         CVectorGet(&v, i, &temp);         printf("%d ", temp);     }      CVectorFree(&v);      return 0; } 
  
         
         

Lista de respuestas

2
 
vote

Creo que debe usar context7 para las cosas donde no puede tener valores negativos.

  context8  

Esta comprobación, por ejemplo, no necesitaría la comparación con 0 si usó context9 .

En los comentarios ya dije algo sobre el desbordamiento. Ahora, de hecho, puedes decir "esa es una gran cantidad de elementos, la gente no va a superar esto" y no la construirá. Eso está bien. Sin embargo, asegúrese de agregarlo como un comentario en el encabezado, porque no quiere descubrir accidentalmente que este es un problema.

 

I think you should use uint for things where you cannot have negative values.

vector_error CVectorGet(CVectorInt *vector, int index, int * value) {     if(index < vector->nrOfElements && index >= 0) 

This check, for instance, wouldn't need the comparison with 0 if you used uint.

In the comments I already said something about overflow. Now, you can indeed say "that's such a big amount of elements, people are not going to surpass this" and not build it in. That's okay. Be sure to add it in as a comment in the header though, because you don't want to accidentally find out that this is a problem.

 
 
 
 
2
 
vote

algunos puntos:

  • on()020 : ¿Qué debería suceder si on()1 ? Debe on()2 ?
  • El on()3 Enum debe ser RENAMIENTO COMO on()4 , creo.
  • on()5 Esta es una progresión geométrica, puede crecer más rápido que el usuario piense. Es posible que desee usar una progresión aritmética ( 99887766555443326 por ejemplo).
  • on()7 Debe arreglar un límite a la capacidad.
  • on()8 ¿Por qué no revisar el límite inferior también? (O usar INT sin firmar)
  • Dado que está inicializando el espacio a cero, debe usar on()9 en lugar de <stdbool.h>0 .
 

Some points:

  • CVectorSet: what should happen if index > vector->nrOfElements? Should nrOfElements=index?
  • The vector_error enum should be rename as vector_status, I think.
  • vector->capacity *= 2; This is a geometric progression, it may grows faster then the user think. You may want to use an arithmetic progression (vector->capacity += DEFAULT_CAPACITY; for example).
  • vector->capacity *= 2; You should fix a limit to the capacity.
  • if(index >= vector->capacity) return VECTOR_OUTOFBOUNDS; Why not checking the lower bound too? (Or use unsigned int.)
  • Since you're initializing the space to zero, you should use calloc instead of malloc.
 
 
   
   

Relacionados problema

12  Codificación de árbol binario  ( Binary tree encoding ) 
Implementé una solución a este desafío de codificación en el código de golf. Tengo experiencia decente con C / C ++, pero ha sido un tiempo desde que los us...

38  Sundoku Solver en C  ( Sudoku solver in c ) 
Tuve este código que miente, así que pensé que sometería esto como mi primer intento de una Fin de semana: desafío . Preferiría si las revisiones contenían s...

2  Función para borrar un carácter en una cadena  ( Function to erase a character in a string ) 
void chrrem (char arr[], size_t len, size_t pos) { memmove(arr + pos, arr + (pos + 1), (len - pos) + 1); } Se supone que es simplemente rápido. Borra...

4  C Socket Parte-1  ( C socket part 1 ) 
En mis intentos en curso de convertirse en un mejor escritor de blog, tengo algunos códigos más que necesitan revisar. Fuente completa: https://github.com/...

14  Representación de OpenGL ACTUPTAR  ( Opengl instanced rendering ) 
Tengo una configuración de representación muy básica de OpenGL ANDRANCT, que está compilando y funcionando, sin embargo, es super lento, y aunque pasé días de...

1  Imprima todos los tamaños posibles de subsecuencias de cadena en C  ( Print out all possible sizes of subsequences of string in c ) 
Por ejemplo, dada una cadena "abcdefghijk", quiero que mi función se imprima: a, b, c, d, e, f, g, h, i, j, k. ab, bc, cd, de, ef, fg, gh, hi, ij, jk ab...

6  Palindrome más largo en una matriz  ( Longest palindrome in an array ) 
Soy nuevo en la programación, y creo que este código podría mejorarse. ¿Alguna sugerencia? 'done'0 ...

5  Cola de bloqueo con la exactitud de la lista doblemente vinculada  ( Lock free queue with doubly linked list correctness ) 
Necesito una cola de bloqueo que se implementa mediante la lista doblemente vinculada. es mi código correcto? ¿Hay algún error? ¿Hay alguna mejoras a realiz...

4  Juego de Runas: Versión 3  ( Game of runes version 3 ) 
He escrito una versión muy revisada y desarrollada de la juego de runas . Los cambios principales se enumeran: Convertir runas para usar maldiciones. ag...

2  Mejora de la función que compara dos cadenas  ( Improving function that compares two strings ) 
Estoy aprendiendo C y he hecho esta función muy simple para comparar dos cuerdas. Me gustaría saber cómo se puede mejorar: int match(char* string1, char* s...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos