Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Ошибка сегментирования  (Прочитано 1170 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Johny Blackbird

  • Автор темы
  • Любитель
  • *
  • Сообщений: 75
    • Просмотр профиля
Ошибка сегментирования
« : 14 Апреля 2011, 00:29:44 »
Всем привет. Писал такую прогу на C++, компилил через g++. Запускал, пробовал задавать размер матрицы 2, выводились 3 матрицы, хотя printmatrix в проге только 2 раза. Правда, вторая матрица совпадает с первой, т. е. это введённая матрица. Да и значения в третьей матрице должны быть не такие. Но главный вопрос не в этом. Дело в том, что при размере матрицы, начиная с 3-ёх выводится только введённая матрица и вылезает ошибка сегментирования. Насколько я знаю, она появляется, при попытке доступа к запрещённым участкам памяти. Но что конкретно не так в моей проге, я не знаю. Код проги и примеры вывода приведены ниже. Please, help me.
#include<stdio.h>
#include<math.h>
int getback(bool t[], int j);
double max(double a[]);
void printmatrix(double mat[],int n);
int main()
{
int n=2;
printf("matrix size=");
scanf("%d",&n);
double *mat;
mat=new double[n*n];
bool *r;
r=new bool[n*n];
for(int i=0; i<n*n; i++)
{
 r[i]=true;
}
 for(int i=0; i<n; i++)
 {
 for(int j=0; j<n; j++)
  {
   printf("mat[%d][%d]=",i,j);
   scanf("%le", &mat[i*n+j]);
  }
 }

printmatrix(mat, n);
for(int j=0; j<n; j++)
 {
  double max=mat[j];
  bool t[n];
  for(int i=j; i<j+n*(n-1); i=i+n)
  {
   if(mat[i]>max&&mat[i]!=0&&r[i]!=false)
   {
max=mat[i];
t[i]=true;
for(int k=i-j;k<i-j+n;i++)
{
r[i]=false;
     }
   }
   else
   {
    t[i]=false;
   continue;
   }
  }
  for(int i=j; i<j+n*(n-1); i=i+n)
  {
   mat[i]=mat[i]/max;
  }
printmatrix(mat, n);
 }      
getchar();/*Вместо привычного getch(), т.к. на Линуксе нет <stdio.h>*/
delete mat;
delete r;
return 0;
}
/*Закончилась основная программа и начались определения функций*/
int getback(bool t[], int n)/*1*/
{
 int tmax=0;
 for(int i=0; i<n; i++)
 {
   if(t[i]==1&&i>tmax)
   {
tmax=i;
   }
   else continue;
 }
 return tmax;
};
double max(double a[], int n)/*2*/
{
 double m=a[0];
 double t[n];
 for(int i=0; i<n; i++)
  {
  if(a[i]>m)
   {
m=a[i];
t[i]=true;
   }
  else
   {
    t[i]=false;
   continue;
   }
  }
 return m;
};
void printmatrix(double mat[], int n)/*3*/
{
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(j!=n-1)
{
printf("%3.2f\t",mat[i*n+j]);
}
else if(j==n*(n-1))
{
printf("%3.2f\n\n",mat[i*n+j]);
}
else
{
printf("%3.2f\n",mat[i*n+j]);
}
}
}
}
matrix size=2
mat[0][0]=1
mat[0][1]=2
mat[1][0]=3
mat[1][1]=4
1.00 2.00
3.00 4.00
1.00 2.00
3.00 4.00
1.00 1.00
3.00 4.00
matrix size=3
mat[0][0]=1
mat[0][1]=2
mat[0][2]=3
mat[1][0]=4
mat[1][1]=5
mat[1][2]=6
mat[2][0]=7
mat[2][1]=8
mat[2][2]=9
1.00 2.00 3.00
4.00 5.00 6.00
7.00 8.00 9.00
Ошибка сегментирования
« Последнее редактирование: 14 Апреля 2011, 00:32:02 от Johny Blackbird »
Гну Линукс. Скоро согну.

Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Re: Ошибка сегментирования
« Ответ #1 : 14 Апреля 2011, 00:39:16 »
Прогнать через дебаггер, и посмотреть, где она крашится.

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Ошибка сегментирования
« Ответ #2 : 14 Апреля 2011, 04:52:03 »
Цитировать
getchar();/*Вместо привычного getch(), т.к. на Линуксе нет <stdio.h>*/
очень забавный комментарий, пиши еще!

я бы не советовал тебе давать переменным и функциям одинаковые имена. тем более которые могут совпадать со стандартными именами. смотри max.

из всего С++ тут только new и delete в остальном plain C

Цитировать
Запускал, пробовал задавать размер матрицы 2, выводились 3 матрицы, хотя printmatrix в проге только 2 раза.
вызов printmatrix стоит в цикле.

               for (int k = i - j; k < i - j + n; i++) {
                    r [ i ] = false; // валится здесь, значение i = 135080
                }
подумай еще раз хорошо где какие буквы должны стоять

и подравняй код. читать это месиво глаз вываливается.

напиши задание которое выполняешь. реверсить студенческие лабы и поняться какой же очередной велосипед здесь хотел сделать автор не интересно

ну и вишенка на торте: с какого перепуга у тебя в конце стоит delete когда должно быть delete[]????
« Последнее редактирование: 14 Апреля 2011, 07:35:56 от Yurror »

 

Страница сгенерирована за 0.067 секунд. Запросов: 25.