Funktions Rückgabe geht nicht

Hi,

ich habe das XBOX-Controller Beispiel-Script von Bluepd32 um eine Funktion (Zeile 25 bis 32) erweitert.
Diese Funktion wird in Zeile 108 aufgerufen, liefert jedoch unverständlicher Weise immer den Wert 0 in der Console. Habt Ihr einen Tip warum?

XBOX_ESP32.ino (11.8 KB)

löse deine Funktion raus in einen Testsketch und prüfe sie.

Aus meiner sicht suchst du an der falschen Stelle

das sieht zwar eigenartig aus - gibt aber wie erwartet die 1800 aus:


int vBerechnung_Test( int & ptrSpeed) {
  Serial.print("TEST_Speed \n");
  ptrSpeed = 1800;
  return int(1800);
};

int speed;


void setup() {
  Serial.begin(115200);

  speed = vBerechnung_Test(speed);
  Serial.println(speed);
}

void loop() {
  // put your main code here, to run repeatedly:

}

Ersetze

  speed = vBerechnung_Test(speed);

durch

vBerechnung_Test(speed);

Hi, ja das ist es ja. Heraus gelöst funktioniert der Code.
Die Zielen 112 bis 114 werden auch ganz normal abgearbeitet.

Die Frage ist warum der Funktionsaufruf innerhalb der Funktion nicht funktioniert?

Danke. (Hat das Irgendwas mit Namespaces zu tun?)

Unfug!

https://en.cppreference.com/w/cpp/language/namespace

OK ich habe die Code mal komplett gekürzt:


int geschw;

int speed;
float base;
float exponent ;

int vBerechnung_Test( int & ptrSpeed) {
  
  Serial.printf(
  "TEST_Speed \n");

  ptrSpeed = 1800;
  return 1800;
};


void dumpGamepad() {

  speed = 0;
  base = 0.0;
  base = float(vBerechnung_Test(speed));
  Serial.printf("Base=%3d  speed= %4d\n",base,speed);
}



void processGamepad() {
    dumpGamepad();
}




void processControllers() {
                processGamepad();
}

// Arduino setup function. Runs in CPU 1



void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  Serial.println("Hello, ESP32!");
}

void loop() {
    processControllers();
  delay(1000); // this speeds up the simulation
}

Als Resultat erhalte ich:

Hello, ESP32!
TEST_Speed
Base= 0 speed= 1083973632
TEST_Speed
Base= 0 speed= 1083973632
TEST_Speed
Base= 0 speed= 1083973632

Also 2x nicht 1800 wie erwartet.

Die Frage ist nur warum?

Ich kann das nicht lesen, ohne dass mir schwindelig wird.

Bitte bringe den Code in Ordnung!

Natürlich ist ptrSpeed kein Pointer, sondern eine Referenz.

Entweder macht man die Rückgabe über die Referenz oder über den Rückgabewert.
Doppelt ist mindestens unschön.

Bist du dir sicher, dass du die printf Modifikatoren richtig verstanden hast?
Mein Rat, weg mit dem printf.

Der explizite Cast ist da unnötig.


Notdürftig geflickt:

int geschw;

int speed;
float base;
float exponent ;

int vBerechnung_Test( int & ptrSpeed) {
  
  Serial.println(
  "TEST_Speed ");

  ptrSpeed = 1800;
  return 1800;
};


void dumpGamepad() {

  speed = 0;
  base = 0.0;
  base = float(vBerechnung_Test(speed));
 // Serial.printf("Base=%3d  speed= %4d\n",base,speed);
 Serial.print("Base="); Serial.print(base); Serial.print("   speed= "); Serial.println(speed);
}



void processGamepad() {
    dumpGamepad();
}




void processControllers() {
                processGamepad();
}

// Arduino setup function. Runs in CPU 1



void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  Serial.println("Hello, ESP32!");
}

void loop() {
    processControllers();
  delay(1000); // this speeds up the simulation
}

Ausgabe:

Hello, ESP32!
TEST_Speed 
Base=1800.00   speed= 1800


@ROB_87

beginn noch mal von vorne.

int vBerechnung_Test( int & ptrSpeed) 

erkläre zunächst mal warum du der Funktion einerseits ein int zurückgeben lassen willst UND eine Variable als Referenz übergeben möchtest.

Zurück zur eigentlichen Frage:

Hat @combie die richtige Antwort angedeutet:

Eine float Zahl per %d geht nicht und bringt hier die komplette Zuordnung von Format-Anweisungen und zugehörigen Variablen durcheinander.

Beispiel
void setup() {
  Serial.begin(115200);
  Serial.println("Hello, ESP32!");
  
  float f=1800.0; int16_t i = 1800;  
  Serial.printf("%d - %d\n",f,i);
}

void loop() {
  delay(10); // this speeds up the simulation
}

liefert

Hello, ESP32!
0 - 1083973632

... ist in dem Fall sehr sinnvoll.

Für den Fall hat mir mall @Tommy56 schöne Seite gezeigt
https://en.cppreference.com/w/c/io/fprintf

Hi,
um die Lösung nicht zu verschweigen. Das Problem war tatsächlich das ich in [Printf] ein %d (entspricht INT) mit einem Float -Wert ausgeben wollte. Damit Hat der scheinbar einiges zerschossen. Mit %f lief alles Palettie!!!

1 Like