Forum: PC-Programmierung C - called Object is not a function or a function pointer


von Max M. (maxmicr)


Lesenswert?

Guten Abend,

ich hab aktuell das Problem, dass C ein "*" falsch versteht als Cast zu 
einem Pointer, dabei soll es eine Multiplikation sein. Bei folgender 
Formel tritt das auf:
1
  int32_t var2  = (((((adc_T>>4)–(dig_T1)) * ((adc_T>>4)–(dig_T1))) >> 12) *dig_T3) >> 14;

Wie kann ich das verhindern? Ich sehe nicht, wo man da noch Klammern 
einsparen kann.

von (prx) A. K. (prx)


Lesenswert?

Du willst jetzt aber nicht wirklich, dass andere dieses Monster 
häckseln?

von Max M. (maxmicr)


Lesenswert?

Wenn man mir sagt, wie ich verhindere, dass C das "*" als Pointer 
missversteht, dann mache ich es gerne selber.

Edit: Ich habs mit Zwischenvariablen gelöst, sorry für das unnötige 
Problem:
1
  int32_t part2 = (adc_T>>4) - dig_T1;
2
  int32_t var2  = (((part2 * part2) >> 12) * dig_T3 ) >> 14;

: Bearbeitet durch User
von Codeleser (Gast)


Lesenswert?

Max M. schrieb:
> Edit: Ich habs mit Zwischenvariablen gelöst

Was ist das für ein (Mist-) Compiler?

von Yalu X. (yalu) (Moderator)


Lesenswert?

Max M. schrieb:
> ich hab aktuell das Problem, dass C ein "*" falsch versteht als Cast zu
> einem Pointer

Wie kommst du darauf, dass der Compiler einen Cast sieht? Die Syntax
eines Casts ist ein in Klammern geschriebener Datentyp, den ich (und
vermutlich auch der Compiler) hier aber nirgends finden kann.

Allerdings sind die Minuszeichen fehlerhaft: Anstelle der beiden '–'
sollte jeweils '-' stehen. In der aufgeteilten Version der Formel sind
sie richtig.

von Rasputin (Gast)


Lesenswert?

Ich konnte deine (erste) Zeile auch nicht kompilieren. Und zwar weil 
das, was aussieht wie ein Minus-Zeichen irgend was anderes ist (Hex: E2 
80 93).

von Mark B. (markbrandis)


Lesenswert?

Yalu X. schrieb:
> Allerdings sind die Minuszeichen fehlerhaft: Anstelle der beiden '–'
> sollte jeweils '-' stehen. In der aufgeteilten Version der Formel sind
> sie richtig.

Au Mann. Da muss man auch erstmal drauf kommen.

