www.mikrocontroller.net

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


Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: MarkusW (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
for(v=0;sizeof(Buffer);v++)

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

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

probieren.

Gruß
Markus

Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja habe mich verschrieben war ja auch so sorry

aber danke für die schnelle antwort..

das ist meine abbruchbedingung
v<sizeof(Buffer);

Autor: JojoS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso

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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian (Guest) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
char a[10];
sizeof(a);    // liefert 10
sizeof(a[3]); // liefert 1

aus
http://de.wikibooks.org/wiki/C-Programmierung:_Aus...


und a[0]  ?

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

Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian (Guest) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sory,
link:

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

Das bEISPIEL IST PASSEND

dEIN aRRAY IST [] = [0]

Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso stimmt...

bin ich doff...

:-)

danke schön

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

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

Autor: BiegeStrahl (Gast)
Datum:

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

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

tun.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.