Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Zeiger auf Zeiger = CRASH!

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
11.04.2007, 21:20 Uhr
~power
Gast


Hi!
Ich muss folgende Aufgaben bearbeiten, aber komme völlig ins tüdeln


Schreiben Sie eine Funktion partition, die als Parameter ein Feld von ganzen Zahlen (integer)
und die effektive Feldgroesse erwartet und als Ergebnis zwei neue integer - Felder und ihre
Groessen ueber den "call by reference" - Mechanismus zurueckliefert. Das erste Feld soll alle geraden Zahlen enthalten, das zweite Feld soll alle ungerade Zahlen enthalten. Das uebergebene Feld soll unveraendert bleiben.

void Partition (int array[], int n, int **evens, int *numEvens,
int **odds, int *numOdds)
{
// Bestimmung der Anzahl gerader und ungerader Zahlen
// Ergaenzen das Programm an dieser Stelle gemäß der Aufgabenstellung!
}


Mein Anfang sieht so aus (die main-funktion war so vorgegeben und der Funktionskopf der Funktion "Partition" auch):


C++:
#include<stdio.h>
#include<stdlib.h>

/*void CountEvensAndOdds ( int array[], int n, int *numEvens, int *numOdds); */
void Partition (int array[], int n, int **evens, int *numEvens,
                                    int **odds, int *numOdds)
{
    int i;
    for(i=0;i<n;i++)
    {
        if(array[i]%2==0)
            (*numEvens)++;
        else
            (*numOdds)++;
    
    }
/* Ab hier komme ich durcheinander (dieser verdammte zeiger auf den zeiger*/

    (*evens)=(int*)malloc((*numEvens)*sizeof(int));
    (*odds)=(int*)malloc((*numOdds)*sizeof(int));

/* Und hier stimmt irgendwas mit der for-schleife nicht, denn so wird nicht vernünftig die ungerade und geraden Zahlen den Feldern richtig zugeordnet! */
        for(i=0;i<n;i++)
    {
        if(array[i]%2==0)
            *evens[i]=array[i];
        else    
            *odds[i]=array[i];        
    }


}

void main ( void )
{
   int arr[] = {7,4,13,8};
   int *evens, *odds; //Zeiger Felder mit den ungeraden und geraden Zahlen.
   int numEvens = 0;
   int numOdds = 0, i = 0;
  
   Partition(arr, 4, &evens, &numEvens, &odds, &numOdds);

   printf("Das Feld enthaelt %d gerade und %d ungerade Zahlen\n", numEvens,
          numOdds);
   printf("Ausgabe der geraden Zahlen: \n");
   for(i=0; i < numEvens; i++)
      printf("%d\n", evens[i]);
   printf("Ausgabe der ungeraden Zahlen: \n");
   for(i=0; i < numOdds; i++)
      printf("%d\n", odds[i]);

   // Felder fuer die geraden und ungeraden Zahlen liegen auf dem Heap und
   // muessen freigegeben werden.
   free(evens);
   free(odds);
}




Zwei Fragen bzw. Probleme habe ich:
1. Ich komme mit dem doppelten Zeiger nicht klar und weiß nicht, wie oder wo ich sterne in der Funktion setzen muss!
2. Ich habe noch keine Lösung für for-schleife gefunden, wie ich jedem Element der beiden dynamischen Felder die Werte genau zuweise! Also, dass sie nicht doppelt in ein Feld gelangen!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
11.04.2007, 23:19 Uhr
Blubber2063



Hab nen Moment gebraucht um deinen Fehler zu sehen, du hastmin. 1 gemacht.

Dein 1. Fehler du brauchst für das odd und even Feld einen eigenen Zähler, bei dir passiert folgendes:

original 7 4 3 8
odd x 4 x 8
even 7 x 3 x

Du siehst also das du hier nicht den selben Zähler für alle Arrays nehmen kannst, du schreibst hier nämlich auch noch in Speicher der dir nicht gehört.
Wobei x hier ein zufälliger Wert ist.
Nimm also statt i den jeweiligen Zählindex und es sollte gehen. Evtl. anderes Problem, bin mir bei der Operatorrangfolge hier nicht sicher, es kann sein das du das dereferenzieren der **Variablen Klammern musst und erst dann den Indexoperator aufrufen darfst, aber das lässt sich durch nachschauen ja prüfen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.04.2007, 00:04 Uhr
~power
Gast


Das mit der for-schleife habe ich ja erwähnt. Irgendwie schaffe ich es nicht, die for schleife für beide dynamischen felder zu schreiben! Irgendwie fehlt mir da der letzte gedankenblitz

Ich versuche noch einmal...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
12.04.2007, 00:19 Uhr
~power
Gast


Haste 'ne Idee, wie ich das umschreiben kann?!

Dieser Versuch geht ja auch nicht:


C++:
    for(i=0;i<n;i++)
    {
         for(k=0;k<(n/2);k++)
         {
           if(array[i]%2==0)
               *evens[k]=array[i];
           else    
              *odds[k]=array[i];        
         }
    }





Ich müsste ja irgendwie ne Überpfüung haben, ob das erste Element der beiden Arrays schon besetzt ist oder ich muss irgendwie aus der zweiten for-schleife rauspringen, ohne dass beim nächsten durchlauf der zähler zurück auf 0 gesetzt wird! (aber dann gibt es wieder stress mit dem zweiten dynamischen array! )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
12.04.2007, 00:31 Uhr
Blubber2063



Ich hatte dir die Lösung ja eigentlich schon gegeben, aber hier noch mal in Code:

C++:
int even = 0;
int odd = 0;
for(i=0;i<n;i++){
  if(array[i]%2==0){
   *evens[even]=array[i];
    even++;
  }
  else{    
    *odds[odd]=array[i];        
    odd++;
  }
}


Dieser Post wurde am 12.04.2007 um 00:31 Uhr von Blubber2063 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
12.04.2007, 00:33 Uhr
~power
Gast


Oh man, bin ich blöd!!
Ich versuche das ständig mit 'ner zweiten Schleife zu lösen!

Aber sieht gut so aus, mal sehen, ob das mit dem hochzählen bzw. den derefenzierungsoperatoren so richtig ist ind er ganzen funktion!

Aber schon mal danke..
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: