Forum: PC-Programmierung sizeof(Buffer) geht nicht warum in C


von Der G. (jonnyk)


Lesenswert?

Hallo alle zusammen


Ich habe eine funktion

int onl_send(char Buffer[])
{
  int v;
  lcd_print("Bin am Senden...",4,22,0,Schwarz,Gruen);

  if(Buffer[0]=='<')
  {
    lcd_print("Start zeichen Found",4,22,0,Schwarz,Gruen);
    for(v=0;sizeof(Buffer);v++)
    {
      stdout = &mystdout;
          printf("%c",Buffer[v]);
    }
  }
  else
  {
    lcd_print("Kein Start zeichen",4,22,0,Schwarz,Gruen);
    getkey();
    menue();
  }
    return(0);
}

Buffer wird vorher eingelesen und an diese funktion übergeben.
wieso funktioniert diese Ausgabe funktion nicht? wenn ich als Abbruch 
bedienung das letzte zeichen rein schreibe was im buffer steht z.b.

for(v=0;Buffer[v]!='>';v++)

Dann gibt er mir alle zeichen aus die vor dem '>' stehen. Ich möchte 
aber dass alle zeichen ausgegeben werden.

Hoffe das jemand damit schon erfahrungen gesamelt hat und mir helfen 
kann.

von MarkusW (Gast)


Lesenswert?

1
for(v=0;sizeof(Buffer);v++)

Und wo ist da die Abbruchbedingung?
sizeof(Buffer) ist immer "wahr".

Würde mal
1
for(v=0;v<sizeof(Buffer);v++)

probieren.

Gruß
Markus

von Der G. (jonnyk)


Lesenswert?

ja habe mich verschrieben war ja auch so sorry

aber danke für die schnelle antwort..

das ist meine abbruchbedingung
v<sizeof(Buffer);

von JojoS (Gast)


Lesenswert?

woher soll der Compiler denn wissen wie gross dein Buffer ist wenn der 
als char[] deklariert ist? Also entweder die Grösse beim Funktionsaufruf 
mitgeben oder als Endebedingung z.B. auf Zeichen '0' testen (das muss 
dann vorher natürlich auch in den Buffer reingeschrieben werden).

von Der G. (jonnyk)


Lesenswert?

Achso

Und wenn ich den Buffer doch von einer anderen Funktion übergebe wird 
die grösse dann nciht vom copiler festgelegt?

von Rolf Magnus (Gast)


Lesenswert?

> Und wenn ich den Buffer doch von einer anderen Funktion übergebe wird
> die grösse dann nciht vom copiler festgelegt?

Man kann generell keine Arrays als Funktionsparameter definieren. Buffer 
ist in deinem Code ein Zeiger auf char, und sizeof wird dir daher die 
Größe eines Zeigers auf char geben.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

@ Der Grosse

Obacht: Du übergibst nur einen Zeiger auf den Datenbereich, nicht den 
Datenbereich selber! Siehe:

Frage 2.4: Warum sind dann Array- und Zeigerdeklarartionen als formale 
Parameter einer Funktion austauschbar?
http://www.dclc-faq.de/kap2.htm

von Christian (Guest) (Gast)


Lesenswert?

char a[10];
sizeof(a);    // liefert 10
sizeof(a[3]); // liefert 1

aus
http://de.wikibooks.org/wiki/C-Programmierung:_Ausdr%C3%BCcke_und_Operatoren#Speichergr.C3.B6.C3.9Fe_sizeof


und a[0]  ?

Nach meiner kenntnis ist:
a[] = a[0]

von Der G. (jonnyk)


Lesenswert?

Christian (Guest) wrote:
> char a[10];

Achtung Achtung

====> sizeof(a);    // liefert 10

> sizeof(a[3]); // liefert 1


und wenn ich a übergebe dann Kriege ich nicht mehr 10 zurück?

Aber stimmt alles was ihr mir geschrieben habt

Vielen dank mir wurde sehr geholfen

von Christian (Guest) (Gast)


Lesenswert?

Sory,
link:

http://home.fhtw-berlin.de/~junghans/cref/EXAMPLES/sizeof1.c

Das bEISPIEL IST PASSEND

dEIN aRRAY IST [] = [0]

von Der G. (jonnyk)


Lesenswert?

Achso stimmt...

bin ich doff...

:-)

danke schön

von Rolf Magnus (Gast)


Lesenswert?

> und wenn ich a übergebe dann Kriege ich nicht mehr 10 zurück?

Du kannst a nicht übergeben. Nochmal: In der Funktion hast du nur noch 
einen Zeiger, der auf den ersten char deines Arrays zeigt. Ein sizeof 
gibt die Größe dieses Zeigers zurück, die natürlich nichts mehr mit der 
Größe des Arrays zu tun hat.

> dEIN aRRAY IST [] = [0]

Nein.

von Peter (Gast)


Lesenswert?

Lösungsvorschlag: Da Du ja eh einen String übergibst (der mit Null 
Terminiert ist) einfach so:
1
for(v=0; '\0' != buffer[v]; v++)

von BiegeStrahl (Gast)


Lesenswert?

Übrigens: Statt ein verhältnismäßig riesiges
1
printf("%c",Buffer[v]);

auf ein einzelnes Zeichen loszulassen, würde es auch ein
1
putchar(Buffer[v]);

tun.

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.