mspgcc : Messergebnis als Funktionsparameter übergeben;

Gast #3033007
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"
    ...
  }
Gast #3033587
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
  }
#3033619
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!
Gast #3033621
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.
#3033624
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.
#3033960
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren