W
a) Benutze std::swap für den Dreieckstausch
b) übergib ein float** und greife mit Matrix[i][j] auf die Elemente zu. Ansonsten: (*Matrix)[i][j]. Den Pointer-Kram solltest Du nochmal genau anschauen. Besser ist möglichst wenig mit blanken Pointern zu fummeln .
c) return ohne Rückgabewert sparst Du Dir besser am Ende einer Funktion. Ist unnötig.
d) weitere Tips zu Deinem Vorhaben: Du könntest eine weitere Indirektion über eine Permutation einführen und Dir damit das umkopieren komplett sparen. Und ausserdem kannst Du den Speicher auch am Stück anfordern und Dir die Positionen umrechnen bzw. über ein Proxy-Objekt einen operator[][] "bauen". Erstmal würde ich den Matrix-Kram sowieso in eine Klasse packen.
e) Du könntest die Matrix auch spaltenweise anfordern und dann einfach mit std::swap(Matrix[i], Matrix[j]) die Spalten tauschen, indem Du einfach die Pointer "swappst".
Zu Deinem Code oben:
void SwapColumns(float*** Matrix, int iRows, int i1stColumn, int i2ndColumn)
{
for (int i = 0; i < iRows; i++)
std::swap((*Matrix)[i][i1stColumn - 1], (*Matrix)[i][i2ndColumn - 1]);
}
sollte eigentlich funktionieren . Du musst evtl. noch "#include <algorithm>" in den Dateikopf einfügen.
Das hier
void SwapColumns(float** Matrix, int iRows, int i1stColumn, int i2ndColumn)
{
for (int i = 0; i < iRows; i++)
std::swap(Matrix[i][i1stColumn], Matrix[i][i2ndColumn]);
}
finde ich persönlich aber besser. Der Dreifach-Pointer ist hier unnötig und die Indizierung in C++ beginnt im Gegensatz zu Fortran, Matlab und Co. mit 0. Daran halten sich auch die meisten darauf aufbauenden Libraries. Aber das ist eher Geschmackssache. Manche Libraries lassen einem auch die Wahl ob nun 0 oder 1 das erste Element in einem Array-Datentyp sein soll.