Siemanko. Mam pytanie. Czy poniższy skrypt można bardziej zoptymalizować, bo jak do parametrów przekażesz 2cyfrowe wartości liczbowe program się wysypuje. Parametry się przekazuje kiedy aktywuje się skrypt i nie jestem pewny czy prawidłowo przeprowadziłem walidacje parametrów. Potrzebuje szybkiej odpowiedzi.
main.cpp
#include <iostream>
#include <windows.h>
#include "assets/Args.cpp"
#include "assets/generateData.cpp"
#include "assets/saveData.cpp"
#define MAX_ARGUMENTS 2
using namespace std;
int main(int argc, char **argv){
system("cls");
try{
Args <int, MAX_ARGUMENTS> arguments(argc, argv);
int* nums = arguments.get();
int** data = generateData(nums);
saveData(data, nums);
cout << "Done!" << endl;
}
catch(const invalid_argument &e){
if(e.what() == "stoi") cout << "Wprowadzono litere zamiast liczby!" << endl;
else cout << e.what() << endl;
}
system("pause");
return 0;
}
assets/Args.cpp
#include <iostream>
#include <string>
using namespace std;
template <typename T = string, int MAX_ARGUMENTS = 1> class Args {
T * argv = new T();
int argc;
T value(string value){
if(is_same<T, int>::value) return stoi(value);
}
public:
Args(int argc, char **argv){
if((argc - 1) != MAX_ARGUMENTS) throw invalid_argument("Nieprawidlowa ilosc argumentow! Liczba argumentow musi wynosic " + to_string(MAX_ARGUMENTS) + "!");
for(int i = 1; i < argc; i++){
int value = this->value(argv[i]);
if(value <= 0) throw invalid_argument("Wartosc nie moze byc mniejsza od zera!");
this->argv[i - 1] = value;
}
this->argc = argc - 1;
}
~ Args() { delete[] this->argv; }
T *get() { return this->argv; }
};
assets/generateData.cpp
#include <iostream>
#include <time.h>
int** generateData(int* nums){
srand(time(NULL));
int x = nums[0], y = nums[1];
int** rows = new int* ();
for(int i = 0; i < x; i++){
int* cols = new int();
for(int j = 0; j < y; j++) cols[j] = rand() % 100 + 1;
rows[i] = cols;
}
return rows;
}
assets/saveData.cpp
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
void saveData(int** data, int *nums){
int x = nums[0], y = nums[1]; fstream f;
f.open("data.txt", ios::out);
for(int i = 0; i < x; i++){
for(int j = 0; j < y; j++)
f << to_string(data[i][j]) << " ";
f << "\n";
}
f.close();
}