Array als Argument in Funktion(C++)

the_undertaker

Erfahrenes Mitglied
Hallo,

ich habe folgendes Problem:

Ich habe in einem Programm eine Funktion, die ein 2-dimensionales Array verarbeiten soll. Wie übergibt man das Array der Funktion als Argument?
Ich habs ungefähr so probiert:
Code:
void machwas(short array[][]);
als Funktionsprototyp und
Code:
machwas(array[][])
als Aufruf. Kann mir da jemand helfen?
 
Ein Array ist ein Array, wieviel Dimensional das ist, weiss nur der Programmierer, ergo ist
der Funktions-Protype
Code:
void machwas(short array[]);
oder
Code:
void machwas(short **array);

Als Beispiel kannst Du nun
Code:
int val[0] = 1;
short arr[0] = val;
schreiben
 
Hallo,

schau mal:

C:
#define X_DIMENSION 4

void foo(short *sa, const int x_size, const int y_size)
{
    /* sa is 1 dimensional but treat it like it has 2 dimensions */
    for(int y = 0; y < y_size; y++)
        for(int x = 0; x < x_size; x++)
            sa[y * x_size + x] = 0;
}

void bar(short sa[][X_DIMENSION])
{}

int main()
{
    short ar[4][X_DIMENSION];

    foo(&ar[0][0], X_DIMENSION, X_DIMENSION);
    bar(ar);
}

Nachteilig bei den 2 Varianten wäre, das du in deiner Funktion immer abhängig von der Größe bist, wenn du das nicht willst oder dir das zu häßlich vorkommt, kannst du auch die elegantere Variante mit dem std::vector aus der STL nutzen ...

Gruß,
RedWing
 
Dumme Frage am Rande:
Wann benutzt man einen Vector, und wann eine Liste ? Gibt es da Unterschiede in Grösse/Fassungsvolumen oder Permormance ?

sonst könnte man doch schreiben
Code:
  typedef pair<double, char> myPair;
  typedef list<myPair> myList;

  myPair p(1.2, 'B');
  myList.push_back(p);
 
Dumme Frage am Rande:
Wann benutzt man einen Vector, und wann eine Liste ? Gibt es da Unterschiede in Grösse/Fassungsvolumen oder Permormance ?

Der entscheidene Unterschied liegt in der Schnittstelle des Containers:
Eine Liste bspw. bietet bspw. keine Operatoren für wahlfreien Zugriff auf die Containerelemente, ein std::vector schon.
D.h. es hängt ganz von deiner Anwendung ab was für ein Container du verwenden möchtest:
Brauchst du wahlfreien Zugriff ist wohl der std::vector das beste,
willst du einen Puffermechanismus bzw eine Warteschlange implementieren bietet sich ein FIFO ala std::list an, usw ...

Gruß,
RedWing
 
Aha -Danke für die Erklärung :)
... ich nutze meist eine Liste, weil mir das mal jemand so erklärt hat, dass eine Liste zwar schon eine Art "Primitive" ist, aber dennoch in den meisten Fällen ausreicht, da für einen Vector mehr Speicher reserviert wird. Wenn ich zB unter Linux/X11 Fenster speichere, habe ich eine Liste genommen,um darauf zuzugreifen, wenn ich XEvents abfange und bearbeite - ein Fenster ist ja im Grunde unter X11 "nur" ein unsigned long long - also speichere ich ein Class-Object als pair -habe da auch noch keine negativen Erfahrungen gemacht ;)

Wahrscheinlich macht das Sinn bei grösseren Anwendungen, wo sehr viele Werte gespeichert werden sollen, und der Zugriff entsprechend schnell sein muss -zB Datenbanken, oder ?

LG
Andy
 
andy hat gesagt.:
Wahrscheinlich macht das Sinn bei grösseren Anwendungen, wo sehr viele Werte gespeichert werden sollen, und der Zugriff entsprechend schnell sein muss -zB Datenbanken, oder ?

Ja, definitiv. Durch den wahlfreien Zugriff beim std::vector ist der Aufwand, um an ein Element an einer bestimmten Position zu gelangen, konstant (lediglich eine Addition mit einem entsprechenden Offset).
Bei einer Liste hängt er vom Parameter n ab, sprich wenn ich das Element an n-ter Stelle haben möchte muss ich erst bis dahin hiniterieren, bevor ich drauf zu greifen kann. Sprich der "Zugriffsaufwand" verhält sich linear in Abhängigkeit zur gesuchten Stelle n, eben durch den fehlenden wahlfreien Zugriff.

//edit:
P.S. und nat. hat man immer einen "Trade- Off" zwischen Speicherverbrauch und Performanz. Dennoch würde ich auch bei kleineren Datenmengen zu einem Vector greifen, da mir eine Liste oft zu umständlich zu bedienen ist :)

Gruß,
RedWing
 
Zuletzt bearbeitet:
Hallo,
Also, ich hab noch zwei (wahrscheinlich ziemlich doofe:-() FragenWas ist denn das?

die Frage ist schon berechtigt ;)

ein std::vector ist ein Container aus der Standard Template Library, in den du verschiedene Elemente reinschmeißen kannst und auch wieder rausholen kannst. Dabei verhält er sich ähnlich wie ein C Array(wahlfreier Zugriff,etc). Allerdings ist er viel dynamischer, da er keine feste vorgegeben Größe besitzt, ich elemente zur Laufzeit hinzufügen kann bzw entfernen kann, d.h. er wächst dynamisch in der Größe.

http://www.sgi.com/tech/stl/Vector.html bzw
http://www.cplusplus.com/reference/stl/vector/

Gruß,
RedWing
 
Ich hab jetzt mal die 2. Variante von RedWing ausprobiert und kriege jetzt folgende Fehlermeldung:
Code:
error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""void __cdecl countup(short * const)" (?countup@@YAXQAF@Z)" in Funktion "_main".    magic4.obj
Dazu: magic4 ist mein Programm und countup ist eine Funktion daraus. Ich hab leider KEINE AHNUNG, was das bedeutet, und was ich dagegen machen kann.:confused:

Edit: Ich kriege diese Meldung 3-mal mit verschiedenen Funktionen und dann:
Code:
Fehler	4	fatal error LNK1120: 3 nicht aufgelöste externe Verweise.	magic4.exe	Zeile 1
 
Zurück