Forum: Mikrocontroller und Digitale Elektronik Freitagsfrust - Pointer


von Thomas T. (runout)



Lesenswert?

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.

von Sebastian W. (wangnick)


Lesenswert?

Zeig mal den Aufruf und dessen Umstände. Und rufst du irgendwo strlen 
auf dem nicht-null-terminierten Quellstring auf?

LG, Sebastian

von Peter D. (peda)


Lesenswert?

Quelltext als JPG, da kommt natürlich Frust auf.

Compilierbarer Anhang, dann kann das jeder nachvollziehen und den Fehler 
finden.

von Stefan F. (Gast)


Lesenswert?

Die wichtigste Info fehlt: Was ist RCV_ERRORCME?

von sei ned aso (Gast)


Lesenswert?

Peter D. schrieb:
> Quelltext als JPG, da kommt natürlich Frust auf.

Ah geh, des kannst du doch schnell mit OCR einscannen ;-)

von MaWin (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Die wichtigste Info

dürfte die 'Zeigerspitze' von cv sein, also auf was gezeigt wird.

von MWS (Gast)


Lesenswert?

Wenn's mit Referenzierung des ersten RCV_ERRORCME funktioniert, warum 
machst Du es beim ersten cv anders?

von Thomas T. (runout)


Lesenswert?

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

von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

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.

von Nop (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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?

von Nop (Gast)


Lesenswert?

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?

von Stefan F. (Gast)


Lesenswert?

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?

von Thomas T. (runout)


Lesenswert?

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 ;-)

von Nop (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

von Dirk B. (dirkb2)


Lesenswert?

Thomas T. schrieb:
> Q: "Was ist cv?" -> Steht im Anfangspost...

Wo steht da
1
cv =
?

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
Noch kein Account? Hier anmelden.