Teil aus beliebigem array entfernen?

Dieses Thema im Forum "C/C++" wurde erstellt von MrFenix, 18.10.2004.

  1. #1 MrFenix, 18.10.2004
    Zuletzt bearbeitet: 18.10.2004
    MrFenix

    MrFenix Executor

    Dabei seit:
    16.10.2004
    Beiträge:
    480
    Zustimmungen:
    0
    Ort:
    Siegen, NRW
    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!
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. etuli

    etuli Betrunken

    Dabei seit:
    12.04.2003
    Beiträge:
    278
    Zustimmungen:
    0
    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
     
  4. #3 MrFenix, 18.10.2004
    Zuletzt bearbeitet: 18.10.2004
    MrFenix

    MrFenix Executor

    Dabei seit:
    16.10.2004
    Beiträge:
    480
    Zustimmungen:
    0
    Ort:
    Siegen, NRW
    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?
     
  5. #4 h2owasser, 18.10.2004
    Zuletzt bearbeitet: 18.10.2004
    h2owasser

    h2owasser Sxe Power User

    Dabei seit:
    07.12.2002
    Beiträge:
    491
    Zustimmungen:
    0
    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:
     
  6. etuli

    etuli Betrunken

    Dabei seit:
    12.04.2003
    Beiträge:
    278
    Zustimmungen:
    0
    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
     
  7. #6 MrFenix, 19.10.2004
    MrFenix

    MrFenix Executor

    Dabei seit:
    16.10.2004
    Beiträge:
    480
    Zustimmungen:
    0
    Ort:
    Siegen, NRW
    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:
     
  8. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
Thema:

Teil aus beliebigem array entfernen?

Die Seite wird geladen...

Teil aus beliebigem array entfernen? - Ähnliche Themen

  1. IT-Systemadministrator/in in Teilzeit oder freiberuflich

    IT-Systemadministrator/in in Teilzeit oder freiberuflich: Wir suchen ab sofort in Teilzeit (20 Std./Woche) oder freiberuflich eine/n IT-Systemadministrator/in. Ihr Aufgabengebiet: Administration,...
  2. GSoC 2016: Teilnehmer angekündigt

    GSoC 2016: Teilnehmer angekündigt: Der Suchmaschinenbetreiber Google hat die Namen der akzeptierten Teilnehmer bekannt gegeben, die im Rahmen des diesjährigen Summer of Code (GSoC)...
  3. Systemadministrator/ in als Teilzeitstelle

    Systemadministrator/ in als Teilzeitstelle: Systemadministrator/ in als Teilzeitstelle Die DiOmega GmbH ist eine Agentur mit Sitz in Frankfurt am Main, die sich auf IT- und...
  4. Großbritannien fördert Bürgerbeteiligung durch die Initiative »Digital by Default«

    Großbritannien fördert Bürgerbeteiligung durch die Initiative »Digital by Default«: Großbritanniens Government’s Digital Service (GDS) hat 2015 die Initiative »Digital by Default« gestrafft, um Richtlinien zur Erstellung...
  5. EU verteilt Forschungsgelder an Open-Source-Projekte

    EU verteilt Forschungsgelder an Open-Source-Projekte: Der Europäische Forschungsrat (ERC) stattet vier Open-Source-Forschungsprojekte mit Forschungsgeldern aus. Weiterlesen...