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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.04.2009, 18:54   #1
TheKnyazz
Пользователь
 
Регистрация: 26.10.2008
Сообщений: 40
По умолчанию Проблема с динамическим массивом

Программа должна удалять строки и столбцы, заполненные нулями.
Прошу чуток намекнуть из-за чего возникает проблема в ф-циях, которые удаляют. Иначе говоря я вероятней всего неправильно передаю параметры.
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <iostream.h>
#include <stdlib.h>
#include <tchar.h>
#include <conio.h>
#include <stdio.h>
#include <windows.h>
#include <iomanip.h>
//---------------------------------------------------------------------------

using namespace std;
// Функция перекодировки в кирилицу
char *rus(char* st)
{
	unsigned char  *p = st; // при объявлении символов как char русские буквы
							// кодируются отрицательными числами
	while( *p ){
		if(*p >= 192)      // здесь русская буква
			if(*p <= 239)
			   *p -= 64;
			else
			   *p -= 16;
		p++;
	}
	return st;
}

void Outputt(int **a, int n, int p)
{ int i,j;
  for (i=0;i<n;i++){
	for(j=0;j<p;j++)
	  cout<<setw(4)<<a[i][j]<<" ";
	 cout<<endl;
   }

}


void strZeroDel(int **a, int n, int p)
{    int i,j,k,t,g,m;

  i=1;
  while(i<=n){
	 k=0;
	 for (j=0;j<p;j++){
	  if (a[i][j]==0){k++ ;}   //ошибка access violation возникает здесь
	  if (k==p){
		   for (t=0;t<p;t++)
		   {
			 for (m=i;m<n-1;m++)
			  {
			   a[m][t]=a[m+1][t];
			   n--;
			  }
		   }
		}else i++;
	  }
  }

}
void stZeroDel(int **a, int n, int p)
{    int i,j,k,t,g,m;
	 j=1;
  while(j<=p){
	 k=0;
	 for (i=0;i<n;i++){
	  if (a[i][j]==0)k++ ;
	  if (k==n){
		   for (t=0;t<n;t++)
		   {
		   for (m=j;m<p-1;m++)
		   {
			  a[m][t]=a[m][t+1];
			  p--;
		   }
		   }
		 }else j++;
	  }
   }

}

#pragma argsused
int main(int argc, char* argv[])
{  int n,p,i,j;
	cout << rus("Введите количество строк и столбцов матрицы: ")<<endl;
	cin>>n>>p;
   int **a=new int *[n];
  
   for (i=0;i<n;i++){   //под матрицу
		a[i]=new int[n];
		}
   for (i=0;i<n;i++){
		for (j=0;j<p;j++){
			cin>>a[i][j];}
			}

	Outputt(a,n,p);
	strZeroDel(a,n,p);
	stZeroDel(a,n,p);
	Outputt(a,n,p);
        system("pause");
	return 0;
}

//---------------------------------------------------------------------------
Подскажите пожалуйста, из-за чего у меня возникает эта ошибка. Вроде ж я никаких элементов вне массива не трогаю, чужую память тоже не цепляю.

Последний раз редактировалось TheKnyazz; 27.04.2009 в 19:00.
TheKnyazz вне форума Ответить с цитированием
Старый 27.04.2009, 20:04   #2
d9m0n
Пользователь
 
Регистрация: 03.03.2009
Сообщений: 29
По умолчанию

у тебя в функции strZeroDel i инициализируется единицей, а цикл while выполняется пока i<=n. Т.е. Нулевой элемент массива не учитывается :-), зато вместо него берется элемент за границей массива:-)
инициализируй i нулем и поменяй условие на i<n
d9m0n вне форума Ответить с цитированием
Старый 27.04.2009, 23:38   #3
TheKnyazz
Пользователь
 
Регистрация: 26.10.2008
Сообщений: 40
По умолчанию

