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.
Wie wär's denn damit: http://www.amazon.de/Programmieren-ANSI-Mit-C-Reference-Manual/dp/3446154973/sr=1-1/qid=1171443767/ref=sr_1_1/028-1842135-2548563?ie=UTF8&s=books
Besser:
1 | //Subroutine Ausgabe an Display
|
2 | void lcd_write(char *text) |
3 | {
|
4 | while (*text) |
5 | output_d(*(text++)); |
6 | }
|
@Trolli:
> Fällt dir noch was auf?
Ja, das ist mir auch aufgefallen. Aber das dürfte eins seiner kleineren
Probleme sein.
//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]); }
und jetzt? Die (einzig sinnvolle) Lösung hat Rufus doch schon gepostet. Guck dir am besten mal C-Grundlagen(-Bücher) an.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.