Anfänger hat probleme mit Zeigern

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Logan
Beiträge: 3
Registriert: Mo Jun 29, 2020 9:18 am

Anfänger hat probleme mit Zeigern

Beitrag von Logan » Di Sep 22, 2020 11:40 am

Hallo liebes Forum,
ich versuche mich gerade an Zeigern in Funktionen und habe mich an den Leitfaden von der Seite https://de.wikibooks.org/wiki/C-Programmierung:_Zeiger gehalten. Nach meiner Einschätzung habe ich es genauso gemacht wie in dem Leitfaden weiß aber nicht mehr weiter.
Daher bitte ich Euch um Hilfe es zu verstehen.
Ich habe folgenden Code:

Code: Alles auswählen

//*******************************************************************
// Globale Variable für den LED Test
static float refLed1 =0;
static float refLed2 =0;
static float refLed3 =0;
static float refLed4 =0;

float *ptrRefLed1= &refLed1;
float *ptrRefLed2= &refLed2;
float *ptrRefLed3= &refLed3;
float *ptrRefLed4= &refLed4;
//*******************************************************************
// Prototypen:
void ledtest(uint32_t anz, uint32_t statusLed1, uint32_t statusLed2, uint32_t statusLed3, uint32_t statusLed4, float *ptrRefLed1, float *ptrRefLed2, float *ptrRefLed3, float *ptrRefLed4){
				
	uint32_t ledTask=1;
	printf(anz);						// Anzeige über String ob Anzeige gleich den LEDs am Board

	while (ledTask)
	{
		if(DBNCTASTER1){						// Taster1 gedrückt?    
			
			printf("Test erfolgreich.\n");			// Anzeige "test erfolgreich"
			
			
			if (statusLed1==1) {*ptrRefLed1++;};
			if (statusLed2==1) {*ptrRefLed2++;};
			if (statusLed3==1) {*ptrRefLed3++;};
			if (statusLed4==1) {*ptrRefLed4++;};
			
			
			LED1AUS;								// LED 1 aus
			LED2AUS;								// LED 2 aus
			LED3AUS;								// LED 3 aus
			LED4AUS;								// LED 4 aus
			
			ledTask = 0;
			
		}
		
		else if(DBNCTASTER2){						// Taster2
			
			
			printf("Test nicht  bestanden.\n");
			
			LED1AUS;								// LED 1 aus
			LED2AUS;								// LED 2 aus
			LED3AUS;								// LED 3 aus
			LED4AUS;								// LED 4 aus
			
			ledTask = 0;
			
		}
	}
	
}

int main(){

printf("              *************** LED Test 1 ***************.\n\n");

statusLed1=1;												// übergabe des led status ob an oder aus
statusLed2=0;
statusLed3=0;
statusLed4=0;	

LED1AN;

ledtest(ANZM1, statusLed1,statusLed2,statusLed3,statusLed4, &ptrRefLed1, &ptrRefLed2, &ptrRefLed3, &ptrRefLed4);

return 0;
}
Ich würde gerne die "refLed1-refLed4" jedes mal Hochzählen wenn die die Bedingung erfüllt wird. Den Inhalt würde ich dann später im Programm weiter verwenden.
Mein Problem scheint der klassiker in der Pointerwelt zu sein, dass der inhalt von den Pointern nicht übernommen wird bzw vorher gelöscht wird.
Ich verzweifel hier und würde es gerne verstehen.
Vielen lieben Dank schon mal für eure Antworten.

Lieben Gruß
Logan

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Anfänger hat probleme mit Zeigern

Beitrag von Xin » Di Sep 22, 2020 7:37 pm

Logan hat geschrieben:
Di Sep 22, 2020 11:40 am
Hallo liebes Forum,
Moin :-)
Logan hat geschrieben:
Di Sep 22, 2020 11:40 am
ich versuche mich gerade an Zeigern in Funktionen und habe mich an den Leitfaden von der Seite https://de.wikibooks.org/wiki/C-Programmierung:_Zeiger gehalten.
Ich habe nur kurz drüber geguckt und ich denke, die sind recht flott unterwegs... Ohne Hilfe solltest Du vielleicht langsamer und bewusster am Start sein.

In dem Code hakt einiges, es kann gar nicht kompilieren, schauen wir uns erstmal das mit den Pointern an.

Code: Alles auswählen

//*******************************************************************
// Globale Variable für den LED Test
static float refLed1 =0;
// ...
float *ptrRefLed1= &refLed1;
// ...

// Deklaration
void ledtest(uint32_t anz, uint32_t statusLed1, uint32_t statusLed2, uint32_t statusLed3, uint32_t statusLed4, float *ptrRefLed1, float *ptrRefLed2, float *ptrRefLed3, float *ptrRefLed4)

// Aufruf aus main heruas
ledtest(ANZM1, statusLed1,statusLed2,statusLed3,statusLed4, &ptrRefLed1, &ptrRefLed2, &ptrRefLed3, &ptrRefLed4);
Also, da ist ein float, das da refLef1 heißt. Das ist: ein float, kein Zeiger darauf. ptrRefLed1 ist ein Zeiger auf ein float, also ein (float *), den Du mit der Adresse von refLed1 initialisierst. ptrRefLed1 zeigt also auf das float refLed1.

Deine Funktion ledtest wünscht sich ein als 6. Argument ein float * ptrRefLed1, also einen Zeiger auf ein float, was dann innerhalb der Funktion ptrRefLed1 genannt wird. Wichtig: Das ist etwas anderes als das ptrRefLed1, was Du als globale Variable deklariert hast. Ich ging mit Andreas Müller in die Grundschule und nach der Grundschule war Andreas Müller in meiner Parallelklasse, aber es war nicht der Andreas Müller aus der Grundschule.

Nun rufst Du die Funktion auf und übergibst &ptrRefLed1, also die Adresse von ptrRefLed1. ptrRefLed1 ist ein (float *) und die Adresse von einem (float *) ist ein Zeiger auf (float *), also ein (float **). Dein Parameter passt nicht zur Funktion. Du übergibst also entweder das globale ptrRefLed1 oder die Adresse von refLed1, nicht aber die Adresse von ptrRefLed1.

Vielleicht hilft Dir hier die Kapitel Array, Zeichenketten und Zeiger zu lesen: C-Tutorial.

Ansonsten fiel mir noch auf die schneller

Code: Alles auswählen

printf(anz);
auf: printf() verlangt einen Formatstring, also ein (char *). Der gewünschte richtige Befehl wäre vermutlich

Code: Alles auswählen

printf("%d\n", anz );
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten