Hallo, ich stehe gerade voll auf dem Schlauch, weil ich die Messergebnisse einer 10-Kanal-AD-Wandlung als Funktionsparameter zurückgeben will und das klappt einfach nicht. Übersetzt wird der Code so wie unten angegeben ohne Fehlermeldung oder Warnung, aber die von der Funktion zurückgelieferten Messwerte stimmen nicht (sieht nach Zufallszahlen aus). Wenn ich die Messwerte IN der Funktion anzeigen lasse und keine Funktionsparameter für die Rückgabe verwende, sind die Werte in Ordnung. Hat jemand eine Idee ? So sieht der Code aus (schematisch) char get_data_10_channel(ULONG *l_flags_val_channel, unsigned int *l_ADC12data_10_channel[10]); // Funktion zur Messwerterfassung : { .. for (ni=0; ni<8; ni++) // AD-Wandlungen { ... *l_ADC12data_10_channel[ni] = ADC12MEM0; // ADC-Kanal ni speichern *l_flags_val_channel |= (1<ni); // Flags für Messwert } } int main(void) // Hauptprogramm { ULONG lflags_valADC12_channel; // Flags erfasste ADC-Messwerte unsigned int *lADC12data_10_channel[10]; // ADC-Messwerte der Kanäle ... // Messdaten über 8 Kanäle des 4051 lesen : rcode = get_data_10_channel_4051(&lflags_valADC12_channel, lADC12data_10_channel); // Modul "mod_messungen01.c" ... }
interrupt schrieb: > unsigned int *lADC12data_10_channel[10]; Entweder hast du hier vergessen, die 10 Zeiger auf unsigned int zu initialisieren oder, was ich eher vermute, es war eigentlich als Array von 10 unsigned ints gedacht und falsch deklariert. Auf jeden Fall schreibst du in deiner Funktion an 8 zufällige Adressen.
Hallo, eigentlich soll in der Funktion ein Array mit 10 unsigned int als Parameter die Messergebnisse zurückliefern. Das wäre die Variable "unsigned int *l_ADC12data_10_channel[10]" Warum ist das als Array von 10 unsigned int falsch deklariert ? So sioeht die Funktion zur ADC-Messung schematisch aus : char get_data_10_channel(unsigned int *l_ADC12data_10_channel[10]); { *l_ADC12data_10_channel[ni] = ADC12MEM0; // ADC-Kanal ni }
interrupt schrieb: > unsigned int *l_ADC12data_10_channel[10] Das ist ein Array von 10 Zeigern auf einen unsigned int. Du möchtest: unsigned int *l_ADC12data_10_channel[10];
*Pointer* schrieb: > interrupt schrieb: >> unsigned int *l_ADC12data_10_channel[10] > > Das ist ein Array von 10 Zeigern auf einen unsigned int. > Du möchtest: unsigned int *l_ADC12data_10_channel[10]; Sch.... Du möchtest: unsigned int l_ADC12data_10_channel[10];
Übergib doch einen Zeiger auf das erste Element des Arrays. mf
Und du möchtest hier
1 | int main(void) // Hauptprogramm |
2 | {
|
3 | ULONG lflags_valADC12_channel; // Flags erfasste |
4 | ADC-Messwerte |
5 | unsigned int *lADC12data_10_channel[10]; // ADC-Messwerte der Kanäle |
6 | ...
|
auch nicht ein Array von 10 Zeigern anlegen, sondern ein Array von 10 Stück unsigned int.
1 | void foo( int * werte ) |
2 | // oder, was in ALLEN Belangen gleichwertig ist:
|
3 | // void foo( int werte[] )
|
4 | {
|
5 | werte[0] = 5; |
6 | werte[1] = 8; |
7 | }
|
8 | |
9 | int main() |
10 | {
|
11 | int werte[2]; |
12 | |
13 | foo( werte ); |
14 | }
|
Und ... vielleicht am Allerwichtigsten ... du BRAUCHST ein C-Buch!
Erst mal danke für den ersten Vorschlag. Ich dachte, über eibnen Funktionsparamater könne man Ergebnisse nur zurückgeben wenn man Zeiger verwendet. Aber diese Syntax funktioniert : nsigned int get_data_10_channel_4051(unsigned int l_ADC12data_10_channel[10] ) { .. } @minifloat : Das mit dem Zeiger auf das erste Element werde ich auch noch probieren.
Karl Heinz Buchegger schrieb: > Und ... vielleicht am Allerwichtigsten ... du BRAUCHST ein C-Buch! Kernighan/Ritchie liegt hier ! :-)
interrupt schrieb: > Karl Heinz Buchegger schrieb: >> Und ... vielleicht am Allerwichtigsten ... du BRAUCHST ein C-Buch! > > Kernighan/Ritchie liegt hier ! :-) Dann studier ihn! Wenn du ihn nur neben dir liegen hast, dann hilft er dir nichts. Wenn du ihn nur anlassbezogen aufschlägst und nachliest, dann hilft er dir nichts. Zumindest das erste Drittel musst du konzentriert Seite für Seite durcharbeiten und die Übungen dazu machen. Dann hast du das minimal notwendige Rüstzeug, um ernsthaft Programme schreiben zu können.
interrupt schrieb: > Ich dachte, über einen Funktionsparamater könne man Ergebnisse nur > zurückgeben wenn man Zeiger verwendet. Stimmt ja auch. > Aber diese Syntax funktioniert :
1 | |
2 | unsigned int get_data_10_channel_4051(unsigned int _ADC12data_10_channel[10] ) |
3 | {
|
4 | ..
|
5 | }
|
Weil sie korrekt ist. Dazu musst du verstehen, was eine Deklaration der Form datentyp name[size] bewirkt. Zum einen wird ein Speicherbereich von size * sizeof(datentyp) reserviert und zum anderen wird name intern als konstanter Pointer auf datentyp vermerkt und mit der Anfangsadresse des reservierten Speicherbereichs belegt. Beispiel: int myarr[4]; Der Ausdruck myarr[i] (i = 0...3) hat den Typ int. Der Ausdruck myarr ist ein Pointer auf int und zeigt aufs erste Element (ist also gleich &(myarr[0]) ). (myarr + 1) ist gleich &(myarr[1]) usw. Generell gilt: Ein Ausdruck der Form array[i] ist nur nur eine andere Schreibweise für *(array + i) bzw. umgekehrt entspricht (array + i) dem Ausdruck &(array[i]). Steht alles im K&R ab Kapitel 5.3. Lies es! Grüße Stefan
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.