Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2011, 07:51   #1
robokop
Новичок
Джуниор
 
Регистрация: 03.05.2011
Сообщений: 5
По умолчанию добавление столбцов в динамический массив

Нужно в динамическом массиве добавить столбцы справа:


Код:
class Matrix
{
    int rows, cols;
    double* p;

   void AddColsRight(Matrix const&a);
Код:
void Matrix::AddColsRight(Matrix const&a){
        if(this->rows != a.rows)  return;
        int c= cols;
  // копируем массив в буфер
       double *p1 =new double[rows*cols];
          for (int i=0;i<rows*cols;i++)p1[i]=p[i];

       if(p!=NULL)delete[]p;
        p=new double[rows* a.cols];
//******************************************************
  for (int i=0;i<rows;i++)
  { int j=0;
      while(j<cols){
          p[i*(cols+a.cols)+j]= p1[i*cols+j]; qDebug()<<"p["<<i*(cols+a.cols)+j<<"]="<< p[i*(cols+a.cols)+j];
          j++;
      }
      int k=0;
      while(j<cols+a.cols){
          p[i*(cols+a.cols)+j]=a.p[i*a.cols+k];qDebug()<<"p["<<i*(cols+a.cols)+j<<"]="<< p[i*(cols+a.cols)+j];
          j++;k++;
      }


}
  cols=cols+a.cols; delete []p1;
}
после вызова
Код:
F.AddColsRight(X)
столбцы добавляются, но приложение завершается с кодом -1073741819
robokop вне форума Ответить с цитированием
Старый 03.05.2011, 07:54   #2
robokop
Новичок
Джуниор
 
Регистрация: 03.05.2011
Сообщений: 5
По умолчанию

оно завершается не сразу после выполнения функции, а при закрытии окна, но с кодом -1073741819
если функцию не вызывать завершается нормально
robokop вне форума Ответить с цитированием
Старый 03.05.2011, 11:27   #3
robokop
Новичок
Джуниор
 
Регистрация: 03.05.2011
Сообщений: 5
По умолчанию

млин, я блондинко
переписала по другому
Код:
void Matrix::AddColsRight(Matrix const&a){
  if(this->rows != a.rows)  return;
  int c= cols+a.cols;
  int r= rows;
  double *p1 =new double[rows*cols];
  for (int i=0;i<rows*cols;i++)p1[i]=p[i];

  if(p!=NULL)delete[]p;
  p=new double[r* c];
  int j=0;int n=0,i=0;

  while(i<r*c)
   {    j=0;
        while(j<cols){
           p[i]=p1[n*cols+j];
                qDebug()<<"p["<<i<<"]=";
                qDebug("%5.2f  ",p[i]);
                j++;i++;
         }
         while(j<c) {
             int k=0;
            p[i]=a.p[n*a.cols +k];k++;
            // p[i]=4;
           qDebug()<<"p["<<i<<"]=";
           qDebug("%5.2f  ",p[i]);
           j++;i++;
         }
         n++;
    }
    cols=c;
    rows=r;
    delete []p1;
}

Последний раз редактировалось robokop; 03.05.2011 в 11:39.
robokop вне форума Ответить с цитированием
Старый 03.05.2011, 17:38   #4
EC.cpp
Пользователь
 
Регистрация: 09.04.2011
Сообщений: 30
По умолчанию

В вашей программе все элементы матрицы хранятся в одномерном векторе (массиве):
Код:
class Matrix
{
    int rows, cols;
    double* p;

   void AddColsRight(Matrix const&a);
Но если Вы будете организовывать хранение матрицы как массив векторов (столбцов):
Код:
	int i;
	double **p;
	p = new double*[cols];
	for(i=0; i < cols; i++)
		p[i] = new double[rows];

