Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> 2мерный массив произвольной длины, выделение памяти, длина произвольна! 
V
    Опции темы
Hohhi
Дата 28.9.2008, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 25.2.2006
Где: Молдова

Репутация: нет
Всего: нет



Приветствую всех! 
Делаю лабу по с++, казалось бы ерунда, а я не знаю, как выделять память под двумерный массив произвольной длины. Вот на всякий случай задание:
Создать класс Matrix-матрица. Данный класс содержит указатель на float, количество строк и столбцов и переменную - код ошибки. Определить конструктор без параметров, конструктор с одним параметром – квадратная матрица и конструктор с двумя параметрами – прямоугольная матрица и др. Определить методы доступа: возвращение и определение значения элемента (i,j). Определить функции сложения и вычитания (матрицы с матрицей), умножение матрицы на матрицу. Определить умножение матрицы на число. Проверить работу этого класса. В случае нехватки памяти, несоответствия размерностей, выхода за пределы используемой памяти устанавливать код ошибки.
Вот как примерно будет выглядеть класс:
Код

class Matrix
{
    private:
        float* matr;
        int m;
        int n;
        int error_code;
    public:
        Matrix();
        Matrix(int);
        Matrix(int, int);
        Matrix Suma(Matrix, int);
        Matrix Proizvedenie(Matrix);
        Print_Matrix();
        Get_Element(int, int);
};


Когда я пытаюсь сделать так,
Код

Matrix::Matrix():n(3),m(3),error_code(0)
{
    matr=new float[n][n];
                      //---//
}

или вот так
Код

* (* (matr+i) +j ); //matr[i][j]

компилятор не пропускает меня по непонятной мне причине. Помогите разобраться smile 

Это сообщение отредактировал(а) Hohhi - 28.9.2008, 21:37
PM MAIL ICQ   Вверх
IKM2007
Дата 28.9.2008, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



Если хочешь создать матрицу n на m, то так
Код

float **a;
a=new float *[n];
for(i=0;i<n;i++)
a[i]=new float [m];
------------------------
------------------------
for(i=0;i<n;i++)
delete [] a[i];
delete [] a;



--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
Hohhi
Дата 28.9.2008, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 25.2.2006
Где: Молдова

Репутация: нет
Всего: нет



IKM2007, Большое спасибо за оперативность и за то, что с подсказкой попали в точку. 
Ещё один вопрос. Что посоветуете почитать по поводу указателей на указатели, а то когда дело доходит до них я просто теряюсь, и даже не понимаю как рассуждать. Может какую то книжку, статью, ещё раз спасибо

Это сообщение отредактировал(а) Hohhi - 28.9.2008, 21:29
PM MAIL ICQ   Вверх
jonie
Дата 28.9.2008, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



а какая разница? в плане просто надо рассматривать указатель на указатель именно как "указатель" на "что-то". И логика работы с указателем ну ничем не отличается от "стандартного". Ну а далее, уже работаете с этим "чем-то" (в даннном случае это "массив указателей").... нарисуйте квадратики, что на что указывает и все поймете.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Hohhi
Дата 29.9.2008, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 25.2.2006
Где: Молдова

Репутация: нет
Всего: нет



странно как-то, но прога у меня глючит. В чём моя ошибка?
Код

#include <iostream.h>
#include <string.h>
#include <conio.h>
class Matrix
{
    private:
        float** matr;
        int m;
        int n;
        int error_code;
    public:
        Matrix();
        Matrix(int);
        Matrix(int, int);
        Matrix Suma(Matrix);
        Matrix Raznosti(Matrix);
        Matrix Proizvedenie(Matrix,Matrix);
        Matrix Multiply_num(int);
        void Print_Matrix();
        float Get_Element(int, int);
        void Initialize();
        int Get_Ec()
        {
            return error_code;
        }
        ~Matrix();

};

