Forum: Mikrocontroller und Digitale Elektronik Funktion in einer Funktion aufrufen [C]


von Ulan (Gast)


Lesenswert?

Tag miteinander!!

Ich hab mal eine kleine Frage:


Ich will in C in einer Funktion, an welche Werte übergeben werden, eine 
andere Funktion aufrufen, an welche ebenfalls werte übergeben werden...

Beispiel:
1
void funktion1(&x, &y, &z, &q)
2
   {
3
   funktion2(&a, &b, &c, &d)      //hier die andere Funktion aufrufen
4
5
   sonstiges der funnktion1
6
   }

die variablen xyzq abcd sind natürlich definiert...die Funktionen 
einzeln gehen auch wunderbar, nur sollte f2 IN f1 aufgerufen werden...

Weiss jemand was ich meine? Wenn ja, sagt mir bitte wie das richtig 
geht...


Dankö!

von Karl H. (kbuchegg)


Lesenswert?

Ulan schrieb:

> die variablen xyzq abcd sind natürlich definiert...die Funktionen
> einzeln gehen auch wunderbar, nur sollte f2 IN f1 aufgerufen werden...

was genau verstehst du unter 'IN'?

So wie du das hast, ist es doch wunderbar.

von -_- (Gast)


Lesenswert?

Ulan schrieb:
> Beispiel:
>
> void funktion1(&x, &y, &z, &q)
>    {
>    funktion2(&a, &b, &c, &d)      //hier die andere Funktion aufrufen
>
>    sonstiges der funnktion1
>    }

Wenn es überhaupt gehen soll, dann fwhlwn da noch zwei Klammern.

void funktion1(&x, &y, &z, &q)
   {
   funktion2(&a, &b, &c, &d)
   {                          //hier die andere Funktion aufrufen

   sonstiges der funnktion1
   }
   }

Ich glaube aber nicht daran.

von was? (Gast)


Lesenswert?

Ulan schrieb:
> Weiss jemand was ich meine?

Nein. Wenn dir hier jemand ernsthaft helfen soll, musst du schon die 
beiden Funktionen zeigen...

von Markus H. (markushehn)


Lesenswert?

2. Funktion davor definieren

Dann kannst sie in deiner 1. Funktion verwenden.

von Noname (Gast)


Lesenswert?

Offen gesagt bin ich ein wenig irritiert von der Fragestellung und 
verstehe sie nicht.

Dein Pseudocode ist (bis auf einige syntaktische Details) korrekt. Die 
Funktion 2 wird in der Funktion 1 aufgerufen.

Es scheint wirklich als wenn Du das "in" einmal definieren solltest, 
damit wir Dein Problem besser verstehen.

Vielleicht hilft folgendes:

1. Eine Funktionsdefinition kann keine weitere Funktionsdefinition 
enthalten.
2. Eine Funktion wird aufgerufen in dem ihr Name gefolgt von einem 
Klammerpaar und einem Semikolon hingeschrieben wird. In diesem Sinne 
sagt man landläufig das ein Funktionsaufruf sich "in" der aufrufenden 
Funktion befindet.

Magst Du bitte die Frage noch einmal ausführlicher formulieren?

von Johann L. (radiostar)


Lesenswert?

Ganz ehrlich: Ulan sollte erst einmal in ein C-Buch oder wenigstens in 
eine Programmieranleitung für C, wie es viele im Netz gibt, schauen. 
Seine Fragestellung sieht etwa so aus, als ob er von C keine Ahnung hat, 
sich auch nicht informiert hat und nun, bei der ersten Hürde, anstatt 
einfach einmal etwas Fachliteratur zu wälzen, seine Fragen ins Netz 
stellt. Sowas nervt.

Gruß aus dem heißen Indien.

von Klaus W. (mfgkw)


Lesenswert?

Falls die a,b,c,d nicht global sind, sondern im Aufrufer von f1, dann 
musst du sie ggf. auch an f1 mit übergeben, damit f1 sie an f2 
weiterreichen kann.

f1 kann ja nicht auf die Variablen seines Aufrufers zugreifen - 
vielleicht ist das der Hintergrund der Frage...

von Klaus W. (mfgkw)


Lesenswert?

J. L. schrieb:
> Gruß aus dem heißen Indien.

Uns hier von schönem Wetter etwas vorzuschwärmen - das nervt auch :-)

von ShivaPlug (Gast)


Lesenswert?

J. L. schrieb:
> Sowas nervt.
>
> Gruß aus dem heißen Indien.

Naja, das nervt höchstens bei schlechter Bezahlung ... da würde mir dann 
auch heiß werden.

von Ulan (Gast)


Lesenswert?

@ Alle

danke für die vielen antworten!


