Forum: PC-Programmierung Definieren von variable im laufenden Programm


von Christoph Fuggersberger (Gast)


Lesenswert?

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
void loop(){
2
    
3
  int in;
4
  
5
    while (Serial.available()) {
6
    int in = (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
  int t1;
20
  int l;
21
  int arrage;
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

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

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?

von Micha (Gast)


Lesenswert?

#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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Amateur (Gast)


Lesenswert?

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.

von Mark B. (markbrandis)


Lesenswert?

1
data_ascii_A1 = a,b,c,d,e,f,g,h;

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.

von Amateur (Gast)


Lesenswert?

Die Anweisung:

>data_ascii_A1 = a,b,c,d,e,f,g,h;

Wird nach:

a,b,c,d,e,f,g,h = a,b,c,d,e,f,g,h;

aufgelöst.

Sollte eigentlich 'nen Meckerer geben.

von Mark B. (markbrandis)


Lesenswert?

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.

von Mark B. (markbrandis)


Lesenswert?

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 :-)

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

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.

von Mark B. (markbrandis)


Lesenswert?

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? ;-)

von Stefan E. (sternst)


Lesenswert?

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;

von Peter II (Gast)


Lesenswert?

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);

?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Stefan E. (sternst)


Lesenswert?

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.

von B. S. (bestucki)


Lesenswert?

1
a=1,2;   /* entspricht a=1; */
2
a=(1,2); /* entspricht a=2; */

von kopfkratzer (Gast)


Lesenswert?

kopfkratz
Um mal auf das "Problem" des TO einzugehen, das was Du willst ist ein 
Array mit vordefiniertem Inhalt:
1
data_ascii_A1[] = {'a','b','c','d','e','f','g','h'};
Dann kannst Du mit Deiner Laufvariable "a" das passende Ergebnis 
ausgeben.

von Amateur (Gast)


Lesenswert?

Christoph ist wohl bereits verstorben.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Amateur (Gast)


Lesenswert?

>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.

von franz (Gast)


Lesenswert?

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";

von kopfkratzer (Gast)


Lesenswert?

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 ;-)

von Karl H. (kbuchegg)


Lesenswert?

@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.

: Bearbeitet durch User
von kopfkratzer (Gast)


Lesenswert?

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

von Christoph Fuggersberger (Gast)


Lesenswert?

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

von Rolf Magnus (Gast)


Lesenswert?

Christoph Fuggersberger schrieb:
> Also ich hänge hier mal die Originale und geänderte Datei an.

Ja, mach das mal ;-)

von Peter II (Gast)


Lesenswert?

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.

von Christoph Fuggersberger (Gast)


Angehängte Dateien:

Lesenswert?

Tut mir echt leid, hab die Dateien vergessen :D

Mfg. Christoph

von Stefan E. (sternst)


Lesenswert?

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).

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

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
1
  Assignment_Statement :=
2
   Target '=' Expression .
C gehört nicht dazu.

: Bearbeitet durch User
von Mark B. (markbrandis)


Lesenswert?

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.

von Christoph Fuggersberger (Gast)


Lesenswert?

.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.

von Mark B. (markbrandis)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von Christoph Fuggersberger (Gast)


Lesenswert?

Tja dann versuch ich das Problem anders zu lösen, danke trotzdem, dass 
ihr versucht habt mir zu helfen.

von Christoph Fuggersberger (Gast)


Lesenswert?

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!

von Mark B. (markbrandis)


Lesenswert?

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? ;-)

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.