Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在C语言中存储和打印数组_Arrays_C_Algorithm_Macros_Malloc - Fatal编程技术网

Arrays 在C语言中存储和打印数组

Arrays 在C语言中存储和打印数组,arrays,c,algorithm,macros,malloc,Arrays,C,Algorithm,Macros,Malloc,我正在学习C语言的结构和算法,我花了好几个小时试图理解这个例子。 如果有人能简单地向我解释这一点,我会非常高兴,因为它显然在我头上飞舞,而我光滑的大脑无法理解它 代码如下: #include <stdlib.h> #include <stdio.h> #include <malloc.h> #include <errno.h> #include <string.h> #define r(i,j) r[(i)*n+(j)] int ma

我正在学习C语言的结构和算法,我花了好几个小时试图理解这个例子。 如果有人能简单地向我解释这一点,我会非常高兴,因为它显然在我头上飞舞,而我光滑的大脑无法理解它

代码如下:

#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#include <errno.h>
#include <string.h>
#define r(i,j) r[(i)*n+(j)]

int main()
{
  int *p, n, pom, i, j;
  long *r;
  FILE *d;

  d = fopen ("niz", "r");
  if (d == NULL)
    perror("Ne mogu otvoriti datoteku");

  for (n = 0; fscanf(d, "%d", &pom) == 1; n++);
  fseek (d, 0L, SEEK_SET);
  p = (int *) malloc (n * sizeof (int));

  if (p == NULL)
    perror("Nema dovoljno memorije za ucitati niz");

  for (n = 0; fscanf(d, "%d", &p[n]) == 1; n++);
  fclose (d);
  if ((r = (long *) malloc (n*n*sizeof(long))) == NULL)
    perror("Nema dovoljno memorije za rezultat");

  for (j = 0; j < n; j++)
  {
    r(0,j) = p[j];
    for (i = 1; i < n; i++)
      r(i,j) = r(i-1,j) * r(0,j);
  }
  free (p);
  for (i = 0; i < n; i++)
  {
    for (j = 0; j < n; j++)
      printf ("%10ld", r(i,j));
    printf ("\n");
  }

  d = fopen ("matrica", "wb");
  fwrite (&n, sizeof (int), 1, d);
  fwrite (r, sizeof (long), n*n, d);
  fclose (d);
  free (r);
  return 0;
}
#包括
#包括
#包括
#包括
#包括
#定义r(i,j)r[(i)*n+(j)]
int main()
{
int*p,n,pom,i,j;
长*r;
文件*d;
d=fopen(“niz”、“r”);
如果(d==NULL)
佩罗尔(Ne mogu Otforiti datoteku);
对于(n=0;fscanf(d,“%d”,&pom)==1;n++);
fseek(d,0L,SEEK_SET);
p=(int*)malloc(n*sizeof(int));
if(p==NULL)
perror(“Nema dovoljno memorije za UCITITI niz”);
对于(n=0;fscanf(d,,%d,&p[n])==1;n++);
fclose(d);
if((r=(long*)malloc(n*n*sizeof(long)))==NULL)
perror(“Nema dovoljno memorije za rezultat”);
对于(j=0;j
这基本上就是这段代码所做的,它从文件中读取一些数字,存储它们,然后以给定的数组在屏幕上打印出来。

所以我不明白的是,定义块是如何工作的,我们只知道它是如何工作的,用最简单的术语,比如,定义12岁,甚至从来没有计算过

除此之外,代码末尾还有两个for循环块,一个存储值,一个打印值,现在只要我能理解它是如何实现的。 我试着打印它存储的数字,对于变量“j”,我得到了正确的数字,从1到6,当我打印r(I,j)时,我得到了0或随机高数值,所以基本上我不明白它是如何计算它们的,或者定义中的公式与它有什么关系

我会感激任何帮助,因为我现在看这段代码太久了,我的大脑在这一点上感觉太平稳了,因为我不理解它

可以看出,最新的for循环打印数字工作得很好,但在它上面我放了两个printf函数来检查数字是否匹配,并找出它是如何工作的,但我根本无法找出它

变量“j”应该打印出6个数字,虽然从0到5,但在下面它是从1打印到6,但基本上它可以工作,我理解这一点

就在它下面,变量“r”正在打印0或某个随机的高数字,但当它最新为块打印时,它会按它应该的方式进行打印,而这一个我完全不理解。

\define AGE 12
\define r(I,j)r[(I)*n+(j)]
以同样的方式工作

在您的程序中,匹配
AGE
的代码将被替换为
12
,同样,代码加工
r(i,j)
将被替换为
r[(i)*n+(j)]
i
j
作为类似宏的函数的参数传递的值

假设
i
为1,
j
为2,
n
为5,
r(i,j)=r(i-1,j)*r(0,j)

相当于:

r[(1)*5 + (1)] = r[(1-1)*5 + (2)] * r[(0)*5 + (2)]
其金额为:

r[6] = r[2] + r[2]
将为索引为6的数组元素分配索引为2的数组元素中存储的值之和的结果

关于函数的作用,它只是一种数组算法,使用一维数组就像使用二维数组一样,避免了使用实际的二维数组来存储/打印值

如果将打印循环替换为以下内容:

for (i = 0; i < n * n; i++) { 
    printf("%10ld", r[i]); 
}
(i=0;i printf(“%10ld”,r[i]); } 您将看到相同的值,但打印为1D数组,实际上就是这样


打印出来的看似随机的数字只是一个提示,表明您正在访问数组,而不是调用未定义行为的数组边界。

宏就像简单的字符串替换
#define r(i,j)r[(i)*n+(j)]
的意思是“请将
r(A,B)
出现在后面的
r[(A)*n+(B)]
”。
#define r(i,j)
被称为类似宏的函数。应该有很多关于这方面的信息和例子。如果你在Linux上,但我看到你不是:P,我建议只使用gcc-E来运行预处理阶段。然后查看.i代码,这是结果。它可能很混乱,但主要功能应该是可读的。我不知道你们在用什么工具,但我认为你们也可以停止在预处理上构建过程。多亏了你们大家,我终于用#define function解决了第一部分,因为我被它吓了很久。如果有人想尝试帮助我解决第二部分,我已经对我的问题进行了编辑。♥谢谢!这完美地回答了我的第一个问题,真不敢相信我被困在这个问题上这么久,该死。我编辑了我的问题,试图找出第二部分,若你们知道什么,我很高兴你们能帮忙。再次感谢你,伙计@AdiKešetović,乐于帮助,请注意,根据网站指南,你应该就你的新疑问提出一个新问题,每个帖子一个问题,我很乐意回答,如果我在场,如果不在场,我相信会有人回答。别忘了发布一个最小的可复制示例,供用户复制和运行,其中包括硬编码数组值或文件内容。当然,谢谢,伙计,我会尝试进一步了解,如果我不了解,我会提出一个新问题。:)@AdiKešetović,这是一种良好的心态,我的意思是,首先尝试自己学习。提示:这只是一个简单的算法,可以像打印二维数组一样打印一维数组。如果您测试打印数组
(i=0;i
,您将看到数组上的值是打印的,但打印在一行中。我已经计算出来了