www.mikrocontroller.net

Forum: Compiler & IDEs Arbeiten mit Arrays


Autor: wolf4124 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Elektrikser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: wolf4124 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Rick Dangerus (Gast)
Datum:

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

Rick

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: wolf4124 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

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

Gruß

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: wolf4124 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: wolf4124 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Beni (Gast)
Datum:

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

Gruß

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: wolf4124 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.