Forum: Mikrocontroller und Digitale Elektronik char* an Funktionübergeben


von Stefan (Gast)


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
}

von Lukas K. (carrotindustries)


Lesenswert?

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

von Marius W. (mw1987)


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

von P. S. (Gast)


Lesenswert?


von Rufus Τ. F. (rufus) Benutzerseite


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.

von bloat (Gast)


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

von Bernhard R. (barnyhh)


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

von Stefan (Gast)


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
}

von Klaus W. (mfgkw)


Lesenswert?

weil du es hier auf das Array anwendest, nicht auf einen Zeiger.

Merke (steht fast überall): Ein Feld ist in C ein Zeiger.
Merke 2: Stimmt nur bedingt, hier nicht.

von Stefan (Gast)


Lesenswert?

Bernhard R. schrieb:
> Nimm Dein
> C-Lehrbuch und schaue nach, wie Du Dein Problem löst.

Joa, ich könnte wohl künstlich ein StringendeZeichen einfügen und dann 
strlen(), oder wie schon erwähnt die Anzahl als extra Parameter 
übergeben

Mehr fällt mir jetzt grad auch nicht ein

von Klaus W. (mfgkw)


Lesenswert?

Stefan schrieb:
> StringendeZeichen

Das ist in C halt das Nullbyte.
Genau dafür wurde die Null von den Indern erfunden.

von bloat (Gast)


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.

von Klaus W. (mfgkw)


Lesenswert?

bloat schrieb:
> sizeof ist nicht wirklich eine funktion. Es ist vielmehr eine Art Makro,

Stimmt, es ist keine Funktion.
Aber nein, es ist keine Art Makro, sondern ein Operator wie + oder
- auf Konstanten, der zur Übersetzungszeit vom Compiler ausgewertet
wird.

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.