Hallo Hier ein Code-Ausschnitt: ================================================================== unsigned char symbol_0[]={0x0e,0x11,0x0e,0x04,0x1f,0x04,0x0a,0x11}; unsigned char symbol_1[]={0x04,0x15,0x0e,0x04,0x04,0x04,0x04,0x04}; int main(void) { ..... create_symbol(symbol_0,0); //symbol_0 code als Symbol 0 create_symbol(symbol_1,7); //symbol_1 code als Symbol 7 ....... lcd_putchar(0); //nun erstes "freie" Zeichen ausgeben lcd_putchar(7); //nun siebtes "freie" Zeichen raus while(1) { //mache irgend was } } void create_symbol(unsigned char sym[],unsigned char symbol_nummer) { unsigned char i; unsigned char a; //für Adressenbeginn a= ((symbol_nummer<<3) | 0x40); //ist ok CG_Ram_Adr_set(a); for (i=0;i<8;i++) { PORTA= ((sym[i]&0xf0) |0x01); lcd_enable(); PORTA=((sym[i]<<4 & 0xf0)|0x01); lcd_enable(); } } ===================================================================== Könnte mir nicht jemand die Syntax aufschreiben, wie ich hier bei der Funktion create_symbol(..,..) mit einem Pointer auf "symbol_.." zugreifen kann. Der Code funktioniert. Ist das Programm mit "Pointers" nicht sinnvoller und effizienter, oder vielleicht doch nicht... ? Übrigens,in der Zwischenzeit bin ich natürlich am C-Buch lesen ;) Toni
Hallo Toni! Ganz einfach: void create_symbol(unsigned char *sym[],unsigned char symbol_nummer) Der * "markiert" hier, daß sym ein Pointer sein soll. Und zwar auf ein array vom Typ unsigned char. Gruß, Patrick...
Hallo Patrick Leider funktioniert es so dann nicht mehr. Oder muss ich den Zugriff in der for-Schleife auch abändern? Hier der Fehlercode : C:\Programme\AtmanAvr\MyProjects\PUTC_Befehl\PUTC_Befehl.c: In function 'main': C:\Programme\AtmanAvr\MyProjects\PUTC_Befehl\PUTC_Befehl.c:56: warning: passing arg 1 of 'create_symbol' from incompatible pointer type C:\Programme\AtmanAvr\MyProjects\PUTC_Befehl\PUTC_Befehl.c:58: warning: passing arg 1 of 'create_symbol' from incompatible pointer type C:\Programme\AtmanAvr\MyProjects\PUTC_Befehl\PUTC_Befehl.c: In function 'create_symbol': C:\Programme\AtmanAvr\MyProjects\PUTC_Befehl\PUTC_Befehl.c:100: error: invalid operands to binary & C:\Programme\AtmanAvr\MyProjects\PUTC_Befehl\PUTC_Befehl.c:102: error: invalid operands to binary << PUTC_Befehl - 2 error(s), 2 warning(s) Gruss Toni
Ähm, hups :-) Die Zeile muss natürlich so aussehen: void create_symbol(unsigned char *sym,unsigned char symbol_nummer) Gruß, Patrick...
Du benutzt die ganze Zeit schon Pointer. Die Schreibweisen *ptr und ptr[] sind identisch bzw. auch *(ptr+5) und ptr[5] Eventuell kann das hier kürzeren Code bewirken: for (i=0;i<8;i++) { PORTA= ((*sym &0xf0) |0x01); lcd_enable(); PORTA=((*sym <<4 & 0xf0)|0x01); lcd_enable(); sym++; } Peter
Hm, Peter, ich habe lange Zeit auch angenommen, daß die Schreibweise [] und * "identisch" sind. Aber vor kurzem habe ich aufgrund eines Problems in einer Queue mit statischen Buffern in einer Veröffentlichung gelesen, daß [] und * nicht identisch sind. Ich müsste diesen Wortlaut jetzt kopieren, da ich das leider nicht mehr im Kopf habe :-) Ich weis auf jeden Fall noch, daß es bei Pointern auf multidimensionale Arrays da ganz große Probleme gibt! Ich werde das nochmal genau nachlesen und das, was ich gerade behauptet habe, versuchen zu beweisen. Nicht, daß ihr denkt, ich würde mir das aus den Fingern saugen g Gruß, Patrick...
Bei einer Definition sind sie natürlich nicht identisch. Am meisten wird das deutlich bei: char *foo = "Hello world!"; vs. char foo[] = "Hello world!"; Das erste definiert einen Zeiger auf das (anderweitig nicht per Namen bekannte) Array, dessen Inhalt "Hello world!" ist. Der Compiler ist berechtigt, dieses Array in einem nur lesbaren Speicherbereich unterzubringen und ggf. mehrere Vorkommen der gleichen Zeichenkette in ein einziges Array zu legen. Der Nutzer ist nicht berechtigt, auf dieses Array über den Zeiger zu schreiben (auch dann nicht, wenn er den Zeiger nicht ausdrücklich `const' deklariert hat). Das zweite definiert ein Array im ganz normalen Datenbereich, das zwar mit den Werten "Hello world!" initialisiert wird, sich aber ansonsten wie eine ganz normale Array-Variable verhält. Aber sowie diese Dinge an eine Funktion weitergereicht werden, sind Zeiger und Array identisch. Es ist also egal, ob ich eine Funktion als void foo(char *x); oder void foo(char x[]); deklariere, der erzeugte Code ist gleich.
Ich habs grad gefunden: void initBufferGuard(GuardType *guard, unsigned char *QName, unsigned char **bufferQ) ist nicht identisch mit void initBufferGuard(GuardType *guard, unsigned char *QName, unsigned char bufferQ[][]) Da gibts spätestens beim Zugriff auf bufferQ einen Fehler vom Compiler (auch lesender Weise). ...hmmm... Gruß, Patrick...
ich sag dir auch warum ;) ** ist eben ein pointer auf nen pointer... [][] ist ein multidimensionales feld... das ist nicht ganz das gleiche aber wenn mans richtig macht.... char pArray[2][3]; sollte das gleiche sein wie char *ppArray[2] ppArray[0]=new char[3]; ppArray[1]=new char[3]; jetzt überleg dir mal scharf warum die 2 funktionen das gleiche sind aber eignetlich doch wieder nicht.... auf jeden fall ist ein pointer auf nen pointer da um den pointer zu verändern...also du gibst einer funktion einen pointer auf nen pointer und kannst den pointer den du da rein gibst auf den speicher stellen wo du z.b einen string hast.... das multidimensionale feld ist deswegen ein bisserl anders weil da meint man normalerweise zusammenhängenden speicher.... aber du kannst alles gleich behandeln wenn du willst...man muss nur überlegen was man haben will und wie man am besten zum ziel kommt... 73 de oe6jwf / hans
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.