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
>//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!
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.
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....
@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
>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?
@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
>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...
@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
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.
Eine eigene Frage?
Dieser Thread ist über 19 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.