parameter ohne typ-angabe - dimension herausfinden

  • parameter ohne typ-angabe\ dimension herausfinden

    Hi ich schreibe grad eine funktion die als parameter ein Array
    erhalten muss und dann daraus eine *.csv datei macht...
    soweit so gut.

    Jetzt ist es ja zunächst eingentlich egal ob es sich um ein array von Interger oder float oder Strings handelt...
    Ich muss aber allerdings doch angeben um was für ein array sich handelt...

    läßst sich das vermeiden?? also das der variablen typ egal is??
    Ich selber glaube eingentlich nicht dass es geht, wollte jedoch zur sicherheit mal fragen.

    Was für Ideen hättet ihr als Lösung??
    Meine war das Array irgendwie bevor es verwendet wird in eine bestimmten typ umzuwandeln z.B. char oder String aber dazu müsste das Original Array auch in die Funktion kommen wozu wieder eine Typ-Angabe im Parameter erwartet wird...

    //--------------------------------------------------------------
    Meine zweite Frage klingt glaube ich au ziemlich blöd aber ich rechne diesem Problem mehr Lösungschancen an...

    und zwar möchte ich herausfinden ob ein geliefertes array eine oder zwei Dimensionen hat...

    ich hatte vor das mit try und catch zu machen indem ich versuche auf das [0][0] Element zuzugreifen und wenn dies nicht geht ises klar das es sich um ein eindimensionales Array handelt...

    Allerdings meckert das der kompiler bevor auch nur das try - catch zum Einsatz kommen kann.

    Wie prüfe ich die Existenz einer Variablen??
    exists();?
    isset();?



    Schonmal vielen vielen Dank für eure Hilfe und Bemühungen!!

    MfG Straightflush
  • Re: parameter ohne typ-angabe\ dimension herausfinden

    "Straightflush" schrieb:

    Hi ich schreibe grad eine funktion die als parameter ein Array
    erhalten muss und dann daraus eine *.csv datei macht...
    soweit so gut.

    Jetzt ist es ja zunächst eingentlich egal ob es sich um ein array von Interger oder float oder Strings handelt...
    Ich muss aber allerdings doch angeben um was für ein array sich handelt...

    läßst sich das vermeiden?? also das der variablen typ egal is??
    Ich selber glaube eingentlich nicht dass es geht, wollte jedoch zur sicherheit mal fragen.

    Dafür gibt es Templates.
    Bsp:

    Quellcode

    1. template <class T>
    2. class MyArray {
    3. private:
    4. T* arr;
    5. public:
    6. explicit MyArray (unsigned int nSize) {
    7. arr = new T [nSize];
    8. }
    9. virtual ~MyArray () {
    10. delete [] arr;
    11. }
    12. T getElement (unsigned int nIndex) {
    13. // Fehlerabfrage ob Index passt hierher
    14. return arr[nIndex];
    15. }
    16. }
    Alles anzeigen


    bzw.- du verwendest gleich std::vector <T>

    "Straightflush" schrieb:

    Meine war das Array irgendwie bevor es verwendet wird in eine bestimmten typ umzuwandeln z.B. char oder String aber dazu müsste das Original Array auch in die Funktion kommen wozu wieder eine Typ-Angabe im Parameter erwartet wird...


    Auch hier helfen Templates. Die funzen auch bei Funktionen:

    Quellcode

    1. template <class T>
    2. void saveCSV (T* data, unsigned int nLength) {
    3. for (unsigned int i = 0; i < nLength; ++i) {
    4. const T& aElement = data[i];
    5. // ...
    6. }
    7. }


    "Straightflush" schrieb:

    Meine zweite Frage klingt glaube ich au ziemlich blöd aber ich rechne diesem Problem mehr Lösungschancen an...

    und zwar möchte ich herausfinden ob ein geliefertes array eine oder zwei Dimensionen hat...

    ich hatte vor das mit try und catch zu machen indem ich versuche auf das [0][0] Element zuzugreifen und wenn dies nicht geht ises klar das es sich um ein eindimensionales Array handelt...


    Dafür gibt es leider keine Lösung. Das funktioniert nur dann, wenn du eine Template Klasse wie std::vector <T> verwendest. Der Templateparameter kann wiederum ein std::vector sein, wodurch du mehrdimensionale Arrays emulieren kannst. In diesem Fall würde ich aber aus Performancegründen Pointer verwenden:

    Quellcode

    1. #include <vector>
    2. using std::vector;
    3. ....
    4. vector <vector <int>* > twoDimensionalIntArray;
    5. vector <int>* pElem1 = new vector <int> ();
    6. pElem1->push_back (17);
    7. pElem1->push_back (42);
    8. twoDimensionalIntArray.push_back (pElem1);
    9. vector <int>* pElem2 = new vector <int> ();
    10. pElem2->push_back (47);
    11. pElem2->push_back (11);
    12. twoDimensionalIntArray.push_back (pElem2);
    Alles anzeigen


    Sauberer wäre es natürlich, wenn du für vector<int> ein typedef machst:

    Quellcode

    1. typedef vector<int> vec_int;
    2. vector <vec_int* > twoDimensionalIntArray;
    3. vec_int* pElem1 = new vec_int ();
    4. pElem1->push_back (17);
    5. pElem1->push_back (42);
    6. twoDimensionalIntArray.push_back (pElem1);
    7. vec_int* pElem2 = vec_int ();
    8. pElem2->push_back (47);
    9. pElem2->push_back (11);
    10. twoDimensionalIntArray.push_back (pElem2);


    hth