Forum: Compiler & IDEs size_t Problem


von Hüsch, Hans Dieter (Gast)


Lesenswert?

Hagenbuch hat jetzt zugegeben, daß er ein Problem im Code hat:
1
void print( char *st, uint32_t x, uint32_t y, int32_t deg)
2
{
3
  int32_t stl;
4
  int32_t i;
5
  stl = strlen(st);
6
7
    const char *p = st;
8
    while (*p)
9
    {
10
        ++p;
11
    }
12
stl = size_t(p - st);
13
 ...
14
 ...
15
 ...
16
}
Führt zu:
 error: expected expression before 'size_t'
 stl = size_t(p - st);
       ^
make: *** [src/LCD480x272/UTFT.o] Error 1

Der Code wurde mal unter C++ compiliert, da gab's kein Gemecker, unter C 
aber schon. Warum?

von Rene H. (Gast)


Lesenswert?

Wer ist Hagenbuch?

Weil C keine size_t kennt, C++ aber schon std::size_t

PS: in C ist das sizeof().

von Hüsch, Hans Dieter (Gast)


Lesenswert?

Hagenbuch ist derjenige von dem man sagt, daß er erneut wie damals 
schon, also daß er erneut einer Einladung des Ministerpräsidenten zu 
einer zwanglosen Teestunde in einem zwanglosen Kreis mit zwanglosen 
Segeljachtbesitzern, Kulturschaffenden und Spitzensportlern, ähem, nicht 
nachgekommen sei.

sizeof() ist gut.
Danke.

von Rene H. (Gast)


Lesenswert?

Ah ok. Den kannte ich nicht. Danke für den (guten) Literatur Tipp :-)

von Hans (Gast)


Lesenswert?

Das ist ein Cast nach size_t in der Pseudo-Konstruktor-Schreibweise, die 
nur C++ kennt. In C muss es heißen:
1
stl = (size_t) (p - st);

Mit sizeof hat das nichts zu tun!

von eric (Gast)


Lesenswert?

Rene H. schrieb:
> Weil C keine size_t kennt, C++ aber schon std::size_t

C kennt auch size_t, dann fehlt vermutlich eher der passende Header 
(stddef.h z.B.), aber size_t ist ein Datentyp und kein Operator. 
sizeof() wiederrum gibt aber ein size_t zurück.
Der Code sieht auch nicht so aus, als wäre an der stelle sizeof gemeint 
gewesen. Da allerdings nicht zu sehen ist, was mit dem Wert noch gemacht 
wird...

von Rene H. (Gast)


Lesenswert?

In dem Fall war ich natürlich falsch

In C braucht es dafür einen Cast und kein sizeof().

Grüsse,
René

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Rene H. schrieb:
> In C braucht es dafür einen Cast

In C++ auch ;-), die Schreibweise typename(expr) ist dort lediglich
eine alternative Form des Casts für (typename)(expr).  C kennt nur
die zweite Form.

von Dr. Sommer (Gast)


Lesenswert?

Hüsch, Hans Dieter schrieb:
> int32_t stl;
>   int32_t i;
>   stl = strlen(st);

Das ist übrigens auch ein Problem. Was, wenn man den Code auf x86 oder 
gar x86_64 kompiliert? Dann ist ein int32_t zu klein für eine String 
Größe. Für die Größe von Datenstrukturen im RAM nimmt man size_t , das 
hat je nach Plattform automatisch die richtige Größe. int32_t nur 
manchmal (auf Plattformen mit <2GB Adressraum, also zB 16Bit Plattformen 
wie AVR. Hier könnte man aber auch effizienter einen 16bit unsigned 
integer verwenden, bzw. gleich size_t).

von Rolf M. (rmagnus)


Lesenswert?

Dr. Sommer schrieb:
> Hüsch, Hans Dieter schrieb:
>> int32_t stl;
>>   int32_t i;
>>   stl = strlen(st);
>
> Das ist übrigens auch ein Problem. Was, wenn man den Code auf x86 oder
> gar x86_64 kompiliert? Dann ist ein int32_t zu klein für eine String
> Größe.

Wenn man denn einen String braucht, der länger als 2 Milliarden Zeichen 
ist. In so einem Fall würde ich aber auch nicht mehr mit "platten" 
Arrays aus char und strlen arbeiten, denn das wird dann irgendwann etwas 
zäh.

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.