Forum: Compiler & IDEs Struktinhalt ohne Komponentenname ansprechen


von Oz z. (ozzy)


Lesenswert?

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

von Oliver (Gast)


Lesenswert?

"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

von Stan (Gast)


Lesenswert?

Was möchtest Du machen?

von Oz z. (ozzy)


Lesenswert?

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

von Werner B. (Gast)


Lesenswert?

Stichwort: "union".

von Karl H. (kbuchegg)


Lesenswert?

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.

von Oz z. (ozzy)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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
}

von Hans (Gast)


Lesenswert?

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.

von yalu (Gast)


Lesenswert?

@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.

von Matthias L. (Gast)


Lesenswert?

@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 )
                                           ^^^^^^^^^^^

von Karl H. (kbuchegg)


Lesenswert?

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