Hi, ist es möglich, Inhalte eines structs über eine Schleife anzusprechen, und nicht über die Komponentennamen? Also nicht struct1.name sondern irgendwas mit "i++"??? MfG, und vielen Dank, Ozzy
"Einmal Döner, aber bitte ohne Brot, Zaziki, Fleisch, Salat, und Sosse..." Wofür baut man sich einen struct, wenn gar keiner gewünscht wird? Beitrag "Datenzuweisung an Struct" Oliver
Hi, also ich bekomme Daten über die serielle Schnittstelle. Es handelt sich dabei um einen String in dem Werte stehen, durch "," getrennt. Manchmal fehlen diese Werte aber, so dass meherere Kommata hintereinander stehen: "500,10.00,,20,1,,,W,17". Nun habe ich ein paar Zeilen geschrieben, die mir diesen String an den entsprechenden Stellen auseinandernehmen (strtok_r gibt ja leider nicht an, wenn meherer Trennzeichen hintereinander stehen...). Damit meine Funktion nun aber schön darauf arbeiten kann, wollte ich ein schönes Struct daraus machen. Klar, Array ginge wohl auch, aber die anderen Funktionen könnten wieder auf den Komponentennamen zugreifen, was die Lesbarkeit des Codes erhöhen würde... MfG, Ozzy
Christoph O. wrote: > "500,10.00,,20,1,,,W,17". Nun habe ich ein paar Zeilen geschrieben, die > mir diesen String an den entsprechenden Stellen auseinandernehmen > (strtok_r gibt ja leider nicht an, wenn meherer Trennzeichen > hintereinander stehen...). > Damit meine Funktion nun aber schön darauf arbeiten kann, wollte ich ein > schönes Struct daraus machen. Ich seh ehrlich gesagt nicht, wie dir da ein alternativer Zugriff auf die Struktur helfen würde. Aus dem Pointer, den dir strtok_r zurückgibt kannst du sowieso keinen Rückschluss darauf ziehen, wieviele ',' strtok_r nun überlesen hat. OK. 'keinen' stimmt nicht ganz, aber mühsam bleibt es trotzdem. Ich würde die Parsing Funktion verändern bzw. mir ein eigenes strtok_r schreiben, welches dieses Problem nicht hat.
Hi, also ich habe mir auch so eine Funktion geschrieben, die mir die Kommata zählt, indem ich einfach bei strtok_r den dritten Paramtere &last auswertet, und schaut, ob da ein Komma steht, und wenn ja, wieviele... Da das aber in einer Schleife geschieht, bis der String zu ende ist, komme ich nicht so schön an die Komponenten ran. Wie das mit union gehen soll, habe ich nicht so wirklich verstanden... MfG, Ozzy
Christoph O. wrote: > Wie das mit union gehen soll, habe ich nicht so wirklich > verstanden... Ich ehrlich gesagt auch nicht. Ich steh immer noch dazu, dass eine spezielle strtok_r Verison die einfachste Variante ist. Die Funktion ist so schwer nun auch wieder nicht
1 | #include <stdio.h> |
2 | |
3 | char* split( char* string, char character, char** end ) |
4 | {
|
5 | if( string != NULL ) |
6 | *end = string; |
7 | else
|
8 | string = *end; |
9 | |
10 | if( **end == '\0' ) |
11 | return NULL; |
12 | |
13 | while( **end != '\0' && |
14 | **end != character ) |
15 | (*end)++; |
16 | |
17 | if( **end == '\0' ) |
18 | return string; |
19 | |
20 | **end = '\0'; |
21 | (*end)++; |
22 | |
23 | return string; |
24 | }
|
25 | |
26 | int main() |
27 | {
|
28 | char Str[] = ",Arg1,Arg2,,Arg4"; |
29 | |
30 | char* pTmp; |
31 | char* pArg; |
32 | |
33 | pArg = split( Str, ',', &pTmp ); |
34 | while( pArg ) { |
35 | printf( "> /%s/\n", pArg ); |
36 | pArg = split( NULL, ',', &pTmp ); |
37 | }
|
38 | }
|
Nur so als Hintergrund: Das Thema heißt "Objektrelationale Abbildung" oder "Objektrelationales Mapping". Ein Objekt (hier struct) wird auf eine relationale Struktur (hier die Kommaliste) abgebildet. Hier ein entsprechendes Framework einzusetzen, wäre allerdings mit Kanonen auf Spatzen geschossen.
@Karl heinz: Ich glaube, Christoph geht es nicht primär um das Auseinanderfieseln des Eingabestrings, sondern darum, wie man die auseinandergefieselten Zahlenwerte in eine entsprechende Struktur eintragen kann, ohne jede Elementzuweisung einzeln hinzuschreiben. Da das Auseinanderfieseln (egal ob mit strtok_r oder anders) typischerweise in einer Schleife stattfindet, wäre ein indizierter Zugriff auf die Strukturelemente wünschenswert. @Christoph: Wenn alle Strukturelemente vom gleichen Typ sind (z.B. int), kannst du, wie Werner B. schon geschrieben hat, mittels einer Union ein Array überlagern oder einen Pointer auf die Struktur in einen int-Pointer umcasten und diesen dann wie ein Array verwenden. Beides ist aber nicht ganz sauber, weil dabei Annahmen über das Speicherabbild von Strukturen gemacht werden. Besser, aber umständlicher wäre es, ein Array mit Pointern auf die einzelnen Strukturelemente anzulegen. Das Unschöne hierbei ist, dass bei jeder Änderung der Struktur auch die Array-Initialisierung angepasst werden muss. Wenn die Strukturelemente unterschiedlichen Typs sind, bringt ein Array nicht viel, da es immer nur Elemente eines Typs enthält. Du bräuchtest dann Fallunterscheidungen in der Auswerteschleife, so dass du mit wenig mehr Aufwand auch gleich die einzelnen Strukturelemente ansprechen kannst.
@Karl heinz: Was ist das:\ Ein Pointer, der auf einen Pointer to char (also auf einen char*) zeigt??
1 | char* split( char* string, char character, char** end ) |
^^^^^^^^^^^
Matthias Lipinsky wrote: > @Karl heinz: > > Was ist das:\ > Ein Pointer, der auf einen Pointer to char (also auf einen char*) > zeigt?? Ganz genau. Machs einfach mit Analogie: Wenn eine Funktion ein Argument verändern können will, dann muss der Aufrufer die Adresse (vulgo Pointer) übergeben, wo die Ursprungsvariable sitzt. Aufruferseitig, x sei irgendein Datentyp
1 | x MyVar; |
2 | |
3 | foo( &MyVar ); |
und funktionsseitig
1 | void foo( x * Arg ) |
2 | {
|
3 | *Arg = irgendwas; |
4 | }
|
Mach dir klar, das das zb. gilt wenn x für 'int' steht. Und jetzt setzt du für x einfach char* ein.
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.