	for(i=0; i<cols; i++)
		delete[] p[i];
	delete [] p;
То добавление столбцов может стать более простой задачей.
EC.cpp вне форума Ответить с цитированием
Старый 03.05.2011, 19:19   #5
Trust_357
Пользователь
 
Регистрация: 10.03.2011
Сообщений: 68
По умолчанию

Код:
#include<time.h>
#include<iostream>
using namespace std;
void Init(int *mas,int n)
{
	for(int i=0;i<n;i++)
		mas[i]=rand()%25;
}
void Show(int *mas,int n)
{
	for(int i=0;i<n;i++)
		cout<<mas[i]<<" ";
	cout<<"\n\n";
}
int *Dobavleniye(int *mas,int &n)
{
	int *t=new int[n+1];
	for(int i=0;i<n;i++)
		t[i]=mas[i];
	t[n]=-1;
	n++;
	return t;
        delete[]t;
}
void main()
{
	srand((unsigned)time(NULL));
	setlocale(LC_CTYPE, "Rus");
	int n=0;
	cout<<"\t\tВведите количество элементов массива\n\n";
	cin>>n;
	int *mas=new int[n];
	Init(mas,n);
	Show(mas,n);
	mas=Dobavleniye(mas,n);
	Show(mas,n);
	delete[]mas;
}

Последний раз редактировалось Trust_357; 04.05.2011 в 00:15.
Trust_357 вне форума Ответить с цитированием
Старый 03.05.2011, 19:54   #6
robokop
Новичок
Джуниор
 
Регистрация: 03.05.2011
Сообщений: 5
По умолчанию

Цитата:
Сообщение от EC.cpp Посмотреть сообщение
В вашей программе все элементы матрицы хранятся в одномерном векторе (массиве):
спасибо
Элементы хранятся в одномерном массиве для упрощения выполнения других операций, добавление столбцов не главное.
Но спасибо за пример!
robokop вне форума Ответить с цитированием
Старый 03.05.2011, 20:28   #7
EC.cpp
Пользователь
 
Регистрация: 09.04.2011
Сообщений: 30
По умолчанию

Предположение:
Если проблема в этом:
Цитата:
Сообщение от robokop Посмотреть сообщение
столбцы добавляются, но приложение завершается с кодом -1073741819
То, возможно, попробуйте в Вашем алгоритме вместо выражений типа
i++
j++
использовать
++i
++j
(так как возможно происходит обращение к "запредельным" элементам массива)

Но только если Вы четко осознаёте разницу между такой перестановкой операции ++.

P.S. Так же помните о том, что если Вы выделяете память в массиве A на [N] элементов, то обращение к таким элементам происходит так:
от A[0]... - первый элемент массива;
до ...A[N-1] - последний элемент массива.
-------------------------
Хотя обращение к элементу, например, A[N] не запрещено, более того такой элемент будет содержать некоторое предельное значение типа массива А...

Последний раз редактировалось EC.cpp; 03.05.2011 в 20:35.
EC.cpp вне форума Ответить с цитированием
Старый 03.05.2011, 21:44   #8
robokop
Новичок
Джуниор
 
Регистрация: 03.05.2011
Сообщений: 5
По умолчанию

Цитата:
Сообщение от EC.cpp Посмотреть сообщение
Предположение:
Если проблема в этом:

Но только если Вы четко осознаёте разницу между такой перестановкой операции ++.

-------------------------
Да, именно в этом и была проблема- выход за границу массива.
Где-то в индексах накосячила. Второй исправленный вариант кода рабочий.
Разницу в префиксной и постфиксной форме конечно осознаю
robokop вне форума Ответить с цитированием
Старый 04.05.2011, 01:44   #9
Trust_357
Пользователь
 
Регистрация: 10.03.2011
Сообщений: 68
По умолчанию

Извените, это матрица, а не массив вот
Код:
#include<iostream>
#include<time.h>
using namespace std;
void Init(int **mas,int n,int m)
{
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			mas[i][j]=rand()%25;
		}
	}
}
void Show(int **mas,int n,int m)
{
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			cout<<mas[i][j]<<"\t";
		}
		cout<<endl;
	}
	cout<<"\n\n";
}
int **Dobavleniye(int **mas,int n,int &m)
{
	int **t=new int*[n];
	for(int i=0;i<n;i++)
		t[i]=new int[m+1];
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			t[i][j]=mas[i][j];
		}
		t[i][m]=-1;
	}
	m++;
	return t;
	for(int i=0;i<n;i++)
		t[i]=new int[m];
	delete[]t;
}
void main()
{
	srand((unsigned)time(NULL));
	setlocale(LC_CTYPE, "Rus");
	int n=0,m=0;
	cout<<"\t\tВведите колличество столбцов\n\n";
	cin>>m;
	cout<<"\t\tВведите колличество строк\n\n";
	cin>>n;
	int **mas=new int*[n];
	for(int i=0;i<n;i++)
		mas[i]=new int[m];
	Init(mas,n,m);
	Show(mas,n,m);
	mas=Dobavleniye(mas,n,m);
	Show(mas,n,m);
	for(int i=0;i<n;i++)
		delete[]mas[i];
	delete[]mas;
}
Trust_357 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дан двухмерный массив из 20 столбцов. Вставить в него столбец из чисел 10 после всех четных столбцов. Дмитрий142 Помощь студентам 9 07.06.2012 19:32
Динамический массив - или всё таки не динамический? vedro-compota Общие вопросы C/C++ 30 10.12.2010 23:22
двумерный динамический массив с запросом к пользователю о кол-ве строк и столбцов? vasyapupkin Общие вопросы C/C++ 2 22.11.2009 17:37
Добавление столбцов! Ilnour1986 Microsoft Office Excel 2 27.10.2009 14:16
Добавление столбцов Ilnour1986 Microsoft Office Excel 1 21.10.2009 19:06