Pages: [1]   Go Down
Author Topic: Void(void)  (Read 1096 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

.2.Fragen an die schon "strukturierteren" C++ ler:
.. beginne gerade mich in die Struktur von Funktionen + Unterprogrammen einzuarbeiten..
1)was bedeutet es, wenn als Argument (void) angegeben wird, z.n void setup(void), oder void(void)??
2)schreibe ein Pgrammd das den Dallas 18B20 als Thermostaten benutzt
so gehts:
void loop(void)
{
  sensors.requestTemperatures(); // Send the command to get temperatures
  temp1=sensors.getTempCByIndex(0);
  temp2=sensors.getTempCByIndex(1);
//und dann die Variablen temp1 +temp2 zum Ausgang schalten
}
wie kann ich die 2 temp variablen von einem Unterprogramm(mit einer Funktion kann ich ja nur 1 Variable übernehmen)
ins Hauptprogramm zurückünernehmen.

..ps.. heute kauf ich mir ein c++ buch
mfg
Logged

Offline Offline
God Member
*****
Karma: 9
Posts: 721
42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Void bedeuted bei einer Funktion eigentlich nur, das sie keinen Rückgabewert hat, daher auch kein "return" benutzt werden muss.

"void" in der funktion hab ich bisher noch nicht gesehen, kann allerdings sein, dass es eben als blankodatentyp mitübergeben wird, aus mir unerfindlichen Gründen. aus unten genannten gründen.

EDIT:
Die Wikipedia weiß auch hier bescheid:

"Funktionen ohne Argumente sollten in C mit dem Schlüsselwort void anstelle der Argumentliste deklariert werden, wie in folgendem Beispiel:

Code:
void hallo(void) {
     printf("Hallo Welt!\n");
 }

Dieser Sonderfall ist nötig, weil es in C zwei verschiedene Arten gibt, Funktionen zu deklarieren. In der ursprünglichen Notation (old-style) wurden im Funktionskopf die Typen der Argumente nicht angegeben; die neue Notation wurde eingeführt, damit der Compiler die Anzahl und die Typen der Argumente bei einem Funktionsaufruf überprüfen kann. Um Kompatibilität mit bestehendem C-Code zu gewährleisten, wurden Deklarationen mit der alten Notation weiterhin erlaubt. Damit Funktionsdeklarationen ohne Argumente nicht fälschlicherweise als old-style erkannt werden, wurde festgelegt, dass in diesem Fall das Schlüsselwort void anstelle der Argumentliste steht.

In C++ dagegen gibt es keine old-style-Deklarationen. Daher ist void als Argumentliste äquivalent zu einer leeren Argumentliste.[1] Old-style-Funktionsdeklarationen sind in C++ nicht möglich.[2]"

« Last Edit: October 23, 2012, 07:45:24 am by Marcus W » Logged


Offline Offline
Edison Member
*
Karma: 21
Posts: 1397
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das "void" als Parameter bedeutet, das diese Funktion keine Parameter übergeben bekommt, es kann auch weggelassen werden.
Das "void" vor einer Funktion bedeutet, das diese Funktion nichts zurück liefert.

Zu Deinem Problem mit den zwei Werten die Du zurück liefern willst. Hier gibt es mehrere Möglichkeiten.
Die einfachste, aber nicht sehr saubere Methode ist die Variablen "temp1 und temp2" als globale Variablen zu deklarieren. Das machst Du, indem Du die Variablen außerhalb einer Funktion deklarierst. z.B. vor dem setup() { ... }. Damit kannst Du temp1 und temp2 innerhalb aller Funktionen in Deinem Programm verwenden und verändern.
Aber aufpassen! Wenn Du innerhalb einer Funktion nochmal Variablen temp1 und temp2 deklarierst, dann "verdecken" diese lokalen (nur innerhalb der Funktion vorhandenen) Variablen die globalen. Die lokalen temp1 und temp2 sind dann nicht die gleichen Variablen wie die globalen temp1 und temp2.

Du kannst einer Funktion auch Referenzen oder Zeiger auf Variablen übergeben.
Code:
void temperatur( int *temp1, int* temp2) {
...
    *temp1 = ...
}
Dadurch das Du nicht die Werte für temp1 und temp2 selbst übergibst, sondern nur die Adresse, wo die Daten im Speicher stehen, kannst Du den Inhalt in der Funktion verändern und die Änderungen sind auch außerhalb der Funktion sichtbar.

Als dritte Variante kannst Du einen komplexen Datentyp zurückliefern:
Code:

//Datentyp für Temperatur
struct temperatur {
  int temp1;
  int temp2;
};

void setup() {
 
}

void loop() {
  //Funktion aufrufen und zwei Werte bekommen
  struct temperatur my_temp = lese_temp();
  Serial.println( my_temp.temp1);
  Serial.println( my_temp.temp2);
}

//Funktion die zwei Werte in einem struct zurückliefert
struct temperatur lese_temp() {
 struct temperatur t;
 t.temp1 = 42;
 t. temp2 = 4711;
 return t;
  
}
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1397
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

"void" in der funktion hab ich bisher noch nicht gesehen, kann allerdings sein, dass es eben als blankodatentyp mitübergeben wird, aus mir unerfindlichen Gründen.
Nein, das void bedeutet an der Stelle tatsächlich das es keine Parameter gibt.
Anders als bei
Code:
function(void* data)
In diesem Fall kann ein Zeiger eines beliebigen Typs übergeben werden, ohne das der Compiler meckert.
Logged

Pages: [1]   Go Up
Jump to: