mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Array Subroutine


Autor: Gastinio (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde gerne im CCS compiler  einen Prototypen schreiben, der mir ein 
Wort in einzelne Charakter unterteilt. Das Problem ist, dass der Wert (R 
E A S O N) im array, beim Sprung in die Subrutine irgendwie 
verschwindet... übrig bleiben unterschiedliche Zeichen... Was könnte 
dies verursachen

Ich habe folgendes Programm geschrieben:


//Programm Init
void lcd_write(char text[10]);


//Main Loop
lcd write("REASON");


//Subrutine Ausgabe an Display
void lcd_write(char text[10])

for(i=0;i<21;i++)
 {
 output_d(x[i]);
 }

mfg Gastinio

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>//Subrutine Ausgabe an Display
>void lcd_write(char text[10])
>for(i=0;i<21;i++)
> {
> output_d(x[i]);
> }

Was soll da passieren?
Ein Parameter, der überhaupt nicht benutzt wird, Variablen, die nicht 
mal irgendwo deklariert werder, und ein Zähler, der, wenn ich es richtig 
deute, zu einem Überlauf des Arrays führt.

Guck dir einfach noch mal den Mist* an, den du dahin geschrieben hast.

*Erst denken, dann suchen und dann fragen!

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du der Ausgabefunktion ein Array mit dem Namen "text" übergibst und 
ein Array mit dem Namen "x" ausgeben willst, dann kann alles Mögliche 
passieren, angefangen von einer Fehlermeldung weil der Compiler 
möglicherweise "x[]" gar nicht kennt. Außerdem dürfte es da sowieso 
einen Speicherklassen-Konflikt geben, weil Du einen konstanten String an 
eine Funktion übergibst, die ein variables Array erwartet. Strings 
übergibt man an Funktionen i.d.R. als Zeiger.

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Johnny:
>text[10])
>for(i=0;i<21;i++)

Fällt dir noch was auf?

Autor: Kallius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Besser:
//Subroutine Ausgabe an Display
void lcd_write(char *text)
{
  while (*text)
   output_d(*(text++));
}

  

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Rufus:
Spielverderber!

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Trolli:
> Fällt dir noch was auf?
Ja, das ist mir auch aufgefallen. Aber das dürfte eins seiner kleineren 
Probleme sein.

Autor: Gastinio (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
//Programm Init
void lcd_write(char text[10]);


//Main Loop
lcd write("REASON");


//Subrutine Ausgabe an Display
void lcd_write(char text[10])

int i;

for(i=0;i<10;i++)
 {
 output_d(text[i]);
 }


Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und jetzt?
Die (einzig sinnvolle) Lösung hat Rufus doch schon gepostet.
Guck dir am besten mal C-Grundlagen(-Bücher) an.

Autor: Gastinio (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmmm.... was soll an der schreibweise falsch sein? alle variabeln sind 
integriert? das die headerfile usw. nicht angegeben werden sollte ja 
eigentlich klar sein. es geht lediglich um die übergabe eines Array in 
eine subroutine....

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Gastinio

So schnell wird Linda zu Gastino? ;-)

>eigentlich klar sein. es geht lediglich um die übergabe eines Array in
>eine subroutine....

Das mancht man über Pointer auf dass Array, das Array selber wird nicht 
übergeben. -> Nochmal Grundlagen von C nacharbeiten.


char my_array[10];

void lcd_write(char *my_pointer)

for(i=0;i<21;i++)
 {
 output_d(my_pointer[i]);
 }

MFG
Falk

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>char my_array[10];

>void lcd_write(char *my_pointer)

>for(i=0;i<21;i++)
> {
> output_d(my_pointer[i]);
> }

Da würde mich interessieren, was bei den letzten 10 Zeichen 
herauskommt...

>So schnell wird Linda zu Gastino? ;-)
Gibt's dazu einen Link?

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Rahul, der Trollige

>>char my_array[10];