Matrix::Matrix():n(3),m(3),error_code(0)
{
    matr=new float *[n];
    for(int i=0;i<n;i++)
        matr[i]=new float [n];
}
Matrix::Matrix(int n):error_code(0)
{
    this->n=this->m=n;
    if (n<=0)
        error_code=1;
    else
    {
        matr=new float *[n];
        for(int i=0;i<n;i++)
        matr[i]=new float [n];
    }

}
Matrix::Matrix(int m,int n):error_code(0)
{
    this->m=m;
    this->n=n;
    if ((n<=0)||(m<=0))
        error_code=1;
    else
    {
        matr=new float *[m];
        for(int i=0;i<n;i++)
            matr[i]=new float [n];
    }
}
void Matrix::Initialize()
{
    for (int i=0;i<m;i++)
        for (int j=0;j<n;j++)
        cin>>matr[i][j];
}
void Matrix::Print_Matrix()
{
    for (int i=0;i<m;i++)
        for (int j=0;j<n;j++)
    {
        cout<<matr[i][j]<<"  ";
        if (j==n-1)
            cout<<endl;
    }
}
Matrix Matrix::Suma(Matrix a)
{
    if ((a.m!=m)||(a.n!=n))
        error_code=2;
    else
    {
        for (int i=0;i<m;i++)
            for (int j=0;j<n;j++)
                matr[i][j]+=a.matr[i][j];
        return *this;
    }
}
Matrix Matrix::Raznosti(Matrix a)
{
    if ((a.m!=m)||(a.n!=n))
        error_code=2;
    else
    {
        for (int i=0;i<m;i++)
            for (int j=0;j<n;j++)
                matr[i][j]-=a.matr[i][j];
        return *this;
    }
}
Matrix Matrix::Proizvedenie(Matrix a,Matrix b)
{

    if (a.n!=b.m)
        error_code=2;
    else
    {
        float sum=0;
        Matrix m3(a.m,b.n);
        for (int i=0;i<a.n;i++)
        for (int j=0;j<b.n;j++)
        {
            sum=0;
            for(int k=0;k<b.m;k++)
                sum+=a.matr[i][k]*b.matr[k][j];
            m3.matr[i][j]=sum;
        }
        return m3;
    }
}
float Matrix::Get_Element(int m, int n)
{
    if ((m<0)||(n<0))
    {
        error_code=2;
        return NULL;
    }
    if ((m>this->m)||(n>this->n))
    {
        error_code=3;
        return NULL;
    }
    else
        return (matr[m-1][n-1]);
}
Matrix Matrix::Multiply_num(int num)
{
    for (int i=0;i<m;i++)
            for (int j=0;j<n;j++)
                matr[i][j]*=num;
    return *this;
}
Matrix::~Matrix()
{
            for (int i=0;i<n;i++)
                delete[] matr[i];
            delete[] matr;
}
int main()
{
        int vibor=1,m,n;
        while (vibor)
        {
                cout<<"=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n";
                cout<<"          THE MENU      \n";
                cout<<"1-Create and initialize matrix number 1"<<endl;
                cout<<"2-Create and initialize matrix number 2"<<endl;
                cout<<"3-Sum matrixes"<<endl;
                cout<<"4-Subtract Matrix nr. 1 from matrix nr.2"<<endl;
                cout<<"5-Multiply matrix nr.1 on matrix number 2"<<endl;
                cout<<"6-Multiply matrix nr.2 on matrix number 1"<<endl;
                cout<<"7-Multiply matrix nr.1 on a number"<<endl;
                cout<<"8-Get an element from matrix nr.1"<<endl;
                cout<<"9-Print matrix nr.1"<<endl;
                cout<<"10-Print matrix nr.2"<<endl;
             //    cout<<"11-Print matrix nr.3 which is the result of arithmetic operations "<<endl;
                cout<<"Enter the desired action"<<endl;
                cin>>vibor;
                switch(vibor)
                {
                    case 0: break;
                    case 1: cout<<"Enter the dimensions of matrix nr.1(m*n)";
                                    cin>>m>>n;
                                    Matrix m1(m,n);
                                    m1.Initialize();
                                    break;
                    case 2: cout<<"Enter the dimensions of matrix nr.1(m*n)";
                                    cin>>m>>n;
                                    Matrix m2(m,n);
                                    m1.Initialize();
                                    break;
                    case 3: m1.Suma(m2);
                                    if (m1.Get_Ec()==2)
                                    {
                                        cout<<"Different dimensions, can't sum matrixes";
                                        vibor=0;
                                    }
                                    break;
                    case 4: m1.Raznosti(m2);
                                    if (m1.Get_Ec()==2)
                                    {
                                        cout<<"Different dimensions, can't sum matrixes";
                                        vibor=0;
                                    }
                                    break;
                    case 5: m2.Raznosti(m1);
                                    if (m2.Get_Ec()==2)
                                    {
                                        cout<<"Different dimensions, can't sum matrixes";
                                        vibor=0;
                                    }
                                    break;
                    case 6: break;
                    case 7: break;
                    case 8: cout<<"Koordinates of the element: ";
                                    cin>>m>>n;
                                    cout<<"The element is: "<<m1.Get_Element(m,n);
                                    if (m1.Get_Ec())                                    {
                                        cout<<"Wrong coordinates ";
                                        vibor=0;
                                    }  break;
                    case 9: m1.Print_Matrix();break;
                    case 10:m2.Print_Matrix();break;
                    default:cout<<"Impossible operation!\n"; break;
                }
        }
    getch();
    return 0;
}


Это сообщение отредактировал(а) Hohhi - 29.9.2008, 14:52
PM MAIL ICQ   Вверх
Avaj
Дата 29.9.2008, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 212
Регистрация: 14.7.2008
Где: Владивосток.

Репутация: 1
Всего: 3



PM MAIL   Вверх
volvo877
Дата 29.9.2008, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: нет
Всего: 116



Цитата(Hohhi @  29.9.2008,  14:48 Найти цитируемый пост)
странно как-то, но прога у меня глючит.

Мало того, она еще и не везде компилируется (ну, скажем, GCC отказывается компилировать программу, потому что case у тебя "перепрыгивает" инициализацию переменной)...

Ну, а глюки - проверь:
Код

                    case 2: cout<<"Enter the dimensions of matrix nr.1(m*n)";
                                    cin>>m>>n;
                                    Matrix m2(m,n);
                                    m1.Initialize(); // <--- Какую-какую матрицу ты инициализируешь?
                                    break;

PM MAIL   Вверх
Hohhi
Дата 29.9.2008, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 25.2.2006
Где: Молдова

Репутация: нет
Всего: нет



volvo877, соласен, уже сам заметил, но дело даже не в этом, а в том, что при инициализации в элемент матрицы [0,0] записывается не понятное какое значение, а если прогу мучить подольше, то начинают пропадать буквы из надписей меню, выводимые cout, перед switch. Вобщем как мне кажется, что- то тут не то, а что именно не понимаюи где тоже, поэтому кинул весь код

Добавлено @ 17:28
volvo877, если инициализировать переменную не в case всё замечательно работает, но почему мне не понятно

Это сообщение отредактировал(а) Hohhi - 29.9.2008, 17:45
PM MAIL ICQ   Вверх
IKM2007
Дата 29.9.2008, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



Цитата(Hohhi @  29.9.2008,  17:21 Найти цитируемый пост)
при инициализации в элемент матрицы [0,0] записывается не понятное какое значение,

Можешь в конструкторе, когда создаешь матрицу, все элементы пронулить
Код

for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
    matr[i][j]=0;

У меня тоже твоя прога не компилится(Visual Studio 2005) из за case-ов.
Цитата(Hohhi @  29.9.2008,  17:21 Найти цитируемый пост)
volvo877, если инициализировать переменную не в cast всё замечательно работает, но почему мне не понятно

Код

case 1: int a;
break;
case 2:int b;
a++;//здесь a не инициализирован
break;
case 3: int c;
b++;//здесь b не инициализирован
break;



--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
volvo877
Дата 29.9.2008, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: нет
Всего: 116



Цитата(Hohhi @  29.9.2008,  17:21 Найти цитируемый пост)
но почему мне не понятно 
Потому что
Цитата(С++ Standard)
6.7 Declaration statement
<...>
It is possible to transfer into a block, but not in a way that bypasses declarations with initialization. A program that jumps from a point where a local variable with automatic storage duration is not in scope to a point where it is in scope is ill-formed unless the variable has POD type (3.9) and is declared without an initializer (8.5).

