Forum: Mikrocontroller und Digitale Elektronik c/c++ Array problem bitte hilfe


von Milas N. (milas)


Lesenswert?

Hi leute,


ich habe folgendes problem momentan arbeite ich mit einem 8051 µc
meine aufgabe ist es eine ampelsteuerung zu entwickeln.

nun wollte ich das mit einem array machen der mehrere werte enthält das 
prob ist aber leider das der array obwohl ich ihn gefüllt habe ürgendwie 
nur die werte
[0]=0x0000
[1]=0x0000
[2]=0x0000 usw
anzeigt dann habe ich mir überlegt das mal als so ne keliene übung zu 
machen das habe ich dann auch gemacht aber das problem besteht immernoch 
ich hoffe ihr könnt mir helfen.
1
/*array Übung*/
2
3
4
#include <reg552.h> 
5
#include <stdio.h>
6
7
unsigned int i, A1;
8
9
int array[3]={0x01, 0x02,0x03}; //belegung des arrays
10
11
12
13
void main (void  )
14
15
{
16
  while(1)
17
  {
18
  i=0;
19
    
20
    while(i<4)
21
    {  
22
      A1=0x00;
23
       A1=  array[i];
24
    
25
      i++;
26
    }
27
  
28
  
29
  }

nun eigentlich müsste A1 (einzelschrittbetrieb) ja den wet vom array 
annehmen aber leider geschieht das nie der ist immer 0x00

Help me pleas

MfG
Milas

von holger (Gast)


Lesenswert?

Also erstens, deine Shift Taste funktioniert nicht.
Satzzeichen werden auch nicht mehr ausgegeben.
Kauf dir eine neue Tastatur!

Dein Array hat nur drei Werte. i<5 ist also völlig falsch.

von Milas N. (milas)


Lesenswert?

weist du holgi ohne mich lange mit dir zu beschäftigen man muss nicht 
immer die bürosprraaaaaaaache tippen (zb. wenn es nicht nötig ist wie 
hier)
aber das andere ist richtig habe ich jetzt auch gemerkt das kommt weil 
ich vorher vir wert im array hatte aber das prob wird bestimmt nicht 
damit zusammenhängen

von STK500-Besitzer (Gast)


Lesenswert?

>      A1=0x00;
unnötig.

>       A1=  array[i];
Dummfug
>
>      i++;
>    }


wie wäre es damit:

    while(i<4)
    {
      array[i]=0x00;
      i++;
    }

von Milas N. (milas)


Lesenswert?

@  STK500-Besitzer

ist das dann nicht so das ich den wert im array verändere weil das will 
ich ja garnicht ich will einfach nur das A1 den array übergeben bekommt 
aber array[] immer den wert 0x00 zurück gibt geht das ürgendwie nicht

MfG
Milas

von STK500-Besitzer (Gast)


Lesenswert?

Holger hat Recht: Dein Schreibstil ist für die Tonne. Der verwirrt mehr, 
als dass er zur Problemlösung hilft.
Woran erkennst du denn, dass in dem Array nichts drinsteht?

von Milas N. (milas)


Lesenswert?

au man leute checkt ihr nicht das ich keine lust habe moentan ordentlich 
zu schreiben (aus faulheit)

Ich lese es vom compiler ab denn wenn ich im einzelschrittbetrieb mit 
der maus über A1 bzw über array[] gehe dann zeit der mir dessen werte an

von holger (Gast)


Lesenswert?

Trollalarm !

von STK500-Besitzer (Gast)


Lesenswert?

>Ich lese es vom compiler ab denn wenn ich im einzelschrittbetrieb mit
>der maus über A1 bzw über array[] gehe dann zeit der mir dessen werte an

Der Compiler kann dir gar keine Werte liefern, da er sich überhaupt 
nicht darum kümmert.

>au man leute checkt ihr nicht das ich keine lust habe moentan ordentlich
>zu schreiben (aus faulheit)

Und ich habe aus Faulheit keine Lust mehr mich mit deinem Problem zu 
befassen.
Um dir helfen zu können, wäre es praktisch zu wissen, mit welchem 
Compiler bzw. mit welcher Entwicklungsumgebung du "arbeitest".
Ich tippe mal auf einen UTS-Fehler.

von Johannes M. (johnny-m)


Lesenswert?

@STK500-Besitzer:
Du bist noch viel zu gut zu ihm... Wenn er sich nicht mal die Mühe 
macht, die Forenregeln auch nur ansatzweise zu beachten, hat er nicht 
mal einen Ansatz sachdienlicher Antworten verdient...

von HildeK (Gast)


Lesenswert?

Du hast ein Array mit vier Elementen angelegt aber nur die Elemente 
array[0], array[1] und array[2] mit Werten gefüllt, in array[3] steht 
immer noch '0'.

Deshalb wird nach dem Durchlaufen der while-Schleife auch nur der letzte 
Wert array[3] in A1 stehen, die anderen waren mal drin, wurden aber 
wieder überschrieben.
Alles funktioniert so, wie es programmiert wurde.
Wenn du nach jedem
A1=  array[i];
den Wert prüfen würdest, dann wäre es dir schnell klar geworden.

@ Milas N.: denk mal auch über die Wünsche der Teilnehmer nach ...
@alle: seid nicht ganz so streng :-)

von holger (Gast)


Lesenswert?

>@alle: seid nicht ganz so streng :-)

Warum nicht ? Einen lesbaren Text zu schreiben
bei dem man keinen Augenkrebs bekommt dürfte doch
nicht zu viel verlangt sein ?

von STK500-Besitzer (Gast)


Lesenswert?

holger, du plenkst...

von STK500-Besitzer (Gast)


Lesenswert?

>@alle: seid nicht ganz so streng :-)

Du arbeitest mit Mikrocontrollern (oder willst es zumindest tun). Da muß 
man sich streng an Regeln halten. Da gibt es nunmal nur 0 und 1...

von Johannes M. (johnny-m)


Lesenswert?

Zu jemandem, der auch noch dummdreist zugibt, zu faul zu sein, sich 
wenigstens ein bisschen Mühe zu geben kann man gar nicht streng genug 
sein...

von HildeK (Gast)


Lesenswert?

>>@alle: seid nicht ganz so streng :-)

>Warum nicht ? Einen lesbaren Text zu schreiben
>bei dem man keinen Augenkrebs bekommt dürfte doch
>nicht zu viel verlangt sein ?
So schnell geht's dann auch wieder nicht :-)

und

>Zu jemandem, der auch noch dummdreist zugibt, zu faul zu sein, sich
>wenigstens ein bisschen Mühe zu geben kann man gar nicht streng genug
>sein...

Ich hatte ihn ja auch gebeten, selber Rücksicht zu nehmen.

Einfach cool bleiben, das schon auch die Nerven!

von Milas N. (milas)


Lesenswert?

ich muss echt sagen das ich es sehr schade finde das alle um so einen 
brei reden den einer angefangen hat statt ürgendwie zu versuchen mir bei 
meinem prob weiter zu helfen aber wenn das so ist muss ich einfach davon 
ausgehen das einige leute den ganzen tag einfach nichts zu tun haben 
ausser ürgend einen quatsch zu schreiben um ürgendwie auffälig zu werden
ausdiesem grund will ich all die jenigen die meinen ürgenwelche 
unnützigen kommentare abgeben zu müssen bitten dies einfach zu 
unterlassen

Desweiteren will ich mich trotz alledem mit einem Dankeschön an die 
Jenigen  wenden die es wenigstens mal versucht haben.

MfG
Milas

von Michael H* (Gast)


Lesenswert?

ich glaub, er is zu dümmlich für rechtschreibung. auf groß- und 
kleinschreibung geb ich auch ned viel, weil man ein substantiv auch ohne 
erkennt. aber satztrennung und semantik tragen doch sehr zum verständnis 
bei. und was is eigentlich bei deinem vornamen schief gegangen? ^^

> DIE ES WENIGSTENS MAL VERSUCHT HABEN
hallo jüngchen, gehts noch bei dir?! wie wärs, wenn du einfach mal 5min 
mit einem buch neben deinem kopf über deinen code nachdenkst? wer so 
dümmlich dümmliche fragen stellt und dann noch rotzfrech kommt, wenn man 
ihm die faulheit aufzeigt, dem sollte hier einfach nicht geholfen werden

von Analog (Gast)


Lesenswert?

hallo milas was möchtest du eigentlich mit deinem programm erreichen ist 
mach doch mal ne ausgabe auf den uart vielleicht stimmt ja alles und du 
hast es bisher nicht gecheckt ansonsten probieres doch mal mit jp 0x000 
gruß

von Peter D. (peda)


Lesenswert?

Stell Dir einfach mal 2 Fragen:

1. Wer will ein Problem gelöst haben?

2. Wer muß Dir die Lösung liefern?



Wer antwortet, macht das für umme, es ist für ihn nur etwas Unterhaltung 
und Gedankenakrobatik.

Vorzugsweise antwortet er daher dort, wo erkennbar ist, daß dem 
Fragesteller an der Anwort liegt und er sich ein ganz kleines bischen 
Mühe gibt bei der Formulierung der Frage.

Und dies kann der Fragesteller dadurch ausdrücken, daß er 
Rechtschreibung und Grammatik weitgehend beachtet und nicht übertrieben 
oft Tippfehler macht.

Seinen Text nochmal zu lesen, ist überhaupt nicht verboten (Ich machs ja 
selber).


Es gibt da so alte Sprichwörter: "Wie man in den Wald hineinruft..."
Und die haben (warscheinlich zu Deinem großen Erstaunen) durchaus ihre 
Gültigkeit.


Peter

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Milas N. wrote:
> au man leute checkt ihr nicht das ich keine lust habe moentan ordentlich
> zu schreiben (aus faulheit)
>
> Ich lese es vom compiler ab denn wenn ich im einzelschrittbetrieb mit
> der maus über A1 bzw über array[] gehe dann zeit der mir dessen werte an

Dann erwarte auch keine Hilfe, wenn es Dir nichteinmal wert ist, 
anstaendig zu schreiben. Solche Rueppel hab ich gefressen.

von Sebastian (Gast)


Lesenswert?

In der Array-deklaration kann man soweit ich weiß keine Werte zuweisen. 
Man muss jede Zelle einzeln füllen. Sonst steht halt einfach "0" drin. 
Außerdem hat dein Array nur 3 Einträge. Diese haben die Nummern 0, 1 und 
2. In deinem jetzigen Code wird aber auch array[3] ausgegeben. Damit 
stocherst du irgendwo im Speicher rum. Etwas vorhersagbares wirst du 
aber nicht ausgeben.


und alda koff di ma n paa bunkte fü die sazzeichn des stresst tottal 
obwol ich selba net dieeeeeee dolle rechtschreipse hab und zimlich 
dollarand bin
undn bissi öl fü die umschalddasde wär auch net fasch


Sebastian

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Was ich bis heute nicht begreife, warum benutzen Leute keine 
For-Schleifen?
Gibt es irgend einen Grund dafür, das manche Leute immer und immer 
wieder irgendwelche while Konstrukte basteln?
1
unsigned int i, A1; //warum nicht char?
2
3
int array[3]={0x01, 0x02, 0x03}; //und hier auch
4
5
void main(void){
6
 while(1){
7
  for (i=0; i<4; i++){ //immernoch falsche Grenze
8
   A1=0x00; //immernoch unnötig
9
   A1=array[i];
10
  };  
11
 };
12
}

Ist zwar immernoch falsch aber irgendwie übersichtlicher...

von Michael H* (Gast)


Lesenswert?

Sebastian wrote:
> In der Array-deklaration kann man soweit ich weiß keine Werte zuweisen.
> Man muss jede Zelle einzeln füllen. Sonst steht halt einfach "0" drin.

nope, die initialisierung geht so, wie ers gemacht hat. zumindest beim 
avr-gcc ^^

von Sebastian (Gast)


Lesenswert?

Danke Michael, auch wieder was gelernt.

von HildeK (Gast)


Lesenswert?

@ Tim T. (tim_taylor)
>Gibt es irgend einen Grund dafür, das manche Leute immer und immer
>wieder irgendwelche while Konstrukte basteln?
Jeder mags nach seinem Geschmack. Beide sind vom Ergebnis her 
gleichwertig, nur vielleicht nicht von der optimalen Speichernutzung bei 
MCs.

>> In der Array-deklaration kann man soweit ich weiß keine Werte zuweisen.
>> Man muss jede Zelle einzeln füllen.
>nope, die initialisierung geht so, wie ers gemacht hat. zumindest beim
>avr-gcc ^^
IMHO ist das ANSI-C-Standard.

>Sonst steht halt einfach "0" drin.
Das stimmt jetzt nicht, bzw. nur bei globalen Variablen/Arrays. Sonst 
steht das drin, was in dem reservierten Speichplatz gerade so drin war.

von Lars H. (Firma: HTW Dresden) (tiger0815)


Lesenswert?

Hi erstmal an alle. Also du deklarierst ein Array der Länge 3 array[3], 
aber läßt die Schleife bis zum 4. Wert laufen. In C beginnt das erste 
Array bei 0, aber bei der Deklaration gibst du die Länge an. Rein 
theoretisch liest du aus den Speicher den ersten Wert nach deinem Array. 
Der ist je nach Compiler, oder vorheriger Nutzung wie hier mit "0" 
gefüllt.

von Joachim B. (jojo84)


Lesenswert?

Nabend!

Ich hoffe einfach mal es ist ok, daß ich hier poste, obwohl das Thema 
schon uralt ist. Aber: ich hab ein Problem mit Arrays und hoffe auf 
einen Tipp :)

Also, ich habe vier char-Arrays mit jeweils vier stellen. nun möchte 
ich, daß diese vier (bzw. 16) Stellen immer in Anhängigkeit von einer 
Variablen bestimmte Werte erhalten, z.b. so:
1
if(temp == 1)
2
{
3
char line1[] = {0xFF, 0xFF, 2, ' '};
4
char line2[] = {0xFF, 2, 4, ' '};
5
char line3[] = {0xFF, 0xFF, 0xFF, ' '};
6
char line4[] = {0xFF, 0xFF, 0xFF, ' '};
7
}
8
9
else if(temp == 2)
10
{
11
char line1[] = {2, ' ', ' ', 3};
12
char line2[] = {0xFF, 0xFF, 2, 4};
13
char line3[] = {0xFF, 2, 4, 0xFF};
14
char line4[] = {2, ' ', ' ', ' '};
15
}

so klappt das auch, aber ich möchte das eigentlich mit globalen Arrays 
machen. Aber da find ich nix, wie ich alle Arrayelemente "auf einmal" 
laden kann. Klar könnte ich schreiben
1
if(temp == 1)
2
{
3
line1[0] = 0xFF;
4
line1[1] = 0xFF;
5
line1[2] = 2;
6
line1[3] = ' ';
7
} // uns usf...

aber das macht pro Array vier zeilen, also pro Abfrage 16 Zeilen und bei 
Zehn abfragen macht das dann schon echt keinen Spaß mehr...
Ich wollte doch nur die Arrays global anlegen und dann irgendwo mit 
sowas wie "line1[] = {0xFF, 0xFF, 2, 4};" laden.
Wieso klappt das nicht und wie könnte ich das souverän lösen?

Danke und schönen Abend noch!

von Michael S. (msk) Benutzerseite


Lesenswert?

Joachim A. schrieb:
> aber das macht pro Array vier zeilen, also pro Abfrage 16 Zeilen und bei
> Zehn abfragen macht das dann schon echt keinen Spaß mehr...
> Ich wollte doch nur die Arrays global anlegen und dann irgendwo mit
> sowas wie "line1[] = {0xFF, 0xFF, 2, 4};" laden.
> Wieso klappt das nicht und wie könnte ich das souverän lösen?

Arrays kannst Du nicht einfach so zuweisen, das geht nur bei der 
Deklaration des Arrays selber.
Zur Lösung: Mehr als memcpy() fällt mir im Augenblick als mögliche 
Lösung nicht ein.

von Joachim B. (jojo84)


Lesenswert?

Ah, ok. Dann danke erstmal für die Antwort! Ich habe allerdings noch nie 
mit memcpy() gearbeitet. Kannst du mir vielleicht kurz erklären, was der 
Befehl macht und wie man den benutzt? Stichpunkte reichen, den Rest lese 
ich dann selbst :)

VG!

von holger (Gast)


Lesenswert?

>Kannst du mir vielleicht kurz erklären, was der
>Befehl macht und wie man den benutzt?

Sagt dir der Begriff "Suchmaschine" etwas?
Man, man...

von Sven P. (Gast)


Lesenswert?

Sowas ist vollkommen legitim:
1
char *vec;
2
3
if (...) {
4
  vec = "\0377\03772 ";
5
}
6
else {
7
  vec = "...";
8
}
Musst nur deine Hexadezimalwerte vorher nach Oktal umrechnen und 
beachten, dass *vec read-only ist!

von Joachim B. (jojo84)


Lesenswert?

@Holger: ruhig bleiben. Ich hab überhaupt keine detaillierte Ausführung 
verlangt. Ich hab nach "kurzen Stichpunkten" gefragt, um eine Grundidee 
zu haben. Den Rest wollte ich mir selbst anlesen (steht da auch, ne?)

@Sven: oha, das sieht ja wild aus :)... da muß ich mich erstmal nen 
Moment reindenken...

Dann danke nochmal und ich probiere rum...

von Michael S. (msk) Benutzerseite


Lesenswert?

Joachim A. schrieb:
> Ah, ok. Dann danke erstmal für die Antwort! Ich habe allerdings noch nie
> mit memcpy() gearbeitet. Kannst du mir vielleicht kurz erklären, was der
> Befehl macht und wie man den benutzt? Stichpunkte reichen, den Rest lese
> ich dann selbst :)

Mit memcpy() kopierst Du einfach den Inhalt eines Speicherbereichs mit 
der angegebenen Länge (in Bytes) in einen anderen:

memcpy(*ziel, *quelle, länge)

Gruß
Michael

von Joachim B. (jojo84)


Lesenswert?

Ok, danke, hab ich verstanden :)
dann kann ich damit ja mal rumprobieren. Hab schon an Pointer oder so 
gedacht. Aber ich wollte mir einfach nochmal andere Meinungen 
einholen...

Ich bin fertig hier =)

von Michael S. (msk) Benutzerseite


Lesenswert?

Sven P. schrieb:
> Sowas ist vollkommen legitim:

Wenn man das Feld mit
1
 char *vec;

anlegt, dann ja. Als Array
1
 char vec[3];

erntest Du bei dieser Zuweisung den Fehler "incompatible types in 
assignment".

Allerdings spricht natürlich nichts dagegen, das Array mit
1
 char *vec;
2
3
vec = (char *) malloc(3*sizeof(char)); //oder auch vec = (char*) malloc(3);

anzulegen und dann nach Deiner Methode in einer Zeile zu füllen. Das 
wäre dann eine weitere mögliche Lösung neben memcpy().

von Sven P. (Gast)


Lesenswert?

Michael S. schrieb:
> Allerdings spricht natürlich nichts dagegen, das Array mit
>
>
1
 char *vec;
2
> 
3
> vec = (char *) malloc(3*sizeof(char)); //oder auch vec = (char*)
4
> malloc(3);
5
> 
6
>
>
> anzulegen und dann nach Deiner Methode in einer Zeile zu füllen.
Dazu bräuchte man dann aber wieder memcpy()...

von Karl H. (kbuchegg)


Lesenswert?

Man könnte auch noch den guten alten 'struct-Trick' anwenden und die 
Arrays in eine Struktur packen, welche man dann direkt zuweisen kann.
1
struct Lines
2
{
3
  char line1[4];
4
  char line2[4];
5
  char line3[4];
6
  char line4[4];
7
};
8
9
struct Lines MyLines;
10
11
...
12
if(temp == 1)
13
{
14
  struct Lines tmp =
15
    { {0xFF, 0xFF, 2, ' '},
16
      {0xFF, 2, 4, ' '},
17
      {0xFF, 0xFF, 0xFF, ' '},
18
      {0xFF, 0xFF, 0xFF, ' '}
19
    }
20
21
  MyLines = tmp;
22
}
23
24
else if(temp == 2)
25
{
26
  struct Lines tmp =
27
    { {2, ' ', ' ', 3},
28
    {0xFF, 0xFF, 2, 4},
29
    {0xFF, 2, 4, 0xFF},
30
    {2, ' ', ' ', ' '}
31
  }
32
  MyLines = tmp;
33
}

das geht dann ohne explicit hingeschriebenen memcpy :-)

von Michael S. (msk) Benutzerseite


Lesenswert?

Sven P. schrieb:
> Dazu bräuchte man dann aber wieder memcpy()...

Naja, nur einen Pointer anzulegen und dann fröhlich Daten an die Adresse 
zu schreiben, wird in einem Absturz oder seltsamem Programmverhalten 
enden.

Die Zuweisung nach Deiner Art wird übrigens vom Compiler auch nach 
malloc() anstandslos geschluckt.

Der struct-Trick von Karl Heinz ist aber auch nicht schlecht...

von 12er Dude (Gast)


Lesenswert?

Hallo,

um noch einaml zum Ausgangsproblem zurück zu kommen:
1
...
2
int array[3]={0x01, 0x02,0x03}; //belegung des arrays
3
...
4
  i=0;
5
  while(i<4) {  
6
...
7
    A1=  array[i];

wie schon richtig erkannt wurde, wird über die Feldgrenze hinaus 
zugegriffen.

Es geht hier um 8051. Da stellt sich die Frage nach dem Compiler. Zum 
Teil muss der Speicher, der nach Startup initialisiert wird, extra 
angegeben werden. Dann muss die Variable (hier array) auch dort abgelegt 
sein.

Tschü Dude

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.