Forum: Mikrocontroller und Digitale Elektronik mspgcc : Messergebnis als Funktionsparameter übergeben;


von interrupt (Gast)


Lesenswert?

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"
    ...
  }

von Andreas B. (andreas_b77)


Lesenswert?

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.

von interrupt (Gast)


Lesenswert?

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
  }

von *Pointer* (Gast)


Lesenswert?

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];

von *Pointer* (Gast)


Lesenswert?

*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];

von minifloat (Gast)


Lesenswert?

Übergib doch einen Zeiger auf das erste Element des Arrays. mf

von Karl H. (kbuchegg)


Lesenswert?

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!

von interrupt (Gast)


Lesenswert?

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.

von interrupt (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Und ... vielleicht am Allerwichtigsten ... du BRAUCHST ein C-Buch!

Kernighan/Ritchie liegt hier ! :-)

von Karl H. (kbuchegg)


Lesenswert?

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.

von Stefan W. (dl6dx)


Lesenswert?

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
Noch kein Account? Hier anmelden.