【问题标题】:convert information of struct of an pointer to array将指针的结构信息转换为数组
【发布时间】:2016-01-23 19:36:07
【问题描述】:

我有一个for循环的问题,它应该将指针的结构信息放入数组。此结构用于复数。问题是数字 m[n].re/.im - 它们不是 korrekt。

typedef struct
{
  float re, im;
} Complex;

#define N 2
#define M 2

int main()
{
Complex* p;
Complex matrix[N][M]; //already filled
Complex m[N*M];
int n;

n = 0;
p = NULL;

for(p = &matrix[0][0]; p<= &matrix[0][0]+N*M-1; p++)
    {
        m[n] = *p;
        n = n+1;
    }
}

【问题讨论】:

  • 1) 使用标准类型! C 已经有_Complex(虽然它是可选的——检查你的编译器)。 2)类型是有原因的。为什么不正确索引二维数组? 3) 不要使用单字母宏名称。 ROWS 有什么问题? 4)使用相同的字母只是不同的大小写已经是不好的风格了。将它们用于不相关的项目更糟糕。
  • 为什么评论“已经填满”? Complex matrix[N][M]; 未初始化。
  • 基本上我觉得你的代码是没有问题的。 DEMO 它将按预期工作。 (二维数组的特殊情况,除了那些不需要的)

标签: c arrays pointers matrix struct


【解决方案1】:

例如,您可以使用标头 &lt;string.h&gt; 中声明的标准 C 函数 memcpy

memcpy( m, matrix, N * M * sizeof( Complex ) ); 

如果你想使用一个使用指针的循环,那么它可以看起来像下面这样

for ( Complex *q = ( Complex * )matrix, *p = m; q != ( Complex * )matrix + N * M; p++, q++ )
{
    *p = *q;
}

【讨论】:

  • Проблема в том, что указатель используется в подпрограмме(я сократил текст тут)。 Такбы использовал первый вариант。 А второй я не совсем понял, к сожалению。
  • @ wildcoonвторойвариант - это,Фактически,копиявашеговарианта,Тольковместопеременнойиндексаn,яиспользуюешеодинуказазатель。 Возможно ваша проблема состоит в том, что после копирования указатель p нужно снова установить на первый элемент массива。
  • @Wildcoon si fueris Rōmae, Rōmānō vivitō mōre; si fueris alibī, vivitō sicut ibi ‎
  • Второй вариант смог бы сработать, но у меня нет на самом деле 矩阵в том месте - есть только указатель на её адрес。 Я сократил тектс кода, там на самом деле беда в подпрограмме, которая получает только адрес первого элемента 矩阵。 Из-за этого и весь конфуз。
  • @Wildcoon Не видя кода, который воспроизводит ошибку, трудно что-либо сказать。
【解决方案2】:

我已经修改了你的程序来初始化矩阵数组,并在使用 for 循环复制后将矩阵和数组 m 的值打印到标准输出:

#include <stdio.h>

typedef struct
{
  float re, im;
} Complex;

#define N 2
#define M 2

int main()
{
    Complex* p;
    Complex matrix[N][M]; //already filled
    Complex m[N*M];
    int idx, jdx, val = 1;
    for (idx = 0; idx < N; idx++) {
            for (jdx = 0; jdx < M; jdx++) {
                    matrix[idx][jdx].re = val;
                    matrix[idx][jdx].im = val;
                    ++val;
            }
    }
    int n;

    n = 0;
    p = NULL;

    for (p = &matrix[0][0]; p < &matrix[0][0] + N*M; p++)
    {
            printf("matrix[%d] = %f + %fi\n", n, p->re, p->im);
            m[n] = *p;
            n = n+1;
    }

    int midx = 0;
    for (midx = 0; midx < N*M; midx++) {
            printf("m[%d] = %f + %fi\n", midx, m[midx].re, m[midx].im);
    }
    return 0;

}

我不确定发生了什么,但在我看来,您似乎没有初始化数组。请记住,memcpy 是您的朋友。希望这段代码有所帮助。

【讨论】:

    【解决方案3】:

    我认为指针p 包含struct Complex 的地址。不确定,但像这样尝试一次

    for(p = &matrix[0][0]; p<= &matrix[0][0]+N*M-1; p = p + sizeof(int))
        {
            m[n] = *p;
            n = n+1;
        }
    }
    

    【讨论】:

      【解决方案4】:

      复制最快的方法是使用memcpy,但是如果你想使用循环,代码应该是这样的

      Complex matrix[N][M];
      Complex array[N*M];
      
      Complex *p = array;
      for ( int n = 0; n < N; n++ )
          for ( int m = 0; m < M; m++ )
              *p++ = matrix[n][m];
      

      响应评论,只给定一个指向矩阵的指针,并且知道维度,可以创建一个像二维数组一样的指针。

      void someFunction( Complex *matrix, int sizeN, int sizeM )
      {
          Complex (*p)[sizeM] = (void *)matrix;
      
          for ( int n = 0; n < sizeN; n++ )
              for ( int m = 0; m < sizeM; m++ )
                  printf( "%f %f\n", p[n][m].re, p[n][m].im );
      }
      

      【讨论】:

      • 我不能再使用矩阵了——这就是问题所在。我应该把整个代码都给她——我删了很多东西,因为它太长了。实际上我有一个子程序,我只从 main 获取矩阵的第一个地址。这就是为什么我坚持这个指向数组的指针的转换。
      • @Wildcoon 好的,现在我明白了。我尝试在 Vlad 的回答下翻译 cmets,但是 google 翻译的不是很好。
      • 非常感谢您对我的帮助!我必须稍后再处理 - 这里已经是晚上了 =)
      猜你喜欢
      • 1970-01-01
      • 2018-06-11
      • 1970-01-01
      • 2017-01-19
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2014-09-07
      • 2014-08-16
      相关资源
      最近更新 更多