Forum: Compiler & IDEs Arbeiten mit Arrays


von wolf4124 (Gast)


Lesenswert?

Hallo

Habe ein Problem mit den Arrays.
Ich richte eine Arrays ein.

char daten[8] = { 1, 2, 3, 4, 5, 6, 7, 8};  //=> sollten doch 8*8bit
sein,

//Inhalt 1 ,2, 3, 4, 5, 6, 7, 8   i.O.

Wenn ich aber nun mit der Anweisung einen Wert hineinschreibe (erste
Zeile) bekomme ich immer die zweite Zeile raus.

daten[0] = 0x33;

//Inhalt 33, 0, 3, 4, 5, 6, 7, 8  n.i.O

Kann mir einer weiterhelfen.

Gruß

von Elektrikser (Gast)


Lesenswert?

char daten[8] = { 1, 2, 3, 4, 5, 6, 7, 8};

also steht dass so in deinem Array:
daten[0] --> 1
daten[1] --> 2
daten[2] --> 3
daten[3] --> 4
usw.

und dann schreibst du in das Array:
daten[0] --> 33
daten[1] --> 0

Vielleicht hast du nicht daran gedacht, dass du zwar mit
char daten[8] = { 1, 2, 3, 4, 5, 6, 7, 8};
ein Array mit 8 Stellen eröffnest, aber die Stellen werden von
0 ... 7 gezählt.

Gruß Elektrikser

von wolf4124 (Gast)


Lesenswert?

Hallo

Nein leider nicht
Ich habe in den Ausgangszustand nur einmal mit
daten[0] = 0x33;
etwas geändert.

Danach ist der Inhalt (Angefangen mit Index 0 bis Index 7)
33, 0, 3, 4, 5, 6, 7, 8


Gruß

von Rick Dangerus (Gast)


Lesenswert?

Probier mal folgendes:
1
daten[0] = (unsigned char) 0x33;
Eventuell wird Dein Hex-Wert als 16-Bit-Int interpretiert.

Rick

von Stefan K. (_sk_)


Lesenswert?

Irgendwelche Warnungen beim Compilieren?

Das sieht danach aus, dass beim Compilieren der Zeile
  daten[0] = 0x33;
daten noch nicht bekannt ist.

Die Lösung von Rick kann (u.U.) zwar funktionieren, ist aber (meiner
Meinung nach) nicht die ganz saubere Art.

Gruß, Stefan

von wolf4124 (Gast)


Lesenswert?

Hallo

Warnungen bekomme ich keine.
Aber das mit den noch nicht bekannt hört sich gut an.
Gleich mal nachschauen-  ;-)

Gruß

von Karl H. (kbuchegg)


Lesenswert?

Poste mal mehr Code.
Das von Dir beschriebene Verhalten ist so nicht möglich,
es sei denn der Compiler hätte einen schweren Fehler.
Ist aber eher unwahrscheinlich. Viel wahrscheinlicher ist,
es, daß Dein Programm einen schweren Fehler enthält. Der
muß noch nicht mal etwas mit diesem Array zu tun haben.
Denk immer daran: Was Du siehst sind die Symptome, nicht die
Ursachen. Wir müssen aber die Ursachen finden um den Fehler
auszumerzen.

Daher: Poste mehr Code. Im Idealfall hast Du ein kleines,
vollständiges Testprogram, welches ganau diesen Fehler
zeigt.

von wolf4124 (Gast)


Lesenswert?

Hallo

Habe den Fehler gefunden.
Ich traue mich garnicht ihn zu posten. ;-)
Ich habe mit den Befehl
char daten[8] = { 1, 2, 3, 4, 5, 6, 7, 8};
zwar die Variable angelegt.
Die Funktion zum füllen der Variable war aber in einer externen Datei.
Die Variable war mit dem Befehl
extern daten[8];
bekannt gegeben.
Da hat er also mit 16 bit gerechnet.

Aber danke für eure Hilfe

Gruß

von Stefan K. (_sk_)


Lesenswert?

Kleiner Tip, damit das nicht nochmal vorkommt:

extern NUR in .h Dateien verwenden.
Die .h Datei AUCH in der Datei einbinden, in der die
Original-Deklaration steht. Also z.B.:

my_data.h:
----------
extern char data[8];

my_data.c:
----------
#include <my_data.h>
char data[8] = {1,2,3,4,5,6,7,8};

main.c:
----------
#include <my_data.h>
  data[0] = 0x30;

Ist die Definition in der .h-Datei dann unterschiedlich als im .c-File,
wird ein Fehler gemeldet.

Übrigens:
Ganz sicher hat Dein Compiler das Verwenden von data ohne Deklaration
mit einer Warnung quittiert. Allerdings kann diese Warnung sehr leicht
übersehen werden, wenn mit make gearbeitet wird:
Enthält eine C-Datei "nur" eine Warnung, wird sie beim nächsten
make-urchlauf nicht mehr neu übersetzt. Die Warnung siehst Du also nur
einmal, nicht bei jedem make (im Gegensatz zu Fehler-Meldungen).

Abhilfe:
Bei unerklärlichen Fehlern ein make clean ausführen. Danach werden alle
Dateien neu compiliert - und alle Compiler-Warnungen tauchen auf.

Gruß, Stefan

von wolf4124 (Gast)


Lesenswert?

Hallo Stefan,

meckert dann nicht der Compiler wenn ich main.c compiliere.
Oder geht das doch, weil die Datei durch include 1:1 vor die Anweisung
eingefügt wird.
Muß ich dann noch im makefile noch die my_data.c mit zum compilieen mit
angeben?

Gruß

von Beni (Gast)


Lesenswert?

vielleicht weil 1,2,3,4 keine char sind, oder eher keine '1', '2'
;-)
versuche es mal jetzt, werde dann klappen!!

Gruß

von Stefan K. (_sk_)


Lesenswert?

Hallo Wolf,

??? - verstehe die Frage nicht ganz.
Hat Dich mein Telegrammstil verwirrt? Natürlich steht in main.c  noch
diverses anderes ... , z.B.:

#include <my_data.h>
...

main(void){
  ...
  data[0] = 0x30;
  ...

> Muß ich dann noch im makefile noch die my_data.c mit zum compilieen
> mit angeben?

Klar, wie gehst Du sonst mit der von Dir erwähnten "externen Datei"
um?

Gruß, Stefan

von wolf4124 (Gast)


Lesenswert?

Hallo Stefan,

ich habe sie auch mit
#include <my_data.c>
eingebunden.
Ich glaube dann sollte ich etwas umstellen.
Das heist aber, das ich von allen eingebundenen Dateien nur die **.h
mit in die main.c einbinde.
Und im Makefile die **.c mit angebe.


hallo Beni,
das mit den 1,2,3,4 hat auch hingehaut.

Gruß

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.