PM MAIL   Вверх
Hohhi
Дата 29.9.2008, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 25.2.2006
Где: Молдова

Репутация: нет
Всего: нет



IKM2007, понял, видимо проблема действительно кроется в областях видимости, спасибо, работает
PM MAIL ICQ   Вверх
Hohhi
Дата 29.9.2008, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 25.2.2006
Где: Молдова

Репутация: нет
Всего: нет



Доправил прогу, остался один минус, причём довольно таки серьёзный, после посылки матрицы в качестве аргумента в какой либо метод, она изменяется.
Доделанный код на всякий случай:
Код

#include <iostream.h>
#include <string.h>
#include <conio.h>
class Matrix
{
    private:
        float** matr;
        int m;
        int n;
        int error_code;
    public:
        Matrix();
        Matrix(int);
        Matrix(int, int);
        void Suma(Matrix);
        void Raznosti(Matrix);
        void Proizvedenie(Matrix,Matrix);
        void Multiply_num(int);
        void Print_Matrix();
        float Get_Element(int, int);
        void Initialize();
        int Get_Ec()
        {
            return error_code;
        }
        int Get_m()
        {
            return m;
        }
        int Get_n()
        {
            return n;
        }
        ~Matrix();

};

Matrix::Matrix():n(3),m(3),error_code(0)
{
    int i;
    matr=new float *[n];
    for(i=0;i<n;i++)
        matr[i]=new float [n];
    for (i=0;i<m;i++)
        for (int j=0;j<n;j++)
            matr[i][j]=0;
}
Matrix::Matrix(int n):error_code(0)
{
    this->n=this->m=n;
    if (n<=0)
        error_code=1;
    else
    {
        matr=new float *[n];
        for(int i=0;i<n;i++)
            matr[i]=new float [n];
    }


}
Matrix::Matrix(int m,int n):error_code(0)
{
    this->m=m;
    this->n=n;
    if ((n<=0)||(m<=0))
        error_code=1;
    else
    {
        matr=new float *[m];
        for(int i=0;i<n;i++)
            matr[i]=new float [n];
    }
}
void Matrix::Initialize()
{
    for (int i=0;i<m;i++)
        for (int j=0;j<n;j++)
        cin>>matr[i][j];
}
void Matrix::Print_Matrix()
{
    for (int i=0;i<m;i++)
        for (int j=0;j<n;j++)
    {
        cout<<matr[i][j]<<"  ";
        if (j==n-1)
            cout<<endl;
    }
}
void Matrix::Suma(Matrix a)
{
    if ((a.m!=m)||(a.n!=n))
        error_code=2;
    else
    {
        for (int i=0;i<m;i++)
            for (int j=0;j<n;j++)
                matr[i][j]+=a.matr[i][j];
    }
}
void Matrix::Raznosti(Matrix a)
{
    if ((a.m!=m)||(a.n!=n))
        error_code=2;
    else
    {
        for (int i=0;i<m;i++)
            for (int j=0;j<n;j++)
                matr[i][j]-=a.matr[i][j];
    }
}
void Matrix::Proizvedenie(Matrix a,Matrix b)
{

    if (a.n!=b.m)
        error_code=2;
    else
    {
        float sum=0;
        for (int i=0;i<a.n;i++)
        for (int j=0;j<b.n;j++)
        {
            sum=0;
            for(int k=0;k<b.m;k++)
                sum+=a.matr[i][k]*b.matr[k][j];
            matr[i][j]=sum;
        }
    }
}
float Matrix::Get_Element(int m, int n)
{
    if ((m<0)||(n<0))
    {
        error_code=2;
        return NULL;
    }
    if ((m>this->m)||(n>this->n))
    {
        error_code=3;
        return NULL;
    }
    else
        return (matr[m-1][n-1]);
}
void Matrix::Multiply_num(int num)
{
    for (int i=0;i<m;i++)
            for (int j=0;j<n;j++)
                matr[i][j]*=num;
}
Matrix::~Matrix()
{
            for (int i=0;i<n;i++)
                delete[] matr[i];
            delete[] matr;
}
int main()
{
        int vibor=1,m,n,numb;
        cout<<"Enter the dimensions of matrix nr.1(m*n)";
        cin>>m>>n;
        Matrix m1(m,n);
        m1.Initialize();
        m1.Print_Matrix();
        cout<<"Enter the dimensions of matrix nr.2(m*n)";
        cin>>m>>n;
        Matrix m2(m,n);
        m2.Initialize();
        m2.Print_Matrix();
        Matrix m3(m1.Get_m(),m2.Get_n());
        while (vibor)
        {
                cout<<"=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n";
                cout<<"          THE MENU      \n";
                cout<<"1-Sum matrixes"<<endl;
                cout<<"2-Subtract Matrix nr. 1 from matrix nr.2"<<endl;
                cout<<"3-Subtract Matrix nr. 2 from matrix nr.1"<<endl;
                cout<<"4-Multiply matrix nr.1 on matrix number 2"<<endl;
                cout<<"5-Multiply matrix nr.2 on matrix number 1"<<endl;
                cout<<"6-Multiply matrix nr.1 on a number"<<endl;
                cout<<"7-Get an element from matrix nr.1"<<endl;
                cout<<"8-Print matrix nr.1"<<endl;
                cout<<"9-Print matrix nr.2"<<endl;
                cout<<"10-Print matrix nr.3 which is the result of matrix multiply "<<endl;
                cout<<"Enter the desired action"<<endl;
                cin>>vibor;
                switch(vibor)
                {
                    case 0: break;
                    case 1: m1.Suma(m2);
                                    if (m1.Get_Ec()==2)
                                    {
                                        cout<<"Different dimensions, can't sum matrixes";
                                        vibor=0;
                                    }
                                    break;
                    case 2: m1.Raznosti(m2);
                                    if (m1.Get_Ec()==2)
                                    {
                                        cout<<"Different dimensions, can't subtract matrixes";
                                        vibor=0;
                                    }
                                    break;
                    case 3: m2.Raznosti(m1);
                                    if (m2.Get_Ec()==2)
                                    {
                                        cout<<"Different dimensions, can't subtract  matrixes";
                                        vibor=0;
                                    }
                                    break;
                    case 4: m3.Proizvedenie(m1,m2);
                                    if (m1.Get_Ec()==2)
                                    {
                                        cout<<"Different dimensions, can't multiply matrixes";
                                        vibor=0;
                                    }
                                    break;
                    case 5: m3.Proizvedenie(m2,m1);
                                    if (m2.Get_Ec()==2)
                                    {
                                        cout<<"Different dimensions, can't multiply matrixes";
                                        vibor=0;
                                    }
                                    break;
                    case 6: cout<<"Enter the number to multiply on ";
                                    cin>>numb;
                                    m1.Multiply_num(numb); break;
                    case 7: cout<<"Koordinates of the element: ";
                                    cin>>m>>n;
                                    cout<<"The element is: "<<m1.Get_Element(m,n);
                                    if (m1.Get_Ec())
                                    {
                                        cout<<"Wrong coordinates ";
                                        vibor=0;
                                    }  break;
                    case 8: m1.Print_Matrix();break;
                    case 9: m2.Print_Matrix();break;
                    case 10: m3.Print_Matrix();break;
                    default:cout<<"Impossible operation!\n"; break;
                }
        }
    getch();
    return 0;
}

Пример. m1.Sum(m2); при этом в m1 сохраняется сумма верно, а в m2 находится странный набор чисел.
PM MAIL ICQ   Вверх
Hohhi
Дата 30.9.2008, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 25.2.2006
Где: Молдова

Репутация: нет
Всего: нет



причина ясна, при вызове m1.Sum(m2), для m2, вызывается дестуктор. Но почему мне не ясно.
PM MAIL ICQ   Вверх
volvo877
Дата 30.9.2008, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: нет
Всего: 116



Сделай так:
Код

  ...
  void Suma(const Matrix&); // вместо void Suma(Matrix);
  ...
, деструктор вызываться не будет...
PM MAIL   Вверх
Hohhi
Дата 30.9.2008, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 25.2.2006
Где: Молдова

Репутация: нет
Всего: нет



volvo877, спасибо, во я тормоз, теперь лаба точно готова, спасибо
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0670 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.