>>void lcd_write(char *my_pointer)
>>for(i=0;i<21;i++)
>> {
>> output_d(my_pointer[i]);
>> }

>Da würde mich interessieren, was bei den letzten 10 Zeichen
>herauskommt...

>>So schnell wird Linda zu Gastino? ;-)
>Gibt's dazu einen Link?

Kommt dir das Probelem und der merkwürdige Quelltext nicht bekannt vor?

Beitrag "Auftrilung eines Strings und Ausgabe"

Diese Welt ist zu schnelllebig. Alzheimer wird zur Norm.

MfG
Falk

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Kommt dir das Probelem und der merkwürdige Quelltext nicht bekannt vor?
Nee.
Da ich da meinen Senf noch nicht dazu gegeben habe, ist er mir wohl 
entfallen.

>Diese Welt ist zu schnelllebig. Alzheimer wird zur Norm.
Wohl wahr. Wobei es wohl nicht Alzheimer ist, sondern das Gehirn kann 
die vielen Eindrücke nicht schnell genug speichern...

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>13.02.2007 10:57
>13.02.2007 11:50

Das war ja schon gestern...

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Rahul, der Trollige

>>Diese Welt ist zu schnelllebig. Alzheimer wird zur Norm.
>Wohl wahr. Wobei es wohl nicht Alzheimer ist, sondern das Gehirn kann
>die vielen Eindrücke nicht schnell genug speichern...

Das Hirn an sich ist intelligent und hat einen gesunden 
Selbsterhaltungstrieb. Es tut sich den Datenmüll gar nicht erst an.
Der Mensch an sich ist da weit weniger intelligent. Vielleicht sind 
MEnsch und irn ja zwei eigenständige Lebewesen, die nur zufällig in 
Symbiose leben? Hmmmmm . . .

>>13.02.2007 10:57
>>13.02.2007 11:50

>Das war ja schon gestern...

Stimmt, das ist ewig her, wie damals Stalingrad . . . ;-)

MfG
Falk

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gastinio wrote:
> //Programm Init
> void lcd_write(char text[10]);
>
>
> //Main Loop
> lcd write("REASON");
>
>
> //Subrutine Ausgabe an Display
> void lcd_write(char text[10])
>
> int i;
>
> for(i=0;i<10;i++)
>  {
>  output_d(text[i]);
>  }

Lass die 10 weg.
Die suggerieren dir etwas, was nicht da ist.
Das Array wird nicht als Array übergeben. In C
werden Arrays immer als Zeiger auf das erste
Element übergeben. Seit einiger Zeit gibt
es etwas was man als 'syntactic sugar' bezeichnet
(also eine 'Verkleidung', die nur syntaktischer
Natur ist). Du kannst ein Array so übergeben:

void lcd_write( char text[] )

Das ist aber nur 'syntactic sugar', das Array wird immer
noch als 'Zeiger auf das erste Element' übergeben, lediglich
die Schreibweise ist etas weniger 'kryptisch'.

Die Längenangabe lässt du aber auf jeden Fall weg.
1) Braucht sie niemand
2) Ignoriert sie der Compiler in diesem Fall sowieso
3) Selbst wenn 1 und 2 nicht wahr wären, du willst ja
   die Funktion sicherlich auch mit Texten anderer Länge
   aufrufen. Was soll dann passieren?

In C ist jeder String mit einem '\0' Zeichen abgeschlossen.
Der ist dein Endekriterium. Deine Ausgabefunktion lautet
also umgangssprachlich:

   Solange das nächste Zeichen nicht '\0' ist
     gib es aus

oder in C (wenn es denn unbedingt die Array-Schreibweise
und Indizierung sein muss)

void lcd_write( char text[] )
{
  int i = 0;
  while( text[i] != '\0' ) {
    output_d( text[i] );
    i++;
  }
}

Ich hab das jetzt bewusst ohne Pointer und ausführlich geschrieben.
Mit einem halben Jahr Übung schreibst du dass dann automatisch so,
wie Rahul es weiter oben schon demonstriert hat.

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.