2014-12-09 18 views
6

我在指针和结构中使用C有一些问题: 我有2个实体结构Signal和指针activeSignal来存储其中一个实体。现在,我想在我的函数printParameters()中使用这个“存储”实体来打印我的结构的值。不幸的是,我的微控制器显示器打印了一些象形文字,而不是我的价值。我不得不承认,我并没有完全看透指针算术......函数中使用的结构上的指针

struct SigParameter { 
    char *name; 
    int value; 
}; 

struct Signal { 
    struct SigParameter signalchar; 
}; 

int main(void) { 
    struct Signal s1; 
    struct Signal s2; 
    s1.signalchar.name = "Sinus"; 
    s2.signalchar.name = "Rect"; 
    struct Signal *activeSignal = &s1; 

    printParameters(activeSignal); 
} 

void printParameters(struct Signal *s) { 
    lcdPrintf(0,11,9,"%s", s->signalchar.name); 
} 
+1

我绝不是C专家,但这看起来确实对我很好。如果用简单的'“Hello”替换's-> signalchar.name',它能正常工作吗? – 2014-12-09 13:24:59

+0

幽默我一会儿,试试'printf(“%s”,s-> signalchar.name);'。代码对我来说看起来很好;除了'name'应该是一个'const char *'这个事实,如果你给文本赋值的话。 – Bathsheba 2014-12-09 13:25:04

+0

你确定'lcdPrintf'工作正常吗?你尝试过'lcdPrintf(0,11,9,“%s”,“Sinus”);'?在你的结构中添加分号。 – 2014-12-09 13:26:23

回答

1

这里,你的代码有一些小错误。我相信那些是错别字。

  1. 没有前向声明printParameters()
  2. 在您的main(),函数调用是printParameter()应该是printParameters()
  3. 缺少分号后struct SigParameter signalchar

但是,我没有看到,逻辑使用struct Signal *activeSignal = &s1;,如果你只是想要打印的值。

您可以查看下面的代码。

#include <stdio.h> 
#include <stdlib.h> 


struct SigParameter { 
char *name; 
int value; 
}; 

struct Signal { 
struct SigParameter signalchar; 
}; 

void printParameters(struct Signal s); 

int main(void) { 
struct Signal s1; 
struct Signal s2; 
s1.signalchar.name = "Sinus"; 
s2.signalchar.name = "Rect"; 

printParameters(s2); 
    return 0; 
} 

void printParameters(struct Signal s) { 
    printf("%s\n", s.signalchar.name); 
} 

我用简单的printf(),而不是你lcdPrintf(),但它工作正常。

输出:

[sourav @大刀临时] $ ./a.out

矩形

+0

好吧,这只是我的代码的一个提取。如果我使用printParameters(s2)它工作正常。但我想实现它有点动态,所以我试图用结构上的指针 – 2014-12-09 13:43:39

+0

@JulianHerbel如何动态?像改变价值和/或内存分配?除此之外,对于任何类型的操作,上面的代码_应该可以正常工作。 – 2014-12-09 13:47:19

+0

@JulianHerbel 1)修改该值,只需传递'&s1'或'&s2'即可。 2)小心,字符串文字通常是“只读”的。 – 2014-12-09 13:48:48

0
struct SigParameter signalchar 

在这种分号没有放置。可能是一个错误。

然后,当分配值给字符指针时,你必须为该指针分配内存。否则它会将值存储在寄存器存储器中。

s1.signalchar.name = "Sinus"; 
s2.signalchar.name = "Rect"; 

您可以为该指针变量分配内存并执行该操作。

然后你调用的函数

printParameter(activeSignal); 

但功能,

printParameters(activeSignal); 
+0

好吧,我在's1.signalchar.name =“Sinus”中看不到问题;'' – 2014-12-09 13:34:47

0
#include <stdio.h> 
typedef struct{ 
    char *name; 
    int value; 
}SignalParameters; 

typedef struct{ 
    SignalParameters signalchar; 
}Signal; 
void printSignal(Signal* s); 
int main(void) { 
    Signal s; 
    s.signalchar.name = "Sinus"; 
    printSignal(&s); 
    return 0; 
} 

printSignal(Signal * s) { 
    printf("%s", s->signalchar.name); 
} 

这对我的作品在GCC-4.8.1,所以有什么错与您的指针运算。这可能与你的微控制器的关系有关。为了给出更有用的答案,我们需要知道你正在使用哪个微控制器,并且我们需要定义lcdPrintf。
顺便说一句,typedefs可以安全地输入C ;-)。

相关问题