Übergabe von int zahl < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 10:50 So 16.05.2010 | Autor: | marike |
Hallo,
ich soll eine Funktion Set0 schreiben die das i-te Element des Arrays auf 0 sezt. Sicherstellung soll mit dem Assertbefehl erfolgen, dass i eine gültige
Position im Array hat.
int Set0(int Vektor[],int laenge,int i); ->Deklaration
void main()
{
int Vektor[5];
{for (int i=0;i<5;i++)
Vektor[i]=5;
}
cout<<"eingabe i-tes element welches auf 0 gesetzt werden soll"<<endl;
cin>>i;
Set0(Vektor,5,i);
-> weiss nicht wie ich der Funktion die int zahl übergeben kann, hier kommt nichtdeklariet als Fehler
}
int Set0(int Vektor[],int laenge,int i) ->Definiton
{return vektor[i]=0;
}
wie implemiere ich dort einen assert befehl, bzw. was ist das genau?
|
|
|
|
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Hallo!
Erstmal ein anderer Fehler in deinem Code:
{for (int i=0;i<5;i++)
Vektor[i]=5;
}
Das '{' gehört ans Ende der zeile. Denn das FOR wiederholt immer nur die nächste Anweisung. Die nächste Anweisung ist hier nur das Setzen des Arrayelements, weshalb das so fehlerfrei funktioniert.
Sollte die FOR-Schleife aber mehr als zwei Zeilen verarbeiten, müssen die mit {} zu einem Block zusammengefaßt werden. So wie hier macht das aber keinen Sinn, funktioniert aber dennoch.
Weiter:
Dein Set0 sollte erstmal nichts zurückgeben. Du sagst der Funktion, an welcher Adresse im Speicher das INT-Array beginnt, wie lang es ist, und welches Element davon auf 0 gesetzt werden soll.
Die Funktion schreibt dann selbst an die Adresse mit dem gewünschten Element eine 0, und damit ist ihr zweck erfüllt. Sie muß nichts zurück geben, und kann daher als void deklariert werden.
Der Fehler, der dein Compiler ausspuckt, hat wenig mit Set0 zu tun, sondern schon darüber, bei dem cin. Die Variable i ist nicht definiert. Zwar hast du ein i in der FOR-Schleife deklariert, das existiert aber auch nur da, und verschwindet nach der FOR-Schleife.
Guckstdu:
for(int i=0; i<10;i++){
cout <<i<<endl; //das ist OK
}
cout << i<<endl; // CompilerError: i nicht deklariert
Aber so geht es:
int i;
for(i=0; i<10;i++){
cout <<i<<endl; //das ist OK
}
cout << i<<endl; // gibt 10 aus, weil die FOR-Schleife bei i=10 abgebrochen ist
Du kannst das i also recyclen, oder aber zum besseren Verständnis ne neue Variable einführen.
Was nun den assert-Befehl angeht: Ich habe das so verstanden: assert(Bedingung) beendet das Programm sofort und gibt ne Meldung raus, wenn die Bedingung gleich 0 bzw FALSE ist. Der Befehl kommt also noch vor das Setzen des Vektors in Set0.
Dein i darf ja nur die Werte 0...4 annehmen, sonst würdest du in einen Speicherbereich außerhalb des Arrays schreiben. Das ist die Bedingung...
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 13:43 So 16.05.2010 | Autor: | marike |
Hallo,
vielen Dank für deine Hilfe:
ich habe den progrmmcode geändert, passt das
grob so?
1 include<iostream>
2 include<cassert>
3 using namespace std;
4 int Set0(int Vektor[],int laenge,int i);
5 void main()
{
6 int Vektor[5];
7 for (int i=0;i<5;i++)
8 {Vektor[i]=9;
9 cout<<Vektor[i]<<endl;}
10 int zero;
11 cout<<"i-ter Platz -> 0 setzen"<<endl;
12 cin>>zero;
13 int i=zero;
14 Set0(Vektor,5,i);
15 cout<<"****Aktuelle Ausgabe****"<<endl;
16 for(int i=0;i<5;i++)
17 cout<<Vektor[i]<<endl;
}
18 int Set0(int Vektor[],int laenge, int i)
{
19 assert(i>=0 && i<4 );
20 return Vektor[i]=0;
}
|
|
|
|
|
Hallo!
13 int i=zero;
14 Set0(Vektor,5,i);
Brauchst du nicht, es reicht
Set0(Vektor,5,zero);
Denn: Du hast in Set0() und main() zwar die Variablen gleich genannt, aber das ist dem Compiler völlig egal. Der rechnet eh nicht mit aussagenkräftigen Namen.
Mit
int Set0(int Vektor[],int laenge,int i);
legst du nur fest, daß es eine Funktion Set0 gibt, die ein INT zurückgeben wird. Der erste Übergabeparameter ist der Zeiger auf ein Array von Integer-Werten, der zweite Wert ist ein Integer, und der dritte ebenfalls.
Das ist wichtig, wenn du die Funktion von außerhalb aufrufst.
Innerhalb der Funktion trägt das Array den Namen Vektor, und die beiden INTs die Namen laenge und i.
Damit hast du den Werten in main() und Set0 die gleichen Namen gegeben, aber es wäre doof, wenn man das immer so machen müßte.
Dann hatte ich gesagt, daß das set0() nichts zurückgeben muß.
Also
18 void Set0(int Vektor[],int laenge, int i)
{
19 assert(i>=0 && i<laenge ); // die Länge wird ja mitgegeben!
20 Vektor[i]=0;
21 return;
}
reicht vollkommen.
Ein kleiner tipp noch:
16 for(int i=0;i<5;i++){ // hier fehlte wieder die klammer
17 cout << "Element "<<i<<" ist "<<Vektor[i]<<endl;
}
gibt etwas deutlicher an,welches Element nun 0 gesetzt wurde.
|
|
|
|