Forum: Compiler & IDEs Call by Reference?


von Peter Ott (Gast)


Lesenswert?

Hallöchen,

ich nutze i.d.R Atmel-Avr Studio zusammen mit dem GC-Compiler.

Nun habe ich ein kleines Problem. Ich habe eine Zeichenkette, z.B. 20
Character, in einer Funktion und möchte diese Zeichenkette in einer
andere Funktion bearbeiten (das ist zwar nicht genau der
Anwendungsfall, aber so ist es leicht verständlich).

Ich denke, ich tippe mal hin, wie ich mir das vorstelle - auf die Art
und Weise funktioniert es aber nicht :-(

void cbrTest(unsigned char *myc);

int main(void)
{
 unsigned char mychar[20];
 cbrTest(mychar);

 // hier brauche ich dann in mychar die Werte aus cbrTest...
}

void cbrTest(unsigned char *myc)
{
 *myc = '1';
 myc++;
 *myc = '2';
}

von Rolf Magnus (Gast)


Lesenswert?

> Ich denke, ich tippe mal hin, wie ich mir das vorstelle - auf die
> Art und Weise funktioniert es aber nicht :-(

Was heißt das? Was funktioniert nicht? Was erwartest du und was
passiert stattdessen?

> void cbrTest(unsigned char *myc);

Ich dachte, es geht um Zeichenketten? Warum dann nicht char*?

> int main(void)
> {
>  unsigned char mychar[20];
>  cbrTest(mychar);
>
>  // hier brauche ich dann in mychar die Werte aus cbrTest...

Ja, da schickst du sie ja auch hin.

> }

void cbrTest(unsigned char *myc)
{
 *myc = '1';
 myc++;
 *myc = '2';
}

Wenn's eine Zeichenkette sein soll, muß sie in der Regel noch mit
einem '\0' terminiert werden.

von Peter Ott (Gast)


Lesenswert?

Hi

ich nutze in der regel ein Character-Feld für
"Zeichenketten"...wüsste auch nicht, was ich anderes nehmen sollte um
halbwegs "platz optimiert" zu arbeiten. Aber darum geht es ja
eigentlich nicht ;-)

Ich hätte eigentlich erwartet, dass nach dem Aufruf von cbrTest mychar
wie folgt ausschaut:
mychar[0]=1
mychar[1]=2
Die restlichen sind undefiniert...

Das ist aber nicht so. mychar ist einfach so wie es initilisiert wurde
bzw. völlig undefiniert.
cbrTest schreibt meiner Ansicht nach irgendwo ins Nirvana...aber warum?

von Frank (Gast)


Lesenswert?

>Das ist aber nicht so. mychar ist einfach so wie es initilisiert wurde
>bzw. völlig undefiniert.
>cbrTest schreibt meiner Ansicht nach irgendwo ins Nirvana...aber
warum?

Das fällt ja fast schwer zu glauben.
Vielleicht solltest Du doch Dein "original Problem Code" posten.
Ich kann hier keinen Fehler entdecken.

von Thomas (Gast)


Lesenswert?

Ok, da ist er:
Prototyp von callbyref ist angelegt.

{
...
  uint8_t temp = 0b11000000;
  unsigned char mychar[10];
  strcpy(mychar,"###########");

  while(1)
  {
  temp |= mylines[0].uiPos ;
  lcd_command(temp);
  //
  fwait(200);
  callbyref(mychar[0]);
  lcd_string_out(&mychar[0]);
  }
...
}

void callbyref(unsigned char *str)
{
  *str = '1';
  str++;
  *str = '2';
}

von ....... (Gast)


Lesenswert?

*myc = '1'; <----------------------- dort wo der Zeiger hinzeigt wird
was eingetragen
myc++; <------------Zeiger verstellen
*myc = '2'; <----------- irgendwo hinschreiben

von Roland P. (pram)


Lesenswert?

nönö:

callbyref(mychar[0]);

ist falsch. Eigentlich müsste der Compiler da ne Cast-Warnung ausgeben.
Übersetz mal mit -Wall

entweder du machst:
callbyref(mychar);
oder
callbyref(&mychar[0]);
was im Prinzip das Gleiche ist.

Gruß
Roland

von Walter (Gast)


Lesenswert?

wenn dein Feld nur 10 Chars gross ist kannst du nicht 12 Zeichen
reinkopieren

Walter

von Thomas (Gast)


Lesenswert?

@Walter - danke für den Hinweis, aber ich glaube Du hast da was
übersehen ;-) Nichts für ungut!

@Roland. Also mit Callbyref(mychar) gehts!
Aber, wieso? Ob ich nun die Adresse vom Beginn, bzw. die Adresse vom
ersten - argh...Da geht mir doch glatt ein Lichtlein auf ;-)

Gut, ich habs verstanden!
callbyref(mychar) --> Adresse vom ersten Element wird übergeben
callbyref(&mychar[0]) --> Adresse vom ersten Element wird übergeben
callbyref(mychar[0]) --> Value vom ersten Elemnt wird übergeben, denn
mychar ist ja nicht als Zeiger angelegt...

Sehe ich das richtig?

von Frank (Gast)


Lesenswert?

>  Sehe ich das richtig?

JA !!

> @Walter - danke für den Hinweis, aber ich glaube Du hast da was
>übersehen ;-) Nichts für ungut!

Und was soll er übersehen haben ? Ich hab's auch übersehen

von André K. (freakazoid)


Lesenswert?

@Thomas:
Nicht so voreilig. Deine Zeilen:

unsigned char mychar[10];
strcpy(mychar,"###########");

kopieren 12 Zeichen (11# + \0) in ein 10-Zeichen-Feld. Das ist
Mumpitz.

Grüße, Freakazoid

von Thomas (Gast)


Lesenswert?

Ach, das meint ihr drei ;-)

Da habe ich mich wohl um zwei verzählt!
Ich bin fest davon ausgegangen, dass dort nur Neun Rauten stehen und
mir gedacht, naja - der Walter meint wohl noch die '1' und die
'2'...Da habe ich wohl was übersehen ;-)

von Rolf Magnus (Gast)


Lesenswert?

> ich nutze in der regel ein Character-Feld für "Zeichenketten"...

Hier aber nicht. Der Typ für Zeichen ist char. Du benutzt aber unsigned
char, und ich wollte nur wissen, warum nicht char.

> Aber darum geht es ja eigentlich nicht ;-)

Ich dachte mir halt, ich merk's trotzdem mal an.

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.