mikrocontroller.net

Forum: Compiler & IDEs C Pointer frage..


Autor: Marcel (Gast)
Datum:

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

Autor: Marcel (Gast)
Datum:

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

Autor: Marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
muss so aussehen sorry:

unsigned char *pt = "Hallo Welt"

*pt++;

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

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

Autor: Marcel (Gast)
Datum:

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

}

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

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

Autor: Marcel (Gast)
Datum:

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

Autor: Christian Schifferle (Gast)
Datum:

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

Autor: Marcel (Gast)
Datum:

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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

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

Autor: Marcel (Gast)
Datum:

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

Autor: Christian Schifferle (Gast)
Datum:

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

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

Autor: Marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
suuper DANKE..:).....das wars....und wieder was dazu gelernt..:)

Autor: Spiderman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dazu kann ich dir eine gute Seite empfehlen:

www.bennonet.com

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.