Gast
#6797427
Hallo, ich habe eine FUnktion geschirben in c aber ich denke sie ist sehr kompliziert? Kann man diese einfacher schreieben??
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
|
Anzeige
|
Hilfe nötig für vereinfachung einer c Funktion
Gast
#6797427
Hallo, ich habe eine FUnktion geschirben in c aber ich denke sie ist sehr kompliziert? Kann man diese einfacher schreieben??
Gast
#6797479
Die Funktion ist sinnlos. Sie gibt einen festen Output aus Wenn Du sagst, was sie machen soll, kann man darüber diskutieren wie.
Gast
#6797486
Gib am Anfang "0x" aus, und dann lauf durch str und gib jedes Zeichen ausser : aus, und bei : gib ", 0x" aus. LG, Sebastian Du hast nirgends eine Funktion geschrieben. Alles steht im Hauptprogramm. Es soll aus 69:66:84:1A:0E:E7:E5:51:30:82:60:A7:27:F2:A5:54:56:B9:15:19 Folgendes geformt werden 0x69, 0x66 .....0x19 Ich weiss es ist in der Main Funktion um zu testen. Danke für die Hilde
Gast
#6797527
Martin L. schrieb: > Es soll aus > 69:66:84:1A:0E:E7:E5:51:30:82:60:A7:27:F2:A5:54:56:B9:15:19 > Folgendes geformt werden Naja, das tut es. Nicht als Funktion, nicht variable, nicht auf irgendwas optimiert, ... Du kannst z.b. anfangen, doppelten Code zu eliminieren. Oder ohne strcat, nur sprintf. Das ist aber ohne Ziel oder Wortlaut der Aufgabe Kaffeesatzleserei Ich wäre dankbar wenn jdm erfahrenes einfach Tipps geben kann oder eine Optimierung meiner Lösung durchführt? Programm soll Macher auf einem esp laufen
Gast
#6797549
welchen Sinn macht es denn ":" durch "," zu ersetzen? Und wenn man weiß, dass es Zahlen sind, dann sieht man auch sofort dass es hex-Zahlen sind. Wozu dann noch "Ox" davor? Oder willst du Zahlen aus dem String extrahieren? wozu schrieb: > welchen Sinn macht es denn ":" durch "," zu ersetzen? > > Und wenn man weiß, dass es Zahlen sind, dann sieht man auch sofort dass > es hex-Zahlen sind. Wozu dann noch "Ox" davor? > > Oder willst du Zahlen aus dem String extrahieren? Es ist ein String die stellen müssen extrahiert werden und dann mit 0x davor. Am Ende soll wieder ein String rauskommen
Gast
#6797554
strtok-Funktion verändert deinen Originalstring. Was muss ich dann machen? Martin L. schrieb: > Am Ende soll wieder ein String rauskommen wieso wenn es doch 8-Bit Hexwerte sind? Dann könnte statt ein String auch gleich ein uint8_t Array rauskommen. Der original "String" belegt Speicher, hinterher brauchst du für 0x definitiv pro Byte 2 Byte mehr, also müsstes dafür Speicher bereitstellen. Ich würde ja 2-stufig vorgehen. 1. Byte zählen : +1 2. malloc für Anzahl 4x der gezählten Byte wegen 0 x Byte , etwa auch noch space? Martin L. schrieb: > Folgendes geformt werden > 0x69, 0x66 .....0x19 dann ja 2a. malloc für Anzahl 5x der gezählten Byte wegen 0 x Byte , <SPACE> Ja uint8_t Array wäre auch super....sorry bin nicht so gut im programmieren..... Könntest du die Funktion in c code schreiben?
Gast
#6797581
Martin L. schrieb: > Ja uint8_t Array wäre auch super Mensch, darum habe ich auch gefragt welchen Sinn es macht ":" durch "," im String zu verändern. Martin L. schrieb: > Ich wäre dankbar wenn jdm erfahrenes einfach Tipps geben kann oder eine > Optimierung meiner Lösung durchführt? Immer noch? Tipp und Optimierung hab ich doch schon gegeben! Aber gut, etwa so:
LG, Sebastian Martin L. schrieb: > Könntest du die Funktion in c code schreiben? ja
Gast
#6797590
Zahlen extrahieren:
Dann kannst du die Zahlen in einem Array speichern (statt sie auszugeben). Sebastian W. schrieb: > char str[] = > "69:66:84:1A:0E:E7:E5:51:30:82:60:A7:27:F2:A5:54:56:B9:15:19"; > char out[200]; gilt doch nur für bekannte Stringlängen und wenn der String mal länger wird crashed es wozu schrieb: > Dann kannst du die Zahlen in einem Array speichern (statt sie > auszugeben). auch dazu müsste man zählen und Speicher reservieren, oder man nimmt den Speicher von Input und legt ja gleich dort ohne : und ohne 0x wieder ab, dann wäre das kein String sondern nur ein Bytearray.
Gast
#6797609
Aus dem String "FF" wird kein byte-Wert von 255. Joachim B. schrieb: > gilt doch nur für bekannte Stringlängen und wenn der String mal länger > wird crashed es Das ist aber kein Problem der Funktion convert() sondern des Aufrufers ... :) Ok, dann also:
https://onlinegdb.com/ziUUevzGY Dann crashed auch char str[] = "::::" nicht! LG, Sebastian
Gast
#6797653
Martin L. schrieb: > Ich wäre dankbar wenn jdm erfahrenes einfach Tipps geben kann oder eine > Optimierung meiner Lösung durchführt? > > Programm soll Macher auf einem esp laufen Deine Frage macht keinen Sinn. Du solltest schreiben, wofür Du das haben möchtest. Ist es eine Hausaufgabe, willst Du ein (ganz anderes) Problem lösen? Dein Code funktioniert vermutlich, ist aber sehr fragil. Die Aufgabe ist aber nur eine Fingerübung, ähnlich der Folge "asdf jklö" im Schreibmaschinenkurs. Da macht es auch keinen Sinn, das "irgendwie eleganter" zu schreiben.
Gast
#6797691
Hier mal noch als posix shell script:
Oder mit sed:
Gast
#6797723
Ich verstehe das Problem nicht. Die Funktion besteht aus einer Schleife mit einer If-Abfrage. Das ist schon fast das wenigste, was Funktionen so im Normalfall machen. Was ist daran jetzt komliziert? Funktionen mit 100 Zeilen sind die Regel, und auch schon mal 500 Zeilen habe ich gesehen.
Gast
#6797887
ich habe es versucht nun mit
in ein uint_8t array zu verandeln aber es klappt nicht. Was ist daran falsch?
Gast
#6797897
Martin Teuer schrieb: > ich habe es versucht nun mit [...] > in ein uint_8t array zu verandeln Was denn? Hast Du einen lauffähigen(Compilerbären) Code? Soll das irgendwo in dein main reinpassen ? Was kommt rein, was soll rauskommen? Hast Du scanf verstanden und Mal in einfacher Form benutzt? Martin Teuer schrieb: > ich habe eine FUnktion geschirben in c aber ich denke sie ist sehr > kompliziert? Kann man diese einfacher schreieben?? Als Quelltext sieht es noch relativ einfach aus. Für das, was die CPU zu tun hat, ist es aber ziemlich kompliziert und aufwendig. Das liegt vor allem an den benutzten Funktionen sprintf, strtok und strcat, die sie unnötigerweise auszuführen hat. Wenn man die Aufgabe direkt mit Pointern löst, hat sie schätzungsweise nur ein hundertstel davon zu tun. Etwa so:
Der Aufruf mit deinen Variablen: convertTo0x(test1,str,test1+sizeof(test1)); Diese Funktion ist zudem durch die Variable lim noch überlaufsicher. In deiner Version müsstest du statt sprintf snprintf verwenden und dabei die Puffergröße immer wieder neu berechnen.
Gast
#6797934
Jobst Q. schrieb: > return t; Das wäre dann die Adresse vom Stringende Helmut -. schrieb: > Du hast nirgends eine Funktion geschrieben. Alles steht im > Hauptprogramm. main() ist eine Funktion wie jede andere auch. Der einzige Unterschied zu anderen Funktionen besteht darin, dass in den meisten(!) Laufzeitumgebungen main() die zuerst aufgerufene Funktion des Anwenderprogramms ist. Nicht mehr und nicht weniger.
Gast
#6797953
Wer will kann ja noch beliebige Fehlerabfragen dazubauen. Ist halt eine Frage davon, was die Spezifikation ist. Wenn garantiert ist, dass der Eingangs-String korrekt ist und der Ziel-Buffer groß genug, kann man sich das sparen. Wenn nicht, muss halt noch etwas Kleinkram dazu. stringende schrieb: > Jobst Q. schrieb: >> return t; > > Das wäre dann die Adresse vom Stringende Genau. In diesem Fall vielleicht nicht notwendig, aber sehr praktisch, wenn man noch etwas anhängen möchte. Der Stringanfang ist ja eh bekannt.
Gast
#6797979
Eigentlich kann man es noch brutaler schreiben, wenn es auf jede Mikrosekunden ankommt:
Gast
#6797983
Und wenn man noch eine Zeile Code sparen will...
...lustig, oder?
Gast
#6798044
Einer schrieb: > ...lustig, oder? naja, das letzte ++ im Schleifenkörper muss dann weg.
Gast
#6798054
Einer schrieb: > ...lustig, oder? oder nur
Und wie konvertiert man das in ein uint8_t Array?
Gast
#6798144
warum muss man DAS (einen weiteren String) jetzt plötzlich nach int konvertieren? warum dieser Umweg?
Gast
#6798161
Martin L. schrieb: > Und wie konvertiert man das in ein uint8_t Array? naja, solange Du nichts zur eigentlichen Aufgabe sagst:
Ich bezweifle nur, dass Du mit den Antworten etwas anfangen kannst. Was spricht dagegen, die Aufgabe zu beschreiben?
Gast
#6798180
wozu schrieb: > Zahlen extrahieren: > char str_in[] = "69:66:84:1A:0E:E7:E5:51:30:82:60:" > "A7:27:F2:A5:54:56:B9:15:19"; > char* end = str_in; > while (1) { > char* start = end; > long hex = strtol (start, &end, 16); > printf ("hex: %lx\n", hex); > if (!*end) { > break; > } > end++; > } da steht es doch schon. statt printf muss er die Werte halt in einem Array ablegen:
Martin Teuer schrieb: > Hallo, > ich habe eine FUnktion geschirben in c aber ich denke sie ist sehr > kompliziert? Kann man diese einfacher schreieben?? Ja.
Erfüllt Deine Anforderung^^ /regards Martin L. schrieb: > Und wie konvertiert man das in ein uint8_t Array? Warum muss der ESP denn diese Hexziffern convertieren? Muss das unbedingt im laufenden Betrieb sein oder reicht das zur compile time aus? Martin Teuer schrieb: > ich habe es versucht nun mit > uint8_t finalout[20]; > for (int i = 0 warum wählst du int für i? kann denn dein i je negativ werden? Beim Programmieren sollte man doch die Wahl der Variablen überdenken und passend wählen.
Gast
#6798265
Machen wir das doch mal richtig. Mit einem richtigen Lexer:
hex.c ist dann der C code.
Joachim B. schrieb: > Martin Teuer schrieb: >> ich habe es versucht nun mit >> uint8_t finalout[20]; >> for (int i = 0 > > warum wählst du int für i? Besser wäre size_t, da sizeof auch diesen Typ zurückgibt. > kann denn dein i je negativ werden? Gegenfrage: Muss es einen Bereich von mehr als 2 Milliarden abdecken können?
Gast
#6798883
Rolf M. schrieb: >Gegenfrage: Muss es einen Bereich von mehr als 2 Milliarden abdecken können? Zumal ab 20 der ganze Code eh broken ist. Als wäre int/uint ein Problem, dass der TO schon hätte.
Gast
#6798941
Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|