array unbekannter größe übergeben, größe aber wichtig



  • Hi,

    hab zu dem konkreten Problem hier noch nichts gefunden.

    Ich möchte ein paar Statistik Funktionen schreiben (z.B. Mittelwert).
    Es soll ein Array übergeben werden (daran kann ich auch so leicht nichts ändern, denn der Code ist schon gegeben).
    Das Array hat prinzipiell erst eimal eine unbekannte Größe.

    Also übergebe ich das Array mit

    double mittelwert(const int array[]);
    

    (const nur um den Inhalt zu schützen)

    in der Funktion will ich jetzt aber eine Schleife schreiben, die das Array durchläuft (ist vielleicht für den Mittelwert nicht notwendig, aber es kommen auch noch kompliziertere Fuktionen. wie kann ich auf dessen Größe zugreifen???

    geht das überhaupt, oder muss ich die Größe als Parameter mit übergeben lassen?
    es geht mir jetzt nicht um eine (vielleicht bessere) Lösung für den Mittelwert (das ist Nebensache), sondern für das Übergabe-Problem.



  • Die Größe mußt du schon selber übergeben lassen, alternativ könntest du auch festlegen, daß nach dem letzten (echten) Element ein Dummy als Ende-Kennung angefügt wird (C-Strings verwenden dafür \0, bei double-Arrays würde sich NaN anbieten).

    PS: Wenn möglich, vergiss das Array und nimm lieber std::vector.



  • itchy00 schrieb:

    ....
    Es soll ein Array übergeben werden (daran kann ich auch so leicht nichts ändern, denn der Code ist schon gegeben)...

    Tja, dann geht's eben nicht.
    Ohne den aufrufenden Code zu verändern (der Dir die LängenInfo nicht mitgibt), kannst DU nicht auf die Länge schließen.

    Spontan würde mir nur "Frickelzeug" einfallen:
    - Länge in Globaler Variable "übergeben",
    - Länge in erstes Element schreiben (hieße aber auch wohl "aufrufenden Code verändern")
    - ...

    Gruß,

    Simon2.



  • ok, danke

    Ich denke immer so ein bischen in Python oder Java, wo das alles halt Objekte sind mit so Funktionen wie legth() usw.

    die LängenInfo hab ich schon.
    mit dem Ändern meinte ich, dass der gesamte Code schon so geschrieben ist, dass ich nicht anfangen kann da dram rumzubasteln (array -> vector oder so)
    das einfachste wird sein die Größe zu übergeben, und damit zu arbeiten.



  • itchy00 schrieb:

    Ich denke immer so ein bischen in Python oder Java, wo das alles halt Objekte sind mit so Funktionen wie legth() usw.

    Arrays in C und C++ haben (leider) keine eingebaute Längen-Kennzeichnung, sondern sind einfach nur eine Aneinanderreihung von Daten (und was in deiner Funktion ankommt, ist trotz der Syntax kein Array, sondern ein Zeiger (auf das erste Array-Element). Die beste Entsprechung zu dem, was du aus anderen Sprachen kennst, ist nunmal std::vector<> (oder eine andere Containerklasse).



  • .. oder du machst dir ne klasse, welche dein Array interpretiert, wenn du auf container verzichte nwillst...

    class MyArray{
    
     int m_pArray;
     const UINT m_size;
    public:
    
     MyArray(int size) : m_size(size){
       m_pArray = new int(size);
     }
    
     int Get(UINT index){
       ASSERT(index> 0 && index <size)
       return m_pArray[index];
    
     void Set(UINT index,int Value){
        ASSERT(index> 0 && index <size)
       m_pArray[index]= Value;
     }
     UINT length(){
       return size;
     }
     }
    
    sowas in der art
    
    };
    


  • @Boris: Und was bringt's, das Rad neu zu erfinden? std::vector deckt genau den Aufgabenbereich ab, den du erreichen willst.



  • @CStoll: Ja , ich sagt do wenn er kein Container verwenden will, kann er es so selber machen;)



  • Hallo

    BorisDieKlinge schrieb:

    @CStoll: Ja , ich sagt do wenn er kein Container verwenden will, kann er es so selber machen;)

    Aber warum sollte er keinen Container benutzen wollen?

    chrische



  • wenn er keinen verwenden will soll er sich einen schreiben?
    Also entweder er kann rein garnichts am Code aendern, dann muss er irgendwie mit dem Array zusammenarbeiten. Oder er kann was aendern, dann kann er n std::container nehmen und muss sich nicht selbst einen bauen. Selbstgestrickte Kompromisse werden da kaum noetig oder sinnvoll sein.



  • Weis nich, manche Leute stehen drauf alles selber zu machen:)



  • HI,

    sein Argument war aber nicht "will keine vector benutzen", sondern "kann Schnittstelle nicht mehr ändern" .... und das gilt für std::vector wie für alle anderen Konstrukte.

    itchy00 schrieb:

    ...
    die LängenInfo hab ich schon. .

    Was bedeutet das und wer ist "ich" ?
    Wenn Du die Längeninfo hast, ist doch alles klar, oder ?

    itchy00 schrieb:

    ...
    mit dem Ändern meinte ich, dass der gesamte Code schon so geschrieben ist, ...

    Der Code für die Algorithmen (also der genutzte) oder der Code für die Datenhaltung (der "nutzende") ?

    Übrigens: Dass der Algorithmus per [] auf die Daten zugreift, verhindert nicht die Verwendung von std::vector...

    Gruß,

    Simon2.


  • Mod

    itchy00 schrieb:

    Das Array hat prinzipiell erst eimal eine unbekannte Größe.

    itchy00 schrieb:

    die LängenInfo hab ich schon.

    ja was denn nun?


Anmelden zum Antworten