Teil aus beliebigem array entfernen?

M

MrFenix

Executor
Hi,
ich brauche für ein Programm eine Funktion, die ein Element aus einem Array von beliebigem Typ entfernt und alle anderen Elemente in dem Array um eins nach vorne verschiebt.
Ich dachte schon mal an den Datentyp Void* als übergabe parameter für die Funktion:

Code:
void* killfromarray(void* array, int arraysize, int pos, int elementsize) {
   void* tmparr = calloc( (arraysize / elementsize)-1, elementsize);
   tmparr = memcpy(tmparr, array, (pos-1) * elementsize);
   FEHLT
   return tmparr;
}

Kann mir hier jemand helfen?

Danke!
 
Zuletzt bearbeitet:
Code:
void killEl( void **parr, int *pnmemb, size_t size, int i)
{
	 char *pdel = i * size + (char*) *parr;
	 char *bytes_to_shift = (*pnmemb - (i + 1)) * size;

	 memmove( pdel, pdel + 1 * size, bytes_to_shift);

	 *parr = (void*) realloc( *parr, -- (*pnmemb) * size);
	 return;
}
Wird vermutlich irgendwo ein Fehler drin sein, von der Idee ist es allerdings richtig. Du solltest im uebrigen die Problemativ von memmove und memcpy bei sich ueberlappenden Speicherbereichen beachten. man memmove

mfg
 
Was mir an der Methode etwas Unbehagen bereitet, ist, dass ich nicht weiß, ob sich das array mit (char*) behandeln lässt..

Code:
char *pdel = i * size + (char*) *parr;
char *bytes_to_shift = (*pnmemb - (i + 1)) * size;

überlebt das wirklich jede Art von daten ohne gehechselt zu werden?

EDIT:

Ich hätte da noch eine Idee... kann man Void* bitweise rumdrehen? Wenn ja wie?
 
Zuletzt bearbeitet:
MrFenix schrieb:
überlebt das wirklich jede Art von daten ohne gehechselt zu werden?

Die daten sollten überleben, da c in normalen zeigern nie genauer als 8-bit auflöst. Du adressierst im Funktionsaufruf selber auch nicht genauer. size_t >= 8-bit mit 8-bit entspricht 1.

PS.: kann man hier im forum eigentlich latex posten ? :dafuer:
 
Zuletzt bearbeitet:
Die Daten spielen keine Rolle. char* kann man verwenden bei allen Daten, da dies (praktisch) die kleinste Einheit ist, auf der Daten in C betrachtet werden und dies entsprechend auf alle Daten somit anwendbar ist. Bitfelder mal ausgenommen.

Siehe dieses Beispiel:
Code:
#include <stdio.h>
#include <stdlib.h>

void killEl( void **parr, int *pnmemb, size_t size, int i)
{
         char *pdel = i * size + (char*) *parr;
         [b]int[/b] bytes_to_shift = (*pnmemb - (i + 1)) * size;

         memmove( pdel, pdel + 1 * size, bytes_to_shift);

         *parr = (void*) realloc( *parr, -- (*pnmemb) * size);
         return;
}

struct RationalNumber { int a,b; };


void dumpRationalNumbers( struct RationalNumber *q_arr, int q_n)
{
        while( q_n -- > 0) {
                printf( "%d / %d\n", q_arr->a, q_arr->b);
                q_arr ++;
        }

        return;
}

int main()
{
        int i;

        for( i = 0 ; i < 3 ; i ++) {
                int q_n = 3;
                struct RationalNumber q_orig[] = {{1,2}, {1,4}, {1,8}}, *q_arr;
                q_arr = malloc( sizeof( q_orig));
                memcpy( q_arr, q_orig, sizeof( q_orig));

                killEl( (void**)&q_arr, &q_n, sizeof(struct RationalNumber), i);

                dumpRationalNumbers( q_arr, q_n);
                free( q_arr);

                printf( "\n");
        }

        return( 0);
}

mfg
 
Danke, der Vorschlag war sehr gut! Hab noch en bischen meinem Wünschen nach rumgeändert und sieht jetzt so aus:
Code:
void arrrm(void** array, unsigned int pos, size_t elsize, size_t arrsize) {



	char* upper = (char*)malloc(sizeof(char)*(arrsize-(pos*elsize)));
	upper = (char*)*array + (pos*elsize);
	
	memmove(upper, upper + elsize, arrsize-(pos+1)*elsize);

	*array = realloc(*array, arrsize-elsize);
	
	return;

	
}

Läuft auf jeden fall :)

:respekt:
 

Ähnliche Themen

Unix Webserver mit HTML Seite erstellen

C Programm unter Unix

Xubuntu - AVR32-linux crosscompile sqlite

Matpack installation

fußballstatistik auswerten

Zurück
Oben