Forum: Mikrocontroller und Digitale Elektronik PIC18F4550: Problem mit Array


von Alexander U. (alexander_u)


Lesenswert?

Hallo,

Stehe gerade vor einem kleinem Problem mit einem Array. Verwenden tu ich 
einen PIC 18F4550, MPLAB 8.89 + CCS Compiler.

1
name[3] = "" ;    //funktioniert. entsprechende Arraystelle ist leer
2
3
int f=3;
4
name[f] = "" ;    //bewirkt nichts

Ich denke mit dem Beispiel ist alles gesagt :).
Vielleicht hat ja jemand eine Idee


danke,
mfg alex,

von _gast (Gast)


Lesenswert?

In "C" werden Indexe beginnend von 0 gezählt!

int f=2;
name[f] = "" ;    //zumindest halbwegs sinnvoll...

von Fabian O. (xfr)


Lesenswert?

Der Code ergibt keinen Sinn. Lies Dir mal den Artikel durch:
http://www.mikrocontroller.net/articles/String-Verarbeitung_in_C

von Alexander U. (alexander_u)


Lesenswert?

Hallo,

Danke für den Link, aber das meiste ist mir bereits bekannt.
vielleicht habe ich nur den Beispielcode schlecht gewählt.

hier nochmal vollständig:
1
char readstring[48] = "" ;    //Character-Array wird deklariert
2
3
//.
4
//.
5
//.
6
// Array wird gefüllt, verarbeitet, etc
7
//.
8
//.
9
//.
10
11
int i=0;
12
13
for(i = 0 ; i < 48; i=i+1)     //Array soll geleert werden, funktioniert aber nicht
14
{
15
    readstring[i] = "" ;
16
}

Was aber funktioniert, jede Arraystelle einzeln leeren. Bei mehreren 
48-stelligen Arrays aber blöd.

mfg,
alex,

von daniel (root) (Gast)


Lesenswert?

Alexander U. schrieb:
> for(i = 0 ; i < 48; i=i+1)     //Array soll geleert werden, funktioniert aber 
nicht
> {
>     readstring[i] = "" ;
> }

"" ist auf jeden Fall falscher Typ.

char * p = "";
char * p[2] = {"", ""};
p[1] = "";

das ist alles ok.

Bei dir sollte es 0 heissen oder '\0'
wobei Literal 0 vom Typ int ist (meines wissens)
und Literal '\0' vom Typ char ist.

Das es bei dir mit "" funktioniert hat liegt wohl daran, dass
"" automatisch terminierende 0 anhängt. Sprich "1" sind in Wirktlichkeit
2 Zeichen [49][0]. 49 ist die Kodierung für '1'.

CCS kommt vielleicht an dieser Stelle durcheinander.

Gruß,
Daniel

von daniel (root) (Gast)


Lesenswert?

Alexander U. schrieb:
> char readstring[48] = "" ;    //Character-Array wird deklariert


char readstring[48] = {0};
Das geht auf jeden Fall

von Fabian O. (xfr)


Lesenswert?

Was meinst Du denn mit "leeren"? Irgendeinen Wert haben die 48 Byte 
immer.

Wenn Du einen leeren String haben willst, reicht es, das erste Byte des 
Arrays auf Null zu setzen:
1
readstring[0] = '\0';

Wenn alle Speicherzellen auf Null gesetzt sein sollen, dann mit einer 
Schleife:
1
for (i = 0; i < sizeof(readstring); i++) {
2
  readstring[i]  = '\0';
3
}

Oder mit memset:
1
memset(readstring, '\0', sizeof(readstring));

Was Du dagegen versuchst, ist ein Stringliteral an eine char-Variable 
zuzuweisen. Das dürfte erst gar nicht kompilieren und ergibt wie gesagt 
auch keinen Sinn.

von Alexander U. (alexander_u)


Lesenswert?

Hallo,

Danke an Fabian und daniel.

Mit '/0' funktionierts wie es soll.

Was mich so verwirrt hat, bzw. noch immer tut, ist nämlich:
1
char readstring[48] = "" ;   //Deklarierung funktioniert, Array ist von Beginn an 0 (sonst Datenmüll)
1
char readstring[48] = '\0' ;   //buildfehler. "A numeric Expression must appear here"
1
readstring[3]= "" ;   //funktioniert, Stelle 3 ist leer, bzw 0
1
readstring[3]= '/0' ;   //funktioniert, Stelle 3 ist leer, bzw 0
1
int i=3;
2
readstring[i]= "" ;   //hat keine Auswirkungen (somit auch keine Schleife möglich)
1
int i=3;
2
readstring[i]= '/0' ;   //funktioniert, Stelle 3 ist leer, bzw 0

mfg alex,

von daniel (root) (Gast)


Lesenswert?

Alexander U. schrieb:
> Mit '/0' funktionierts wie es soll.

vorsicht '\0' ist nicht dasselbe wie '/0'

Darstellbare Zeichen werden durch durch sie selbst representiert, wie 
'a'
Nicht darstellbare durch numerischen Wert, zB 0x30
Daneben haben nicht darstellbare Steuerzeichen "eigene" Schreibweise, 
'\n'
für newline ('\r' carrige return, '\t' tab).
Man kann auch statt '\n' numerischen Wert hinschreiben (10 in diesem 
Fall)

