Hallo Forum, ich stehe irgendwie ganz schön auf dem Schlauch... µC = STM32F405xx Compiler GCC Die betreffende Funktion wird aus einer ISR (USART) aufgerufen. Es wird ein Pointer auf ein festes "Pattern" übergeben, welchen mit memcmp() gefunden werden soll. Aufruf: MySearch(const char *cv); Wenn ich das Such-Pattern (RCV_ERRORCME) direkt verwende funktioniert alles. Wenn es wie oben beschrieben als Parameter übergeben wird geht nix mehr. (keine Übereinstimmung) Im Anhang ist das Dissasembly. In der direkten Variante (die funktioniert) schreibt der Compiler Konstanten rein. (z.B. statt strlen() movs 2,#11) In der indirekten Variante (über Funktionsparameter) wird indirekt adressiert. Nur geht das leider nicht. Sollte ich strcmp() verwenden? Null-Terminiert ist nur das Such-Pattern. Den Quellstring müsste ich evtl. über einen Zwischenpuffer Null-terminieren. Fragen über Fragen.
Zeig mal den Aufruf und dessen Umstände. Und rufst du irgendwo strlen auf dem nicht-null-terminierten Quellstring auf? LG, Sebastian
Quelltext als JPG, da kommt natürlich Frust auf. Compilierbarer Anhang, dann kann das jeder nachvollziehen und den Fehler finden.
Peter D. schrieb: > Quelltext als JPG, da kommt natürlich Frust auf. Ah geh, des kannst du doch schnell mit OCR einscannen ;-)
Stefan ⛄ F. schrieb: > Die wichtigste Info dürfte die 'Zeigerspitze' von cv sein, also auf was gezeigt wird.
Wenn's mit Referenzierung des ersten RCV_ERRORCME funktioniert, warum machst Du es beim ersten cv anders?
Hallo Zusammen, sorry für die fehlenden Angaben. Wollte eigentlich "Salami" vermeiden... ***** Die wichtigste Info fehlt: Was ist RCV_ERRORCME? ******* const char RCV_ERRORCME[] = { '+', 'C', 'M', 'E', ' ', 'E', 'R', 'R', 'O', 'R', ':', 0x0 }; Aufruf: rc = MySearch(&RCV_ERRORCME[0]); Werde noch die entsprechenden Codeschipsel extrahieren und als *.c-Datei hier reinstellen. ..oder finde (hoffentlich) dabei selber den Fehler ;-) Grüße Runout
Thomas T. schrieb: > ***** Die wichtigste Info fehlt: Was ist RCV_ERRORCME? ******* > const char RCV_ERRORCME[] = { '+', 'C', 'M', 'E', ' ', 'E', 'R', 'R', > 'O', 'R', ':', 0x0 }; Ernsthaft? Einen String aus einzelnen chars konstruiert? Noch nie was von String-Literals wie "+CME ERROR:" gehört? >> welchen mit memcmp() gefunden werden soll. memcmp() für Strings? > rc = MySearch(&RCV_ERRORCME[0]); Und die nächste C-Grundlage nicht verstanden :(. Der Name eines Arrays ist direkt ein Zeiger auf das Array, und damit ein Zeiger auf das erste Element. RCV_ERRORCME reicht völlig. > Werde noch die entsprechenden Codeschipsel extrahieren > und als *.c-Datei hier reinstellen. Danke, reicht schon um die Diagnose zu stellen und die notwendige Behandlung vorzuschlagen: https://www.amazon.de/Programming-Language-Prentice-Hall-Software/dp/0131103628 [1] durcharbeiten. -- [1] Alt, aber immer noch mehr als gut genug solide C-Grundlagen zu erlernen.
Thomas T. schrieb: > Wollte eigentlich "Salami" vermeiden... Dafür machst Du das aber sehr konsequent. Mit "cv" geht es also nicht. Dann wird cv wohl irgendwas Verkehrtes sein, aber wo cv herkommt, weiß man nicht. Ist geheim. Häng einfach den GANZEN C-Code an. Als Text, nicht als Bild. Abgesehen davon ist der Adreßoperator bei RCV_ERRORCME und dem memcmp auch sinnfrei, weil RCV_ERRORCME schon ein Array ist. Bei strlen übergibst Du das ja auch direkt. Hannes J. schrieb: > memcmp() für Strings? Die Idee scheint zu sein, den String nur bis zur Länge des konstanten Strings zu vergleichen, d.h. zu testen, ob der Eingabestring mit dem konstanten String beginnt, nicht ob er identisch ist.
Mal abgesehen von unnötiger Komplexität ist der Code mit RCV_ERRORCME offenbar korrekt. Also wird die Funktion wohl mit einem Falschen Wert für cv aufgerufen. Was ist cv?
Was mich auch interessiert: was genau geht eigentlich im Kopf eines Menschen vor, der fragt, wieso es mit RCV_ERRORCME geht und mit cv nicht, aber weder von vornherein sagt, was RCV_ERRORCME ist, noch was cv ist? WAS GEHT DA VOR?
Das kommt von den Corona-Beschränkungen. Ohne anregende Impulse wird das Gehirn zu Matsche. Ich habe im vergangenen Jahr auch schon ein paar unfassbare Blödheiten von mir gegeben. Hoffentlich ist das reversibel. ... Ist es doch, oder?
Also Jungs, euch ist wohl das Frühlingswetter etwas auf den Kopf geschlagen! Q: "Was ist cv?" -> Steht im Anfangspost... Das die Pattern als Character-Array definiert sind, liegt daran, dass sie aus einer vorhandenen Lib übernommen wurden. Das sollte aber keine Schnappatmung auslösen... Und es ist in der Tat so, das ich Teilstrings vergleichen will. Dafür ist memcmp schon geeignet. (wurde aber alles schon beschrieben) Also, nicht so viel Schwanzfedern spreizen und etwas gemäßigtere Antworten, bitte. Ihr schafft das ;-)
Thomas T. schrieb: > Q: "Was ist cv?" -> Steht im Anfangspost... Code, Code, Code. Wenn Du wüßtest, was Du tatsächlich tust, hättest Du das Problem ja nicht. Daher sind Prosa-Beschreibungen wertlos. > Ihr schafft das ;-) Da Du keinen weiteren Code posten möchtest, darfst Du Dich nun alleine auf die Suche machen. Du schaffst das.
Thomas T. schrieb: > Q: "Was ist cv?" -> Steht im Anfangspost... Meinst du das? Thomas T. schrieb: > Aufruf: MySearch(const char *cv); Das sagt gar nichts darüber aus, womit und wie du die Funktion aufrufst.
Thomas T. schrieb: > Das die Pattern als Character-Array definiert sind, > liegt daran, dass sie aus einer vorhandenen Lib übernommen wurden. Umso schlimmer. Thomas T. schrieb: > Und es ist in der Tat so, das ich Teilstrings vergleichen will. Das sollte mit strcmp auch gehen, da ja zumindest ein String nullterminiert sein muß. Sonst würde ja strlen nicht gehen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.