2014-12-09 9 views
6

Mam pewne problemy w C ze wskaźnikami i strukturami: Mam 2 elementy struktury Signal i wskaźnik activeSignal do przechowywania jednego z elementów. Teraz chcę użyć tej "przechowywanej" encji w mojej funkcji printParameters(), aby wydrukować wartości mojej struktury. Niestety, mój wyświetlacz mikrokontrolera wypisuje niektóre hieroglify zamiast mojej wartości. Muszę przyznać, że nie jestem całkowicie pominie wskaźnik-arytmetyki ...Wskaźnik na platformie używanej w funkcji

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

Nie jestem ekspertem od C, ale wydaje mi się to słuszne. Czy działa poprawnie, jeśli zastąpisz 's-> signalchar.name' po prostu' "Hello" '? –

+0

Uspokój się na chwilę i wypróbuj 'printf ("% s ", s-> signalchar.name);'. Kod wygląda dobrze dla mnie; poza tym, że 'name' powinno być' const char * 'jeśli przypisujesz do niego literały. – Bathsheba

+0

Czy jesteś pewien, że 'lcdPrintf' działa poprawnie? Czy próbowałeś 'lcdPrintf (0,11,9,"% s "," Sinus ");'? Dodaj średnik w swojej strukturze. –

Odpowiedz

1

tutaj istnieją pewne drobne błędy w kodzie. Uważam, że są to literówki.

  1. Brak zgłoszenia z wyprzedzeniem dla printParameters().
  2. w swojej main(), funkcja nazywa się printParameter(), która powinna być printParameters().
  3. brakuje średnik po struct SigParameter signalchar

Ja jednak nie widzę, za pomocą logiki struct Signal *activeSignal = &s1; jeśli chcesz po prostu wydrukować wartości.

Możesz sprawdzić poniższy kod.

#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); 
} 

Użyłem prosty printf() zamiast swojego lcdPrintf(), ale działa dobrze.

wyjściowa:

[Sourav @ pałasz temp] $ ./a.out

Rect

+0

cóż, to był tylko wyciąg z mojego kodu. jeśli używam printParameters (s2), to działa dobrze. ale chcę zaimplementować go nieco bardziej dynamicznie, więc próbowałem go z tym wskaźnikiem na struct –

+0

@JulianHerbel jak dynamiczny? jak zmienić wartość i/lub alokację pamięci? poza tym, dla każdego rodzaju operacji, powyżej kodu "powinien" działać poprawnie. –

+0

@JulianHerbel 1) w celu modyfikacji wartości, po prostu przekazuj '& s1' lub' & s2'. 2) uważaj, literały łańcuchowe są zwykle "tylko do odczytu". –

0
struct SigParameter signalchar 

W tym średnik nie jest umieszczony. Może być to błąd.

Następnie Przypisując wartość do wskaźnika postaci, musisz przydzielić pamięć dla tego wskaźnika. W przeciwnym razie zapisuje wartość w pamięci rejestru.

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

Można przydzielić pamięć dla tej zmiennej wskaźnika i wykonać w niej pracę.

Potem dzwonisz funkcję

printParameter(activeSignal); 

ale funkcja jest

printParameters(activeSignal); 
+0

cóż, nie widzę problemu w 's1.signalchar.name =" Sinus ";' –

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); 
} 

Działa to dla mnie na gcc-4.8.1, więc nie ma nic złego z wskaźnikiem arytmetyki. Prawdopodobnie jest to związane z clib twojego Microcontrollera. Aby udzielić bardziej przydatnych odpowiedzi, będziemy musieli wiedzieć, z jakiego mikrokontrolera korzystasz i potrzebujemy definicji lcdPrintf.
Nawiasem mówiąc, typedefs bezpieczne dużo pisania w C ;-).