LINUX.ORG.RU

видимость переменных в разных функциях в С


0

0

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <magick/api.h>
#include <math.h>

int recursion(int x, int y, int f,int cc,int sz){
  printf ("%d %d %d %d %d\n",x,y,f,cc,sz);
  if (cc<sz){
    if (m[x][y]==3) {
      printf ("sovpalo!\n");
    }
  } else {
    printf ("deep recursion, closed!\n");
  }
  return 1;
}

int main(int argc,char **argv) {
  ...
  int **m;
  ...
  m = malloc(w * sizeof(*m));
  for (i=0; i<w; ++i){
    m[i] = malloc ( h * sizeof(**m));
  }
  for (i = 0; i <= w-1; i++) {
    for (j = 0; j <= h-1; j++) {
      m[i][j]=(int)255*pixels[j+h*i].blue/65535;
    }
  } c=0;
  for (i = 0; i <= w-1; i++) {
    for (j = 0; j <= h-1; j++) {
      if (m[i][j]!=255 && c<size){
        c++; //x=i; y=j;
        recursion(i,j,1,c,size);
        printf ("ok\n");
      }
    }
  }
  ...
}

при компиляции выскакивает такая вещь, что мол типа, не вижу массива m

[vilfred@observ contur]$ gcc `Magick-config --cflags --cppflags` contur.c `Magick-config --ldflags --libs`;
contur.c: In function `recursion':
contur.c:10: `m' undeclared (first use in this function)
contur.c:10: (Each undeclared identifier is reported only once
contur.c:10: for each function it appears in.)
contur.c:18: parse error before '}' token
contur.c: At top level:
contur.c:22: parse error before "else"
[vilfred@observ contur]$

Однако он был объявлен в функции main(), из котороый и происходит 
вызов функции recursion() Вобщем, что надо читать на предмет того, 
как  сделать массив видимым в любой из вызываемых функций? Да и 
потом, я не шарю да и не хотелось бы массив массивов передавать 
при каждом рекурсивном вызове.

Спасибо за ответ!
☆☆

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <magick/api.h>
#include <math.h>


int recursion(int , int , int , int , int );

int main(int argc,char **argv) {
  ...
  int **m;
  ...
  m = malloc(w * sizeof(*m));
  for (i=0; i<w; ++i){
    m[i] = malloc ( h * sizeof(**m));
  }
  for (i = 0; i <= w-1; i++) {
    for (j = 0; j <= h-1; j++) {
      m[i][j]=(int)255*pixels[j+h*i].blue/65535;
    }
  } c=0;
  for (i = 0; i <= w-1; i++) {
    for (j = 0; j <= h-1; j++) {
      if (m[i][j]!=255 && c<size){
        c++; //x=i; y=j;
        recursion(i,j,1,c,size);
        printf ("ok\n");
      }
    }
  }
}

int recursion(int x, int y, int f,int cc,int sz){
  printf ("%d %d %d %d %d\n",x,y,f,cc,sz);
  if (cc<sz){
    if (m[x][y]==3) {
      printf ("sovpalo!\n");
    }
  } else {
    printf ("deep recursion, closed!\n");
  }
  return 1;
}

stalcker
()

Делай массив глобальным, но это отстой. Если не хочешь отстоя, то передавай в функцию - он же (int **m) указатель на указатель на инт.

anonymous
()

спасибо за ответы, народ! :)

Еще вот вопрос, это надо будет на perl-XS переписывать, а он С понимает в стандарте C99 вроде бы как? Где ннить про стандарты можно еще прочитать? А то напишу, а надо будет переделаывать вобщем.

vilfred ☆☆
() автор топика
Ответ на: комментарий от vilfred

Можешь почитать книгу "Язык программирования С", Хабирсон и Стил, они вроде кой-чего писали о стандарте, о сравнении снового и страрого стандарта.

stalcker
()
Ответ на: комментарий от stalcker

> int recursion(int , int , int , int , int );

> int main(int argc,char **argv) {

Правило коммутативности no-dashi: от перестановки функций область видимости локальной для функции "main" переменной "m" не меняется.

no-dashi ★★★★★
()
Ответ на: комментарий от anonymous

нарыл в инете, как указатель на указатель на инт сделать 
(с предвартиельным объявлением не получилось)

вобщем, передаю массив массивов m вот так вот:

recursion(i,j,1,c,size,&m,h);


int recursion(int x, int y, int f,int cc,int sz,void *massiv,int h){
//  printf ("%d %d %d %d %d\n",x,y,f,cc,sz);
  printf ("[ %d ]\n",(int)((int*)(massiv)+3*h+3));
  return 1;
}

но оно печатает стабильно 

[ -1073743608 ]

т.е. идея из инета такая, оно воспринимается как строка с числами и 
отсчитывая по 3*h+3 символов я хочу получить пиксел с координатами 
(x,y) = (3,3) соответственно.

Еще интересует вопрос, рекурсивный вызов будет из самой рекурсии, 
там также надо передавать указатель на указатлеь? 
Не запутается ли оно и не будет ли пеерезапись в буфер, где хранится массив? 

vilfred ☆☆
() автор топика
Ответ на: комментарий от stalcker

void tmp ( int i_in, int j_in, int **l)
{
	int i, j;
	l = (int**)malloc (sizeof(int) * i_in);
	for ( i = 0; i < i_in; ++i)
	{
		l[i] = (int*)malloc (sizeof(int) * j_in);
	}
}

int main()
{
	int **l = NULL;
	int i, j;
	i = 10;
	j = 10;
	tmp ( i, j, l);
	return 0;
}

Вот как указательна на указатель на инт передать в вфункциюи выделить память для массива 10x10, далше сам думай.

stalcker
()
Ответ на: комментарий от vilfred

>но оно печатает стабильно 

>[ -1073743608 ]

У тебя же m - массив к указателей.
Вызывая recursion(...,&m,...) - получается, что в recursion ты передаешь
m как int***. Затем этот int*** ты приводишь к void*, после чего void* приводишь к int*. Т.е. фактически ты получил следующее выражение:

int ***m1; //значение адреса m, переданое как &m
int *massiv = (int***)m1; //massiv - локальная переменная-указатель в recursion,
                      // которая указывает черт знает куда.

Делай так:

recursion(...,int **m,...)
{
 ...
   ...m[x][y]...
 ...
}

main()
{
   recursion(...,m,...);  
}


kosmonavt
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.