> char readstring[48] = '\0' ;   //buildfehler. "A numeric Expression must appear 
here"
Stelle keine große Ansprüche an CCS Compiler bezüglich seiner "C" 
Standard-Treu. Wie gesagt '/0' ist falsch, keine Ahnung was CCS daraus 
macht.

von Karl H. (kbuchegg)


Lesenswert?

Alexander U. schrieb:

> Was mich so verwirrt hat, bzw. noch immer tut, ist nämlich:

Was dich verwirrt ist der Unterschied zwischen " und '

" ist für einen kompletten String
' ist für ein einzelnes Zeichen

Weiter hat dich verwirrt der Unterschied zwischen einer Initialisierung 
und einer Zuweisung.

Das hier
>
1
> char readstring[48] = "" ;   //Deklarierung funktioniert, Array ist von
2
> Beginn an 0 (sonst Datenmüll)
3
>

ist eine Initialisierung. Und hier gelten ein klein wenig andere Regeln 
als bei einer Zuweisung. Insbesondere kann man an dieser Stelle ein 
Array als ganzes Initialisieren. Und deshalb kann man es hier auch mit 
einem String insitialisieren, der ja eine Abfolge von Bytes ist (welches 
im weitesten Sinne das Markenzeichen eines Arrays ist).

Deshalb funktioniert das hier.

>
1
> char readstring[48] = '\0' ;   //buildfehler. "A numeric Expression must
2
> appear here"
3
>

Logisch. Initialisiert wird ein Array. Syntaxmässig gibst du hier aber 
einen Character an. Zumindest versuchst du es. Denn wenn man ein Array 
mit einzelnen Werten initialisieren will, dann schreibt sich das so
1
  char text[10] = { 'a', 'b', 'c', '\0' };

und das ist eigentlich immer so. Lediglixh für Strings gibt es eine 
Ausnahme, weil man das
a) häufig braucht.
b) das in eine Schreiborgie ausartet.
c) schnell unübersichtlich wird.

Anstelle von
1
  char text[10] = { 'a', 'b', 'c', '\0' };
welches syntaktisch völlig korrekt ist, ist auch
1
  char text[10] = "abc";
als kürzere Form erlaubt. Aber mehr steckt da nicht dahinter. Es ist 
einfach nur eine Erleichterung der Schreibweise, dass man hier gleich 
ein String-Literal als solches angeben kann.


Wohingegen das nächste alles Zuweisungen sind
>
1
> readstring[3]= "" ;   //funktioniert, Stelle 3 ist leer, bzw 0
2
>
Und das kann nicht gehen.
Wenn readSstring ein ganzes Array aus Charactern ist, dann ist 
readstring[3] ein einzelner Character aus diesem Array. "" ist aber ein 
String. Und einen String kannst du nicht in dieser Form zuweisen, schon 
gar nicht an einen einzelnen Character. Allgemeiner: Arrays kann man 
nicht als ganzes zuweisen. Man kann sie als Einheit initialisieren aber 
nicht als Einheit zuweisen. Ein

   int i[5], j[5];
   i = j;

ist in C illegal. Und auch wenn du in weiteren C-Studien auf Konstrukte 
mit Pointern stösst, die fast so aussehen, als ob das gehen würde: Nein, 
das tut es nicht - Arrays sind nicht zuweisbar. Wohl aber können es die 
einzelnen Elemente eines Arrays sein. In diesem konkreten Fall der 
einzelne char.

>
1
> readstring[3]= '/0' ;   //funktioniert, Stelle 3 ist leer, bzw 0
2
>

Logisch funktioniert das. Links vom Zuweisungs-= steht der Datentyp 
char, rechts davon steht der Datentyp char. Passt also alles zusammen 
und die Zuweisung kann gemacht werden.

>
1
> int i=3;
2
> readstring[i]= "" ;   //hat keine Auswirkungen (somit auch keine
3
> Schleife möglich)
4
>

Logisch. Der Datentyp links ist wieder ein einzelner Character. Rechts 
von = steht aber ein String. Passt nicht.

>
1
> int i=3;
2
> readstring[i]= '/0' ;   //funktioniert, Stelle 3 ist leer, bzw 0
3
>


Auch klar. Links ist ein char, rechts ist ein char. Alles paletti.


Du brauchst ein C-Buch. Die Datentypen von Literalen in einem C-Programm 
zu erkennen, wenn man sie sieht, sind absolute Grundlagen.


Aber das steht auch im Link zur FAQ, dass " und ' verschiedene Dinge 
sind. Scheint so, als ob du das eben nicht alles weißt, was da im Link 
steht.

von root (Gast)


Lesenswert?

Hallo Karl Heinz,

TO verwendet '/0', nicht '\0'

Gruß

von Karl H. (kbuchegg)


Lesenswert?

root schrieb:
> Hallo Karl Heinz,
>
> TO verwendet '/0', nicht '\0'

Danke. Darauf hab ich dann nicht mehr geachtet.

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.