2014-12-09 19 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 ;-)。

相關問題