Funktion in einer Funktion aufrufen [C]

Gast #2632969
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ö!
Gast #2632978
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.
Gast #2632991
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?
#2633003
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.
Gast #2633017
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
#2633028
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.
#2633042
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.
Gast #2633049
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.
#2633060
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
#2633151
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.
Gast #2633186
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.
Gast #2633938
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

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