robobimbo
2007-12-09, 10:35:32
Hallo zusammen,
Aufgabe aus der FH - dynamische Speicherverwaltung ( noch ganz einfach, 1. Semester)
Aufgabestellug:
Benutzer gibt eine Arraygrösse n ein, das Array ist dynamisch (mittels malloc) zu erzeugen und mit Zufallswerten zu füllen. Soweit noch kein Problem
Der Benutzer gibt ein zahl p ein (p<n) - das sind aufsteigend sortiert die ersten p Elemente des vorhin erstellten Arrays - d.h. Array1 kopieren, sortieren und die ersten p Elemente ausgeben.
Meine Vorgehensweise (verkürzt):
mainfunktion:
Deklaroeren der beiden Pointervariablen für die Speicherblöcke Eingabe und Ausgabe, sowie der beiden Ints für die Anzahl der jeweilgen Items
int ar_groesse = 0;
int ar_output = 0;
int *ar_daten = NULL;
int *ar_ausgabe = NULL;
Einlesen der Anzahl und reservieren des Speicherbereichs, füllen mit Zufallswerten, ar_daten teshalber ausgeben --> funktioniert.
Einlesen der Anzahl der auszugebenden Elemtent.
Aufrufen der Funktion "verarbeite":
ar_daten --> Original array
ar_groesse --> Grösse des Array ar_daten
ar_ausgabe --> Pointervariable die dann am Ender der Funktion auf das Ausgabearray zeigen soll
ar_output --> Anzahl der Elemente die in ar_ausgabe sein sollen
int verarbeite(int *ar_daten, int ar_groesse, int *ar_ausgabe, int ar_output)
{
int *temp = NULL;
int i=0;
temp = (int*) malloc(ar_groesse * sizeof (int));
if (temp == NULL) { printf("\n FEHLER: Konnte Speicherbereich nicht reservieren!!"); return -1;}
ar_ausgabe = (int*) malloc(ar_output * sizeof (int));
if (ar_ausgabe == NULL) { printf("\n FEHLER: Konnte Speicherbereich nicht reservieren!!"); return -1;}
for(i=0; i<ar_groesse; i++) *(temp+i) = *(ar_daten+i);
shell_sort(temp, ar_groesse);
printf("\n\nDas Kopie Array nun sortiert: \n");
output(temp, ar_groesse);
for(i=0; i<ar_output; i++) *(ar_ausgabe+i) = *(temp+i);
return 0;
}
Die Funktion macht soweit das richtige, wenn ich es mit dem Debugger ansehe (die Funktion output gibt nur das array am schirm aus).
Was mich wundert - innerhalb der Funktion bekommt *ar_ausgabe eine Adresse, sobald ich die main zurückspringe hat sie dort wieder den Wert "NULL" und bringt mir natürlich bei entsprechenden Aufruf eine Fehlermeldung:
if (verarbeite( ar_daten, ar_groesse, ar_ausgabe, ar_output)) printf("Fehler in der Funktion verarbeite!!");
printf("\n\nDas ersten %d Elemente: \n", ar_output);
output(ar_ausgabe, ar_output);
Wo liegt denn hier mein Denkfehler?
tia
robo
Aufgabe aus der FH - dynamische Speicherverwaltung ( noch ganz einfach, 1. Semester)
Aufgabestellug:
Benutzer gibt eine Arraygrösse n ein, das Array ist dynamisch (mittels malloc) zu erzeugen und mit Zufallswerten zu füllen. Soweit noch kein Problem
Der Benutzer gibt ein zahl p ein (p<n) - das sind aufsteigend sortiert die ersten p Elemente des vorhin erstellten Arrays - d.h. Array1 kopieren, sortieren und die ersten p Elemente ausgeben.
Meine Vorgehensweise (verkürzt):
mainfunktion:
Deklaroeren der beiden Pointervariablen für die Speicherblöcke Eingabe und Ausgabe, sowie der beiden Ints für die Anzahl der jeweilgen Items
int ar_groesse = 0;
int ar_output = 0;
int *ar_daten = NULL;
int *ar_ausgabe = NULL;
Einlesen der Anzahl und reservieren des Speicherbereichs, füllen mit Zufallswerten, ar_daten teshalber ausgeben --> funktioniert.
Einlesen der Anzahl der auszugebenden Elemtent.
Aufrufen der Funktion "verarbeite":
ar_daten --> Original array
ar_groesse --> Grösse des Array ar_daten
ar_ausgabe --> Pointervariable die dann am Ender der Funktion auf das Ausgabearray zeigen soll
ar_output --> Anzahl der Elemente die in ar_ausgabe sein sollen
int verarbeite(int *ar_daten, int ar_groesse, int *ar_ausgabe, int ar_output)
{
int *temp = NULL;
int i=0;
temp = (int*) malloc(ar_groesse * sizeof (int));
if (temp == NULL) { printf("\n FEHLER: Konnte Speicherbereich nicht reservieren!!"); return -1;}
ar_ausgabe = (int*) malloc(ar_output * sizeof (int));
if (ar_ausgabe == NULL) { printf("\n FEHLER: Konnte Speicherbereich nicht reservieren!!"); return -1;}
for(i=0; i<ar_groesse; i++) *(temp+i) = *(ar_daten+i);
shell_sort(temp, ar_groesse);
printf("\n\nDas Kopie Array nun sortiert: \n");
output(temp, ar_groesse);
for(i=0; i<ar_output; i++) *(ar_ausgabe+i) = *(temp+i);
return 0;
}
Die Funktion macht soweit das richtige, wenn ich es mit dem Debugger ansehe (die Funktion output gibt nur das array am schirm aus).
Was mich wundert - innerhalb der Funktion bekommt *ar_ausgabe eine Adresse, sobald ich die main zurückspringe hat sie dort wieder den Wert "NULL" und bringt mir natürlich bei entsprechenden Aufruf eine Fehlermeldung:
if (verarbeite( ar_daten, ar_groesse, ar_ausgabe, ar_output)) printf("Fehler in der Funktion verarbeite!!");
printf("\n\nDas ersten %d Elemente: \n", ar_output);
output(ar_ausgabe, ar_output);
Wo liegt denn hier mein Denkfehler?
tia
robo