Was bedeutet "(uint8_t *)msg" ?

Programmierung und Hardwaredesign mit Arduino, AVR, PIC und Konsorten.

Moderatoren: MaxZ, ebastler, SeriousD

Antworten
Benutzeravatar

Thread-Ersteller
L_B_S
Beiträge: 551
Registriert: Fr 24. Jul 2015, 10:13
Schule/Uni/Arbeit: KFZ-Elktr.
Hat sich bedankt: 24 Mal
Danksagung erhalten: 23 Mal

Was bedeutet "(uint8_t *)msg" ?

Beitrag von L_B_S »

Hallo zusammen,

im beigefügten Quelltext-Beispiel ist soweit alles verständlich ausser:

char *msg = "Hallo Welt";// Nachricht

dort wird der Variablen *msg ein text zugewiesen. Was bedeutet das " * " vor "msg" ?

und in der Zeile:

vw_send((uint8_t *)msg, strlen(msg));

Was bedeutet "(uint8_t *)msg" ?

"uint8_t" hat was mit "byte" zu tun aber warum wird hier nur "uint8_t" verwendet ?
Kann mir das jemand kurz erklären oder ein Hinweis geben. In der Referenz habe ich auch
nicht wirklich was gefunden.

Vielen Dank

Code: Alles auswählen

// 433 MHz Sender mit der VirtualWire Library  V 1.27
//
// Matthias Busse 17.5.2014 Version 1.0

// Verbindungen zum Uno
// GND > D5
// VCC > D6
// Daten > D7
 
#include <VirtualWire.h>

char *msg = "Hallo Welt";// Nachricht
 
void setup() {
  pinMode(7, OUTPUT);
  pinMode(5, OUTPUT);   // GND 0V
  digitalWrite(5, LOW);
  pinMode(6, OUTPUT);   // VCC 5V
  digitalWrite(6, HIGH);
  vw_setup(5000);       // Bits pro Sekunde
  vw_set_tx_pin(7);     // Datenleitung
}
 
void loop(){
  vw_send((uint8_t *)msg, strlen(msg));
  vw_wait_tx();                         // warten bis alles übertragen ist
  delay(1000);
}
Benutzeravatar

Teslafreak
Wiki-Crew
Beiträge: 1596
Registriert: So 3. Feb 2008, 20:35
Hat sich bedankt: 1 Mal
Danksagung erhalten: 5 Mal

Re: Was bedeutet "(uint8_t *)msg" ?

Beitrag von Teslafreak »

char *msg = "Hallo Welt";// Nachricht

dort wird der Variablen *msg ein text zugewiesen. Was bedeutet das " * " vor "msg" ?
Das * vor der variable bedeutet dass die Variable ein Pointer(/Zeiger) ist, sie zeigt nur auf einen Speicherbereich wo in dem Fall "Hallo Welt" drin steht.
http://www.c-howto.de/tutorial-zeiger.html
Was bedeutet "(uint8_t *)msg" ?
Das Ganze ist Type casting, da der Compiler ja denkt das msg vom Typ char * ist und die Funktion anscheinend uint8_t * als Parameter braucht, man sagt dem Compiler in dem Fall dass er die Varibale an der Stelle als einen anderen Typ benutzten soll. (Würde sonst einen Warnung ausgeben)
In dem fall geht das weil char * und uint8_t * gleich groß sind (uint8_t ist nur unsigned)

Gruß
,___,
[O.o] - orly?
/)__)
-"--"-

[Zensiert.]
Benutzeravatar

Thread-Ersteller
L_B_S
Beiträge: 551
Registriert: Fr 24. Jul 2015, 10:13
Schule/Uni/Arbeit: KFZ-Elktr.
Hat sich bedankt: 24 Mal
Danksagung erhalten: 23 Mal

Re: Was bedeutet "(uint8_t *)msg" ?

Beitrag von L_B_S »

Danke ersteinmal,

dass das " *msg " ein Pointer ist, hab ich mit fast gedacht. Muss man nun das so machen oder kann man "Hello World" nicht in eine einfache Stringvariable schreiben ? Z. Bsp.
string msg = "Hallo Welt";
...
...
vw_send(msg, strlen(msg));

oder verlangt die Funktion vw_send.......; ausdrücklich einen Pointer (was ich vermute :gruebel: )?

Gruss
Ludwig
Benutzeravatar

Teslafreak
Wiki-Crew
Beiträge: 1596
Registriert: So 3. Feb 2008, 20:35
Hat sich bedankt: 1 Mal
Danksagung erhalten: 5 Mal

Re: Was bedeutet "(uint8_t *)msg" ?

Beitrag von Teslafreak »

einen "string" gibt es in c nicht, strings nur arrays an bytes.
könnte man auch machen, man muss dann nur die position des ersten bytes an die funktion als pointer übergeben,

Code: Alles auswählen

void print(char *p,int length){
  int i;
  for(i=0;i<length;i++)
    printf("%c",p[i]);
  printf("\n");
}

void main(void){
   char msg[] = "hello world";
   int i = strlen(msg);
   print(&msg[0],i);
}
(sollte man allerdings nicht machen, ist nicht schön)

laut referenz ist der parameter ein pointer, als ja, es muss ein pointer zu einem string übergeben werden:
http://www.airspayce.com/mikem/arduino/ ... 66ec3b63b2
,___,
[O.o] - orly?
/)__)
-"--"-

[Zensiert.]
Benutzeravatar

Thread-Ersteller
L_B_S
Beiträge: 551
Registriert: Fr 24. Jul 2015, 10:13
Schule/Uni/Arbeit: KFZ-Elktr.
Hat sich bedankt: 24 Mal
Danksagung erhalten: 23 Mal

Re: Was bedeutet "(uint8_t *)msg" ?

Beitrag von L_B_S »

Danke Teslafreak,
jetzt ist einiges klarer
Antworten