einen c-array per referenz an eine funktion übergeben
-
hi leute,
ich hoffe, dass ihr mir helfen könnt.
folgendes Problem: Ich soll eine Funktion entwerfen,welche die felder x und y vertauscht, wenn diese unterschiedlich sind. die felder sind gleichgroß aber in der größe variieren.folgendes habe ich probiert.der Compiler gibt keinen Fehler aus aber er durchläuft das Programm aber auch nicht bis zum Ende.
Wäre für jede Hilfe sehr dankbar:)
# include <iostream>
# include <stdio.h>extern void tauschefelder (int *px,int *py );
using namespace std;
int *px = new int [];
int *py = new int [];
int n;void main ()
{
cout<<"Wie viele Werte sollen eingegeben werden?";
cin >>n;
cout<<"Geben Sie alle Werte ein!";
cin>>px[n]>>py[n];tauschefelder (&px[n],&py[n]);
cout<<px[n]<<py[n];
}
void tauschefelder (int *px,int *py )
{
for (;n!=0;n++)
{
if (px[n]==py[n])
{
px[n]=px[n];
py[n]=py[n];
}else
{
int temp;
temp=px[n];
px[n]=py[n];
py[n]=temp;}
}
cout <<px[n]<<py[n];}
-
jenny93 schrieb:
der Compiler gibt keinen Fehler aus
Das kann ich mir beim besten Willen nicht vorstellen.
Zumindest bei void main und new int[] müsste er schreien.
-
Gibt es übrigens schon: std::swap_ranges.
Für zwei Felder mit unterschiedlicher Größe:
template< typename ForwardIterator1, typename ForwardIterator2 > void swap_ranges( ForwardIterator1 first , ForwardIterator1 last, ForwardIterator2 first2, ForwardIterator2 last2 ) { while( first != last && first2 != last2 ) std::iter_swap(first++, first2++); // iter_swap tauscht die Werte der Iteratoren. Das heißt nicht, dass danach die Iteratoren auf das jeweils andere Element zeigen, // sondern das die Elemente, auf die die Iteratoren zeigen, vertauscht werden. }
Beziehungsweise ohne Templates, damit du das Prinzip verstehst:void swap_ranges( int* first , int* last, int* first2, int* last2 ) { while( first != last && first2 != last2 ) std::swap(*first++, *first2++); // std::swap solltest du kennen, vertauscht zwei Werte. Ist in <utility> deklariert. }
Zumindest bei void main und new int[] müsste er schreien.
Ich kann mir gut vorstellen, dass alte Compiler annehmen, dass der User Speicher für einen Zeiger haben will. Das würde dann aber
int** ptr = new int[];
erfordern...
for (;n!=0;n++)
Hui!? Wo ist denn n deklariert? Doch nicht etwa global!?
Doch, leider. Wenn du die Funktion zwei mal aufrufst, klappt schon nichts mehr.
-
Noch mehr Kritik:
#include <stdio.h>
Das muss
<cstdio>
heißen. Die alte Schreibweise ist deprecated. Abgesehen davon brauchst du den Header gar nicht.extern void tauschefelder (int *px,int *py );
Wozu das
extern
? Wozu hier überhaupt Deklaration und Definition trennen?Außerdem fällt mir gerade auf, dass die Schleife, die ich oben schon aufgegriffen habe, völliger Unsinn ist:
for (;n!=0;n++)
Das würde ja heißen, du wartest auf einen Überlauf! Das führt sowieso zu undefiniertem Verhalten, sobald du über die Arraygrenzen hinaus zugreifst.
Wie lernst du eigentlich C++?
Außerdem bitte Code-Tags verwenden (und natürlich formatieren)!
-
das Problem ist, dass ich nicht verstehe wie ich z.b einen integer-Array (z.B int a = {1,2,3,4}) also einen Array mit einer Unbestimmten Größe n als Zeiger übergeben kann und dann halt vertausche.
Per Wert würde ich einfach int [n] übergeben
Ich lerne mit dem Skript unseres Profs, was mich aber ein wenig verzweifeln lässt. Deshalb bin ich für jede Hilfe immer noch sehr dankbar
-
Ich glaube ich habe eine Lösung gefunden. Zumindest passiert das, was ich gerne möchte
# include <iostream> # include <stdio.h> using namespace std; void funktion(int *array1, int *array2, int groesse); void main () { int a[10]={1,2,3,4,5,6,7,8,9,10}; int b[10]={10,9,8,7,6,5,4,3,2,1}; for (int i=0;i<10;i++) { cout <<a[i]<<endl; } for (int i=0;i<10;i++) { cout <<b[i]<<endl; } funktion (a,b,10); for (int i=0;i<10;i++) { cout <<a[i]<<endl; } for (int i=0;i<10;i++) { cout <<b[i]<<endl; } } void funktion(int *array1, int *array2, int groesse) { for (int i=0; i<groesse; i++) // kleiner Größe, weil letzte Stelle der Terminator { if (array1[i]==array2[i]) { array1[i]=array1[i]; array2[i]=array2[i]; } else { int temp = array1[i]; array1[i]=array2[i]; array2[i]=temp; } } }
-
Du brauchst den Fall, in dem die beiden Elemente gleich sind, nicht zu behandeln. Die Zeilen 56 und 57 sind überflüssig, und damit auch der der if-Zweig:
void funktion(int *array1, int *array2, int groesse) { for( int i = 0; i < groesseM ++i ) { // 1. C++ Variante per swap if( array1[i] != array2[i] ) swap( array1[i], array2[i] ); // 2. oder manuell tauschen if( array1[i] != array2[i] ) { int tmp = array1[i]; array1[i] = array2[i]; array2[i] = tmp; } } }