Pointer und Funktionen
-
Hallo,
ich versuche mich gerade an einer eigentlich simplen Funktion die die Differenz von zwei Arrays im Sinne der Subtraktion von Mengen realisiert. Dabei habe ich ein paar Probleme mit Pointer als Rückgabeargument von Funktionen. Zum einen, verstehe ich folgendes nicht:
// test.cpp // Dev-C++ 4.992 under winXP void somefunc(){ int* ip; *ip = 5; //error! warum? Zuordnung mit new? } int main() { somefunc(); int* ip; *ip = 5; //geht manchmal! warum? }Zum anderen weiß ich nicht wie ich die Rückgabe machen soll. Hier die ganze Funktion:
int* minarray(int* array, int* minus, int sizea, int sizeb){ // vectoren aus arrays erstellen vector<int> a; for (int i = 0; i < sizea; i++) { a.push_back(array[i]); } vector<int> b; for (int i = 0; i < sizeb; i++) { b.push_back(minus[i]); } vector<int>::iterator Iter, result; vector<int> intersect; // Differenz bilden for (Iter = b.begin();Iter != b.end(); Iter++) { result = find(a.begin(), a.end(), *Iter); if (result != a.end()) { intersect.push_back(*result); } } // neues array erstellen int* newarr = new int[a.size()]; int count = 0; for (Iter = intersect.begin();Iter != intersect.end(); Iter++){ newarr[count] = *Iter; //printf("i: %i %i\n", count, newarr[count]); count++; } return newarr; }Bei der Rückgabe bekomme ich nicht die richtige Größe des Arrays:
int a[] = {1, 14, 44, 89}; int b[] = {14, 44, 17}; int* c = minarray(a, b, 4, 2); int length = sizeof(c)/sizeof(*c); printf("length: %i\n", length); for (int i = 0; i < 12; i+=sizeof(*c)) { printf("%i\n", c[i]); } //output //14 //197121 //2609
-
Hallo,
In beiden Fällen oben wurde für ip kein Speicher vereinbart. Deswegen erzeugt eine Dereferenzierung dort undefiniertes Verhalten. Du könntest da z.Bsp. mit new Speicher anfordern.
Du kannst bei einem dynamisch erzeugten Array im Nachhinein nicht herausbekommen wie groß es ist.
Das hierint length = sizeof(c)/sizeof(*c);funktioniert also nicht. Du müsstest die Länge mit zurückgeben oder du gibst hier gleich den Vektor zurück.
Ansonsten müsste das hierint* newarr = new int[a.size()];auch eher so aussehen
int* newarr = new int[intersect.size()];