Forum: Compiler & IDEs C Pointer frage..


von Marcel (Gast)


Lesenswert?

hallo,
habe ein kleines c problem mit pointer und zwar:
warum kann ich ausserhalb einer funktion der variablen "apt"
die adresse des arrays[0] übergeben? der compiler schmeisst immer ein 
fehler.
hintergrund der ganzen sache ist, das ich diesen pointer über mehrere 
C-Dateien benutzten möchte. also muss ích den irgendwie global 
definieren. geht aber irgendwie nicht..:(..weiss jemand wieso?...setzte 
ich die 3te zeile in eine funktion gehts..aber dann ist der pointer 
wieder nicht global..


extern unsigned char array[10] = "Hallo Welt";
extern unsigned char *apt;

apt=&array[0];  <<--das bekomme ich nicht global hin..

von Marcel (Gast)


Lesenswert?

ok...hab das problem anders gelöst..jetzt hab ich aber ein nächstes..:)
und zwar:

unsigned *char = "Hallo Welt"

*char++;

wie kann ich am einfachsten nach dem hochzählen den pointer wieder auf 
den ursprung setzten?

von Marcel (Gast)


Lesenswert?

muss so aussehen sorry:

unsigned char *pt = "Hallo Welt"

*pt++;

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Wenn du pt änderst, dann ist die Information wo der Ursprung war weg. 
Also nimm dafür am besten einen zweiten Zeiger denn du zu Beginn auf die 
Stelle von pt setzt.

von Marcel (Gast)


Lesenswert?

hab ich auch schon gedacht..geht aber leider nicht.

ich habe eine interrupt routine in der der pointer jedesmal um eins 
erhöht wird. ist der pointer am ende des strings, soll er zurück gesetzt 
werden. d.h ich müsste den original pointer vor der interrupt routine 
umladen. das kann ich aber nicht da ich vorher keine funktion mehr habe 
wo ich den umladen könnte.

ich poste mal meinen code:

char *chab = "Hallo Welt";

hier müsste ich eigentlich den pointer umladen.
geht aber nicht, da ich nicht in einer funktion bin.


SIGNAL(SIG_OVERFLOW0)
{



    if (*chab)
    {
    i=*chab++;
    lcdsetcur(4,j++);
    lcdputchar(i);
    }
    else
    {
    lcdclearline(4);
    j = 1;

                HIER MÜSSTE DER POINTER ZURÜCKGESETZT WERDEN

    }




}


outp(0,TCNT0);

}

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Du hast doch wohl eine main()-Funktion!? Initalisiere dort den zweiten 
Pointer:

char *text = "Hallo Welt";
volatile char *p = NULL;

void main(void)
{
  p=text;
}

Alternativ könntest du einfach statt dem zweiten Zeiger einen int nehmen 
und damit die Position im String angeben.

von Marcel (Gast)


Lesenswert?

die zweite alternative ist klar. ich versuche nur ein wenig mit pointern 
umzugehen...:)

das problem sehe ich gerade ist ein ganz anderes.
und zwar wenn ich eine variable global über der main funktion definiere, 
findet er die variable nicht mehr in einer anderen c datei. die 
funktionen in der angefügten c datei kann ich aus der main funktion 
aufrufen aber ich kann die globalen variablen nicht aus der c main datei 
nutzten. könnte das an dem makefile liegen?

von Christian Schifferle (Gast)


Lesenswert?

Kannst du wohl.
Du musst die Variable in der anderen Datei lediglich bekannt machen mit

extern char *chab;

Damit weiss der Compiler, dass irgendwo eine Variable chab vom Typ 
Zeiger auf char deklariert ist.
In der Originaldatei darf chab dann eigentlich nur nicht als static 
deklariert werden, dann geht's.


Zu deinem ersten Problem: Das mit den extern Deklarationen geht so 
nicht, da wird nämlich kein Platz für die Variablen reserviert.
So müsste es gehen:

unsigned char array[] = "Hallo Welt";
unsigned char *apt = array;
oder
unsigned char *apt = &array[0]; // Adresse des ersten Elementes

Ach, und übrigens, mit dem makefile hat das gar nichts zu tun.

Gruss
Christian

P.S. Ich empfehle dir gern mal die Durcharbeitung meines C-Tutorials auf 
dieser Seite unter Artikel.

von Marcel (Gast)


Lesenswert?

hi christian,

danke für deine hilfe...aber irgendwie scheint das ein seltsames problem 
zu sein.

wenn ich die variable mit extern definiere geht es trotzdem nicht. er 
findet die einfach nicht.

main c-datei;

extern unsigned char test = 0x00;

int main(void)
{

   tuewas();

   for(;;);


}



andere c datei:


void tuewas(void)
{
  outp(0xFF,DDRB);
  test = 0x12;
  outp(test,PORTB);

}

die funtion findet er und sie fumtioniert auch..nur wenn ich die 
variable mit einbringe gehts net..

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Schreib dieses "extern" mal in die andere C-Datei:
extern unsigned char test;

von Marcel (Gast)


Lesenswert?

das ganze geht zwar jetzt da ich die variable in der anderen c datei 
definiert habe. aber was soll das??...jetzt kann ich die variable nicht 
mehr in der main funktion benutzen..:))...
ich kann mein problem zwar auch anders lösen aber das müsste doch gehen 
oder etwa nicht? das stört mich jetzt ein wenig...

von Christian Schifferle (Gast)


Lesenswert?

So muss das sein!

main c-datei;
=========================================================
// Hier wird der Platz fuer die Variable alloziert
unsigned char test = 0x00;    // Kein extern hier!!!!!!!


int main(void)
{

   tuewas();

   for(;;);


}
============================================================


andere c datei:
============================================================
// Dies ist lediglich eine Referenz auf die Variable.
extern unsigned char test;   // Hier muss das extern hin!!!!

void tuewas(void)
{
  outp(0xFF,DDRB);
  test = 0x12;
  outp(test,PORTB);

}
============================================================

von Marcel (Gast)


Lesenswert?

suuper DANKE..:).....das wars....und wieder was dazu gelernt..:)

von Spiderman (Gast)


Lesenswert?

Dazu kann ich dir eine gute Seite empfehlen:

www.bennonet.com

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.