char* an Funktionübergeben

Gast #1884381
Lesenswert?

Hallo,

ich möchte einen Pointer auf eine Zeichenkette an ein Unterprogramm 
übergeben, nur leider scheint das SO nicht zu klappen. Der Pointer im 
Unterprogramm zeigt irgendwo hin. Deswegen liefert sizeof() auch zB 2 
anstatt 3.

Wie muss es richtig lauten?
1
extern int8_t unterprogramm(char* buffer)
2
{
3
   return sizeof(buffer);
4
}
5

6
int main(void)
7
{
8
   int8_t u;
9
   char test[] = {0x0E,0x02,0x21};
10
   u = unterprogramm(test);
11
   .
12
   .
13
   .
14
}
#1884390
Lesenswert?

Das kann so ja auch nicht funktionieren. Test ist ja halt nur ein 
Pointer, der eben aufm AVR 16-bit groß ist. Also liefert sizeof völlig 
korrekt den Wert 2.

Die Funktion kann ja mit allen möglichen char * Pointern aufgerufen 
werden. Beim Aufruf übergibst du einfach den Pointer und verlierst die 
Größeninformation eines Arrays. Das sizeof eines Arrays funktioniert nur 
dann richtig, wenn die Größe zur Compile-Zeit bekannt ist.

MfG
Marius
Persönliche Seite #1884398
Lesenswert?

> Der Pointer im Unterprogramm zeigt irgendwo hin.

Nö, der an Deine Funktion übergebene Pointer zeigt dahin, wo er soll.

> Deswegen liefert sizeof() auch zB 2 anstatt 3.

sizeof liefert die Größe des übergebenen Pointers, und der ist auf einem 
16-Bit-System nunmal 2 Bytes groß.

Das ist also korrekt.

Daß der Pointer auf ein Array mit n Elementen zeigt, das ist in Deiner 
Funktion nicht bekannt, und die Anzahl der Elemente lässt sich so auch 
nicht mit sizeof bestimmen.

Wenn buffer ein String (eine Zeichenkette) sein soll, dann lässt sich 
die Stringlänge mit der C-Runtime-Funktion strlen bestimmen.

In Deinem Beispiel aber ist das Array test kein String, da es nicht 
mit Null terminiert ist (und außerdem mehrere nicht darstellbare Zeichen 
enthält).

Deiner Funktion musst Du beim Aufruf neben dem Pointer auf das Array 
auch dessen Größe mitteilen:
1
int8_t unterprogramm(char* buffer, int size)
2
{
3
   return size;
4
}
5

6
int main(void)
7
{
8
   int8_t u;
9
   char test[] = {0x0E,0x02,0x21};
10
   u = unterprogramm(test, sizeof (test));
11
   .
12
   .
13
   .
14
}

Damit gewinnt allerdings das Beispiel an Sinnlosigkeit (warum einer 
Funktion, die anscheinend die Länge eines Arrays bestimmen soll, 
dessen Länge mitteilen?).


Abschließend:
Das Schlüsselwort extern ist hier vollkommen fehl am Platze.
Gast #1884402
Lesenswert?

Du solltest nochmal das Kapitel über Datentypen und Pointer 
durcharbeiten.

Luk4s K. schrieb:
> Datum: 05.10.2010 21:58
>

>        u = unterprogramm(test);ersetzen durch u = unterprogramm(&test);


das ist ebenfalls Quatsch! test ist schon ein pointer und zwar der 
pointer auf das array test[], daher richtig ohne "AdressOf"(&) Operator
#1884410
Lesenswert?

Stefan schrieb:
> Hallo,
>
> ich möchte einen Pointer auf eine Zeichenkette an ein Unterprogramm
> übergeben, nur leider scheint das SO nicht zu klappen. Der Pointer im
> Unterprogramm zeigt irgendwo hin. Deswegen liefert sizeof() auch zB 2
> anstatt 3.
>
> Wie muss es richtig lauten?
> extern int8_t unterprogramm(char* buffer)
> {
>    return sizeof(buffer);
> }
>
> int main(void)
> {
>    int8_t u;
>    char test[] = {0x0E,0x02,0x21};
>    u = unterprogramm(test);
>    .
>    .
>    .
> }

Das Programm tut genau das, was Du ihm aufträgst. Die Funktion 
unterprogramm soll die Größe eines Pointers (auf ein char) zurückgeben. 
Die Größe dieses Pointers ist 2.

Was Du erreichen wolltest, ist vermutlich etwas völlig anderes. Dich 
scheint die Länge des char arrays test zu interessieren. Nimm Dein 
C-Lehrbuch und schaue nach, wie Du Dein Problem löst.

Bernhard
Gast #1884454
Lesenswert?

Danke für die schnellen Antworten

das "extern" war nur ein überbleibsel vom richtigen Programm, hab ich 
vergessen weg zu machen

Da ich offensichtlich vergessen hatte wie sizeof() funktioniert ist mir 
nun auch klar warum 2 raus kam als Ergebnis

Aber warum liefert es hier den korrekten Wert 4?
1
int main(void)
2
{
3
  char test[] = {0x0E,0x02,0x21,0x66};
4
  int8_t bufferlength = sizeof(test);
5
}
Gast #1884491
Lesenswert?

sizeof ist nicht wirklich eine funktion. Es ist vielmehr eine Art Makro, 
die den compiler veranlasst, mal nachzuschauen, wie gross deine 
Variablen sind und der Wert wird dann an der Stelle des sizeof 
eingesetzt. Das heisst, es ist wie eine Konstante, wenn das Programm 
erstmal kompiliert ist.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren