Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

[C++] Использование функций из статической библиотеки

34K
17 декабря 2007 года
dima_maslo
1 / / 17.12.2007
Доброго всем времени суток. Задача: создать класс для работы с матрицами. Реализовать в виде статической библиотеки.
Пишу на Builder 6.

Суть проблемы: при использовании функций из библиотеки крашит. Чаще всего ошибки с индексами(адресацией). Причем на функциях с изменением массива. (Например транспонирование матрицы, умножение матриц, добавление столбца и т.д.). При использовании функции, например, вывода, все в норме. Однако ,если же эти функции написать в простой программе, оформив также в виде класса, и использовать из нее же, все в порядке.

Созданную библиотеку подключаю след. образом:
1)include"xxx.h"2)Project->Add to project-> xxx.lib (лежит в папке с рабочей программой).


Итак, header.

Код:
#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
};


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";
        }
}


"программа где используется библиотека":

Код:
#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;
}


пните, пожалуйста, где ошибка?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог