www.mikrocontroller.net

Forum: Compiler & IDEs Eine Frage zu C / Pointers


Autor: Toni (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Toni (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ähm, hups :-)

Die Zeile muss natürlich so aussehen:

void create_symbol(unsigned char *sym,unsigned char symbol_nummer)

Gruß,
Patrick...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

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.