Übergabe von Parametern (int?)

OP #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?
OP #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...
OP #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...
OP #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).
OP #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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.