kostenloser Webspace werbefrei: lima-city


[C++] Elemente aus Array entfernen

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    heavyraptor

    heavyraptor hat kostenlosen Webspace.

    Hi,

    wie kann ich aus einem Array elemnte löschen, am besten so wie mit der PHP-Funktion unset()?

    Mein Array ist so definiert:
    unsigned long int * a = new unsigned long int[64];


    Wäre nett, wenn mir jemand helfen könnte. Danke.

    mfg,
    hr
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. c*a

    Hallo,

    du kannst nicht so ohne weiteres beliebige Elemente aus einem Array löschen. Nur die Elemente am Anfang des Arrays und am Ende lassen sich "leicht" löschen.

    Wenn du das Element an der Stelle i löschen willst, kannst du aber die Arrayelemente ab der Stelle i+1 (inklusive) um eine Stelle nach vorne verschieben,.

    Vielleicht so:
    int i = 10; int laenge = 64; //Element an der Stelle i soll gelöscht werden
    int k;
    for(k=i; k<laenge-1; k++){
    a[k] = a[k+1];
    }

    ^^nicht getestet^^

    Das Element ist jetzt gelöscht aber die Grösse des Arrays ist noch nicht angepasst. Da gäbe es verschiedene Möglichkeiten.

    P. S.: Warum nimmst du nicht den STL Vektor?

    Beitrag geaendert: 7.3.2007 19:24:12 von cga
  4. Autor dieses Themas

    heavyraptor

    heavyraptor hat kostenlosen Webspace.

    Hi,

    achso alles klar. Schade, dass man nicht beliebige Elemente direkt löschen kann ... naja.
    Den STL Vektor verwende ich nicht, weil ich mit einem Vektor im Heap weniger speicher verwende. Jedoch weiss ich auch nicht richtig, was man mit dem STL Vektor machen kann ... gibt es da Vorteile?

    Da hab ich aber noch eine Frage, was ist daran Falsch? Es wird mir ein Fehler bei der letzten Zeile ausgegeben ("Allgemeine Schutzverletzung"):
    unsigned long int size = 1000000;
    unsigned long int * primes = new unsigned long int[size];
    
    for (unsigned long int i = 0; i < size; i++)
      primes[i] = 1; // Hier gibt es ein Fehler ...


    mfg,
    hr

    Beitrag geaendert: 8.3.2007 18:07:34 von heavyraptor
  5. c*a

    Den STL Vektor verwende ich nicht, weil ich mit einem Vektor im Heap weniger speicher verwende. Jedoch weiss ich auch nicht richtig, was man mit dem STL Vektor machen kann ... gibt es da Vorteile?


    Der STL Vektor kommt in den Heap. Ein über mit "unsigned long int * a = new unsigned long int[64];" erzeugtes Array aber ebenfalls.
    Ein mit "unsigned long int a[64];" erzeugtes dagegen Array kommt auf den Stack!!

    Ein Vorteil vom STL-Vektor wäre z. B., dass da solche Sachen wie Löschen von Elementen schon fertig eingebaut sind.


    Es wird mir ein Fehler bei der letzten Zeile ausgegeben ('Allgemeine Schutzverletzung'):

    Was hast du für einen Compiler? Meiner sagt:
    invalid conversion from `int' to `long unsigned int*'

    primes ist ein Zeiger, dem kannst du doch nicht eine 1 zuweisen. Was sollte denn das bedeuten? Meinst du vll so was:

    unsigned long int size = 1000000;
    unsigned long int * primes = new unsigned long int[size];
    
    for (unsigned long int i = 0; i < size; i++)
      primes[i] = 1; // Hier gibt es ein Fehler ...
  6. hannover-liga

    hannover-liga hat kostenlosen Webspace.

    Hier eine Funktion, die ich mal vor längerer Zeit geschrieben habe, mit der man aus allen Arten von mit new erzeugten Arrays einzelne Elemente rauslöschen kann. Vielleicht findets irgendwer nützlich.
    bool DelElement(void ** pArray, int iSize,
                    int iDelIndex, int iElementCount)
    {
       char * pTemp;
       int iFound;
       int iDelBegin;
       int iDelEnd;
    
       if (iElementCount <= 1)
       {
          delete [] *pArray;
          *pArray = NULL;
          return true;
       }
    
       pTemp = new char[iSize * (iElementCount - 1)];
       iFound = 0;
       iDelBegin = iDelIndex * iSize;
       iDelEnd = (iDelIndex + 1) * iSize;
    
       for (int iTemp = 0; iTemp < (iElementCount * iSize); iTemp++)
       {
          if ((iTemp < iDelBegin) || (iTemp >= iDelEnd))
             pTemp[iTemp - iFound] = ((char *) *pArray)[iTemp];
          else
             iFound++;
       }
    
       delete [] *pArray;
       *pArray = pTemp;
       return true;
    }

    Fehlerbehandlung habe ich mal rausgenommen, damit es übersichtlicher ist.
    Das ist übrigens ein gutes Beispiel dafür, wann Referenzen einfach nicht zu gebrauchen sind (siehe Thread http://www.lima-city.de/boards/thread/58989 ).

    Der Aufruf würde beispielhaft so aussehen:
    char * pc;
    pc = new char[26];
    
    // erzeugtes Array mit Alphabet füllen
    pc[0] = 'a';
    for (int ii = 1; ii < 26; ii++)
       pc[ii] = pc[ii - 1] + 1;
    
    cout << "vor loeschung: ";
    for (ii = 0; ii < 26; ii++)
       cout << pc[ii];
    cout << endl;
    
    // 3. Element (Buchstabe c) löschen
    DelElement((void **) &pc, sizeof(*pc), 2, 26);
    
    cout << "nach loeschung: ";
    for (ii = 0; ii < 25; ii++)
       cout << pc[ii];


    Man muss halt nur wissen, wie gross das Array ist.


    Edit:
    Wann ist endlich der verdammte Fehler aus diesem Forum raus, der immer dazu führt, dass man eine Variable namens i nicht als Index benutzen kann, ohne dass sie aus dem Text verschwindet und der Rest des Codes plötzlich kursiv erscheint...?


    Edit2:

    Da hab ich aber noch eine Frage, was ist daran Falsch? Es wird mir ein Fehler bei der letzten Zeile ausgegeben ("Allgemeine Schutzverletzung"):
    unsigned long int size = 1000000;
    unsigned long int * primes = new unsigned long int[size];
    
    for (unsigned long int i = 0; i < size; i++)
      primes[ i ] = 1; // Hier gibt es ein Fehler ...


    Check mal primes auf NULL, nachdem du new benutzt hast. Wenn der Fehler wirklich genau dort sein sollte, wo du es angibst, ist das die einzig logische Erklärung.
    @cga:
    Sein Index-i ist auch verschwunden dank lima, ansonsten hättest du recht.

    Beitrag geaendert: 9.3.2007 1:44:53 von hannover-liga
  7. Autor dieses Themas

    heavyraptor

    heavyraptor hat kostenlosen Webspace.

    Hi,

    erstmal danke für die Antworten.
    Ich verwende übringens den Borland C++ Builder v6 und v4.52. Die Funktionen von hannover-liga könnten mir zwar weiterhelfen, aber ich hab' es jetzt anders gelöst (danke trotzdem):
    Mit dem STL Vektor klappt es, ausserdem hab ich noch eine andere Problemlösung gefunden.

    Gracias para todo cga, eres el unico lama que yo conozco que es útil :biggrin:.

    mfg,
    hr
  8. c*a

    Sein Index-i ist auch verschwunden dank lima, ansonsten hättest du recht.

    Da dachte ich schon, ich könnte mit meinen gerade erworbenem Wissen angeben...

    Ein Compiler der in so einem Fall als Fehlermeldung "Allgemeine Schutzverletzung" rausgibt :lol: na danke.
  9. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!