PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit malloc()-Funktion!?



firstblood
10-09-2007, 11:05
Die Funktion „Count…“soll die geraden und ungeraden Zahlen zählen!
Die Funktion „partition“ soll über „call by reference“ 2 neue integer felder zurückliefern, mit den geraden und ungeraden Zahlen.
Wäre froh wenn mir jemand helfen könnte!
Hier mal der Code.Fehlermeldung bei der malloc()-Funktion in der Funktion partition():

#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 main (void)
{
int array[] = {7,4,13,8};
int *evens, *odds; //Zeiger auf Felder mit den ungeraden und geraden Zahlen.
int numEvens = 0;
int numOdds = 0;
int i = 0;

CountEvensAndOdds(array,4,&numEvens,&numOdds);
printf("\nDas Feld enthaelt %d gerade und %d ungerade Zahlen!", numEvens, numOdds);
printf("\n\n\n");

Partition(array, 4, &evens, &numEvens, &odds, &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 für die geraden und ungeraden Zahlen..Heap freigegeben
free(evens);
free(odds);
}
void CountEvensAndOdds(int array[], int n, int *numEvens, int *numOdds)
{
int i;
for(i=0;i<n;i++)
{
if((array[i]%2)==0){
(*numEvens)++;
}
else{
(*numOdds)++;
}
}
}

void Partition (int array[], int n, int **evens, int *numEvens, int **odds, int *numOdds)
{

int i,j,k;

CountEvensAndOdds(array,4,numEvens,numOdds);

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

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

}
}

jeebee
10-09-2007, 12:38
1. Schritt für Fehlersuche: Beim Kompilieren den Schalter -Wall setzen, das gibt dir alle möglichen Warnungen aus, zum Beispiel
Zuweisung erzeugt Zeiger von Ganzzahl ohne Typkonvertierung wenn du einer Zeigervariable einen Integer-Wert zuweisen willst.
gcc -Wall -o outfile myprog.c
2. Schritt: mit gdb die Stelle des Fehlers untersuchen. Kompilieren mit
gcc -Wall -ggdb -o outfile myprog.c
3. Schritt: mit valgrind nach vergessenen frees suchen, valgrind informiert auch über Verwendung von nicht initialisierten Zeigern. Kompilieren wie bei Schritt 2


#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);

void print_array(int *array, int length) {
int i=0;
for(i=0;i<length;i++) {printf("%i\n", array[i]); }
printf("\n\n");
return;
}


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


CountEvensAndOdds(array,4,&numEvens,&numOdds);
printf("\nDas Feld enthaelt %d gerade und %d ungerade Zahlen!", numEvens, numOdds);
printf("\n\n\n");

// hier gilt numEvens = 2 und numOdds = 2

Partition(array, 4, &evens, &numEvens, &odds, &numOdds);

printf("Ausgabe der geraden Zahlen: \n");
print_array(evens, numEvens);
printf("Ausgabe der ungeraden Zahlen: \n");
print_array(odds, numOdds);

// Felder für die geraden und ungeraden Zahlen..Heap freigegeben
free(evens);
free(odds);
return 0;
}
void CountEvensAndOdds(int *array, int n, int *numEvens, int *numOdds)
{
int i;
for(i=0;i<n;i++) {
if((array[i]%2)==0) (*numEvens)++;
else (*numOdds)++;
}
}

void Partition (int array[], int n, int **evens, int *numEvens, int **odds, int *numOdds)
{

int i,j,k;

// hier gilt numEvens = 2 und numOdds = 2
// CountEvensAndOdds(array,n,numEvens,numOdds);
// jetzt wären numEvens = 4 und numOdds = 4!!
// deshalb: entweder hier CountEvensAndOdds mit "neuen" Variablen
// aufrufen oder CountEvensAndOdds nur hier oder nur im main()
// aufrufen.


// Damit die Zeiger richtig verändert werden:
// evens=(int*) malloc(numEvens * sizeof(int));
// odds=(int*) malloc(numOdds * sizeof(int));
// Das Obenstehende würde evens (Zeiger auf Zeiger auf int)
// einen Zeiger auf int zuweisen... Funktioniert nicht. Gleiches für odd.
// Dann: numEvens * sizeof(int): numEvens ist Zeiger auf int, damit
// kannst du nicht multiplizieren. Deshalb (*numEvens) * sizeof(int)
// Dasselbe für numOdds

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

for(i=0,j=0,k=0;i<n;i++) {
if((array[i]%2)==0) {
// *evens[j] gibt dir die Adresse vom j-ten
// Element von evens zurück. du willst aber das j-te
// Element von *evens füllen. ([] bindet stärker als *)
(*evens)[j]=array[i];
j++;
}
else {
// wie oben
(*odds)[k]=array[i];
k++;
}
}
return;
}

firstblood
11-09-2007, 10:43
Dankeschön!!