Forum: Mikrocontroller und Digitale Elektronik Verständnisfrage zu char


von Gast (Gast)


Lesenswert?

Hallo zusammen,  wie gesagt habe ich eine Verständnisfrage zu char´s.
Ich habe folgende Zeilen:
1
 char Eheit2 =65;// 'A';

Diese Variable rufe ich in einer Funktion
1
 void xy (char *string, char* Einheit)

folgendermaßen auf.
1
 xy (Messwert, &Eheit2);

Nur wird beim Sprung in die Funktion die Variable ungewollt erweitert.
In der Funktion ist Einheit später sowas wie "A1200".

Die Variable Messwert ist ein char array.
1
 char Messwert[5];

Wenn ich aber so deklariere
1
 char *Eheit2 ={"A"};

läuft alles richtig.
Kann mir einer auf die Sprünge helfen??

von Suchender (Gast)


Lesenswert?

Zeig mal den Rest vom Code... sonst ist raten angesagt...

Ich versuch mich mal am Raten. Du verwnedest in den Funktionen irgendwo 
eine string Funktion? Sowas wie strcpy vielleicht?
1
char Eheit2 =65;// 'A';
Hier fehlt die abschließende 0, der einen String abschließt. Bei der 
Version:
1
char *Eheit2 ={"A"};
wird diese 0 automatisch hinzugefügt, da "" ein string kennzeichnet -> 0 
am Schluss.

von Sören H. (dersoe)


Lesenswert?

wäre evtl. noch hilfreich zu wissen mit was für einem Compiler du 
arbeitest...

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Gast wrote:
> Nur wird beim Sprung in die Funktion die Variable ungewollt erweitert.
> In der Funktion ist Einheit später sowas wie "A1200".

Das ist klar, weil der String-Delimitter (\0) fehlt. Im Ernstfall 
wuerdest Du so einen totalen Absturz provozieren oder jede Menge Muell 
auslesen.

von Detlev T. (detlevt)


Lesenswert?

Was machst du den später damit? printf? char * wird auch als string 
benutzt, das ist eine Zeichenkette, die mit einer null abgeschlossen 
wird. Wenn du "A" schreibst, ist das so ein String, in Wirklichkeit zwei 
Bytes, einer mit 65, einer mit null. 'A' hingegen nur ein Zeichen - ohne 
die abschließende null.

Ich vermute, dass du so etwas wie printf damit aufrufst und dann wird 
alles im Speicher ausgegeben - nicht nur das eine Zeichen -bis 
zufälligerweise irgendwann eine null auftaucht. Der Compiler meckert 
hier nicht, da es sich um einen logischen und nicht syntaktischen Fehler 
handelt.

-Mist, zu langsam. ;)

von Gast (Gast)


Lesenswert?

1
  
2
3
char Messwert[5]; 
4
short xxx = 4;
5
int DatenWert =piffpaff, valuetowrite;
6
char *Eheit2 = {"A"};
7
8
while (xxx >=0)
9
  {
10
    if (DatenWert == 0)
11
      {
12
      Messwert[xxx] = 48;     //Entspricht der Null im ASCII
13
      xxx-=1;
14
      }
15
    else
16
    {
17
    valuetowrite = (DatenWert % 10);
18
    Messwert[xxx] = valuetowrite + 48;
19
    DatenWert = (DatenWert - valuetowrite)/10;
20
    xxx -=1;
21
    }
22
  }
23
24
UC1617_write_string_messwert(Messwert, Eheit2);

So sieht das bis zur aufrufenden Funktion aus.
Ich wandle einen short in ein char um und übergebe ihn incl. Einheit an 
die Funktion.

Und die Funktion sieht folgendermaßen aus:
1
void UC1617_write_string_messwert(char *string, char *Einheit)
2
{
3
 short n,u,uEinheit;
4
 char *Buchstabe = string;
5
 char *Eheit = Einheit;
6
  
7
  while (*Buchstabe == 48)    //Bleibt in der Schleife, solange ein Messwert eine 0 an erster Stelle hat.
8
          Buchstabe++;
9
  
10
  u = strlen (Buchstabe);
11
  uEinheit = strlen (Eheit);
12
 
13
     for (n=1; n<=((16 - (u+uEinheit))/2);n++)            //Auffüllen mit " "
14
      {
15
      UC1617_write_char(' ',Features);      //bis Mitte
16
      x+=2;
17
      } 
18
     
19
     while(*Buchstabe != '\0')
20
      {
21
        
22
      write_char (*Buchstabe,Features);
23
      Buchstabe ++;
24
      }
25
     
26
     while(*Eheit != '\0')
27
      {
28
        
29
      write_char (*Eheit,Features);
30
      Eheit ++;
31
      }
32
     for (n = (x+(2*u)); n<32;n+=2)                   //Auffüllen mit " "
33
      write_char(' ',Features);      //bis Zeilenende
34
    
35
}

Das ganze schreibt einen Wert auf ein Display.

von Suchender (Gast)


Lesenswert?

Ja also genau das was wir vermutet hatten. Im ersten Fall hat einfach 
die "String-Kennzeichnung" gefehlt.

http://www.exforsys.com/tutorials/c-language/handling-of-character-strings-in-c.html

von Gast (Gast)


Lesenswert?

Aber soll man eine Zuweisung wie
1
 char *Eheit2 = {"A"};

nicht vermeiden??

von Suchender (Gast)


Lesenswert?

1
char *Zeiger = "TEXT";
ist völlig ok. Wüsste nicht, was dagegen spricht.

von Gast (Gast)


Lesenswert?

Habe in einem Buch folgendes gelesen.

Aber Achtung, nachstehendes Programm könnte böse Folgen haben:
1
#include <stdio.h>
2
3
int main()
4
{
5
   int *y;
6
   *y=10;
7
   printf("Der Wert von *y ist %d\n",*y);
8
   return 0;
9
}

Dem Zeiger y wurde hier zuvor keine gültige Adresse zugewiesen. Dies 
bedeutet, dem Zeiger y steht beim Start des Programms eine Adresse zur 
Verfügung, die durch ein zufälliges Bitmuster vom Linker erzeugt wurde. 
Das Programm kann theoretisch sogar korrekt ablaufen. Irgendwann kann 
(wird) es jedoch ein vollkommen falsches Ergebnis zurückliefern. Auch 
könnte es sein, dass auf einen Speicherbereich zugegriffen wird, der 
bereits Daten beinhaltet. Dies könnte zu erheblichen Problemen bei der 
Programmausführung bis hin zum Absturz führen.

Ist das nicht genau das was ich gemacht habe?

von Suchender (Gast)


Lesenswert?

Ok das ist was anderes. hier hast du zunächst einen Zeiger der irgendwo 
im Speicher hinzeigt.
1
int *y;

Dort schreibst du dann 10 rein! Überschreibst also wenn du pech hast was 
anderes.

aber bei
1
char *Zeiger = "TEXT";
wird der Zeiger auf den String "TEXT" im Speicher gelegt. Dieser String 
wurde zuvor aber im Speicher abgelegt und hat für ihn zugeordneten 
Speicher erhalten.

von Sören H. (dersoe)


Lesenswert?

Fein wäre es gewesen, dir vorher entsprechend Speicher zu allokieren... 
sonst kann das tatsächlich ins Auge gehen. Das allerdings ist unabhängig 
von der abschließenden Null....

von Gast (Gast)


Lesenswert?

Danke. Mit euren Antworten ist mir wieder einmal geholfen.

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.