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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2013, 15:06   #1
Irina999
 
Регистрация: 07.06.2013
Сообщений: 3
По умолчанию Динамические массивы в Си

Программа закрывается после ввода 1 элемента 5 строки (строк 10, столбцов 4). При вводе меньшего кол-ва строк и столбцов работает нормально. Что не так?
Само задание: определить является ли данная матрица ортонормированной, т. е. скалярное произведение каждой пары различных строк (столбцов) равно 0.
Код:
#include <stdlib.h>
#include <stdio.h>
#define MAXN 30
int** GetMem(int, int);
void Orthonormality(int**, int, int, int);
void OutF(int**, int, char*);
void FreeMem(int**, int);
void InputElements(int**, int, int);
//---------------------------
int **GetMem(int n, int m) {
   int i,j;   
   int **a;
   a=(int **)calloc(n, sizeof(int *));
   if (a==NULL) {
      printf("error when allocating memory\n");
      return NULL;
   }
   for (i=0; i<m; i++) {        
      a[i]=(int *)calloc(m, sizeof(int)); 
      if (a[i]==NULL) {
         printf("error when allocating memory\n");
         return NULL;
      }
   }          
   return a;      
} 
//---------------------------
void FreeMem(int **a, int n) {
   int i;
   for (i=0; i<n; i++) 
      free (a[i]);       
   free (a); 
   return;
}
//-----------------------------
void InputElements(int **a, int n, int m) {
  for(int i=0; i<n; i++) {
    for(int j=0; j<m; j++) {
      printf("%d-th element of %d line = ", j+1, i+1);
      scanf("%d", &a[i][j]);
    }
  }
  return;     
}
//-----------------------------
void OutF(int result, char name[]) {
   FILE *out; 
   out=fopen(name,"w+");      
     if(result==1) {
       fprintf(out, "matrix is not orthonormal");
       printf("matrix is not orthonormal\n");
     }
     else {
       fprintf(out, "matrix is orthonormal");
       printf("matrix is orthonormal\n");
     }  
   fclose(out);
   return; 
}  
//------------------------------
int Orthonormality(int **a, int n, int m) {
   int result=0;
   int temp=0;
   for(int i=0; i<(n-1); i++) {   
     for(int j=(i+1); j<n; j++) {
       for(int k=0; k<m; k++) {
         temp+=a[i][k]*a[j][k];
       }        
       if(temp!=0) {
         result=1;
       }
     }
   }
   return result;
} 
//------------------------
void Trans(int **a, int n, int m) {
  int temp;
  for(int i=0; i<n; i++) {
    for(int j=0;j<m; j++) {
      temp=a[i][j];
      a[i][j]=a[j][i];
      a[j][i]=a[i][j];
    }
  }
}
//------------------------
int main(void) {
  printf("\nThis program is designed for determine whether a given matrix of orthonormal;");
  printf("\ncount of lines = "); 
  int n;
  scanf("%d", &n);
  printf("count of columns = "); 
  int m;
  scanf("%d", &m);
  char outputFile[MAXN];
  printf("path to output file: "); 
  scanf("%s", outputFile);
  int **a;
  a=GetMem(n,m);
  if(a!=NULL) {
    InputElements(a,n,m);
    int result;
    system("PAUSE");
    result=Orthonormality(a,n,m);
    Trans(a,n,m);
    result*=Orthonormality(a,n,m);
    OutF(result,outputFile);
    FreeMem(a,n);
  }
  system("PAUSE");
  return 0;
}
Irina999 вне форума Ответить с цитированием
Старый 07.06.2013, 15:32   #2
kventin_zhuk
БНТУ ФИТР
Форумчанин
 
Аватар для kventin_zhuk
 
Регистрация: 20.05.2012
Сообщений: 315
По умолчанию

У вас ошибка в выделении памяти. Из - этого получается Access violation. Смотрите

Код:
int **GetMem(int n, int m) {
   int i,j;   
   int **a;
   a=(int **)calloc(n, sizeof(int *)); //  вы захватили память под n - указателей на int
   if (a==NULL) {
      printf("error when allocating memory\n");
      return NULL;
   }
   for (i=0; i<m; i++)  // а здесь проходите по вашему массиву указателей но не до n , а уже до m. Почему?
   {        
      a[i]=(int *)calloc(m, sizeof(int)); 
      if (a[i]==NULL) {
         printf("error when allocating memory\n");
         return NULL;
      }
   }          
   return a;      
}
Выход: исправить в том месте m на n.
С++(console/builder/WinAPI/Linux), C#, Pascal, Delphi, Asm, Prolog.
< ----- Контакты
kventin_zhuk@live.com
kventin_zhuk вне форума Ответить с цитированием
Старый 07.06.2013, 15:39   #3
Irina999
 
Регистрация: 07.06.2013
Сообщений: 3
По умолчанию

спасибо большое) не внимательная я))) все работает)
Irina999 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамические массивы с++ maxsept Общие вопросы C/C++ 2 27.10.2010 20:16
Динамические массивы и массивы варианты N@stya Помощь студентам 0 11.06.2010 21:09
Динамические массивы С++ LoRD_ОЛЕДЖАН Помощь студентам 13 21.07.2009 15:16
Динамические массивы на С++ LoRD_ОЛЕДЖАН Помощь студентам 3 14.07.2009 13:43