Спасибо!) действительно не в свой огород полез... Тяжеловат синтаксис си, после паскаля) А что я еще неправильно делаю, так как теперь прога хорошо компилируется, но удалятся злобно не хочет..Мож я чего-то путаю в алгоритме удаления? Я на самом деле переносил на Си свою же программу паскаля,и на паскале все чудесно пахало, а здесь не понятно.
TheKnyazz вне форума Ответить с цитированием
Старый 28.04.2009, 18:37   #4
TheKnyazz
Пользователь
 
Регистрация: 26.10.2008
Сообщений: 40
По умолчанию

Нашел ошибку, не пойму в чем её причина. У меня счетчик k увеличивается почему-то только 1 единственный раз, а дальше не хочет прибавлять. Элементы в строке\столбце нули.
Код:
 //---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include <iostream.h>
#include <stdlib.h>
#include <tchar.h>
#include <conio.h>
#include <stdio.h>
#include <windows.h>
#include <iomanip.h>
//---------------------------------------------------------------------------
 
using namespace std;
// Функция перекодировки в кирилицу
char *rus(char* st)
{
        unsigned char  *p = st; // при объявлении символов как char русские буквы
                                                        // кодируются отрицательными числами
        while( *p ){
                if(*p >= 192)      // здесь русская буква
                        if(*p <= 239)
                           *p -= 64;
                        else
                           *p -= 16;
                p++;
        }
        return st;
}
 
void Outputt(int **a, int n, int p)
{ int i,j;
  for (i=0;i<n;i++){
        for(j=0;j<p;j++)
          cout<<setw(4)<<a[i][j]<<" ";
         cout<<endl;
   }
 
}
 
 
 
void strZeroDel(int **a, int &n, int p)
{    int i,j,k,t,m;
 
  i=0;
  while(i<n){
         k=0;
         for (j=0;j<p;j++){
          if (a[i][j]==0){k++ ;} 
//вот это счетчик, 1 раз условие проверяется, и больше не трогается(
          if (k==p){
                   for (t=0;t<p;t++)
                   {
                         for (m=i;m<n-1;m++)
                          {
                           a[m][t]=a[m+1][t];
                           
                          }
                   }n--;
                }else i++;
          }
  }
 
}
void stZeroDel(int **a, int n, int &p)
{    int i,j,k,t,m;
         j=0;
  while(j<p){
         k=0;
         for (i=0;i<n;i++){
          if (a[i][j]==0)k++ ;
          if (k==n){
                   for (t=0;t<n;t++)
                   {
                   for (m=j;m<p-1;m++)
                   {
                          a[m][t]=a[m][t+1];
                         
                   }
                   } p--;
                 }else j++;
          }
   }
 
}
 
#pragma argsused
int main(int argc, char* argv[])
{  int n,p,i,j;
        cout << rus("Введите количество строк и столбцов матрицы: ")<<endl;
        cin>>n>>p;
   int **a=new int *[n];//Выделение памяти
   for (i=0;i<n;i++){   //под матрицу
                a[i]=new int[n];
 
                }
   for (i=0;i<n;i++){
                for (j=0;j<p;j++){
                        cin>>a[i][j];}
                        }
 
 
          Outputt(a,n,p);
          system("pause");
          strZeroDel(a,n,p);
          stZeroDel(a,n,p);
          Outputt(a,n,p);
          system("pause");
                return 0;
}
 
//---------------------------------------------------------------------------
TheKnyazz вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с динамическим массивом sand Общие вопросы C/C++ 3 22.08.2008 12:48
Проблема с динамическим массивом dee_lv Помощь студентам 7 09.06.2008 16:58
Помогите с динамическим массивом!!!! vish25 Помощь студентам 2 31.05.2008 19:20
проблема с динамическим массивом romeo007.06 Общие вопросы Delphi 1 03.04.2008 20:18
проблема с динамическим массивом kommunist Помощь студентам 6 11.11.2007 21:18