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


von C-Anfänger (Gast)


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:
1
MasterWrite( unsigned char *msg, unsigned char msgSize)

Und zwar so:
1
U08 msg[8];
2
U08 msgSize = 8;
3
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.

von Increment (Gast)


Lesenswert?

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

von C-Anfänger (Gast)


Lesenswert?

Oh mann, natürlich. So einfach!
Danke.

von Marc V. (Firma: Vescomp) (logarithmus)


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.

von Chris (Gast)


Lesenswert?

Geht auch so:
&msg[1]

von Increment (Gast)


Lesenswert?

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

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

von VIA (Gast)


Lesenswert?

Ich würde das schon bei der Übergabe des Zeigers einfügen:
1
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.

von Luther B. (luther-blissett)


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?

von mh (Gast)


Lesenswert?

Increment schrieb:
> Einfach msg++; benutzen.

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

Nein!
1
error: lvalue required as increment operand
2
     foo(++x);
3
         ^~
4
5
error: lvalue required as increment operand
6
     foo(x++);
7
          ^~

von Increment (Gast)


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.

von Wegstaben V. (wegstabenverbuchsler)


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

von Luther B. (luther-blissett)


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?

1
$ cat x.c
2
3
int main()
4
{
5
  char m[8]; 
6
  m++; 
7
}
8
$ gcc x.c 
9
x.c: In function ‘main’:
10
x.c:5:3: error: lvalue required as increment operand
11
  m++; 
12
   ^

: Bearbeitet durch User
von Walter K. (Gast)


Lesenswert?


von Walter K. (Gast)


Lesenswert?

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

si tacuisses, philosophus mansisses

von Walter K. (Gast)


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

von Norbert (Gast)


Lesenswert?

MasterWrite(msg + 1, msgSize - 1);

von Stefan E. (sternst)


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.

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.