Pointer auf Array (unbekannte Grösse)
-
Hallo.
Es muss doch eine Lösung geben, dass ich ein Array mit vorher
nicht bekannter Grösse an eine Funktion übergeben kann, oder?So muss man es machen - ist mir klar:
Funktion(Array[][200]) { }
Ich habe aber eine Funktion, die zu einer DLL kompeliert wird.
Und natürlich soll man jeden Array übergeben können. Somit kann
ich nicht die Grösse vor dem kompelieren eingeben:Funktion(Array[][]) { }
Das geht aber (so) nicht...
Also ... wie macht man dies? Es wird doch sicher eine Lösung
gehen, oder?
-
void funktion(int* array, int size);
normalerweise uebergibt man die groesse des arrays immer mit
-
Ja, dass mache ich auch. Die Grösse in x- und y-Richtung wird auch
übergeben.Und weiter? Etwa so? Angenommen das Array hätte zwei Dimensionen
und wäre "quadratisch".void funktion(int **array, int size) { int Wert; For (int x = 0; x <= size - 1; x++) { for (int y = 0; y <= size - 1; y++) { Wert = array[x][y]; } } }
Ist das so richtig?
-
warzm probierst du es nicht aus?
aber ich will mal nicht so sein;)
void funktion(int *array, int size) {/*WAS sollte der doppelpointer? macht üerhauptkeinen sinn */ int Wert; For (int x = 0; x == size; x++) { for (int y = 0; y == size; y++) { Wert = array[x][y]; } } }
-
... geht nicht
Meldung: subscripted value is neither array nor pointer
Die Meldung kommt an der Stelle, wo man versucht auf das Array
zuzugreifen: Wert = array[x][y];Davon ab ist ein Fehler in deinem Code:
for (int x = 0; x == size; x++) { for (int y = 0; y == size; y++) { Wert = array[x][y]; } }
Du musst bei for anders Abfragen:
Bei dir ist x == size immer false, bis size gleich x ist.
Deshalb wird die Schleife sofort beendet.for (int x = 0; x <= size; x++) { for (int y = 0; y <= size; y++) { Wert = array[x][y]; } }
Hier ist die Bedingung x <= size immer true, bis
der Zähler den Wert erreicht. So muss es sein...Aber wie gesagt: Dein Vorschlag mit dem Array geht nicht!
-
Ich hab's selber gefunden (mehr oder weniger):
Funktion (Datentyp *Name) { }
Dann kann man mit Name[x] die Einträge abrufen.
Wenn man nun ein Array mit zwei Dimensionen hat, muss
man so vor gehen wie die Einträge im Speicher liege:
Reihe für Reihe!Sagen wir mal ein Array mit 200x200 Einträgen.
Dann greift man mit Name[0] bis Name[199] auf
die erste Reihe zu, mit Name[200] bis [399] auf
die zweite Reihe usw.Damit ist das Problem gelöst
PS: Wenn mein(e) Beiträge oben irgendwie "überheblich"
sind, dann möchte ich mich dafür entschuldigenAber mit x == size geht es eben nicht
-
@ths
Probiers mal noch so:void funktion(int *array, int size) { int wert; for (int x = 0; x < size; x++) { for (int y = 0; y < size; y++) { wert = array[x][y]; } } } //Aufruf bei einem Array von 200 x 200 funktion(array, 200);
-
Das geht auch nicht. Mein Compiler sagt dann:
subscripted value is neither array nor pointerGeht also nur mit einer eckigen Klammer
Aber ich habe mir eine Funktion geschrieben, die
das wieder ausgleicht:WriteArray(long *Name, long Breite, long x, long y, long Wert) { Name[(y * Breite) + x] = Wert; }
Man bräuchte also eine Funktion zum lesen und schreiben und
das jeweils für alle Datentypen. Aber das ist für mich okay
-
ths. schrieb:
Davon ab ist ein Fehler in deinem Code:
for (int x = 0; x == size; x++) { for (int y = 0; y == size; y++) { Wert = array[x][y]; } }
hast recht ich schreibe immer "<"
so kann man die "-1" weglassenbei deiner lösung ist es aber so, dass das array nur "vorgestellt" ist. es ist nicht wirklich 2 dimensional. Man kann also ein 2 dimensionales array als 2 dimensionales array "missbrauchen".
Man bräuchte also eine Funktion zum lesen und schreiben und das jeweils für alle Datentypen. Aber das ist für mich okay
Versuchs mla mit templates
-
gibbets2000 schrieb:
bei deiner lösung ist es aber so, dass das array nur "vorgestellt" ist.
es ist nicht wirklich 2 dimensional. Man kann also ein 2 dimensionales
array als 2 dimensionales array "missbrauchen".Ne ne ... okay - ich erkläre mal alles:
Ich schreibe in C eine Funktion, die als DLL compeliert wird. Diese DLL
benutze ich dann in anderen Programmen, die auch nicht zwangsläufig
in C oder C++ geschrieben sind.In meinem Beispiel ist es so, dass ich in dem Hauptprogramm (kein C)
ein zweidimensionales Array erstelle! Es ist also auf jeden Fall
zweidimensional.An die DLL (in C geschrieben) übergeben ich den Pointer auf das
Array. Und in diesem Fall ist halt die Grösse des Arrays zum Zeitpunkt
des compelierens in C nicht bekannt - geht ja auch schlecht.Ich täusche also kein "2D" Array vor, sondern es ist wirklich eines
Versuchs mla mit templates
Ich fange gerade erst mit C an, und mit Templates kann ich im Moment
nichts anfangen, sorry. Aber ich komme auch so zurecht.
-
imho sind templates c++
sorry, ich habe mich ein wenig verschrieben. aer so wichtig ist das net ganz!
es sollte in etwa so heisen:
bei deiner lösung ist es aber so, dass das array nur 2 dimensional "vorgestellt" ist.
es ist nicht wirklich 2 dimensional. Man kann also ein 1 dimensionales
array als 2 dimensionales array "missbrauchen".