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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.02.2012, 23:26   #1
blain
Пользователь
 
Регистрация: 26.01.2012
Сообщений: 19
Злость Си проблема с функциями(

В матрице A(m,n), состоящей из нулей и единиц, найти квадрат заданного размера (квадратную подматрицу), состоящий целиком из нулей.

нужно всё написать с помощью функций....
я написал, но прога не работает не хочет компилироваться.... пишет:

[Linker error] undefined reference to `search(int*)'
[Linker error] undefined reference to `out_mas(int*)'
ld returned 1 exit status

Код:
#include <stdio.h>
#include <conio.h>
# define M 5
# define N 4
void in_mas(int*);
void out_mas(int*);
void search(int *);
int main (void)
{ int a[M][N], *raz=NULL, *kol=NULL;
in_mas(&a[0][0]);
search (&a[0][0]);
out_mas (&a[0][0]);
getch();
return 0;
}
void in_mas(int *p)
 { int i;
   for (i=0; i<N*M; i++)
   scanf("%d", p+i);
 }
void search(int *p, int*raz, int *kol )
 { int i, r, k=0;
  printf("Vvedi razmer podmatr\n");
  scanf("%d", &r);
  for (i=0; i<N*M; i++)
   if(((*p+i==0)&&(*p+i+N==*p+i))||((*p+i==0)&&(*p+i-N==*p+i))) k++;
  raz=&r;
  kol=&k;
 
 } 
void out_mas(int *p, int*raz, int *kol )
 {int i;
   for (i=0; i<N*M; i++)
   printf("  %d   ", *p+i);
 if (*raz**raz==*kol) printf ("Est`");
 else ("net");
}
что такое??
blain вне форума Ответить с цитированием
Старый 01.02.2012, 23:34   #2
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

У вас эти функции, на которые ругается редактор связей объявлены и определены с разным количеством параметров. То есть объявления функций не соответствуют их определениям. Так, например, функция search объявлена как void search(int *);, то есть с одним параметром, а определена как void search(int *p, int*raz, int *kol ), то есть с тремя параметрами.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 01.02.2012, 23:47   #3
blain
Пользователь
 
Регистрация: 26.01.2012
Сообщений: 19
По умолчанию

Цитата:
Сообщение от Сыроежка Посмотреть сообщение
У вас эти функции, на которые ругается редактор связей объявлены и определены с разным количеством параметров. То есть объявления функций не соответствуют их определениям. Так, например, функция search объявлена как void search(int *);, то есть с одним параметром, а определена как void search(int *p, int*raz, int *kol ), то есть с тремя параметрами.
теберь проблема в том, что прога зависает и винда предлагает послать сообщение в цент об ошибке...

Код:
#include <stdio.h>
#include <conio.h>
# define M 5
# define N 4
void in_mas(int*);
void out_mas(int*, int*, int*);
void search(int*, int*, int*);
int main (void)
{ int a[M][N], *raz=NULL, *kol=NULL;
in_mas(&a[0][0]);
search (&a[0][0], raz, kol);
out_mas (&a[0][0], raz, kol);
getch();
return 0;
}
void in_mas(int *p)
 { int i;
   for (i=0; i<N*M; i++)
   scanf("%d", p+i);
 }
void search(int *p, int*raz, int *kol )
 { int i, r, k=0;
  printf("Vvedi razmer podmatr\n");
  scanf("%d", &r);
  for (i=0; i<N*M; i++)
   if(((*p+i==0)&&(*p+i+N==*p+i))||((*p+i==0)&&(*p+i-N==*p+i))) k++;
  raz=&r;
  kol=&k;
 
 } 
void out_mas(int *p, int*raz, int *kol )
 {int i;
   for (i=0; i<N*M; i++)
   printf("  %d   ", *p+i);
 if (*raz**raz==*kol) printf ("Est`");
 else ("net");
}
blain вне форума Ответить с цитированием
Старый 02.02.2012, 01:55   #4
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Очевидно, что программа некорректная.

Например, в функции search не понятно, что вы делаете в этом цикле

Код:
 for (i=0; i<N*M; i++)
   if(((*p+i==0)&&(*p+i+N==*p+i))||((*p+i==0)&&(*p+i-N==*p+i))) k++;
Во-вторых, какой смысл следующего присваивания значений локальным переменным этой фукнции raz и kol, если при выходе из функции эти локальные переменные будут уничтожены?

Код:
  raz=&r;
  kol=&k;
Вы наверное думаете, что эти значения получат одноименные переменные из главной функции? Но вы ошибаетесь. Те так и останутся равными NULL. Поэтому эти значения NULL вы передаете далее в функцию out_mas, что должно привести к аварийному завершению программы, если оно не наступило еще раньше.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 02.02.2012, 10:42   #5
blain
Пользователь
 
Регистрация: 26.01.2012
Сообщений: 19
По умолчанию

ну а как тогда сделать так, чьтобы из одной функции в другую передавались значения...??
blain вне форума Ответить с цитированием
Старый 02.02.2012, 12:34   #6
Inv1s
Форумчанин
 
Аватар для Inv1s
 
Регистрация: 06.11.2011
Сообщений: 214
По умолчанию

Не знаю как у вас, но у меня в универе сильно придираются, что есть функция, а что процедура.
Твоя процедура search в if делает что то уж очень страшное.

P.S. *p+i+N==*p+i - это равно когда N = 0;
Помог, нажми на весы
html, js, php, С++, С#, OpenGl, DirectX, XNA, HLSL
Inv1s вне форума Ответить с цитированием
Старый 02.02.2012, 14:44   #7
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от blain Посмотреть сообщение
ну а как тогда сделать так, чьтобы из одной функции в другую передавались значения...??
Вам надо изменить дезайн вашей функции search. То есть размер искомой квадратной матрицы запрашивать в главной функции main и передавать его в функцию search как параметр функции.

Как я понимаю, у вас проблема, как вернуть искомые номера строки и столбца, где находится эта квадратная матрица.
Есть два варианта. Вы можете объявить структуру, которая будет хранить координаты строки и столбца и возвращать ее из функции при условии, что вы проходили, что такое структуры. например,

Код:
struct Position
{
   int row;
   int col;
};
Тогда объявление вашей функции search может выглядеть следующим образом:

Код:
struct Position search( int a[], int m, int n, int k );
Здесь int a[] - исходный массив, int m - количество строк, int n - количество столбцов, int k - размер искомой квадратной матрицы.
Если не будет найдена квадратная матрица, то в элементах структуры передавать значения -1.

Второй вариант - это передавать координаты искомой матрицы через указатели:

Код:
int search( int a[], int m, int n, int *raz, int *kol );
Здесь возвращаемое значение либо 1, либо 0 в зависимости от того, найдена ли квадратная матирца или нет. Последние два параметра - это указатели на строку и колонку, где располагается квадратная матрица.
Отличие от вашего кода состоит в том, что вы юудуте в эти переменные заносить не адрес строки и столбца, как вы делали

Код:
  raz=&r;
  kol=&k;
а значения строки и колонки. То есть у ва в функции должно выглядеть следующим образом:

Код:
  *raz = r;
  *kol = k;
В функции main вы эти переменные должны объявить как

Код:
int raz;
int kol;
и передавать их в функцию search следующим образом:

Код:
search( a, M, N, &raz, &kol );
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с функциями! Ислам Помощь студентам 21 03.03.2011 21:35
Проблема в Delphi 2010 с функциями работы со строками Likos Общие вопросы Delphi 7 21.12.2010 19:42
Проблема с виртульными функциями petrovich985 Общие вопросы C/C++ 7 18.12.2010 20:39
Проблема с функциями из math.h maryan.vetrov Общие вопросы C/C++ 2 01.08.2010 19:34
проблема с функциями world12_tk Помощь студентам 6 03.03.2009 19:34