Forum: Mikrocontroller und Digitale Elektronik Array Subroutine


von Gastinio (Gast)


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

von Rahul, der Trollige (Gast)


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!

von johnny.m (Gast)


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.

von Rahul, der Trollige (Gast)


Lesenswert?

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

Fällt dir noch was auf?

von Kallius (Gast)


Lesenswert?


von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Besser:
1
//Subroutine Ausgabe an Display
2
void lcd_write(char *text)
3
{
4
  while (*text)
5
   output_d(*(text++));
6
}

  

von Rahul, der Trollige (Gast)


Lesenswert?

@Rufus:
Spielverderber!

von johnny.m (Gast)


Lesenswert?

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

von Gastinio (Gast)


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]);
 }


von Rahul, der Trollige (Gast)


Lesenswert?

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

von Gastinio (Gast)


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....

von Falk (Gast)


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

von Rahul, der Trollige (Gast)


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?

von Falk (Gast)


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

von Rahul, der Trollige (Gast)


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...

von Rahul, der Trollige (Gast)


Lesenswert?

>13.02.2007 10:57
>13.02.2007 11:50

Das war ja schon gestern...

von Falk (Gast)


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

von Karl H. (kbuchegg)


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.

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.