Ich definiere in den ersten Zeilen meines Arduino-Codes eine Variable,
die später Punkte einer LED Matrix steuert.
Erste Zeile:
1
a=0;
2
#define data_ascii_A1 a,b,c,d,e,f,g,h
Später möchte ich die Variable a im laufenden Programm ändern, dies
funktioniert so weit auch, nur wirkt sich die Änderung von "a" nicht auf
"data_ascii_A1" aus.
Teil vom Programmcode:
1
voidloop(){
2
3
intin;
4
5
while(Serial.available()){
6
intin=(int)Serial.read();
7
8
if((in-48)==1)
9
a=a+1;
10
11
if((in-48)==2)
12
a=a+2;
13
14
data_ascii_A1=a,b,c,d,e,f,g,h;
15
16
17
Serial.print(a);
18
19
intt1;
20
intl;
21
intarrage;
22
for(arrage=0;arrage<10;arrage++)
23
{
24
do{
25
for(t1=0;t1<8;t1++)
26
{
27
displayNum(data_ascii[1][t1],(t1+1));
28
}
29
}while(Serial.available()==0);
30
31
32
}
33
}
34
}
Beim ausgeben von "a" wird die Änderung angezeigt, jedoch wenn man
"data_ascii_A1" verwendet(Nach der Änderung natürlich) bleibt "a" auf
dem in der ersten Programmzeile definierten Wert.
Wie kann ich durch einlesen einer Variable im Hauptprogramm die Variable
"a" in "data_ascii_A1" ändern?
Mfg. Christoph
Christoph Fuggersberger schrieb:> Wie kann ich durch einlesen einer Variable im Hauptprogramm die Variable> "a" in "data_ascii_A1" ändern?
so bestimmt nicht.
ein define ist eine Textersetzen die vor dem Kompilieren gemacht wird.
Das ist überhaupt keine Variable.
data_ascii_A1 = a,b,c,d,e,f,g,h;
Das das überhaupt angenommen wird ist schon fast ein wunder. Es macht
aber bestimmt nicht was du willst.
Was soll es denn überhaupt machen?
#define ist eine Anweisung an den Präprozessor, der in Deinem Code
erstmal "data_ascii_A1" durch "a,b,c,d,e,f,g,h" ersetzt. So ähnlich, als
würdest du das selber vorher mit suchen+ersetzen machen. DANACH wird das
Programm kompiliert.
Mach nochmal ein neues Minmalbeispiel, dann kommen wir vielleicht
weiter.
Micha schrieb:> Mach nochmal ein neues Minmalbeispiel, dann kommen wir vielleicht> weiter.
Und beschreib, was das Problem aus grober Sicht gesehen ist.
Die ganze Fragestellung, der ganze Democode, hinterlässt den ganz
starken Eindruck, dass du dich völlig verlaufen hast und versuchst eine
ungeeignete Lösungsidee umzusetzen.
Es kann auch manchmal nicht schaden, offensichtlicher zu Programmieren.
Warum nicht gleich:
if(in == '2')
a = a + 2;
Da sieht man gleich viel besser was abgeht.
Das hier ist in C keine sinnvolle Zuweisung.
Sollen die Variablen a bis h für einzelne Pixel stehen, und
data_ascii_A1 für eine Zeile von Pixeln, oder was ist deren Bedeutung?
Was willst Du eigentlich machen.
Peter II schrieb:> data_ascii_A1 = a,b,c,d,e,f,g,h;>> Das das überhaupt angenommen wird ist schon fast ein wunder.
Also der GCC kompiliert das ohne Fehler, aber natürlich mit Warnungen:
main.c:8: warning: left-hand operand of comma expression has no effect
main.c:8: warning: left-hand operand of comma expression has no effect
main.c:8: warning: left-hand operand of comma expression has no effect
main.c:8: warning: left-hand operand of comma expression has no effect
main.c:8: warning: left-hand operand of comma expression has no effect
main.c:8: warning: left-hand operand of comma expression has no effect
main.c:8: warning: left-hand operand of comma expression has no effect
main.c:8: warning: left-hand operand of comma expression has no effect
main.c:8: warning: left-hand operand of comma expression has no effect
main.c:8: warning: left-hand operand of comma expression has no effect
main.c:8: warning: left-hand operand of comma expression has no effect
main.c:8: warning: left-hand operand of comma expression has no effect
main.c:8: warning: left-hand operand of comma expression has no effect
Man erhält bei 7 Variablen 13 Warnugen, also 2*n+1. Bei 6 Variablen
entsprechend 11 Warnungen usw.
Wenn der Präprozessor drübergelaufen ist, steht da ja im Endeffekt:
a,b,c,d,e,f,g,h = a,b,c,d,e,f,g,h;
Und das ist offenbar vom Compiler akzeptierter C-Code. Auch wenn er
natürlich keinen Sinn ergibt.
Mark Brandis schrieb:> Man erhält bei 7 Variablen 13 Warnugen, also 2*n+1. Bei 6 Variablen> entsprechend 11 Warnungen usw.
Sollte natürlich 2*n minus 1 heißen. Aber stimmt auch nicht:
Bei 4 Variablen sind es dann 5 Warnungen.
2 Variablen: 1 Warnung
3 Variablen: 3 Warnungen
Nutzloses Wissen des Tages :-)
Mark Brandis schrieb:> a,b,c,d,e,f,g,h = a,b,c,d,e,f,g,h;>> Und das ist offenbar vom Compiler akzeptierter C-Code. Auch wenn er> natürlich keinen Sinn ergibt.
Wobei interessant ist, dass der Kommaoperator auf der linken Seite
überhaupt zulässig ist. Hätte ich nicht gedacht. Hab ich mir allerdings
auch noch nie Gedanken darüber gemacht.
Karl Heinz schrieb:> Wobei interessant ist, dass der Kommaoperator auf der linken Seite> überhaupt zulässig ist. Hätte ich nicht gedacht.
Auf der rechten Seite ergäbe das mehr Sinn? ;-)
Karl Heinz schrieb:> Wobei interessant ist, dass der Kommaoperator auf der linken Seite> überhaupt zulässig ist. Hätte ich nicht gedacht.
Ist er auch nicht.
Aber das = hat eine höhere Präzedenz. Da steht eigentlich
a,b,c,d,e,f,g,(h=a),b,c,d,e,f,g,h;
Stefan Ernst schrieb:> Ist er auch nicht.> Aber das = hat eine höhere Präzedenz. Da steht eigentlich> a,b,c,d,e,f,g,(h=a),b,c,d,e,f,g,h;
gilt bei , nicht das letzte also:
a,b,c,d,e,f,g,(h=a,b,c,d,e,f,g,h);
=
a,b,c,d,e,f,g,(h=h);
?
Stefan Ernst schrieb:> Karl Heinz schrieb:>> Wobei interessant ist, dass der Kommaoperator auf der linken Seite>> überhaupt zulässig ist. Hätte ich nicht gedacht.>> Ist er auch nicht.> Aber das = hat eine höhere Präzedenz. Da steht eigentlich> a,b,c,d,e,f,g,(h=a),b,c,d,e,f,g,h;
Ah.
Da liegt des Pudels Kern!
Ja, klar. So erklärt sich, warum es die von mir erwartete Fehlermeldung
nicht gibt.
Danke.
Peter II schrieb:> gilt bei , nicht das letzte also:>> a,b,c,d,e,f,g,(h=a,b,c,d,e,f,g,h);>> =>> a,b,c,d,e,f,g,(h=h);>> ?
Nein. So wie du es schreibst, hätte das = ja sowohl eine höhere als auch
eine niedrigere Präzedenz. Wie soll das gehen?
"Das letzte gilt" bezieht sich einzig auf das Ergebnis des
Komma-Operators.
kopfkratzer schrieb:> *kopfkratz*> Um mal auf das "Problem" des TO einzugehen, das was Du willst
Ich gehör zwar auch zu denen, die ganz gerne schon mal raten, was ein TO
eigentlich wirklich will, aber in dem Fall trau ich mich noch nicht mal
das. Die Beschreibung ist so verworren, der Code ist so
zusammengewürfelt und da drinn fehlt es IMHO an jeder noch so kleinen
erkennbaren Idee, was das ganze werden soll, dass ich mir da keinerlei
Prognose abzugeben traue.
>a=0;>#define data_ascii_A1 a,b,c,d,e,f,g,h
...
> data_ascii_A1 = a,b,c,d,e,f,g,h;
...
>Später möchte ich die Variable a im laufenden Programm ändern, dies>funktioniert so weit auch, nur wirkt sich die Änderung von "a" nicht auf>"data_ascii_A1" aus.
Natürlich wirkt sich die Änderung nicht auf "a" aus, da kein normaler
Compiler dieses Fragment übersetzt.
Interessant, das dieses kleine Detail unter den Tisch gekehrt wurde.
Hier gilt wohl die Maxime: Ich kann programmieren – der Compiler ist nur
zu doof das zu kapieren.
Amateur schrieb:> Natürlich wirkt sich die Änderung nicht auf "a" aus, da kein normaler> Compiler dieses Fragment übersetzt.
Bitte C lernen. Es entspricht "h = a";
Karl Heinz schrieb:> kopfkratzer schrieb:>> *kopfkratz*>> Um mal auf das "Problem" des TO einzugehen, das was Du willst>> Ich gehör zwar auch zu denen, die ganz gerne schon mal raten, was ein TO> eigentlich wirklich will, aber in dem Fall trau ich mich noch nicht mal> das. Die Beschreibung ist so verworren, der Code ist so> zusammengewürfelt und da drinn fehlt es IMHO an jeder noch so kleinen> erkennbaren Idee, was das ganze werden soll, dass ich mir da keinerlei> Prognose abzugeben traue.
Ist zwar ziemlich wirr, aber das was er will wird aus dem Programm und
dem Text schon ersichtlich, er will via RS232/seriell/usb einen
Buchstaben schicken und das dann auswerten um LEDs leuchten zu lassen.
Programmierung ist nicht gerade seine Stärke und Probleme zu analysieren
bevor man quick'n'dirty etwas zusammenhackt auch nicht.
Es kann jetzt natürlich sein das "meine" Logik da etwas
hineininterpretiert was nicht da ist, das ist allerdings das einzige was
ich erkennen kann das Sinn macht ;-)
@kopfkratzer
Man weiß es nicht.
Am Anfang spricht er von einer LED Matrix. Gut. Damit baut sich bei mir
schon eine gewisse Vorstellung auf.
Dann dieser Codeteil hier
1
if((in-48)==1)
2
a=a+1;
3
4
if((in-48)==2)
5
a=a+2;
das erinnert mich wiederrum mehr an eine Zählung, wie oft ein bestimmtes
Zeichen vorgekommen ist. Aber auch wieder nicht, dann es macht dann
keinen Sinn, dabei jedesmal a zu verwenden.
Die Funktion, die er letzten Endes aufruft, heißt DisplayNum. Wenn ich
nach dem Namen gehe, dann zeigt die eine Zahl (eine Ziffer?) an einer
bestimmten Stelle an der LED-Matrix an. Vielleicht schaltet sie aber
auch nur eine bestimmte Anzahl an LED in in einer bestimmten Spalte
(Zeile) der Matrix an.
Ich könnte mir genausogut vorstellen, dass das eine Zählung der
Auftreten der Zeichen '0' bis '9' und entsprechendes EInschalten von LED
zum Zwecke der Darstellung eines Balkendiagramms an der LED-Matrix sein
soll.
Dann wäre die nachgefragte Zeile der untaugliche Versuch, die einzeln
ermittelten Häufigkeiten wieder in ein Array zusammenzufassen.
Man weiß es nicht. So recht kann ich keinen definitiven Sinn erkennen.
Deine Interpretation ist natürlich eine Möglichkeit. Eine von mehreren,
die man rauslesen könnte.
Der Teil hier
1
for(t1=0;t1<8;t1++)
2
{
3
displayNum(data_ascii[1][t1],(t1+1));
4
}
könnte wiederum die Spaltenweise Ausgabe von Werten sein. Aber warum
heißt die Funktion dann displayNum, warum wird in der ersten Dimension
immer auf den Index 1 zugegriffen, und warum wird beim zweiten Argument
1 zu t1 dazugezählt?
Oder ist die LED-Matrix gross genug, so dass da 8 Ziffern (Buchstaben)
nebeneinander dargestellt werden können, und das ganze soll hier ein
Multiplexen sein? Wenn dem so ist, warum erledigt dann der
Ausgabemechanismus dann das Multiplexen nicht für sich alleine
(timergesteuert). Warum ist das ganze eingebettet in eine
while-Schleife, die auf ein Zeichen von der Seriellen wartet? Und
darüber liegt dann noch eine 10-er for Schleife.
Ich werd nicht wirklich schlau daraus.
Karl Heinz schrieb:> Ich könnte mir genausogut vorstellen, dass das eine Zählung der> Auftreten der Zeichen '0' bis '9' und entsprechendes EInschalten von LED> zum Zwecke der Darstellung eines Balkendiagramms an der LED-Matrix sein> soll.> Dann wäre die nachgefragte Zeile der untaugliche Versuch, die einzeln> ermittelten Häufigkeiten wieder in ein Array zusammenzufassen.kopfkratz
Ja stimmt das würde zu der -48 passen wenn es ASCII ist.
Das das ganze einfach schnell zusammengewürfelt ist ist wohl dem "ich
hack mal was zusammen ohne das ich weiß was ich eigentlich will"
geschuldet.
So wie ich's verstanden habe will er je nachdem was via serialin ankommt
in die a Zählvariable konvertieren und danach das was in seinem define
ist abzuklappern.
Aber da sich unser TO nie wieder gemeldet hat wird er wohl die
Eierlegendewollmilchsau in einem anderen Forum gefunden haben :-P
Hallo,
Bin weder verstorben, noch habe ich die " Eierlegendewollmilchsau" in
einem anderen Forum gefunen, hatte nur bisher nicht viel Zeit um vorbei
zu schauen.
Zugegeben das Programm ist nicht rein von mir, ich hab es nur
abgewandelt.
Also ich hänge hier mal die Originale und geänderte Datei an.
Beim Original laufen die Buchstaben von A-I auf der Matrix Anzeige
durch.
Im geänderten Programm soll dann durch serielle Eingabe von Zahlen die
einzelnen Punkte auf der Matrix gesetzt werden.
Wie genau das mit data_ascii_A1 funktioniert weiß ich ehrlich gesagt
auch nicht, was wohl mein Problem erklärt.
Ich weiß nur, dass die 8 Zahlen nach "data_ascii_A1" in Binärdarstellung
den LEDs entspricht.
a==1 --> a==0b00000001 und daraus folgt die erste LED in der ersten
Zeile leuchtet.
Mit der Variable "b" wäre is die 2. Zeile.
Hoffe ich hab mich so ausgedrückt dass ihr wisst was ich meine.
Mfg. Christoph
Stefan Ernst schrieb:> Nein. So wie du es schreibst, hätte das = ja sowohl eine höhere als auch> eine niedrigere Präzedenz. Wie soll das gehen?
rechts vom = wird vorher Ausgewertet und dort gilt laut , Operator das
das Letzte element übernommen wird.
Peter II schrieb:> rechts vom = wird vorher Ausgewertet
Unsinn, so eine Regel gibt es nicht. Die Zuweisung ist ein Operator mit
einer Präzedenz wie jeder andere auch.
"x=a,b;" entspricht "(x=a),b;", und nicht "x=(a,b);".
Edit:
Dass "rechts vom = wird vorher Ausgewertet" meistens zutrifft, liegt
einfach daran, dass der Zuweisungsoperator eine ziemlich niedrige
Präzedenz hat. Die vom Kommaoperator ist aber nun mal noch niedriger
(tatsächlich sogar die niedrigste überhaupt).
Stefan Ernst schrieb:> Dass "rechts vom = wird vorher Ausgewertet" meistens zutrifft, liegt> einfach daran, dass der Zuweisungsoperator eine ziemlich niedrige> Präzedenz hat.
Und das ist auch gut so. Sie sorgt dafür, dass zb
1
i=a<b
als
1
i=(a<b)
angesehen wird, und nicht als
1
(i=a)<b
Ansonsten muss ich dir absolut recht geben. Auch wenn das auf den ersten
Blick unintuitiv erscheint, ist eine Zuweisung nichts spezielles,
sondern ein ganz normaler Operator, so wie + oder - oder * oder % auch.
Er liefert einen Wert und hat als Nebeneffekt die Speicherung seines
rechten Operanden im linken Operanden zur Folge (der ein lvalue sein
muss). In C ist eine Zuweisung nichts spezielles, sondern eine Operation
in einem Ausdruck. Die komplette Anweisung
1
i=2*a;
ist ein arithmetischer Ausdruck. In ihm kommen die Operationen = und *
vor. In anderen Sprachen ist das anders. Da gibt es eine explizite
Zuweisungs-Anweisung mit der Syntax
Ich hab zwar keine Ahnung, was "ino" für ein komisches Dateiformat sein
soll. Auch verstehe ich nicht den Sinn, die notwendigen Header
wegzulassen und eine Datei mit nur zwei Bytes hochzuladen.
Aber wenn ich das ganze mal als .c Datei abspeichere , byte durch
unsigned char ersetze und kompiliere, bekomme ich:
error: initializer element is not constant
Was auch klar ist wegen:
1
6.7.8 Initialization
2
3
All the expressions in an initializer for an object that has static
4
storage duration shall be constant expressions or string literals.
Das kann also so nicht funktionieren, und hat so auch niemals woanders
funktioniert. Kauf dir ein C-Buch und arbeite es durch. Gründlich.
.ino ist die Endung für eine Arduino Datei.
Ivh benutze die Arduino IDE, kompilieren funktioniert bri beidrn Codes
ohne Afehlermeldung und das original Programm macht genau das, was es
machen soll.
Christoph Fuggersberger schrieb:> .ino ist die Endung für eine Arduino Datei.> Ivh benutze die Arduino IDE, kompilieren funktioniert bri beidrn Codes> ohne Afehlermeldung und das original Programm macht genau das, was es> machen soll.
Mit Sicherheit nicht. Was du hier gepostet hast
(LED_Matrix_Original.ino) hat zwei Bytes. Schau nach wenn du es nicht
glaubst.
Christoph Fuggersberger schrieb:> .ino ist die Endung für eine Arduino Datei.> Ivh benutze die Arduino IDE, kompilieren funktioniert bri beidrn Codes> ohne Afehlermeldung und das original Programm macht genau das, was es> machen soll.
Das mag schon sein.
Trotzdem würden wir es gerne mal sehen um wenigstens die Codeidee
rauszufinden.
Ich würde ja raten, dass "data_ascii" im Original nichts anderes als
eine Zeichensatztabelle ist, in der für jeden Buchstaben das
spaltenmässig aufgeschlüsselte Bitmuster abgelegt ist und du das 'in
deiner Version' mangels Verständnis einfach nur kräftig versaut hast.
Mangels verfügbarem Code des Originals ist es aber nicht möglich, dieses
abzuklären. Deinen Code hingegen kann man getrost in die Tonne treten.
Der ist weit weg davon, auch nur annähernd Sinn zu machen. Aus dem kann
man nichts rauslesen.
Eine LED-Matrix ist nun mal kein Anfängerprojekt. Auch wenn viele
Anfänger das glauben. Für eine LED Matrix ist das sichere Beherrschen
von einigen Konzepten sowie Arrayoperationen Grundvoraussetzung. Alles
andere führt mit Sicherheit ins Desaster - wie du ja mehr als
eindrucksvoll bewiesen hast.
Habe gerade eine Lösung gefunden falls es jemanden interessiert ;)
Ich habe:
byte data_ascii[][display_array_size] = {
data_null,
data_ascii_A1
};
durch:
byte data_ascii[][display_array_size] = {
data_null,
{a,b,c,d,e,f,g,h}
};
ersetzt.
Und zum Thema : Zusammengewürfelt, Ich hätte keine Idee was ich mache
etc.
Das Programm mach dank Änderung von 2 Zeilen EXAKT das, was ich will!
Christoph Fuggersberger schrieb:> Und zum Thema : Zusammengewürfelt, Ich hätte keine Idee was ich mache> etc.> Das Programm mach dank Änderung von 2 Zeilen EXAKT das, was ich will!
Na wenn das so einfach war, warum hast Du's dann nicht gleich richtig
gemacht? ;-)