Witam, fragment kodu:
W tym fragmencie chodzi o to że jeśli jedna z tych danych nie jest liczbą to program kończy działanie.
Jest to zapisane bardzo nieelegancko, lecz nie wiem jak można tworzyć try-catcha z własnymi wyjątkami na przykład na coś takiego co tutaj mam. Czytałem po wielu stronach, są jakieś throw i throws, lecz robiąc coś takiego nie widzę w ogóle gdzie ten mój warunek ze wskazaniem na puste pole mogę gdzieś wpisać. Mógłby ktoś mi to wytłumaczyć krok po kroku co powinienem zrobić?
0
1
Jesteś pewny, że chcesz tworzyć własną klasę wyjątków? Jesteś pewny, że chcesz rzucać wyjątki w przypadku błędnych argumentów wejściowych?
Dlaczego uważasz, że zawartość zmiennej tekst
poinformuje Cię o poprawności konwersji? Funkcja strtod
w przypadku braku poprawnej konwersji zwróci wartość 0.0, albo ustawi errno
na wartość ERANGE;
Przeanalizuj sobie ten kod:
#include <iostream>
#include <cerrno>
enum {a, b, c, d, sinus, argSize};
int main(int argc, char *argv[]) {
if (argc != argSize + 1) {
std::cerr << "[ERROR] Wrong argument list. Should be: " << argSize + 1 << " , but is: " << argc << ".\n";
exit(EXIT_FAILURE);
}
double dataIN[argSize];
for (size_t i = 0; i < argSize && errno != ERANGE; ++i) {
dataIN[i] = strtod(argv[i + 1], nullptr);
if (dataIN[i] == 0.0) {
std::cerr << "[WARNING] Possibly conversion error for argument " << i << ": " << argv[i + 1] << ".\n";
}
}
if (errno == ERANGE) {
std::cerr << "[ERROR] One of arguments conversion failure.\n";
exit(EXIT_FAILURE);
}
std::cout << "Arguments: \n";
std::cout << dataIN[a] << std::endl;
std::cout << dataIN[b] << std::endl;
std::cout << dataIN[c] << std::endl;
std::cout << dataIN[d] << std::endl;
std::cout << dataIN[sinus] << std::endl;
return EXIT_SUCCESS;
}
0
Teraz widzę że zamiast tych pięciu deklaracji mogłem zrobić deklarację tablicy i wtedy nie będzie takiego problemu. Natomiast o tym throw-ie chciałbym się jednak nauczyć, na wikipedii jest taki kod:
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
double Dziel(double, double);
int main()
{
try
{
Dziel(10, 0);
}
catch(string w)
{
cout<<"Wyjatek: "<<w;
}
cin.get();
return 0;
}
double Dziel(double a, double b) //funkcja zwraca iloraz a / b
{
if (b == 0) {
string wyjatek = "dzielenie przez zero!";
throw wyjatek;
}
return a / b;
}
Co się dzieje w catchu oraz co się dzieje gdy w funkcji Dziel, b jest równe 0?
0
http://melpon.org/wandbox/permlink/b7bgHa8AGwBmXMG3
bool ParseArgAsDouble(int argc, const char *argv[], vector<double>& result)
{
result.clear();
for (int i=1; i<argc; ++i)
{
istringstream argValue(argv[i]);
double x;
if (argValue >> x && argValue.eof())
{
result.push_back(x);
}
else
{
return false;
}
}
return true;
}