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
unsignedinti,A1;
8
9
intarray[3]={0x01,0x02,0x03};//belegung des arrays
10
11
12
13
voidmain(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
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.
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
@ 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
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?
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
>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.
@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...
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 :-)
>@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 ?
>@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...
>>@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!
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
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
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ß
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
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.
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
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
unsignedinti,A1;//warum nicht char?
2
3
intarray[3]={0x01,0x02,0x03};//und hier auch
4
5
voidmain(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...
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 ^^
@ 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.
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.
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
charline1[]={0xFF,0xFF,2,' '};
4
charline2[]={0xFF,2,4,' '};
5
charline3[]={0xFF,0xFF,0xFF,' '};
6
charline4[]={0xFF,0xFF,0xFF,' '};
7
}
8
9
elseif(temp==2)
10
{
11
charline1[]={2,' ',' ',3};
12
charline2[]={0xFF,0xFF,2,4};
13
charline3[]={0xFF,2,4,0xFF};
14
charline4[]={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!
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.
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!
@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...
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
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 =)
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...
Hallo,
um noch einaml zum Ausgangsproblem zurück zu kommen:
1
...
2
intarray[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