also funktion1:
1
void setTimeDigit1(char *digit1)
2
{
3
   P5=segCode[*digit1];
4
   do{
5
      P5 = segCode[*digit1];
6
      if(S2==1)
7
      {
8
         *digit1 = *digit1 + 1;
9
         P5=segCode[*digit1];
10
      }
11
      if(*digit1 > 2)
12
      {
13
         *digit1 = 0;
14
      }
15
   }while(S1 == 0);
16
}

und Funktion2:
1
void multiplexing(char *digit4, char *digit3, char *digit2, char *digit1)
2
{
3
   muxSeg4 = 1;
4
      P5 = segCode[*digit4];
5
         muxSeg4 = 0;
6
7
   muxSeg3 = 1;
8
      P5 = segCode[*digit3];
9
         muxSeg3 = 0;
10
11
   muxSeg2 = 1;
12
      P5 = segCode[*digit2];
13
         muxSeg2 = 0;
14
15
   muxSeg1 = 1;
16
      P5 = segCode[*digit1];
17
         muxSeg1 = 0;
18
}

Prototypen und alles andere ist auch vorhanden und funktioniert...

Was ich jetzt will:

Ich möchte in der ersten Funktion die zweite Funktion "einbinden/daraus 
heraus aufrufen"

--> Sobald ich in der ersten 1.Funktion bin, möchte ich die 2.Funktion 
Abhandeln und und dann den Rest der 1.Funktion und dann das Spiel wieder 
von vorne solange S1==0.

also ungefähr so:
1
void setTimeDigit1(char *digit1)
2
{
3
   
4
   void multiplexing(char *digit4, char *digit3, char *digit2, char *digit1) //stimmt so nicht, ist klar...aber hier hin sollte die 2.Funktion
5
   
6
   P5=segCode[*digit1];
7
   do{
8
      P5 = segCode[*digit1];
9
      if(S2==1)
10
      {
11
         *digit1 = *digit1 + 1;
12
         P5=segCode[*digit1];
13
      }
14
      if(*digit1 > 2)
15
      {
16
         *digit1 = 0;
17
      }
18
   }while(S1 == 0);
19
}

Ich hoffe, dass ich mich jetzt klarer ausgedrückt habe...


Dank euch allen für die Unterstützung!

Gruss

Ulan

von Ulan (Gast)


Lesenswert?

...die digit-Variablen sind lokal im main

Danke

von Johann L. (radiostar)


Lesenswert?

Klaus Wachtler schrieb:
> J. L. schrieb:
>> Gruß aus dem heißen Indien.
>
> Uns hier von schönem Wetter etwas vorzuschwärmen - das nervt auch :-)

Von wegen schönes Wetter... >40 Grad im Schatten, das Bier wird 
schneller warm als man's trinken kann und ich gebe mir wirklich Mühe. 
Wenn ich Glück habe, regnet's heute noch... Und wenn ich noch mehr Glück 
habe, bin ich am Dienstag wieder daheim.

von Markus H. (markushehn)


Lesenswert?

Entweder müsstest du alle digit-Variablen deiner 1. Funktion übergeben 
oder sie global machen.
Stichwort Variablengültigkeit

von Jan S. (db8jo)


Lesenswert?

Ulan schrieb:
> ...die digit-Variablen sind lokal im main
>
> Danke

Du meinst die Funktion main, oder das modul main.c? Lokal meint wohl die 
Funktion ...

Dann sind sie auch in der Funktion 1
1
void setTimeDigit1(char *digit1)
nicht bekannt, und können damit nicht weiter übergeben werden.

Aber
1
void multiplexing(char *digit4, char *digit3, char *digit2, char *digit1)
tut ja eh nur mit *digit1 was sinnvolles, da ja alle vorherigen 
zuweisungen an P5 überschrieben werden.

von Klaus W. (mfgkw)


Lesenswert?

Ulan schrieb:
> void multiplexing(char *digit4, char *digit3, char *digit2, char *digit1) 
//stimmt so nicht, ist klar...aber hier hin sollte die 2.Funktion

Was soll da hin?
Die Funktion? Geht nicht.
Oder ein Aufruf der Funktion? Dann ruf sie da halt auf.

von Noname (Gast)


Lesenswert?

>Ich hoffe, dass ich mich jetzt klarer ausgedrückt habe...
Nicht wirklich, aber ich glaube ich ahne worum es geht.
Bevor ich dazu komme ein kleiner Tip, den Du auch in der Netiquette 
findest:

Du willst vor allem ein Ziel erreichen. In dem Du uns Deine Frage nicht 
als Beschreibung des "Was" sondern in Begriffen des "Wie" stellst machst 
Du uns die Sache schwer, weil man eigentlich beides, in jedem Fall aber 
erstmal das "Was" kennen muss.

