Problem mit Pointer
-
Hallo,
ich programmiere gerade an einem Projekt (Konsolenanwendung). Das Programm soll in der Lage sein wie ein Taschenrechner zu funktionieren und fragt nachher ab, ob das Resultat gespeichert werden soll. Nun, bis jetzt funktioniert er auch ungefähr wie ein Taschenrechner, jedoch versuche ich derzeit das Speichern des Resultats in eine andere Funktion zu schreiben - was wegen den Pointern (glaub ich) nicht klappt. Ich möchte die 3 Arrays (
double saved_number[100][50]
,char saved_arithmetic_operator[100][50]
unddouble saved_result[100][50]
) an eine Funktion als Pointer übergeben. Folgende Meldung:1>c:\users\minispiri\documents\visual studio 2010\projects\calculator\calculator\ccalculator.cpp(147): error C2664: 'save' : cannot convert parameter 1 from 'double *' to 'double'
Die Klasse:
#ifndef CCALCULATOR_HPP #define CCALCULATOR_HPP class ccalculator { private: // member variables // double number[100]; char arithmetic_operator[100]; double result[100]; double saved_number[100][50]; char saved_arithmetic_operator[100][50]; double saved_result[100][50]; public: // member functions // void calculator (); void continue_to_calculate (double *number, char *arithmetic_operator, double *result); // initialize member variables void initialize_variables () { for (int i=0; i<100; i++) { number[i] = 0.0; arithmetic_operator[i] = '\0'; result[i] = 0.0; for (int j=0; j<50; j++) { saved_number[i][j] = 0.0; saved_arithmetic_operator[i][j] = '\0'; saved_result[i][j] = 0.0; } } } // initialize variables bool saved_calculations_available () { if (saved_number[0][0] == 0.0) return false; else return true; } }; #endif
Die save-Funktion:
void save (double number, char arithmetic_operator, double result, double *saved_number, double *saved_arithmetic_operator, double *saved_result);
Wo der Compiler den Fehler findet (mit
&
habe ich es schon versucht):// save result? // if (error == false) save (number, arithmetic_operator, result, saved_number, saved_arithmetic_operator, saved_result);
Die Funktion in der sich die save-Funktion befindet (ganz unten die letzten Zeilen):
// function to continue to calculate // void ccalculator::continue_to_calculate (double *number, char *arithmetic_operator, double *result) { // variables // bool error = false; bool first_calculation = true; // continue to calculate // for (int i=1; i<100; i++) { // enter arithmetic operator cout << "Arithmetic operator\t: "; cin >> arithmetic_operator[i-1]; // if an error occurs // if (cin.fail ()) { error = true; clr_scr (0, 0, 25, 80); error_message (); arithmetic_operator[i-1] = '\0'; i = 100; } // back to the menu // else if (arithmetic_operator[i-1] == '0' || arithmetic_operator[i-1] == '0.0') { if (i == 1) error = true; clr_scr (0, 0, 25, 80); i = 100; } // otherwise enter next number // else { // enter next number cout << i+1 << ". Number\t\t: "; cin >> number[i]; // if an error occurs // if (cin.fail ()) { error = true; clr_scr (0, 0, 25, 80); error_message (); number[i] = 0.0; i = 100; } // back to the menu // else if (number[i] == 0.0) { if (i == 1) error = true; clr_scr (0, 0, 25, 80); i = 100; } // otherwise calculate an show result // else calculate_result (number, arithmetic_operator, result, i, first_calculation); } // otherwise enter next number } // continue to calculate // save result? // if (error == false) save (number, arithmetic_operator, result, saved_number, saved_arithmetic_operator, saved_result); } // function to continue to calculate
...und die ganze Source File ( codepad.org )
Bin Dankbar für jede Hilfe.
-
Hallo Minispiri,
du übergibst einen Zeiger auf ein Array
Defenition : "double number[100]; "
Übergabe : "continue_to_calculate (double *number,.."
Weitergabe: "save (number,.." (ist immer noch der Zeiger)Die Funktion "save" will aber keinen Zeiger auf ein Array sondern einen normalen Wert "double number". Die Datenübergabe mit "&" funktioniert auch nicht, da du ein Array hast und keinen Einzelwert.
-
D.h., dass der Pointer nicht wie die Variable genannt werden darf?
Ich probiers mal aus
-
Hallo Minispiri,
sinnvoller ist es schon, wenn mann sich an bestimmte Regeln hält, um einen Variable und einen Pointer zu unterscheiden m_number Membervariable p_number Pointer auf Variable. Weiterhin ist es sinnvoll vor die Bezeichung eine Kennzeichung des Variablentypes zu setzen (z.B. char m_szArithmetic_operator[100];)
void ccalculator::continue_to_calculate (double *number, char *arithmetic_operator, double *result)
In der gesammten Funktion arbeitest du nur mit dem Zeiger auf die Variable nicht mit der Variablen, was ja auch richtig ist, den wenn du die Variabalen übergibst wird dafür neuer Speicherplatz benötigt.
Die gleiche Schreibweise des Bezeichners bewirkt, das du die Variable "number" mit dem Pointer "number" in dieser Funktion neu defeniert (überschrieben) hast.Schaue dir die Funktion
calculate_result (number, arithmetic_operator, result, i, first_calculation);
an, dort sollte als Übergabe ein Zeiger defeniert sein oder du bekommst die gleiche Fehlermeldung.
Zur Behebung des Problems solltest du die Funktion save überarbeiten. Übergebe den Zeiger (die Variable ist ja vorhanden) und hole dir die Daten innerhalb der entsprechenden Funktion.