Übergabe von Parametern (int?)

#3041934
Lesenswert?

Hallo,

irgendwas raffe ich nicht. Und zwar habe ich folgende Funktion:
1
void setRow(unsigned char nr) {
2
  if (nr>1) {
3
    com74hc595_row[0]=pow(2,nr-2);
4
    com74hc595_row[1]=0;
5
  }
6
  else {
7
    com74hc595_row[0]=0;
8
    com74hc595_row[1]=pow(2,nr+6);
9
  }
10
  com74hc595_row_out();
11
}

Bei zahlen >1 soll in Array[0] etwas eingetragen werden. Und zwar:
Parameter->Arrayinhalt
2->1
3->2
4->4
5->8
...
Bei 0 und 1:
1->128
0->64

Habe ich evtl. Problem mit den Datentypen?
Aufgerufen wird z.B. über setRow(1);


Danke schonmal
#3041960
Lesenswert?

Michael N. schrieb:
> Habe ich evtl. Problem mit den Datentypen?

Das wissen wir nicht. Du hast ja kein Problem beschrieben.

Was komisch wirkt:
> Bei zahlen >1 soll in Array[0] etwas eingetragen werden.

Wenn in com74hc595_row[0] etwas eingetragen werden soll, warum schreibst 
Du dann:
1
com74hc595_row[1]=0;
und
1
com74hc595_row[1]=pow(2,nr+6);
Wo und wie ist überhaupt "com74hc595_row" deklariert?
Gast #3041966
Lesenswert?

1
#include <stdio.h>
2
#include <math.h>
3
#define LEN 2
4
unsigned char com74hc595_row[LEN];
5

6
void com74hc595_row_out(void)
7
{
8
    for (unsigned i = 0; i < LEN; ++i) {
9
  printf("%3u ", com74hc595_row[i]);
10
    }
11
    printf("\n");
12
}
13

14
void setRow(unsigned char nr)
15
{
16
    if (nr > 1) {
17
  com74hc595_row[0] = pow(2, nr - 2);
18
  com74hc595_row[1] = 0;
19
    } else {
20
  com74hc595_row[0] = 0;
21
  com74hc595_row[1] = pow(2, 6 + nr);
22
    }
23
    com74hc595_row_out();
24
}
25

26
int main(void)
27
{
28
    for (unsigned char i = 0; i < 10; ++i) {
29
  printf("i=%d: ", i);
30
  setRow(i);
31
    }
32
}
ergibt:
i=0:   0  64
i=1:   0 128
i=2:   1   0
i=3:   2   0
i=4:   4   0
i=5:   8   0
i=6:  16   0
i=7:  32   0
i=8:  64   0
i=9: 128   0

Wo genau steckt das Problem?
#3041970
Lesenswert?

Hatte schon ähnliche Antworten erwartet, deshalb nochmal genau:

Wenn ich nicht mit dem Parameter "nr" arbeite, funktioniert das ganze.

Uwe ... schrieb:
> Im else-Zweig müsste noch abgefragt werden, ob 0 oder 1, und dann der
> zugeordnete Wert in com74hc595_row[0] eingetragen werden

Wenn nr==0 oder nr==1 (negative Werte werden nicht an die funktion 
übergeben), dann wird in meinem code folgendes ausgeführt:
com74hc595_row[1]=pow(2,nr+6); //Gibt bei nr=0: 2^6 und bei nr=1: 2^7
Das passt also. Und wenn ich statt nr direkt eine 1 oder 0 eintrage, 
geht auch alles.

com74hc595_row ist ein Array. Element 1 ist das erste Schieberegister. 
Element 1 das zweite. Wenn ich per Hand etwas hineinschreibe dann zeigt 
mir die Matrix auch das richtige an. (sind die Reihen der Matrix)

A. K. schrieb im Beitrag #3041959:
> Ja. 1-2 ist -1. Auch in C.

1-2 wird nie ausgeführt werden, da obendrüber ein if nr>1 steht...
#3041974
Lesenswert?

Service schrieb:
> i=0:   0  64
> i=1:   0 128
> i=2:   1   0
> i=3:   2   0
> i=4:   4   0
> i=5:   8   0
> i=6:  16   0
> i=7:  32   0
> i=8:  64   0
> i=9: 128   0
>
> Wo genau steckt das Problem?

Genau, du hast meine Idee verstanden. So soll es sein.
Und zwar leuchtet bei i=1 die Matrix so, als hätte ich i=0 übergeben 
(also in Array[0]=0 und Array[1]=64). Bei i=0 leuchtet garnichts. Bei 
anderen werten werden teilweiße mehrere Bit auf 1 gesetzt...
#3041981
Lesenswert?

Also in Kurzfassung:
1
com74hc595_row[0]=pow(2, 9-2); //Diese Zeile liefert in meinem Code etwas anderes als:
2
com74hc595_row[0]=pow(2, nr-2); //nr ist ein Parameter dieser Funktion. Ich habe 9 als Parameter übergeben...
Kann ich mir nur schlecht anzeigen lassen. Aber dieser Test zeigt, dass 
wohl im Array schon das falsche steht. Es geht ja, wenn ich es so fest 
eintrage...
#3041990
Lesenswert?

Michael N. schrieb:
> Aber dieser Test zeigt, dass
> wohl im Array schon das falsche steht. Es geht ja, wenn ich es so fest
> eintrage...

Dass Deine Funktion prinzipiell richig arbeitet, hat aber der User 
"Service" schon demonstriert. Jetzt wäre zu klären, welchen Controller 
Du verwendest und was Du sonst noch unötigerweise an Bibliotheken 
verwendest (eventuell wird der Speicher knapp).
#3042005
Lesenswert?

Habe es mittlerweile auch auf meinem PC per C geschrieben. Da geht es:
1
void setRow(int nr) {
2
    printf("%i",nr);
3
  if (nr>1) {
4
            int test=pow(2, nr-2); //geht nicht direkt in printf
5
    printf("Test:%i",test);
6
  }
7
  else {
8
            int test=pow(2, nr+6);
9
    printf("Test:%i",test);
10
        }
11
}
--> Die Funktion liefert alles passend zurück

Ich arbeite mit einem Atmega8-16

Bibliotheken:
#include <avr/io.h>
#include <util/delay.h>
#include "math.h"
#include "com74hc595_col.h"
#include "com74hc595_row.h"

Die beiden com74hc595 sind nur ansteuerroutinen für die schieberegister.
#3042012
Lesenswert?

Ersetz die pow()-Funktion doch mal durch Shifts:
1
void setRow(unsigned char nr) {
2
  if (nr > 1) {
3
    com74hc595_row[0] = 1 << (i - 2);
4
    com74hc595_row[1] = 0;
5
  }
6
  else {
7
    com74hc595_row[0] = 0;
8
    com74hc595_row[1] = 1 << (i + 6);
9
  }
10
  com74hc595_row_out();
11
}
#3042019
Lesenswert?

Michael N. schrieb:
> Wüsste trotzdem gerne was meine pow-Logik zu nichte gemacht hat.
> Vielleicht wirklich ungenauigkeiten?

Es wird wohl 127 rausgekommen sein, was dann wie 64 wirkte. Die 
Grundrechenarten sind im Rahmen der Stellenzahl exakt, aber pow() ist 
das Ergebnis einer Approximationsrechnung. Und die ist bei ganzzahligen 
Argumenten nicht zwingend exakt.

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