Jump to content

[SOLVED] [C/C++] PTC-Bricklet ptc_get_resistance führt zu Fehlermeldung


Recommended Posts

Hallo zusammen,

 

Ich nutzt zur Zeit ein PTC Bricklet an einem Master Brick. Das Auslesen über BrickViewer funktioniert einwandfrei.

 

Nun habe ich das Beispiel C++ Programm in VisualStudio geladen. Das Auslesen der Temperatur funktioniert einwandfrei. Nun möchte ich die Funktion ptc_get_resistance nutzen. Diese erzeugt aber folgenden Fehler:

 

Run-Time Check Failure #2 - Stack around the variable 'response' was corrupted.

 

Um Herauszufinden, wo das Problem liegen könnte, bin ich im Debug Modus den Code durchgegangen. Der Fehler erscheint, wenn die Funktion verlassen wird.

 

Meiner Internetrecherche zufolge kann das an zu voll gestopften Arrays liegen, unsachgemäßem Löschen von Variablen oder versehentliches verschieben von Pointern. Aber es handelt sich hier um die Datei bricklet_ptc.cpp. Diese habe ich nicht verändert und finde den Fehler nicht. Ist dieser schon bei jemand anderem aufgetaucht?

 

Im Folgenden einmal meine Änderungen zum Beispielcode (example_simple.c) Alles andere ist wie es auf der Homepage zur Verfügung gestellt wird:

 

// Get current resistance
uint16_t resistance;
if (ptc_get_resistance(&ptc, &resistance) < 0) {
	fprintf(stderr, "Could not get temperature, probably timeout\n");
	return 1;
}

resistance = (resistance * 3900) / 32768;
printf("Temperature: %f Ohm\n", resistance);

 

Link to comment
Share on other sites

Ich kann das Problem nachstellen, wenn ich die Visual Studio IDE nehme.

 

Wenn ich aber direkt den Visual Studio Compiler aufrufe tritt das Problem nicht auf. Es muss also mit den Compileroptionen zu tun haben.

 

Muss ich mir genauer ansehen. So auf den ersten Blick ergibt das keinen Sinn.

Link to comment
Share on other sites

Das Problem ist reproduzierbar, das ist schon mal gut. Danke für die schnelle Antwort. Von dem Compiler habe ich leider auch gar keine Ahnung. Aus dem Grund bin ich jetzt erstmal auf C# umgestiegen und da funktioniert alles wie es soll. Eine Lösung wäre aber natürlich für andere Nutzer auch interessant. Wenn ich zwischenzeitlich eine Lösung finde werde ich natürlich auch ein Update schreiben

Link to comment
Share on other sites

Okay, habe das Problem gefunden. Es betrifft alle Bindings, nicht nur C/C++. Aber nicht in allen Bindings wird das Problem auch sichtbar.

 

Das Problem ist, dass die Bindings erwarten, dass die Resistance als uint16 übertragen wird, das PTC Bricklet diese aber als int32 überträgt. Dadurch ist der Empfangsbuffer (response) in den C/C++ Bindings für diese Antwort 2 Byte zu kurz. Das verursacht die Stackcorruption die Visual Studio meldet.

 

Das Problem wird mit der nächsten Version der Bindings behoben werden.

Link to comment
Share on other sites

  • 7 months later...

Dieses Problem sollte eigentlich schon vor einer ganzen Weile behoben worden sein. Allerdings scheint der Fix damals abhanden gekommen zu sein, so dass das Problem erst jetzt mit Version 2.1.16 der C/C++ Bindings behoben ist. Sorry, für diese unnötig lange Verzögerung.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...