Array mithilfe einer Funktion kopieren



  • Hi

    Ich versuche schon den ganzen Tag über irgendwie ein integer Array mit Hilfe einer Funktion zu verändern und in ein neues Array zu kopieren, was mir jedoch noch nicht gelang.

    Da ich aus der PHP-Ecke stamme dachte ich, sowas hätte ich innerhalb von wenigen Sekunden zusammen.

    <?php
    funtion wurschtisize_array($array)
    {
      // diverse manipulationen
      return $array;
    }
    $foobar = array("Hans","Wurst");
    $newbar = wurschtisize_array($foobar);
    echo $newbar[0]; // z.B. Curry
    echo $newbar[1]; // z.B. Poulet
    ?>
    

    In cpp scheint das aber irgendwie nicht so einfach. leider......zum glück? ...bisher nur leider 🙂

    Konkret geht es darum Jasskarten zu mischen. Ich habe ein in array mit 52 Elementen.

    int KartenStappel[52]
    for (int i = 0; i < 52; i++)
    {
    	KartenStappel = i;
    }
    

    und die Funktion, die die Karten (das Array) mischen soll und als neues Array rauspacken. Die Funktion, wie sie jetzt ist, ist zwar performancemässig gegen Ende der for-Schlaufe nicht optimal (er versucht solange die letzten, noch nicht gebrauchten Zahlen zu finden, bis das Array gefüllt ist), aber da es nur ein Kartenspiel werden soll und diese Funktion auch nur einmal pro ~3 Minuten aufgerufen wird, auch nicht dramatisch.

    void CDialogEinsDlg::RandomizeArray(int *pointer)
    {
    	//Eine Zufallszahl zwischen a und b (incl. a und b) erzeugt man z.B. mit:
    	//a + ( rand() % ( b - a + 1 ) )
    	srand( (unsigned) time(NULL) ) ;	// zufallsgenerator initialisieren
    	int zahl;							// zufallszahl
    	int a = 0;							// niedrigste zufallszahl
    	int b = 51;							// höchste zufallszahl
    	int new_array[52];					// array mit den zufällig gemischten zahlen von 0-51
    	bool fFound;						// prüf-bit, ob die zahl schon in new_array existiert
    	for (int i = 0; i < 52; i++)
    	{
    		fFound = FALSE;	// zurücksetzen des pfüf-bits, für diesen Durchlauf
    		zahl = a + ( rand() % ( b - a + 1 ) ); // zufallszahl generieren
    		for (int p = 0; p < 52; p++)
    		{
    			if ( new_array[p] == (*pointer)[zahl]) // existiert die zufallszahl schon?
    			{
    				fFound = TRUE; // wenn ja, abbrechen
    				break;
    			}
    		}
    		if (fFound == FALSE) // wenn nein
    		{
    			new_array[i] = (*pointer)[zahl]; // zahl hinzufügen
    		}
    		else
    		{
    			i=i-1; // wenn die zahl schon existiert, den selben Durchlauf nochmals
    		}
    	}
    	//*KartenStappel = *new_array;
    	*pointer = new_array;
    	return 0;
    	//return new_array;
    }
    

    so, wie sie jetzt da steht, produziert sie die Fehler
    error C2109: subscript requires array or pointer type
    auf der Linie [i]if ( new_array[p] == (pointer)[zahl])

    wie ihr seht, habe ich da ein wenig mit pointern versucht, was zu reissen, da ich glaube, dass ich da nicht sehr Falsch liege, komme aber alleine nicht mehr weiter.

    Was mache ich Falsch? Mit welchem Denkansatz soll ich weiterfahren? Habt ihr evtl. bereits ein Lösung auf Lager?

    Grüsse, Megge



  • _Zim schrieb:

    int KartenStappel[52]
    for (int i = 0; i < 52; i++)
    {
    	KartenStappel[i] = i;
    }
    

    und die Funktion, die die Karten (das Array) mischen soll und als neues Array rauspacken. Die Funktion, wie sie jetzt ist, ist zwar performancemässig gegen Ende der for-Schlaufe nicht optimal (er versucht solange die letzten, noch nicht gebrauchten Zahlen zu finden, bis das Array gefüllt ist), aber da es nur ein Kartenspiel werden soll und diese Funktion auch nur einmal pro ~3 Minuten aufgerufen wird, auch nicht dramatisch.

    void CDialogEinsDlg::RandomizeArray(int *pointer)
    {
    	//Eine Zufallszahl zwischen a und b (incl. a und b) erzeugt man z.B. mit:
    	//a + ( rand() % ( b - a + 1 ) )
    	srand( (unsigned) time(NULL) ) ;	// zufallsgenerator initialisieren
    	int zahl;							// zufallszahl
    	int a = 0;							// niedrigste zufallszahl
    	int b = 51;							// höchste zufallszahl
    	int new_array[52];					// array mit den zufällig gemischten zahlen von 0-51
    	bool fFound;						// prüf-bit, ob die zahl schon in new_array existiert
    	for (int i = 0; i < 52; i++)
    	{
    		fFound = FALSE;	// zurücksetzen des pfüf-bits, für diesen Durchlauf
    		zahl = a + ( rand() % ( b - a + 1 ) ); // zufallszahl generieren
    		for (int p = 0; p < 52; p++)
    		{
    			if ( new_array[p] == (*pointer)[zahl]) // existiert die zufallszahl schon?
    

    In C und C++ ist der Ausdruck

    int* p;
        *(p + index);
    

    identisch zu

    p[index];
    

    korrekt ist also

    if ( new_array[p] == pointer[zahl]) // existiert die zufallszahl schon?
    

    _Zim schrieb:

    {
    				fFound = TRUE; // wenn ja, abbrechen
    				break;
    			}
    		}
    		if (fFound == FALSE) // wenn nein
    		{
    			new_array[i] = (*pointer)[zahl]; // zahl hinzufügen
    

    wie oben

    _Zim schrieb:

    }
    		else
    		{
    			i=i-1; // wenn die zahl schon existiert, den selben Durchlauf nochmals
    		}
    	}
    	//*KartenStappel = *new_array;
    	*pointer = new_array;
    

    Das kannst kein C-Array per Zuweisung kopieren. Entweder eine eigene Schleife schreiben oder 'copy' aus der STL nutze

    std::copy( new_array, new_array + 52, pointer ); // benötigt #include <algorithm>
    

    _Zim schrieb:

    return 0;
    

    Das return ist zu viel, die Methode liefert void; also einfach weglassen

    Du kannst Dir in C++ auch die ganze Methode sparen wenn Du einfach schreibst:

    int KartenStappel[52];
        for (int i = 0; i < 52; i++)
        {
            KartenStappel[i] = i;
        }    
        std::random_shuffle( arr, arr + 52 ); // benötigt #include <algorithm>
        // hier sind die Karten gemischt
    

    Noch mal 'ne allgemeine Bemerkung. Wenn Du von PHP kommst, so solltest Du Dich mit std::sring und std::vector un den anderen Dingen aus der STL beschäftigen, dann ist vieles genauso einfach wie in PHP.

    Gruß
    Werner


Anmelden zum Antworten