Forum: Compiler & IDEs Eine Frage zu C / Pointers


von Toni (Gast)


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

von OldBug (Gast)


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

von Toni (Gast)


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

von OldBug (Gast)


Lesenswert?

Ähm, hups :-)

Die Zeile muss natürlich so aussehen:

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

Gruß,
Patrick...

von Peter D. (peda)


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

von OldBug (Gast)


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

von Jörg Wunsch (Gast)


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.

von OldBug (Gast)


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

von Hans (Gast)


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

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.