Forum: Mikrocontroller und Digitale Elektronik Zwei Werte aus Unterprogramm übergeben


von Philipp (Gast)


Lesenswert?

Hallo
ich hätte ein Frage im Bezug auf Unterprogramme, ich will aus meinem 
Unterprogramm 2 Werte in das Hauptprogramm übergeben, weiß aber nicht 
wie man das richtig in C-Code schreibt (die Stelle, die Falsch ist, ist 
mit Fragezeichen makiert). Wie man eine Variable vom Unterprgramm 
übergibt ist das kein Problem. Im Hauptprogramm teste ich dann mit LED's 
ob die Variablen den richtigen Wert haben, diese leuchten allerdings 
nicht.

Ich verwende den dsPIC33FJ256MC710A, das dsPICDEM MCLV, einen CCS
Compiler
1
#include <33FJ256MC710A.h>
2
#include <stdio.h>
3
#include <stdlib.h>
4
#fuses XT,PR_PLL, NOWDT
5
#use delay (crystal=8M,clock=80M)
6
7
signed long eins(signed long b, signed long c)
8
{
9
   signed long x=1,y=3;
10
   b=x*y;
11
   c=x+y;
12
   return(b,c);
13
}
14
15
void main()
16
{
17
  set_tris_e(0);
18
    while(1)
19
    {
20
    signed long b,c,u,i;
21
22
 ????   i,u=zwei(b,c);    ????
23
24
    if(i==3)
25
    {output_high(PIN_E0);}
26
    else
27
    output_low(PIN_E0);
28
29
    if(u==4)
30
    {output_high(PIN_E1);}
31
    else
32
    output_low(PIN_E1);
33
    }
34
}
ich hoffe jemand kann mir helfen
mfg

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Lies ein C-Buch.

Stichwort: Call by Reference.


Was Du "Unterprogramm" nennst, heißt Funktion.

von Karl H. (kbuchegg)


Lesenswert?

Philipp schrieb:

> wie man das richtig in C-Code schreibt

Spätestens jetzt ist der Zeitpunkt erreicht, in dem du in deinem C Buch 
mit dem Abschnitt "Funktionsargumente und wann muss ich einen Pointer 
einsetzen?" beginnen musst.
1
void foo( int * wert )
2
{
3
  *wert = 5;
4
}
5
6
int main()
7
{
8
  int a;
9
10
  foo( &a );
11
12
  // a hat jetzt den Wert 5
13
}

von Karl H. (kbuchegg)


Lesenswert?

>    return(b,c);

Wann immer du in nächster Zeit versucht bist, ein Komma ',' zu benutzen: 
lass es. Der Komma-Operator macht etwas völlig anderes, als du denkst.

Für manche Sachen ist er ganz nett, aber im Grunde wirft er eine Menge 
Probleme auf, die man ohne ihn nicht hätte. Man hätte ihn auch weglassen 
können, ohne dass es sich gravierend ausgewirkt hätte.

von Max H. (hartl192)


Lesenswert?

Der Funktion einen Pointer auf die zweite Varaible Übergeben
1
i=zwei(&u,b,c);

1
signed long zwei(signed long *c, signed long b, signed long c)
2
{
3
   signed long x=1,y=3;
4
   b=x*y;
5
   *c=x+y;
6
   return(b);
7
}

von Peter D. (peda)


Lesenswert?

Du kannst eine struct aus 2 Variablen definieren und dann die struct 
returnen.

von TM F. (p_richner)


Lesenswert?

Versuch es mal so. Mit der zweiten Möglichkeit musst du einfach 
aufpassen, damit du keine Variablennamen zweimal benützt. Dafür musst du 
dich nicht mit dem Übergeben von Daten beschäftigen.
1
#include <33FJ256MC710A.h>
2
#include <stdio.h>
3
#include <stdlib.h>
4
#fuses XT,PR_PLL, NOWDT
5
#use delay (crystal=8M,clock=80M)
6
7
int eins(int b, int c)
8
{
9
   int x=1,y=3;
10
   b=x*y;
11
   c=x+y;
12
   return(b,c);
13
}
14
15
void main()
16
{
17
  set_tris_e(0);
18
    while(1)
19
    {
20
    int b,c,u,i;
21
22
    i=eins(b); 
23
    u=eins(c);
24
    if(i==3)
25
    {output_high(PIN_E0);}
26
    else
27
    output_low(PIN_E0);
28
29
    if(u==4)
30
    {output_high(PIN_E1);}
31
    else
32
    output_low(PIN_E1);
33
    }
34
}
35
36
// Andere Möglichkeit mit globalen Variablen
37
int x=1,y=3;
38
int b,c,u,i;
39
40
int eins(void)
41
{
42
   b=x*y;
43
   c=x+y;
44
}
45
46
void main()
47
{
48
  set_tris_e(0);
49
    while(1)
50
    {
51
  eins();
52
    if(i==3)
53
    {output_high(PIN_E0);}
54
    else
55
    output_low(PIN_E0);
56
57
    if(u==4)
58
    {output_high(PIN_E1);}
59
    else
60
    output_low(PIN_E1);
61
    }
62
}


Warum benutzt du eigentlich long ??
Mit char oder int würdest du weniger Speicher benötigen.

von Karl H. (kbuchegg)


Lesenswert?

P_ Richner schrieb:
> Versuch es mal so.

> int eins(int b, int c)
> {
> ...
>     i=eins(b);
>     u=eins(c);


Das wird so aber nichts.

> Mit der zweiten Möglichkeit musst du einfach
> aufpassen, damit du keine Variablennamen zweimal benützt. Dafür musst du
> dich nicht mit dem Übergeben von Daten beschäftigen.

Ah, die gute alte 'Ich brauch das nicht lernen'Ä Methode.
Kann man machen. Klar.
Aber irgendwann wird es nicht ausbleiben sich auch mal mit dem 
Schreckgespenst aller angehenden C-Programmierer 'Pointer' zu 
beschäftigen.
Auf dieser Ebene ist das alles noch recht einfach. Das zu lernen, darum 
kommt er auf Dauer nicht herum. Warum also nicht jetzt, wo die Dinge 
noch einfach sind.

von TM F. (p_richner)


Lesenswert?

Karl Heinz schrieb:
> kommt er auf Dauer nicht herum. Warum also nicht jetzt, wo die Dinge
> noch einfach sind.

So gehts einfacher zum Lernen klar.


>    int x=1,y=3;
>    b=x*y;
>    c=x+y;
>    return(b);
>    return(c);

>     i=eins(b);
>     u=eins(c);

Geht  es dann so??
Ich denke schon.

von Peter II (Gast)


Lesenswert?

P_ Richner schrieb:
> Geht  es dann so??
> Ich denke schon.

nein. das 2. Return wird nie erreicht.

von Max H. (hartl192)


Lesenswert?

P_ Richner schrieb:
> Geht  es dann so??
Mein. Es wird bei jedem Aufruf
>    return(b);
ausgeführt

von TM F. (p_richner)


Lesenswert?

Ah ok jetzt sehe ich es.

von Volli (Gast)


Lesenswert?

Ernsthaft: Nimm Pointer.
Die sind nicht besonders kompliziert und tatsächlich praktisch.

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.