Wer schreibt so beschissen(en) Code? :-(

von klugscheißer (Gast)


Lesenswert?

naja - wenn man Word als Editor nimmt :(

von Sebastian L. (der_mechatroniker)


Lesenswert?

Wobei man dem Ding zugute halten muss, dass es eigentlich korrekte 
Unicode-Minuszeichen nimmt. Blöd, wenn der Compiler einen Bindestrich 
erwartet ;-)

OT: Gibt es eigentlich eine Programmiersprache, die 
Unicode-Minuszeichen, -Kleiner-Gleich-, -Größer-Gleich- und 
-Ungleichzeichen statt der Zusammensetzungen erlaubt?

von Yalu X. (yalu) (Moderator)


Lesenswert?

Sebastian L. schrieb:
> Wobei man dem Ding zugute halten muss, dass es eigentlich korrekte
> Unicode-Minuszeichen nimmt.

Nein, auch das verwendete Symbol "–" ist kein Minuszeichen, sondern ein
Halbgeviertstrich (U+2013, EN DASH), der bspw. in deutschsprachigen
Texten als Gedankenstrich verwendet wird. Das echte Minuszeichen ist "−"
(U+2212, MINUS SIGN). Beide unterscheiden sich vom Bindestrich "‐"
(U+2010, HYPHEN) dadurch, dass sie länger sind. Das Minuszeichen ist
aber meist etwas dicker als der Halbgeviertstrich und steht etwas höher
über der Grundlinie.

Das ASCII-Zeichen "-" (U+002D) wird historisch bedingt sowohl als
Bindestrich als auch als Minuszeichen verwendet und heißt deswegen in
Unicode HYPHEN-MINUS. Wenn also kein echtes Minuszeichen verfügbar ist,
sollte dieses Zeichen verwendet werden, auf keinen Fall aber der
Halbgeviertstrich.


Sebastian L. schrieb:
> OT: Gibt es eigentlich eine Programmiersprache, die
> Unicode-Minuszeichen, -Kleiner-Gleich-, -Größer-Gleich- und
> -Ungleichzeichen statt der Zusammensetzungen erlaubt?

In Haskell dürfen Operatoren und Bezeichner auch Zeichen außerhalb des
ASCII-Bereichs enthalten. So definiert das Modul Prelude.Unicode u.a.
die folgenden Operatoren:

1
  ≤ ≥ ≮ ≯ ≠   Vergleiche
2
  ⋅ ÷         Multiplikation und Division
3
  ∘           Verkettung von Funktionen
4
  ∧ ∨ ¬       Logikoperatoren
5
  ∈ ∉         Elementrelation
6
  π           Kreiszahl
7
  ℤ ℚ         Datentypen (ganze bzw. rationale Zahlen)

In anderen Modulen sind weitere Operatoren für spezielle Datentypen
definiert.

Das Minuszeichen ist nicht dabei, aber man kann es sich leicht selbst
definieren:

1
(–) = (-)
2
infixl 6 –

: Bearbeitet durch Moderator
von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Yalu X. schrieb:
> Nein, auch das verwendete Symbol "–" ist kein Minuszeichen, sondern ein
> Halbgeviertstrich (U+2013, EN DASH), der bspw. in deutschsprachigen
> Texten als Gedankenstrich verwendet wird. Das echte Minuszeichen ist "−"
> (U+2212, MINUS SIGN). Beide unterscheiden sich vom Bindestrich "‐"
> (U+2010, HYPHEN) dadurch, dass sie länger sind. Das Minuszeichen ist
> aber meist etwas dicker als der Halbgeviertstrich und steht etwas höher
> über der Grundlinie.

Ein "Hyphen" ist doch ein Trennstrich? Also kürzer als Minus, Binde- und 
Gedankenstrich.

Trennstrich: in "Binde-" von oben bzw. bei Worttrennung (TeX -, HTML - 
oder ­)

Bindestrich: wie in "Satz von Banach-Tarski" (TeX --, HTML –)

Gedankenstrich nochmal länger (TeX ---, HTML —)

Minus: In Formeln (TeX - in math-Mode, HTML −) wobei TeX Minus als 
Infix nochmal anders setzt als als Vorzeichen.

Das ­ in HTML markiert lediglich eine Trennstelle; ob tatsächlich 
ein - ausgegeben wird hängt vom konkreten Textssatz ab.  Oft erkennt man 
Texte, die jemand per Copy & Paste erstellt hat, an "-" mitten im Wort 
wie bei "Binde-strich" mitten im Text.  Das entsteht dadurch, dass im 
Originaltext das "Binde-" am Zeilenende stand und das "strich" am Anfang 
der nächsten Zeile.  Nach Copy+Paste bleibt der Trennstrich erhalten, 
weil nicht erkannt wird, dass dieser entstand durch "Binde­strich" 
(HTML) oder dass ein Textsatzprogramm wie TeX "Bindestrich" automatisch 
trennte.

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Max M. schrieb:
> Wie kann ich das verhindern?

Zunächst solltest Du uns die Deklaration der verschiedenen Variablen 
zeigen, damit wir deren Typen kennen. Sonst ist und bleibst das 
blindes Gerate.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Johann L. schrieb:
> Ein "Hyphen" ist doch ein Trennstrich? Also kürzer als Minus, Binde-
> und Gedankenstrich.

Es ist ein so genannter Viertelgeviertstrich, der sowohl als Trenn- als
auch als Bindestrich verwendet wird.

> Trennstrich: in "Binde-" von oben bzw. bei Worttrennung (TeX -, HTML -
> oder ­)

Der &shy (soft hyphen) in HTML unterscheidet sich vom "-" nicht im
Aussehen, sondern nur in der Semantik, aber das hast du ja bereits
ausführlich erklärt.

> Bindestrich: wie in "Satz von Banach-Tarski" (TeX --, HTML –)

Der Bindestrich dient dazu, aus zwei Einzelwörtern ein zusammengesetztes
Wort zu bilden und ist dasselbe Zeichen wie der Trennstrich (also "-" in
TeX und HTML).

Der Halbgeviertstrich (-- bzw. &ndash) hingegen wird anstelle von "von
... bis"

  Bahnlinie Hamburg–Berlin
  Schuhgröße 39–42

und im Deutschen zusätzlich als Gedankenstrich verwendet.

Bei "Banach-Tarski" handelt es sich nicht um ein zusammengesetztes Wort
im eigentlichen Sinn. Der Strich soll hier eine Beziehung zwischen den
beiden Personen (konkret: die Tatsache, dass der Satz in einer
Zusammenarbeit entstanden ist) ausdrücken. In diesem Fall wird im
Englischen oft ebenfalls der Halbgeviertstrich verwendet, im Deutschen
ist das aber unüblich.

> Gedankenstrich nochmal länger (TeX ---, HTML —)

Das ist der Geviertstrich, der im Englischen als Gedankenstrich, im
Deutschen aber so gut wie überhaupt nicht verwendet wird.

> Minus: In Formeln (TeX - in math-Mode, HTML −) wobei TeX Minus als
> Infix nochmal anders setzt als als Vorzeichen.

IMHO ist das Subtraktions- und das negative Vorzeichen dasselbe Zeichen,
nur dass letzteres etwas näher an die nachfolgende Zahl oder Variable
gerückt wird.


Oje, und das Ganze nur, weil mal wieder einer Quellcode aus dem Internet
gecopypastet hat, der irgendwann auf seinem Weg dorthin eine fehlerhafte
Autokorrektur à la Word durchlaufen hat :)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

