访问嵌套结构变量

时间:2019-01-30 16:32:13

标签: c arrays struct nested structure

当我尝试编译以下程序时,它在屏幕上没有输出:

#include<stdio.h>
int main ()
{
struct d1
{
char arr [10];
int num;
};

struct d2
{
struct d1 name;
int age;
}p1;

p1.name={("JANE",8)};
printf ("%s",&p1.name.arr[0]);
}

我认为问题是由于第p1.name={("JANE",8)};行引起的 但是我想我写的都没错。通过写这行代码,我尝试为成员"name"的变量p1具有结构类型d2的成员赋值。并且由于name本身是具有两个成员的d1类型的结构,因此我为JANE8分配了两个值arr [10]num name的成员。

我什至尝试过

p1.name={{"JANE",8}}; //For this it gives error

p1.name={("JANE",8),20}; //For this it compiles but no output

p1.name={{"JANE",8},20}; //again error

20p1's成员"age"的值。尝试打印值p1.name.age时,它给出的是0而不是20

怎么了?是否存在语法错误或概念错误?

2 个答案:

答案 0 :(得分:3)

  1. 仅在初始化结构后才允许使用您使用的表单。您需要使用复合文字。

import org.apache.spark.sql.{DataFrame, Column}
import org.apache.spark.sql.functions._

val arrayHead = udf((sequence: Seq[String]) => sequence.head)
val arrayTail = udf((sequence: Seq[String]) => sequence.tail)

// re-produces the ArrayType column recursively
val rewriteArrayCol = (c: Column) => {

  def helper(elementsRemaining: Column, outputAccum: Column): Column = {

    when(size(elementsRemaining) === lit(0), outputAccum)
    .otherwise(helper(arrayTail(elementsRemaining), concat(outputAccum, array(arrayHead(elementsRemaining)))))
  }

  helper(c, array())
}


// Test
val df = 
  Seq("100"  -> Seq("a", "b", "b", "b", "b", "b", "c", "c", "d"))
  .toDF("id", "sequence")
//  .withColumn("test_tail", arrayTail($"sequence"))   //head & tail udfs work
//  .withColumn("test", rewriteArrayCol($"sequence"))  //stackoverflow if uncommented

display(df)

答案 1 :(得分:2)

如果是初始化,请直接执行:

#include<stdio.h>

int main ()
{
  struct d1
  {
    char arr [10];
    int num;
  };

  struct d2
  {
    struct d1 name;
    int age;
  }p1 = {{"JANE",8}, 20};

  printf ("%s",&p1.name.arr[0]);
}

p1.name.num为8,p1.age为20

注释&p1.name.arr[0]可以为p1.name.arr