Falls meine Vermutung richtig ist, dann gibst Du an P5 (was immer das 
sei, welcher uC ist denn das?) mit setTimeDigit1 bestimmte Pegel aus um 
die Segmente eines 7-Segment-Displays zum leuchten zu bringen.

Deine Frage ist nun, wie Du im Ablauf die Erzeugung dieser Signale mit 
dem kontinuierlichen weiterschalten, also multiplexen der aktiven 
Anzeigen zeitlich und logisch verschränkst.

Falls das so ist, dann hat das nichts oder nur auf sehr abstrakte Art 
mit "in" oder "einbinden" oder "daraus heraus aufrufen" zu tun.

Du stehst an einem Punkt wo Du mehrere zeitlich parallel laufende 
Vorgänge koordinieren musst. Dazu gibt es den Ansatz mit 
Timer-Interrupts. Lies mal hier in den Artikeln unter 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige#Mehrere_7-Segment_Anzeigen_.28Multiplexen.29

Falls Du dann weitere konkrete Fragen hast, antworten wir gerne.

von Klaus W. (mfgkw)


Lesenswert?

PS: Wieso schmiesst du hier mit sovielen Zeigern um dich, wenn du doch 
eh nur die char verwendest, auf die sie zeigen? Übergib doch gleich die 
char und verwende sie direkt.

von Peter D. (peda)


Lesenswert?

Multiplexing funktioniert so nicht.
Du mußt immer ein Digit bis zum nächsten Timerinterrupt leuchten lassen.

Auch ist es Unsinn, 4 Pointer zu übergeben. Es reicht ein Pointer auf 
das Array mit den 4 Digits.

Generell ist es ungünstig, im Timerinterrupt Funktionen aufzurufen (viel 
Overhead). Leg das Array einfach global an.


Peter

von Karl H. (kbuchegg)


Lesenswert?

Ähm.

Das hier
1
void setTimeDigit1(char *digit1)
2
{
3
   
4
   void multiplexing(char *digit4, char *digit3, char *digit2, char *digit1) //stimmt so nicht, ist klar...aber hier hin sollte die 2.Funktion

ist aber kein Funktionsaufruf. Bei einem Funktionsaufruf werden keine 
Datentypen der Argumente angegeben, sondern die Argumente selbst.
1
void bar( uint8_t i )
2
{
3
  printf( "%d\n", i );
4
}
5
6
void foo( uint8_t klawoom )
7
{
8
  bar( 5 );
9
  bar( klawoom );
10
}

In der Funktion foo wird die Funktion bar aufgerufen. So sieht ein 
Funktionsaufruf aus.
Und du brauchst ganz dringend ein C-Buch. Eine Sprache wie C kann man 
nicht durch Versuch und Irrtum und durch Zusammenschnorren von 
Viertelwissen in diversen Foren erlernen.

von Ulan (Gast)


Lesenswert?

@ Karl Heinz

ICH WEISS WIE MAN EIN FUNKTION AUFRUFT...

ich weiss auch, dass das:
1
void multiplexing(char *digit4, char *digit3, char *digit2, char *digit1)

kein aufruf ist, steht ja hinten, das ich weiss, das es falsch ist...

>Und du brauchst ganz dringend ein C-Buch.
Hab ich, C von A bis Z liegt neben mir...

>Eine Sprache wie C kann man
>nicht durch Versuch und Irrtum und durch Zusammenschnorren von
>Viertelwissen in diversen Foren erlernen.

Das weiss ich auch...


und danke an alle, es funktioniert jetzt wie es sollte...

Ulan out.

von Karl H. (kbuchegg)


Lesenswert?

Ulan schrieb:
> @ Karl Heinz
>
> ICH WEISS WIE MAN EIN FUNKTION AUFRUFT...

Warum präsentierst du dann einen derartigen Müll um dein Problem zu 
demonstrieren?

>>Und du brauchst ganz dringend ein C-Buch.
> Hab ich, C von A bis Z liegt neben mir...

Dann arbeite es durch! Davon dass es neben dir liegt, davon hast du 
nichts!

von Klaus W. (mfgkw)


Lesenswert?

Halt, DU bist der Geduldige - das wäre mein Job!

von Ulan (Gast)


Lesenswert?

@Karl Heinz

Ich wollte damit lediglich verdeutlichen, was an dieser Stelle hin 
sollte...da ich nicht wusste, wie man mein Problem löst, habe ich Dir 
einen derartigen Müll präsentiert...


>Dann arbeite es durch! Davon dass es neben dir liegt, davon hast du
>nichts!

Damit bin ich zur Zeit beschäftigt, nur wurde ich aus dem Geschriebenen 
im Buch nicht schlau, google konnte mir auch nicht recht helfen --> ergo 
frag ich hier blöde...


Aber danke an alle, welche mir geholfen haben!

gruss

Ulan

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.