Forum: Compiler & IDEs probleme mit pointern.


von fugitivus (Gast)


Lesenswert?

Hallo.....
Ich habe da ein riesiges prob mit Pointern....
Mit rddouble will ich einen pointer auf "val" im struct params legen.
Bei "var" habe ich überhaupt kein problem damit. Bei "val" bekomme ich
aber nur jeden 2.ten wert zurückgegeben. Ich hab schon alles mögliche 
versucht,
finde aber keine antwort warum das so ist... hab mir die peinter 
ausgeben lassen,
bekomme es trozdem nicht zum laufen........


Hier erst mal die code Fragmente:



struct val

{

  double val;

      unsigned int var;

}val;

struct svalue

{

  struct val V1;

  struct val V2;

  struct val V3;

  struct val V4;

}svalue;



double rddouble(unsigned int index)
{
  double * ptr;
  //ptr = (double *)&params + (index * ((sizeof(val)/2)>>1));
  return (double)*ptr;
}

struct svalue params;

achso...
mit params.VX.val ausgeben bzw einlesen klappt aber mit nem pointer ?!?!
ich versweifel so langsam drann....
für jedliche Hilfe währe ich Dankbar !

mfg fugitivus

von Stefan E. (sternst)


Lesenswert?

Warum nimmst du nicht einfach ein Array?
1
struct val params[4];
2
3
double rddouble(unsigned int index) {
4
5
  return params[index].val;
6
7
}

Und so nebenbei:
(sizeof(val)/2)>>1)
Was denkst du, was bei diesem Konstrukt rauskommen soll?

von fugitivus (Gast)


Lesenswert?

1:
(sizeof(val)/2)>>1) war der lezte versuch.... das /2 wa halt ne 
verbesserung... ist eigendlich quatsch... das macht mich ja auch so 
stutzig... weil teile ich es nicht durch 2 so bekomme ich nur jeden 
4.ten wert von "val"..: aso:
(sizeof(params)/2)>>1)

sry...

2:
Also das mit dem array ist ne gute frage eigendlich hätte ich es ja so 
gemacht.... aber da ich bei allen anderen datentypen als dem double 
keine probleme habe denke ich das es irgendwie gehen muss... kurz ich 
will das mit den pointern endlich raffen das macht mich sonst 
bekloppt....

aber erst mal danke für deine antwort !
mfg fugitivus

von Stefan E. (sternst)


Lesenswert?

Wenn du denn unbedingt auf die Elemente in "struct svalue" über 
Pointerarithmetik zugreifen willst (*), dann z.B. so:
1
double rddouble(unsigned int index) {
2
3
  return ((struct val*)&params)[index].val;
4
5
}

(*) So was ist aber ziemlich Pfui, und funktioniert z.B. auch nur, wenn 
"struct svalue" keine Padding-Bytes enthält.

von fugitivus (Gast)


Lesenswert?

super herzlichen dank !!! das ist genau das wonach ich gesucht habe !!!!

von fugitivus (Gast)


Lesenswert?

aber wieso ist das pfui ?!?
und was sind padding bytes ?!?

von Rolf Magnus (Gast)


Lesenswert?

> aber wieso ist das pfui ?!?

Es ist in C eigentlich verboten.

> und was sind padding bytes ?!?

http://www.lmgtfy.com/?q=padding+bytes

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.