mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zeiger auf Array ein weiter schieben


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: C-Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammem,
bin in C noch nicht so fit.
Habe ein kleines Problem mit Zeigern.

Ich übergebe einen Zeiger auf ein Array dieser Funktion:
MasterWrite( unsigned char *msg, unsigned char msgSize)

Und zwar so:
U08 msg[8];
U08 msgSize = 8;
MasterWrite(msg , msgSize);

Ich will jetzt aber, dass der Zeiger nicht auf msg[0] zeigt, sondern auf 
msg[1], da in der Funktion MasterWrite erst am msg[1] angefangen werden 
soll.
Wie kann ich den Zeiger manipulieren?
Ich bekomme es einfach nicht hin. Der Compiler spuckt mir immer 
irgendwelche Fehlermeldungen aus.

Bitte haut mich nicht gleich, bin noch Anfänger.

Autor: Increment (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Einfach msg++; benutzen. Aber achtung. Dann darf die größe natürlich nir 
noch 7 sein.

Autor: C-Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh mann, natürlich. So einfach!
Danke.

Autor: Marc V. (Firma: Vescomp) (logarithmus)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Increment schrieb:
> Einfach msg++; benutzen. Aber achtung. Dann darf die größe natürlich nir
> noch 7 sein.

 Das ist post-increment, ++msg haut eher hin.

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht auch so:
&msg[1]

Autor: Increment (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marc V. schrieb:
> Das ist post-increment, ++msg haut eher hin.

Das brauch er aber nur wenn er wirklich erst in
MasterWrite(msg , msgSize);
Msg inkrementieren will. Kann man aber machen wie man lustig ist.

Autor: VIA (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Ich würde das schon bei der Übergabe des Zeigers einfügen:
MasterWrite(&msg[1], msgSize);

Je nachdem was da in der Funktion passiert, musst du dann natürlich 
aufpassen, dass du nicht über das Array hinaus läufst.

Autor: Luther B. (luther-blissett)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Increment schrieb:
> Einfach msg++; benutzen. Aber achtung. Dann darf die größe natürlich nir
> noch 7 sein.

Du hast aber schon gesehen, dass msg als Array deklariert ist, 
demzufolge kein lvalue ist und nicht inkrementiert werden kann?

Autor: mh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Increment schrieb:
> Einfach msg++; benutzen.

C-Anfänger schrieb:
> Oh mann, natürlich. So einfach!

Nein!
error: lvalue required as increment operand
     foo(++x);
         ^~

error: lvalue required as increment operand
     foo(x++);
          ^~

Autor: Increment (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
C-Anfänger schrieb:
> Oh mann, natürlich. So einfach!
> Danke.

Luther B. schrieb:
> Du hast aber schon gesehen, dass msg als Array deklariert ist,
> demzufolge kein lvalue ist und nicht inkrementiert werden kann?

Scheint dafür aber erstaunlich gut zu funktionieren.

Autor: Wegstaben V. (wegstabenverbuchsler)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
C-Anfänger schrieb:
> Der Compiler spuckt mir immer irgendwelche Fehlermeldungen aus.

Na da wird ja auf dem Bildschirm nicht einfach im Wortlaut stehen 
"irgendwelche Fehler sind aufgetreten". Da wird schon mehr (für dich 
unverständliches Zeugs) stehen.


In solch einem Falle ist es zweckmäßig,

a) den genauen Wortlaut der Fehlermeldungen nicht geheim zu halten, 
sondern zu "veröffntlichen", so daß der geneigte Mit-Leser einen 
Kommentar dazu abgeben kann.

b) selber mal versuchen zu deuten, was die Fehlermeldung wohl aussagen 
möchte. Diese (deine) Deutungs-Annahme auch mit veröffentlichen, auf daß 
noch mehr Kommentare eintreffen.



"Aus Fehlern wird man klug" tritt dann in Folge automatisch ein

Autor: Luther B. (luther-blissett)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Increment schrieb:
> C-Anfänger schrieb:
>> Oh mann, natürlich. So einfach!
>> Danke.
>
> Luther B. schrieb:
>> Du hast aber schon gesehen, dass msg als Array deklariert ist,
>> demzufolge kein lvalue ist und nicht inkrementiert werden kann?
>
> Scheint dafür aber erstaunlich gut zu funktionieren.

Weil du vermutlich was anderes compilierst, als du hier postest und 
nicht verstehst, worin der Unterschied besteht. Was macht dein Compiler 
denn hier?

$ cat x.c

int main()
{
  char m[8]; 
  m++; 
}
$ gcc x.c 
x.c: In function ‘main’:
x.c:5:3: error: lvalue required as increment operand
  m++; 
   ^

: Bearbeitet durch User
Autor: Walter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Walter K. (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Increment schrieb:
> Einfach msg++; benutzen. Aber achtung. Dann darf die größe
> natürlich nir noch 7 sein.

si tacuisses, philosophus mansisses

Autor: Walter K. (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Marc V. schrieb:
> Increment schrieb:
> Einfach msg++; benutzen. Aber achtung. Dann darf die größe natürlich nir
> noch 7 sein.
>
>  Das ist post-increment, ++msg haut eher hin.

Si tacuisses, philosophus mansisses

Autor: Norbert (Gast)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
MasterWrite(msg + 1, msgSize - 1);

Autor: Stefan E. (sternst)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Luther B. schrieb:
> Weil du vermutlich was anderes compilierst, als du hier postest

Liegt eher daran, dass du nicht richtig hin geschaut hast. Der lokale 
Funktionsparameter heißt ebenfalls "msg". Innerhalb der fraglichen 
Funktion kann man also sehr wohl ein msg++ machen.

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.