C-Quelltext ist üblicherweise 7-Bit-ASCII, und damit erübrigen sich 
sämtliche typographischen Betrachtungen.

von Mark B. (markbrandis)


Lesenswert?

Rufus Τ. F. schrieb:
> C-Quelltext ist üblicherweise 7-Bit-ASCII, und damit erübrigen sich
> sämtliche typographischen Betrachtungen.

Nicht wenn der Themenersteller mit verhunztem Code ankommt, woraus eben 
gerade der Fehler resultiert.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Genau lesen. Das ist dann nämlich kein C-Quelltext mehr, sondern nur 
etwas, was vage ähnlich aussieht.

von Mark B. (markbrandis)


Lesenswert?

Rufus Τ. F. schrieb:
> Genau lesen. Das ist dann nämlich kein C-Quelltext mehr, sondern nur
> etwas, was vage ähnlich aussieht.

Wenn der Themenersteller das alles kapieren würde, würde er ja die Frage 
so nicht stellen.

von Der Andere (Gast)


Lesenswert?

Mark B. schrieb:
> Wenn der Themenersteller das alles kapieren würde, würde er ja die Frage
> so nicht stellen.

Die ist doch längst erschöpfend beantwortet. Was höchstens noch offen 
ist ist deine Frage:

Mark B. schrieb:
> Wer schreibt so beschissen(en) Code? :-(

Die wurde aber auch schon beantwortet. Man kann sie nochmal mit Murphy 
und Einstein beantworten, sprich jeder Fehler und sei er noch so blöd 
wird irgendwann mal vorkommen, und es wird immer noch ejemand geben der 
eine noch dümmere Idee hat.

von Arc N. (arc)


Lesenswert?

A. K. schrieb:
> Du willst jetzt aber nicht wirklich, dass andere dieses Monster
> häckseln?

Das sieht nach Bosch-Sensor aus ;)
1
  v_x2_u32r  = (((((v_uncomp_temperature_s32
2
  >> BME280_SHIFT_BIT_POSITION_BY_04_BITS) -
3
  ((s32)p_bme280->cal_param.dig_T1))
4
  * ((v_uncomp_temperature_s32 >> BME280_SHIFT_BIT_POSITION_BY_04_BITS) -
5
  ((s32)p_bme280->cal_param.dig_T1)))
6
  >> BME280_SHIFT_BIT_POSITION_BY_12_BITS) *
7
  ((s32)p_bme280->cal_param.dig_T3))
