Forum: Mikrocontroller und Digitale Elektronik Pointer auf Array zegen


von Jürgen W (Gast)


Angehängte Dateien:

Lesenswert?

Hallo, brauche dringend eure hilfe...

ich habe ein Array mit 96 Elementen, und möchte ab den zweiten Wert 
jedes dritte abfragen. jedoch weiß ich nicht wie. bin neuling also bitte 
ein bisschen gnade.

habe es bis jetzt so gemacht:
int Array[96]

"Jetzt werden die Werte im Array gespeichert"

Endlosschleife:

if(Array[ 1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 
49, 52, 55, 58, 61, 64, 67, 70, 73, 76, 79, 82, 85, 88, 91, 94] >= 11)
{_LATB1 = OFF;}
else
{_LATB1 = ON;}
.
.
.
aber das klappt nicht.

hab n anhang dabei

von Jürgen W (Gast)


Lesenswert?

Also ich möchte jetzt mit in der if anweisung ein pointer abfragen, der 
auf die elemente im array zeigt.

von Dennis S. (eltio)


Lesenswert?

Zeig doch mal ein lauffähiges Minimalbeispiel von deinem Code. Aus 
diesen Schnippseln kann man ja kaum die verwendete Sprache erkennen... 
Vielleicht beschreibst du auch etwas genauer was du genau machen willst.

Gruß
Dennis

von ghl (Gast)


Lesenswert?

[c]
int arr[96];
int const * const end = &arr[95];

for(const int * ptr = &arr[1]; ptr < end; ptr += 3) {
  if(*ptr >= 11) {
    /* ... */
  } else {
    /* ... */
  }
}
[c]

?

von Sebastian V. (sebi_s)


Lesenswert?

So funktioniert das auch nicht. Du musst von Hand über alle Elemente im 
Array iterieren. So in etwa:
1
int check = 0;
2
for(int i = 1; i < 96; i += 3)
3
{
4
  if(Array[i] >= 1)
5
  {
6
    check = 1;
7
    break;
8
  }
9
}
10
if(check)
11
  _LATB1 = OFF;
12
else
13
  _LATB1 = ON;

Code nicht getestet daher keine Garantie. Falls du an solchen Aufgaben 
schon scheiterst solltest du dir nochmal ein paar C-Grundlagen 
aneigenen.

von Mark B. (markbrandis)


Lesenswert?

Man kann das mit einem Pointer machen, aber man braucht keinen.

1
unsigned int i;
2
3
for (i=1; i<=92; i+=3)
4
{
5
  if(Array[i] >= 11)
6
    {_LATB1 = OFF;}
7
  else
8
    {_LATB1 = ON;}
9
}

Setzt natürlich voraus, dass das Array zuvor mit sinnvollen Werten 
befüllt wurde.

von Sebastian V. (sebi_s)


Lesenswert?

Der TO sollte vielleicht nochmal sagen was er von seinem Programm 
erwartet. Wann soll der _LATB1 = OFF; Teil ausgeführt werden?

Wenn mindestens ein Element größer gleich 11 ist?
Wenn alle Elemente größer gleich 11 sind?
Wenn die Summe größer gleich 11 ist?
usw...

Edit: Hat sich noch ein Tippfehler in mein Codebeispiel eingeschlichen. 
Sollte natürlich if(Array[i] >= 11) heißen.

von Mark B. (markbrandis)


Lesenswert?

Sebastian V. O. schrieb:
> Der TO sollte vielleicht nochmal sagen was er von seinem Programm
> erwartet.

Nein, das darf man auf gar keinen Fall machen! Dann fällt ja das 
Herumraten darüber weg, was eigentlich getan werden soll. Wir brauchen 
doch eine Herausforderung hier. ;-)

von Jürgen W (Gast)


Lesenswert?

Mark Brandis schrieb:
> Man kann das mit einem Pointer machen, aber man braucht keinen.
>
> unsigned int i;
>
> for (i=1; i<=92; i+=3)
> {
>   if(Array[i] >= 11)
>     {_LATB1 = OFF;}
>   else
>     {_LATB1 = ON;}
> }
>
> Setzt natürlich voraus, dass das Array zuvor mit sinnvollen Werten
> befüllt wurde.

jawoll hat geklappt, danke dir :)

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Jürgen W schrieb:
>> Setzt natürlich voraus, dass das Array zuvor mit sinnvollen Werten
>> befüllt wurde.
>
> jawoll hat geklappt, danke dir :)

 Und der Sinn von ganzen Unsinn ist ?
 Nur der Wert von Array[95] wird ausgewertet. Warum fragst du dann nicht
 direkt Array[95] ab, wozu das Ganze überhaupt ?
 Ein sehr guter Compiler mit Optimierung würde da wahrscheinlich direkt
 Array[95] übernehmen.
 LOL.

von Sebastian V. (sebi_s)


Lesenswert?

Naja so schlimm ist es jetzt nicht. Kommt eben drauf an was _LATB1 
überhaupt sein soll. Wenn das ein Output Pin ist wo er eine LED 
angeschlossen hat dann wird er kaum eine Chance haben die Änderung zu 
beobachten und sieht dann nur den Wert der vom letzten Array Element 
stammt. Könnte aber auch sonstwas sein.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Sebastian V. O. schrieb:
> Naja so schlimm ist es jetzt nicht. Kommt eben drauf an was _LATB1
> überhaupt sein soll. Wenn das ein Output Pin ist wo er eine LED
> angeschlossen hat dann wird er kaum eine Chance haben die Änderung zu
> beobachten und sieht dann nur den Wert der vom letzten Array Element
> stammt. Könnte aber auch sonstwas sein.

 Ja.
 Die Bemerkung trifft natürlich nicht auf deinen Code, aber er hat ja
 den Code von Mark Brandis genommen.
 Da gibt es kein break, die Schleife wird immer voll durchgelaufen.

von Jürgen W (Gast)


Lesenswert?

Ja, LATB1 ist eine LED.
Und im Array werden werden die Werte des ADCs abgespeichert.
Ich habe drei Spannungseingänge im ADC und AN1 (array [1, 4, 7...]) soll 
ausgewertet werden, immer wenn die Spannung x überschritten wird soll 
die LED angehen.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Jürgen W schrieb:
> Ich habe drei Spannungseingänge im ADC und AN1 (array [1, 4, 7...]) soll
> ausgewertet werden, immer wenn die Spannung x überschritten wird soll
> die LED angehen.

 Dann nimm doch den Code vom Sebastian, nur for-schleife so ändern:
1
for(uint8_t i = 1; i <= 91; i += 3)
 und gut ist es.


 oder:
1
  _LATB1 = ON;
2
3
  for(uint8_t i = 1; i <= 91; i += 3)
4
  {
5
    if(Array[i] >= 11)
6
    {
7
      _LATB1 = OFF;
8
      break;
9
    }
10
  }

 Ich nehme an, dass du mit Log.0 LED einschaltest, trotzdem sollten
 die Bezeichnungen fur ON und OFF logisch sein...

von Jürgen W (Gast)


Lesenswert?

Okay mach ich, vielen Dank.
Jetzt siehts besser aus =)

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.