我有以下代码:
struct home {
int id;
int p;
int prio;
int rasp;
};
struct home *P[5];
int new[6][5] =
{
{ 1, 3, 5, 3, 1 },
{ 3, 5, 6, 5, 1 },
{ 7, 2, 3, 5, 0 },
{ 12, 1, 5, 3, 0 },
{ 20, 6, 3, 6, 1 },
{ 20, 7, 4, 7, 1 },
};
我需要将所有元素(没有每行的第一个元素)从数组new添加到struct home(在循环中)。例如,如果我们采用第一行,它看起来像这样:
id=3
p=5
prio=3
rasp=1
答案 0 :(得分:4)
你可以这样做:
P[0]=&new[0][1];
如果您确定您的矩阵具有结构所需的有效元素数量。
这将把结构向量的元素链接到矩阵,所以如果矩阵中的一个元素发生变化,它也会改变结构。
答案 1 :(得分:3)
您可以在代码中执行类似的操作,因为您的结构没有填充。因此它比复制元素更有效。您可以直接转换新矩阵的一部分,并在struct home指针数组中分配给struct home指针。
#include "stdio.h"
struct home {
int id;
int p;
int prio;
int rasp;
};
struct home *P[6];
int new[6][5] =
{
{ 1, 3, 5, 3, 1 },
{ 3, 5, 6, 5, 1 },
{ 7, 2, 3, 5, 0 },
{ 12, 1, 5, 3, 0 },
{ 20, 6, 3, 6, 1 },
{ 20, 7, 4, 7, 1 },
};
int main()
{
int i;
int offset = 1; // exclude first element.
for (i =0; i <6; ++i ) {
P[i] = (struct home*)&new[i][offset];
}
for (i= 0; i < 6; ++i) {
printf("%dth struct is\n",i);
printf("[%d].id:%d\n",i,P[i]->id);
printf("[%d].p:%d\n",i,P[i]->p);
printf("[%d].prio:%d\n",i,P[i]->prio);
printf("[%d].rasp:%d\n",i,P[i]->rasp);
}
}
答案 2 :(得分:2)
编写一个按元素执行复制元素的函数:
#define INDEX_ID 1
#define INDEX_P 2
#define INDEX_PRIO 3
#define INDEX_RAPS 4
struct home {
int id;
int p;
int prio;
int rasp;
};
int copydata( struct home *h, int row, int arr[][5] )
{
h->id = arr[row][INDEX_ID];
h->p = arr[row][INDEX_P];
h->prio = arr[row][INDEX_PRIO];
h->rasp = arr[row][INDEX_RAPS];
}
由于您知道数据是按升序排列的,因此您也可以使用memcpy
。但为此,您必须使用大量关于数据结构的隐式知识。
int copydata( struct home *h, int row, int arr[][5] )
{
memcpy( h, arr[row] + INDEX_ID, 4*sizeof(int) );
}
这是在循环中调用copydata
的方法:
int data[6][5] =
{
{ 1, 3, 5, 3, 1 },
{ 3, 5, 6, 5, 1 },
{ 7, 2, 3, 5, 0 },
{ 12, 1, 5, 3, 0 },
{ 20, 6, 3, 6, 1 },
{ 20, 7, 4, 7, 1 },
};
struct home *P[6];
for ( int row = 0; row < 6; row++ )
{
P[row] = malloc( sizeof(struct home) );
copydata( P[row], row, data );
}
答案 3 :(得分:0)
您可以创建所有变量的数组,并使用其名称创建枚举。
然后您可以插入数组中的值。