如何将数组[4]转换成数组[2][2]?

3
我有一个数组short frame[4],我希望将其作为函数参数short frame[2][2],该怎么做?我尝试了不同的方法(例如*(short [2][2])&frame[0]*)),但是我仍然收到错误消息。同时,如果我声明函数void function(short frame[2][2])并用 function(&frame[0]) 调用该函数,也不起作用,而frame是一个short frame[4];

1
你为什么想要这样做?将从2个索引转换为单个索引,像这样:z = y * 2 + x;,然后再像这样转换回去:x = z % 2; y = z / 2; - SpacedMonkey
4个回答

2

我认为这不是一个好的实践方法,无论如何:

f((short (*)[2])a);

1
+1. 这个方法可行的原因是,作为函数参数 short frame[2][2]short (*frame)[2] 是相同的。我认为这是否违反了严格别名规则有点棘手。我记不清结果了,所以对于来说假设它不违反规则肯定不是一个好习惯。其他人对其有效性的信心可能更高,但无论如何,这就是提问者要求的;-) - Steve Jessop

1

这在这里可以工作,尽管有一个警告。

#include <stdio.h>
void function(short frame[2][2])
{
  for (int i = 0; i < 2; i++)
    for (int j = 0; j < 2; j++)
      printf("%d ", frame[i][j]);
  printf("\n");
}
int main()
{
  short frame[4] = { 0, 1, 2, 3 };
  function(&frame[0]);
  return 0;
}

你收到了什么错误信息?

我也尝试过这个,但是...哦,不好意思!你是对的!那只是一个警告,不是错误!它可以工作,谢谢! :) - user1859796
警告应该主要被修复。 - md5
@Kirilenko 正确的修复需要两个“frame”是相同类型的...但这并不能回答user1859796的问题。通过将其强制转换为“short (*)[2]”来消除警告并不好:我更喜欢被警告。 - kmkaplan

0

你不能在不同维度的数组之间进行转换。

它不知道你想要哪个方向。

你必须编写一个函数。

伪代码如下:

function castArray(short[4] input){
   short[2][2] output = new short[2][2];
   output[0][0] = input[0];
   output[0][1] = input[1];
   output[1][0] = input[2];
   output[1][1] = input[3];
   return output;
}

我不想复制。在内存中,数组[4]的字节是相继的,例如 0x34 -> array[0]
0x35 -> array[1]
...为了更好地使用,我希望可以访问该内存,如下所示 0x34 -> array[0][0]
0x35 -> array[0][1]
0x36 -> array[1][0]
...
- user1859796

0
你可以通过以下简单的方式实现:
将一维数组转换为二维数组。
short frame[MAX];
short dup_frame[ROW][COL];
int i,j,k;
for(i = 0 ; i < MAX ; i++)
{
  j= i / ROW ;  // you can do it by i / COL also 
  k= i % ROW ; // you can do it by i % COL also 
  dup_frame[j][k] = frame[i];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接