ROB_87
July 20, 2024, 12:31am
1
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)
ROB_87:
Habt Ihr einen Tip
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);
ROB_87
July 20, 2024, 11:49am
4
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?)
combie
July 20, 2024, 12:09pm
5
ROB_87
July 20, 2024, 12:20pm
6
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?
combie
July 20, 2024, 12:41pm
7
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.
fony
July 20, 2024, 7:52pm
10
ROB_87
August 5, 2024, 7:29am
11
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