001
02.08.2004, 09:41 Uhr
virtual
Sexiest Bit alive (Operator)
|
Mag sein, daß Qt weitere Möglichkeiten bietet, aber in C wäre die erste Wahl realloc:
C++: |
/* * Vergroessert/verkleinert arrays, welches Elemente vom Typen X enthält. * @param array pointer of das Array (darf auf eine NULL zeigen) * @param size Gewünschte Größe des Arrays * @return 0, wenn ok, -1, wen kein Speicher */ int resize_array(X** array, size_t size) { X* temp = (X*)realloc(*array, size*sizeof(X)); if (NULL == temp) return -1; *array = temp; return 0; }
/* * Anwendungsbeispiel * (in resize_array sollte nun X durch int setzt werden. */ int main() { int* array = NULL; size_t anzahl = 0; int zahl;
printf("Gebe Zahlen ein, soviel wie Du willst; 0 für ende.\n"); while(scanf("%d", &zahl)==1 && zahl!=0) { if (resize_array(&array, anzahl+1) { printf("Fehler: kein Speicher beim Speichern von Zahl %d\n", anzahl+1); if (NULL != array) free(array); exit(1); } array[anzahl++] = zahl; }
... if (NULL != array) free(array); exit(0); }
|
In C++ würde man wohl eher std::vector oder std::list verwenden, was die dynamische Speicherverwaltung für einen übernimmt. Gleiches Beispiel wie oben in C++:
C++: |
#include <iostream> #include <iterator> #include <vector>
int main() { std::cout<<"Gebe Zahlen ein, soviel wie Du willst; 0 für ende."<<std::endl; std::vector<int> array; int zahl; for(;;) { std::cin>>zahl; if (!std::cin || zahl==0) break; array.push_back(zahl); // Alternativ: /* try { array.push_back(zahl); } catch(std::bad_alloc bae) { std::cerr<<"Kein Speicher beim Speichern von Zahl "<<(array.size()+1)<<std::endl; return 1; } */ } }
|
-- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |