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
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
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
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>
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:
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.
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:
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.
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.
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:
1
char*convertTo0x(char*t,constchar*s,char*lim){
2
3
intfirstrun=1;
4
5
lim--;
6
while(*s&&t<lim){
7
if(*s==':'&&(t+4)<lim){
8
s++;
9
*t++=',';
10
*t++=' ';
11
*t++='0';
12
*t++='x';
13
}
14
elseif(firstrun&&(t+2)<lim){
15
*t++='0';
16
*t++='x';
17
firstrun=0;
18
}
19
else*t++=*s++;
20
}
21
*t=0;
22
returnt;
23
}
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.
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.
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.
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.
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.
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?
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.