2014-12-09 13 views
6

Ho alcuni problemi in C con i puntatori e le strutture: Ho 2 entità della struct Signal e il puntatore activeSignal per memorizzare una delle entità. Ora, voglio usare questa entità "memorizzata" nella mia funzione printParameters() per stampare i valori della mia struct. Sfortunatamente, il display del mio microcontrollore stampa alcuni geroglifici al posto del mio valore. Devo ammettere che non sono completamente guardando attraverso puntatore-aritmetica ...Puntatore su Struct utilizzato nella funzione

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

Non sono affatto un esperto di C, ma questo mi sembra giusto. Funziona correttamente se si sostituisce 's-> signalchar.name' con semplicemente' "Hello" '? –

+0

Humor me per un momento e prova 'printf ("% s ", s-> signalchar.name);'. Il codice mi sta bene; a parte il fatto che 'name' dovrebbe essere un' const char * 'se assegni letterali ad esso. – Bathsheba

+0

Sei sicuro che 'lcdPrintf' funziona correttamente? Hai provato 'lcdPrintf (0,11,9,"% s "," Sinus ");'? Aggiungi punto e virgola nella tua struct. –

risposta

1

Qui, ci sono alcuni piccoli errori nel codice. Credo che quelli siano errori di battitura.

  1. Nessuna dichiarazione diretta per printParameters().
  2. nella tua main(), la funzione chiamata è printParameter() che dovrebbe essere printParameters().
  3. dispersi e virgola dopo struct SigParameter signalchar

Tuttavia, non vedo una logica per l'utilizzo del struct Signal *activeSignal = &s1; se si vuole semplicemente stampare il valore.

È possibile controllare il codice sottostante.

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

ho usato semplice printf() al posto del tuo lcdPrintf(), ma funziona bene.

uscita:

[sourav @ spadone Temp] $ ./a.out

Rect

+0

beh, questo era solo un estratto del mio codice. se uso printParameters (s2) funziona correttamente. ma voglio implementarlo un po 'più dinamico, quindi lo stavo provando con quel puntatore sulla struct –

+0

@JulianHerbel quanto dinamico? come cambiare il valore e/o l'allocazione della memoria? a parte questo, per qualsiasi tipo di operazione, sopra il codice _should_ funziona bene. –

+0

@JulianHerbel 1) per modificare il valore, è sufficiente passare '& s1' o' & s2'. 2) Attenzione, i valori letterali delle stringhe di solito sono "di sola lettura". –

0
struct SigParameter signalchar 

In questo punto e virgola non è stato posizionato. Potrebbe essere un errore.

Quindi Mentre si assegna il valore al puntatore del carattere, è necessario allocare la memoria per quel puntatore. Altrimenti memorizzerà il valore nella memoria del registro.

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

È possibile allocare la memoria per quella variabile del puntatore ed eseguire il lavoro.

Poi si chiedono la funzione

printParameter(activeSignal); 

ma la funzione è,

printParameters(activeSignal); 
+0

beh, non vedo alcun problema in '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); 
} 

Questo funziona per me su gcc-4.8.1, quindi non c'è niente di sbagliato con il puntatore aritmetica. Probabilmente è correlato al clib del tuo microcontrollore. Per dare più risposte utili dovremo sapere quale Microcontrollore stai usando e abbiamo bisogno della definizione di lcdPrintf.
A proposito, typedef ha un sacco di digitazione in C ;-).

Problemi correlati