8
>> BME280_SHIFT_BIT_POSITION_BY_14_BITS;
(Formatierung nicht von mir... und BME280_SHIFT_BIT_POSITION_BY_14_BITS 
ist tatsächlich #define BME280_SHIFT_BIT_POSITION_BY_14_BITS (14))

https://github.com/BoschSensortec/BME280_driver/blob/master/bme280.c

Edit: Bevor jemand fragt: Die definieren auch
1
#define BME280_NULL                          (0)
2
oder
3
#define BME280_RETURN_FUNCTION_TYPE s8
4
oder 
5
#define BME280_DELAY_RETURN_TYPE void
6
und
7
#define BME280_DELAY_PARAM_TYPES u16
Und ja, die werden benutzt...

: Bearbeitet durch User
von Mark B. (markbrandis)


Lesenswert?

Arc N. schrieb:
> (Formatierung nicht von mir... und BME280_SHIFT_BIT_POSITION_BY_14_BITS
> ist tatsächlich #define BME280_SHIFT_BIT_POSITION_BY_14_BITS (14))
>
> https://github.com/BoschSensortec/BME280_driver/blob/master/bme280.c

Was mal wieder beweist: In jeder großen Firma gibt es Vollidioten, die 
man programmieren lässt obwohl sie für diesen Job einfach nicht geeignet 
sind.

von Arc N. (arc)


Lesenswert?

Mark B. schrieb:
> Arc N. schrieb:
>> (Formatierung nicht von mir... und BME280_SHIFT_BIT_POSITION_BY_14_BITS
>> ist tatsächlich #define BME280_SHIFT_BIT_POSITION_BY_14_BITS (14))
>>
>> https://github.com/BoschSensortec/BME280_driver/blob/master/bme280.c
>
> Was mal wieder beweist: In jeder großen Firma gibt es Vollidioten, die
> man programmieren lässt obwohl sie für diesen Job einfach nicht geeignet
> sind.

Aber das auf Github zu stellen...

p.s. die Sensoren an sich sind wirklich gut und die Gleichungen 
funktionieren
p.p.s. das ist nicht aus dem Github-Code, sondern direkt aus dem 
Datenblatt, aber: "Please note that it is strongly advised to use the 
API available from Bosch Sensortec to perform readout and compensation. 
If this is not wanted, the code below can be applied at the user’s 
risk."
1
BME280_S32_t t_fine;
2
BME280_S32_t BME280_compensate_T_int32(BME280_S32_t adc_T)
3
{
4
    BME280_S32_t var1, var2, T;
5
    var1 = ((((adc_T>>3) - ((BME280_S32_t)dig_T1<<1))) * ((BME280_S32_t)dig_T2)) >> 11;
6
    var2 = (((((adc_T>>4) - ((BME280_S32_t)dig_T1)) * ((adc_T>>4) - ((BME280_S32_t)dig_T1))) >> 12) *
7
((BME280_S32_t)dig_T3)) >> 14;
8
    t_fine = var1 + var2;
9
    T = (t_fine * 5 + 128) >> 8;
10
    return T;
11
}
12
mit
13
uint16_t dig_T1;
14
int16_t dig_T2;
15
int16_t dig_T3;
p.p.p.s. wer mag darf überlegen welche Casts da nötig und welche es 
nicht sind

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.