#ifndef matr_funcH
#define matr_funcH
#endif
class matrix {
private:
double **mass;
int str, stlb;
public:
//constructors
matrix(int n, int m); //create a matrix
matrix(int m); //create a vector
matrix(const char* fname); //create a matrix/vector from the file
//destructor
~matrix();
//functions
void writeTofile(char *filename); //write matrix to TXT file.
double get_Element(int str_, int stlb_); //returns matrix element, by it index
void set(); //set elements of matrix
matrix operator *(matrix A); //Overload of the operator *
matrix operator- (const matrix A); //Overload of the operator -
matrix operator+ (const matrix A); //Overload of the operator +
void set_str (int k); //Reenter row
void set_stlb (int k); //Reenter column
matrix add_stlb(int k); //Add a column to matrix
matrix add_str(int k); //Add a row to matrix
matrix transp(); //Shift Colums and Rows
friend ostream& operator<< (ostream& out, matrix A); //Overload << operator
};
[C++] Использование функций из статической библиотеки
Пишу на Builder 6.
Суть проблемы: при использовании функций из библиотеки крашит. Чаще всего ошибки с индексами(адресацией). Причем на функциях с изменением массива. (Например транспонирование матрицы, умножение матриц, добавление столбца и т.д.). При использовании функции, например, вывода, все в норме. Однако ,если же эти функции написать в простой программе, оформив также в виде класса, и использовать из нее же, все в порядке.
Созданную библиотеку подключаю след. образом:
1)include"xxx.h"2)Project->Add to project-> xxx.lib (лежит в папке с рабочей программой).
Итак, header.
Код:
cpp:
Код:
#include "matr_func.h"
matrix::~matrix(){
delete [] mass;
}
matrix::matrix(int m,int n){
if ((m < 0) || (n < 0)) {
str = 0; stlb = 0;
std::cout << "\nIncorect object values. Some mistakes may occur";
}
else {
str = m; stlb = n;
mass = new double *[str];
for (int i = 0; i < str; i++)
mass = new double [stlb];
}
}
matrix::matrix(int m) {
if (m < 0) {
std::cout << "\nIncorect object values. Some mistakes may occur";
str = 0; stlb = 0;
}
else {
str = 1; stlb = m;
mass = new double *[str];
for (int i = 0; i < str; i++)
mass = new double [stlb];
}
}
matrix::matrix(const char* fname) {
try {
FILE *fm;
float temp;
if ((fm = fopen(fname, "r")) == 0) throw "\nerror: cannot open file";
fscanf(fm,"%d %d\n", &str, &stlb);
mass = new double *[str];
for (int i = 0; i < str; i++)
mass = new double [stlb];
for (int i = 0; i < str; i++){
if (feof(fm)) break;
for (int j = 0; j < stlb; j++) {
if (feof(fm)) break;
fscanf(fm,"%f",&temp);
mass[j] = temp;
}
}
fclose(fm);
}
catch (char *e) {
std::cout << e;
}
}
void matrix::writeTofile(char *filename){
try {
FILE *Fcl;
if ((Fcl = fopen(filename, "w")) == 0) throw "\nerror: Cannot open file";
fprintf(Fcl, "%d %d\n", str, stlb);
for (int i = 0; i < str; i++)
for (int j = 0; j < stlb; j++)
fprintf(Fcl, "%f ", mass[j]);
fclose(Fcl);
}
catch(char *wtf){
std::cout << wtf;
}
}
double matrix::get_Element(int str_, int stlb_) {
try {
if ((str_ > str) || (stlb_ > stlb)) throw "error: Indexes entered not correctly ";
return mass[str_][stlb_];
}
catch (char *p) {
std::cout << p;
}
}
void matrix::set() {
std::cout << "\nEnter matrix elements";
for (int i = 0; i < str; i++) {
for (int j = 0; j < stlb; j++)
std::cin >> mass[j];
}
}
matrix matrix::operator *(matrix A) {
try {
if ((stlb != A.str) || (A.str == 1)) throw "\nCannot make multiplication";
double value ;
matrix umn (str, A.stlb);
for (int i = 0 ; i < str ; i++) {
for (int j = 0 ; j < A.stlb ; j++) {
value = 0.0 ;
for (int k = 0 ; k < stlb ; k++) {
value += mass[k] * A.mass[k][j] ;
}
umn.mass[j] = value; ;
}
}
return umn ;
} catch (char *u) {
std::cout << u;
}
}
matrix matrix::operator- (const matrix A) {
try {
if ((str != A.str ) || (stlb != A.stlb)) throw "\nCannot make deduction";
matrix C(str, stlb);
for (int i = 0; i < str; i++)
for (int j = 0; j < stlb; j++)
C.mass[j] = mass[j] - A.mass[j];
return C;
}
catch (char *v) {
std::cout << v;
}
}
matrix matrix::operator+ (const matrix A) {
try {
if ((str != A.str ) || (stlb != A.stlb)) throw "\nCannot make summarize";
matrix C(str, stlb);
for (int i = 0; i < str; i++)
for (int j = 0; j < stlb; j++)
C.mass[j] = mass[j] + A.mass[j];
return C;
}
catch (char *sl) {
std::cout << sl;
}
}
matrix matrix::add_stlb(int k) {
if (k < 0) {
k = 0;
std::cout << "\nIncorect object values. Some mistakes may occur";
}
double **tmp = new double *[str];
for (int i = 0; i < str; i++) {
tmp = new double [stlb+k];
for (int j = 0; j < stlb; j++) {
tmp[j] = mass[j];
}
delete [] mass;
mass = tmp;
}
delete [] tmp;
std::cout << "\nInput new elements";
stlb += k;
for (int i = 0; i < str; i++)
for (int j = stlb-k; j < stlb; j++)
std::cin >> mass[j];
return *this;
}
matrix matrix::add_str(int k) {
try {
if (k < 0) throw "\nData input incorrect";
double **tmp = new double *[str+k];
for (int i = 0; i < str; i++)
tmp = mass;
for (int i = str; i < str+k; i++) {
tmp = new double[stlb];
}
delete [] mass;
mass = tmp;
str += k;
std::cout << "\ninput new elements";
for (int i = str-k; i < str; i++) {
for (int j = 0; j < stlb; j++)
std::cin >> mass[j];
}
return *this;
} catch (char *p) {
std::cout << "\n" << p;
}
}
void matrix::set_str (int k) {
try {
if ( k <=0 ) throw "\nData input incorect";
std::cout << "\nInput new row elements";
for (int i = 0; i < stlb; i++) {
std::cin >> mass[k-1];
}
}
catch (char *sr) {
std::cout << sr;
}
}
void matrix::set_stlb (int k) {
try {
if ( k <=0 ) throw "\nData input incorect";
std::cout << "\nInput new column elements";
for (int i = 0; i < str; i++) {
std::cin >> mass[k-1];
}
}
catch (char *sr) {
std::cout << sr;
}
}
matrix matrix::transp() {
matrix T(stlb, str);
double buff;
for (int i = 0 ; i < stlb ; i++) {
for (int j = 0 ; j < str ; j++) {
buff = T.mass[j] ;
mass[j] = buff ;
}
}
return T;
}
ostream& operator<< (ostream& out, matrix A) {
std::cout<<"\n";
for (int i=0; i<A.str; i++){
for (int j=0; j<A.stlb; j++)
out<<setw(3)<<A.mass[j];
out<<"\n";
}
}
matrix::~matrix(){
delete [] mass;
}
matrix::matrix(int m,int n){
if ((m < 0) || (n < 0)) {
str = 0; stlb = 0;
std::cout << "\nIncorect object values. Some mistakes may occur";
}
else {
str = m; stlb = n;
mass = new double *[str];
for (int i = 0; i < str; i++)
mass = new double [stlb];
}
}
matrix::matrix(int m) {
if (m < 0) {
std::cout << "\nIncorect object values. Some mistakes may occur";
str = 0; stlb = 0;
}
else {
str = 1; stlb = m;
mass = new double *[str];
for (int i = 0; i < str; i++)
mass = new double [stlb];
}
}
matrix::matrix(const char* fname) {
try {
FILE *fm;
float temp;
if ((fm = fopen(fname, "r")) == 0) throw "\nerror: cannot open file";
fscanf(fm,"%d %d\n", &str, &stlb);
mass = new double *[str];
for (int i = 0; i < str; i++)
mass = new double [stlb];
for (int i = 0; i < str; i++){
if (feof(fm)) break;
for (int j = 0; j < stlb; j++) {
if (feof(fm)) break;
fscanf(fm,"%f",&temp);
mass[j] = temp;
}
}
fclose(fm);
}
catch (char *e) {
std::cout << e;
}
}
void matrix::writeTofile(char *filename){
try {
FILE *Fcl;
if ((Fcl = fopen(filename, "w")) == 0) throw "\nerror: Cannot open file";
fprintf(Fcl, "%d %d\n", str, stlb);
for (int i = 0; i < str; i++)
for (int j = 0; j < stlb; j++)
fprintf(Fcl, "%f ", mass[j]);
fclose(Fcl);
}
catch(char *wtf){
std::cout << wtf;
}
}
double matrix::get_Element(int str_, int stlb_) {
try {
if ((str_ > str) || (stlb_ > stlb)) throw "error: Indexes entered not correctly ";
return mass[str_][stlb_];
}
catch (char *p) {
std::cout << p;
}
}
void matrix::set() {
std::cout << "\nEnter matrix elements";
for (int i = 0; i < str; i++) {
for (int j = 0; j < stlb; j++)
std::cin >> mass[j];
}
}
matrix matrix::operator *(matrix A) {
try {
if ((stlb != A.str) || (A.str == 1)) throw "\nCannot make multiplication";
double value ;
matrix umn (str, A.stlb);
for (int i = 0 ; i < str ; i++) {
for (int j = 0 ; j < A.stlb ; j++) {
value = 0.0 ;
for (int k = 0 ; k < stlb ; k++) {
value += mass[k] * A.mass[k][j] ;
}
umn.mass[j] = value; ;
}
}
return umn ;
} catch (char *u) {
std::cout << u;
}
}
matrix matrix::operator- (const matrix A) {
try {
if ((str != A.str ) || (stlb != A.stlb)) throw "\nCannot make deduction";
matrix C(str, stlb);
for (int i = 0; i < str; i++)
for (int j = 0; j < stlb; j++)
C.mass[j] = mass[j] - A.mass[j];
return C;
}
catch (char *v) {
std::cout << v;
}
}
matrix matrix::operator+ (const matrix A) {
try {
if ((str != A.str ) || (stlb != A.stlb)) throw "\nCannot make summarize";
matrix C(str, stlb);
for (int i = 0; i < str; i++)
for (int j = 0; j < stlb; j++)
C.mass[j] = mass[j] + A.mass[j];
return C;
}
catch (char *sl) {
std::cout << sl;
}
}
matrix matrix::add_stlb(int k) {
if (k < 0) {
k = 0;
std::cout << "\nIncorect object values. Some mistakes may occur";
}
double **tmp = new double *[str];
for (int i = 0; i < str; i++) {
tmp = new double [stlb+k];
for (int j = 0; j < stlb; j++) {
tmp[j] = mass[j];
}
delete [] mass;
mass = tmp;
}
delete [] tmp;
std::cout << "\nInput new elements";
stlb += k;
for (int i = 0; i < str; i++)
for (int j = stlb-k; j < stlb; j++)
std::cin >> mass[j];
return *this;
}
matrix matrix::add_str(int k) {
try {
if (k < 0) throw "\nData input incorrect";
double **tmp = new double *[str+k];
for (int i = 0; i < str; i++)
tmp = mass;
for (int i = str; i < str+k; i++) {
tmp = new double[stlb];
}
delete [] mass;
mass = tmp;
str += k;
std::cout << "\ninput new elements";
for (int i = str-k; i < str; i++) {
for (int j = 0; j < stlb; j++)
std::cin >> mass[j];
}
return *this;
} catch (char *p) {
std::cout << "\n" << p;
}
}
void matrix::set_str (int k) {
try {
if ( k <=0 ) throw "\nData input incorect";
std::cout << "\nInput new row elements";
for (int i = 0; i < stlb; i++) {
std::cin >> mass[k-1];
}
}
catch (char *sr) {
std::cout << sr;
}
}
void matrix::set_stlb (int k) {
try {
if ( k <=0 ) throw "\nData input incorect";
std::cout << "\nInput new column elements";
for (int i = 0; i < str; i++) {
std::cin >> mass[k-1];
}
}
catch (char *sr) {
std::cout << sr;
}
}
matrix matrix::transp() {
matrix T(stlb, str);
double buff;
for (int i = 0 ; i < stlb ; i++) {
for (int j = 0 ; j < str ; j++) {
buff = T.mass[j] ;
mass[j] = buff ;
}
}
return T;
}
ostream& operator<< (ostream& out, matrix A) {
std::cout<<"\n";
for (int i=0; i<A.str; i++){
for (int j=0; j<A.stlb; j++)
out<<setw(3)<<A.mass[j];
out<<"\n";
}
}
"программа где используется библиотека":
Код:
#include <vcl.h>
#pragma hdrstop
#include <iostream.h>
#include <iomanip.h>
#include "matr_func.h"
#pragma argsused
int main(int argc, char* argv[])
{
matrix matr_1("matrix.txt");
cout << matr_1.transp();
return 0;
}
#pragma hdrstop
#include <iostream.h>
#include <iomanip.h>
#include "matr_func.h"
#pragma argsused
int main(int argc, char* argv[])
{
matrix matr_1("matrix.txt");
cout << matr_1.transp();
return 0;
}
пните, пожалуйста, где ошибка?