Werteübergabe eines Arrays an Funktion multipliziert mit 10 Wieso?
-
Hallo liebe C++-Gemeinde,
Ich muss für die Universität eine Aufgabe schreiben, in der ich ein Array, das aus Zufallszahlen gebildet wird einlese und in einer Funktion Ausgebe.
Mein Problem ist:
Ich habe nach dem ich die Zufallszahl in der Mainfunktion Ausgebe zum Beispiel den Wert 1207 und in der Funktion out_1200 () den Wert 12070 und würde mich sehr darüber freuen, zu wissen, ob ich den Fehler mache oder ob das am Compiler liegen könnte (Gnu).// // main.cpp // Hausafgabe 4 // // Created by Alexander Bös on 15.01.12. // Copyright 2012 __MyCompanyName__. All rights reserved. // #include <iostream> #include <ctime> #include <cstring> #include <iomanip> using namespace std;; int W6x200 (void); int W1x1200 (void); int graf (void); int out_1200 (int n, int array[]); int out_200 (int n, int array[]); int main (void) { srand(time(NULL)); int n, i, richtig_1200, richtig_200; richtig_200 = richtig_1200 = 0; cout << "Wie viele Widerstaende sollen berechnet werden? "; cin >>n; int array_W1200[n]; int array_W6200[n]; for (i=n;i>=0;i--) { array_W1200[i-1]=W1x1200(); if (array_W1200[i-1]==1200) { richtig_1200++; } } cout <<endl; for (i=n;i>0;i--) { array_W6200[i-1]=W6x200(); if (array_W6200[i-1]==1200) { richtig_200++; } } cout << endl << array_W1200[1]<< endl; //hier stimmt der Wert noch! cout << n << " 1200 Ohm Widerstaende" <<endl << out_1200(n, array_W1200); //aufruf der Funktion un dann 10 facher Wert in der Funktion cout << endl << n << " 6x200 Ohm Widerstaende" << endl << out_200(n, array_W6200); cout << endl << "Exakte 1200 Ohm Widerstaende: " << richtig_1200; cout << endl << "Exakte 6x200 Ohm Widerstaende: " << richtig_200; return 0; } int W1x1200 (void) {...} int W6x200 (void) {...} int out_1200 (int n, int array[]) { cout << array[1]; // hat plötzlich zehnfachen Wert also statt 1207 120701 return 0; } int out_200 (int n, int array[]) {...}
-
Ich bezweifel, dass das am Compiler liegt. Poste doch mal lieber ein Code, den man kompilieren kann. Kürze ihn ggf. so runter, dass der Fehler aber noch bestehen bleibt.
-
müsste jetzt kompilierbar sein, entschuldige bitte ist mein erster Beitrag

[/code]#include <iostream>
#include <ctime>
#include <cstring>
#include <iomanip>
using namespace std;;int W6x200 (void);
int W1x1200 (void);
int graf (void);
int out_1200 (int n, int array[]);
int out_200 (int n, int array[]);int main (void)
{
srand(time(NULL));
int n, i, richtig_1200, richtig_200;
richtig_200 = richtig_1200 = 0;
cout << "Wie viele Widerstaende sollen berechnet werden? ";
cin >>n;
int array_W1200[n];for (i=n;i>=0;i--)
{
array_W1200[i-1]=10; //habe ich jetzt mal auf 10 gelegt
if (array_W1200[i-1]==1200)
{
richtig_1200++;
}
}
cout << endl <<"main "<< array_W1200[1]<< endl; //hier stimmt der Wert noch!
cout <<"Funktion " << out_1200(n, array_W1200); //aufruf der Funktion un dann 10 facher Wert in der Funktionreturn 0;
}int out_1200 (int n, int array[])
{cout << array[1]; // hat plötzlich zehnfachen Wert also statt 1207 120701
return 0;
}
[code]
-
1. Arrays variabler Länge gibt es in C++ nicht. Das ist ein spezielles Zusatzfeature, welches dein Compiler vielleicht kann, aber muss nicht jeder können. Nimm doch einen std::vector.
2. Bei deiner Schleife wird i auch mal 0. Und du greifst dann auf Arrayindex i-1 zu. Und dann passieren solche Sachen wie das was du beobachtest.
3. Wenn du Variablen erst dort deklarierst, wo du sie benutzt, behältst du viel leichter den Überblick. Der scheint dir hier nämlich verloren gegangen zu sein.
4. Und wenn wir schon am quengeln sind: cstdlib fehlt, aus iomanip benutzt du nichts und cstring wirst du hoffentlich nicht benutzen.
-
In der ersten Schleife kann i==0 sein, du greifst aber auf Elemente zu (i-1) die es gar nicht gibt. Diese rohe Array/Zeiger Frickelei ist — wie du siehst — fehleranfällig.
Alternativ kannst (und solltest) Du die Standardcontainer vorziehen. Die bieten auch meistens einen Debugmodus an, mit dem Du solche Fehler frühzeitig erkennen kannst, statt dass dir das Programm irgendwo an einer anderen Stelle um die Ohren fliegt. So einen Debugmodus schreibt der C++ Standard nicht vor. Microsoft bietet das, soweit ich weiß, aber an. Genauso der GCC. Schau in die Dokumentation Deines Compilers.
Ich sehe gerade, dass Dein C++ Code sowieso nicht standardkonform ist.
cin >>n; int array_W1200[n]; int array_W6200[n];VLAs (Variable Length Arrays) gibt es nämlich in C++ nicht. Wenn Du ein Array in so einem Kontext definierst, dann hat die Größe eine Compile-Zeit-Konstante zu sein.
Schalte am besten auch mal alle Deine Warnungen an. Wenn du den GCC verwendest:
-Wall -pedantic -D_GLIBCXX_DEBUGSo geht's richtig:
cin >> n; vector<int> dings (n); vector<int> bums (n);Dazu musst Du natürlich den <vector> Header einbinden. Das Ding lebt im Namensraum „std“.
-
Hi,
Die Funktion out_1200 gibt auf cout deinen gewünschten Wert aus und liefert 0 zurück.
int out_1200 (int n, int array[])
{
cout << array[1]; // hat plötzlich zehnfachen Wert also statt 1207 120701
return 0;
}Weiter oben gibst du den Rückgabewert der Funktion out_1200 (ebenjene 0) aus:
cout <<"Funktion " << out_1200(n, array_W1200);
Daher immer das zehnfache. Die 0 kommt aus einer anderen Ausgabe und nicht aus dem Teil der Funktion.Gruß,
MJM
-
Super Dankeschön
