C
Crymes
Guest
Hallo,
Ich beschäftige mich gerade mit der Programmiersprache C , deshalb probier ich einen Vector und eine Liste in C zu schreiben (was praktisches um die dynamische Speicherverwaltung zu üben ) und habe ein paar Fragen.
Am Besen erstmal mein Code:
Vector.h:
Vector.c:
Und das Testprogramm:
1. Was würdet ihr bis jetzt zum grundsätzlichen Aufbau sagen?
2. Es wird kein Element angefügt, wahrscheinlich stimmt in der Vector_appendElement Funktion am Anfang die Größenabfrage des void-Pointers nicht. Wie regelt man das sonst, dass der Vektor nur einen Datentyp enthält?
3. Wenn ich in eienr dynamisch erstellten Struktur auf den Wert hinter einer Pointervariable zugreifen will, schreibe ich das dann folgendermaßen?
Es geht um die letzte auskommentierte Zeile.
Ich beschäftige mich gerade mit der Programmiersprache C , deshalb probier ich einen Vector und eine Liste in C zu schreiben (was praktisches um die dynamische Speicherverwaltung zu üben ) und habe ein paar Fragen.
Am Besen erstmal mein Code:
Vector.h:
Code:
/*
* vector.h
*
* Created on: 23.06.2014
*/
#ifndef VECTOR_H_
#define VECTOR_H_
#include <stdlib.h>
//Struktur des Vektors
struct Vector
{
int numelements;
int capacity;
size_t element_size;
void *data;
};
//Funktionen
struct Vector* Vector_new(const size_t, unsigned int);
void Vector_delete(struct Vector*);
size_t Vector_getSize(struct Vector*);
int Vector_getNumElements(struct Vector*);
int Vector_getCapacity(struct Vector*);
int Vector_resize(struct Vector*, const unsigned int);
int Vector_appendElement(struct Vector*, void*);
void *Vector_getElement(struct Vector*, const unsigned int);
#endif /* VECTOR_H_ */
Vector.c:
Code:
/*
* vector.c
*
* Created on: 23.06.2014
*/
#include "vector.h"
struct Vector* Vector_new(const size_t element_size, unsigned int capacity)
{
//Vectorstruktur erstellen
struct Vector *V = NULL;
V = (struct Vector*) malloc(sizeof(struct Vector));
if(V == NULL)
{
return(V);
}
V->element_size = element_size;
V->numelements = 0;
//Kapazitaet initialisieren
if(capacity == 0)
{
V->data = NULL;
V->capacity = 0;
}
else
{
V->data = calloc(capacity, element_size);
V->capacity = capacity;
//Fehlerbehandlung wenn Kapazität nicht zur Verfügung steht
if(V->data == NULL)
{
//Vektor ohne Kapazitaet erstellen
V->capacity = 0;
}
}
return(V);
}
void Vector_delete(struct Vector *V)
{
free(V->data);
free(V);
}
int Vector_appendElement(struct Vector *V, void *element)
{
//ueberprüfen ob das Element die gleiche größe wie element_size hat
if(sizeof(element) != V->element_size)
{
return(0);
}
//Vector groß genug für neues Element?
if(V->capacity <= V->numelements)
{
//Vektor um 1 vergroessern
int error = Vector_resize(V, V->numelements+1);
if(error == 0)
{
return(0);
}
V->capacity++;
}
//Neues Element am Ende des Datenblocks anhängen
memcpy(V->data + V->numelements*V->element_size, element, V->element_size);
V->numelements++;
return(1);
}
void *Vector_getElement(struct Vector *V, const unsigned int position)
{
if(position > V->numelements-1)
{
return(NULL);
}
return(V->data + position*V->element_size);
}
int Vector_resize(struct Vector *V, const unsigned int capacity)
{
if(capacity == 0)
{
V->capacity = 0;
V->numelements = 0;
free(V->data);
return(1);
}
//Pointer des aktuellen Datenblocks sichern, falls realloc() scheitert
void *p = NULL;
p = V->data;
V->data = realloc(V->data, V->element_size*capacity);
if(V->data == NULL)
{
V->data = p;
return(0);
}
V->capacity = capacity;
if(capacity < V->numelements)
{
V->numelements = capacity;
}
return(1);
}
size_t Vector_getSize(struct Vector *V)
{
return(sizeof(V->data));
}
int Vector_getNumElements(struct Vector *V)
{
return(V->numelements);
}
int Vector_getCapacity(struct Vector *V)
{
return(V->capacity);
}
Und das Testprogramm:
Code:
/*
============================================================================
Name : test.c
Author :
Version :
Copyright : Your copyright notice
Description : Hello World in C, Ansi-style
============================================================================
*/
#include <stdio.h>
#include <stdlib.h>
#include "vector.h"
int main(void)
{
//Vektor erstellen
struct Vector *V = Vector_new(sizeof(struct Vector), 50);
int a,b;
Vector_appendElement(V, &a);
Vector_appendElement(V, &b);
printf("%d", Vector_getNumElements(V));
printf("%d", Vector_getCapacity(V));
printf("%d", (int) Vector_getSize(V));
return(0);
}
1. Was würdet ihr bis jetzt zum grundsätzlichen Aufbau sagen?
2. Es wird kein Element angefügt, wahrscheinlich stimmt in der Vector_appendElement Funktion am Anfang die Größenabfrage des void-Pointers nicht. Wie regelt man das sonst, dass der Vektor nur einen Datentyp enthält?
3. Wenn ich in eienr dynamisch erstellten Struktur auf den Wert hinter einer Pointervariable zugreifen will, schreibe ich das dann folgendermaßen?
Code:
struct a
{
int x;
int *y;
};
struct a *s = (struct a*) malloc(sizeof(struct a));
int i = 5;
s->y = &i;
*s->y++; // ist das selbe wie i++, also 6 ?
Es geht um die letzte auskommentierte Zeile.
Zuletzt bearbeitet: