www.mikrocontroller.net

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


Autor: Milas N. (milas)
Datum:

Bewertung
0 lesenswert
nicht 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.
/*array Übung*/


#include <reg552.h> 
#include <stdio.h>

unsigned int i, A1;

int array[3]={0x01, 0x02,0x03}; //belegung des arrays



void main (void  )

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


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

Autor: holger (Gast)
Datum:

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

Autor: Milas N. (milas)
Datum:

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

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>      A1=0x00;
unnötig.

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


wie wäre es damit:

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

Autor: Milas N. (milas)
Datum:

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

Autor: STK500-Besitzer (Gast)
Datum:

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

Autor: Milas N. (milas)
Datum:

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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Trollalarm !

Autor: STK500-Besitzer (Gast)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: HildeK (Gast)
Datum:

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

Autor: holger (Gast)
Datum:

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

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger, du plenkst...

Autor: STK500-Besitzer (Gast)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: HildeK (Gast)
Datum:

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

Autor: Milas N. (milas)
Datum:

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

Autor: Michael H* (Gast)
Datum:

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

Autor: Analog (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

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

Autor: Sebastian (Gast)
Datum:

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

Autor: Tim T. (tim_taylor)
Datum:

Bewertung
0 lesenswert
nicht 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?
unsigned int i, A1; //warum nicht char?

int array[3]={0x01, 0x02, 0x03}; //und hier auch

void main(void){
 while(1){
  for (i=0; i<4; i++){ //immernoch falsche Grenze
   A1=0x00; //immernoch unnötig
   A1=array[i];
  };  
 };
}

Ist zwar immernoch falsch aber irgendwie übersichtlicher...

Autor: Michael H* (Gast)
Datum:

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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Michael, auch wieder was gelernt.

Autor: HildeK (Gast)
Datum:

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

Autor: Lars Höhne (Firma: HTW Dresden) (tiger0815)
Datum:

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

Autor: Joachim B. (jojo84)
Datum:

Bewertung
0 lesenswert
nicht 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:
if(temp == 1)
{
char line1[] = {0xFF, 0xFF, 2, ' '};
char line2[] = {0xFF, 2, 4, ' '};
char line3[] = {0xFF, 0xFF, 0xFF, ' '};
char line4[] = {0xFF, 0xFF, 0xFF, ' '};
}

else if(temp == 2)
{
char line1[] = {2, ' ', ' ', 3};
char line2[] = {0xFF, 0xFF, 2, 4};
char line3[] = {0xFF, 2, 4, 0xFF};
char line4[] = {2, ' ', ' ', ' '};
}

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
if(temp == 1)
{
line1[0] = 0xFF;
line1[1] = 0xFF;
line1[2] = 2;
line1[3] = ' ';
} // 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!

Autor: Michael S. (msk) Benutzerseite
Datum:

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

Autor: Joachim B. (jojo84)
Datum:

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

Autor: holger (Gast)
Datum:

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

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sowas ist vollkommen legitim:
char *vec;

if (...) {
  vec = "\0377\03772 ";
}
else {
  vec = "...";
}
Musst nur deine Hexadezimalwerte vorher nach Oktal umrechnen und 
beachten, dass *vec read-only ist!

Autor: Joachim B. (jojo84)
Datum:

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

Autor: Michael S. (msk) Benutzerseite
Datum:

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

Autor: Joachim B. (jojo84)
Datum:

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

Autor: Michael S. (msk) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven P. schrieb:
> Sowas ist vollkommen legitim:

Wenn man das Feld mit
 char *vec;

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

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

Allerdings spricht natürlich nichts dagegen, das Array mit
 char *vec;

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().

Autor: Sven P. (haku) Benutzerseite
Datum:

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

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

Bewertung
0 lesenswert
nicht 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.
struct Lines
{
  char line1[4];
  char line2[4];
  char line3[4];
  char line4[4];
};

struct Lines MyLines;

...
if(temp == 1)
{
  struct Lines tmp =
    { {0xFF, 0xFF, 2, ' '},
      {0xFF, 2, 4, ' '},
      {0xFF, 0xFF, 0xFF, ' '},
      {0xFF, 0xFF, 0xFF, ' '}
    }

  MyLines = tmp;
}

else if(temp == 2)
{
  struct Lines tmp =
    { {2, ' ', ' ', 3},
    {0xFF, 0xFF, 2, 4},
    {0xFF, 2, 4, 0xFF},
    {2, ' ', ' ', ' '}
  }
  MyLines = tmp;
}


das geht dann ohne explicit hingeschriebenen memcpy :-)

Autor: Michael S. (msk) Benutzerseite
Datum:

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

Autor: 12er Dude (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

um noch einaml zum Ausgangsproblem zurück zu kommen:
...
int array[3]={0x01, 0x02,0x03}; //belegung des arrays
...
  i=0;
  while(i<4) {  
...
    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

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.