www.mikrocontroller.net

Forum: Compiler & IDEs Call by Reference?


Autor: Peter Ott (Gast)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: Peter Ott (Gast)
Datum:

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

Autor: Frank (Gast)
Datum:

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

Autor: Thomas (Gast)
Datum:

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

Autor: ....... (Gast)
Datum:

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

Autor: Roland Praml (pram)
Datum:

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

Autor: Walter (Gast)
Datum:

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

Walter

Autor: Thomas (Gast)
Datum:

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

Autor: Frank (Gast)
Datum:

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

Autor: André Kronfeldt (freakazoid)
Datum:

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

Autor: Thomas (Gast)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

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

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.