c/c++ Array problem bitte hilfe

OP #775739
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
OP #775772
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
Gast #775792
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.
Gast #775802
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 :-)
Gast #775824
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!
OP #776347
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
Gast #776357
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
Gast #776391
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ß
#776399
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
Persönliche Seite #776458
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.
Gast #776478
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
Gast #776504
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...
Gast #776507
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 ^^
Gast #776564
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.
(Firma: HTW Dresden) #1077616
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.
#1410305
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!
Persönliche Seite #1410324
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.
Gast #1410540
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!
#1410551
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...
Persönliche Seite #1410614
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
Persönliche Seite #1410618
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().
Gast #1410828
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()...
#1410926
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 :-)
Persönliche Seite #1410953
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...
Gast #1410957
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren