www.mikrocontroller.net

Forum: Compiler & IDEs probleme mit pointern.


Autor: fugitivus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum nimmst du nicht einfach ein Array?
struct val params[4];

double rddouble(unsigned int index) {

  return params[index].val;

}

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

Autor: fugitivus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du denn unbedingt auf die Elemente in "struct svalue" über 
Pointerarithmetik zugreifen willst (*), dann z.B. so:
double rddouble(unsigned int index) {

  return ((struct val*)&params)[index].val;

}

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

Autor: fugitivus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
super herzlichen dank !!! das ist genau das wonach ich gesucht habe !!!!

Autor: fugitivus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber wieso ist das pfui ?!?
und was sind padding bytes ?!?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> aber wieso ist das pfui ?!?

Es ist in C eigentlich verboten.

> und was sind padding bytes ?!?

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.