Einfachste Grafiken in C

KoRnFreaK1984

Grünschnabel
Hallo zusammen,

ich bin neu hier und bin auch noch ein Anfänger im C-Programmieren.
Für meine Fortbildung zum staatliche geprüften Techniker soll ich in C eine 7-Segment-Anzeige zeichnen.
Als Bibliothek steht mir die graphics.h zur Verfügung.
Ich habe nun ein Segment (das waagerechte Segment) der 7-Segment-Anzeige als Array geschrieben:
int Segm1[14]={1.Wert,2.Wert,...,14.Wert};
drawpoly(7,Seg1);

So weit, so gut.
Nun möchte ich dieses Segment um sage ich mal 300Pixel nach rechts und 200Pixel nach unten nochmal zeichnen, ohne die einzelnen Koordinatenpunkte einzeln auszurechnen.
Meine Idee war, für die neue Position einen neuen Array anzulegen mit den Werten Position2[2]={300,200}.

Gibt es nun eine Möglichkeit, dass die beiden Arrays folgendermaßen addiert werden:
Segm1[14]={10,20,30,40,50,60,70,80,90,100,110,120,130,140};
Position2[2]={300,200};

Ergebnis[14]={310,220,330,240,350,260,370,280,390,400,310,420,330,440};

Über eine for-Schleife könnte ich mir das vorstellen, weiß aber nicht genau, wie man einen Array immer nur nach den geraden, bzw. ungeraden Positionen abfragt.

Kann mir da jemand weiterhelfen?
Oder gibt es da noch eine viel einfachere Lösung?

Vielen Dank für eure Hilfe und einen guten Rutsch ins neue Jahr.
Gruß KoRnFreaK1984
 

cwriter

Erfahrenes Mitglied
Als Bibliothek steht mir die graphics.h zur Verfügung.
Da die graphics.h nicht zum Standard gehört und mir nicht bekannt ist, wäre es wohl hilfreich, die zu sehen. (Ist ja nicht diese hier, oder?)

Ich habe nun ein Segment (das waagerechte Segment) der 7-Segment-Anzeige als Array geschrieben:
int Segm1[14]={1.Wert,2.Wert,...,14.Wert};
drawpoly(7,Seg1);
Also ist Segm1 nur die Darstellung eines einzelnen Segments?

Über eine for-Schleife könnte ich mir das vorstellen, weiß aber nicht genau, wie man einen Array immer nur nach den geraden, bzw. ungeraden Positionen abfragt.
Modulo (%) ist da recht hilfreich. Also sowas wie:
C:
for(size_t i = 0; i < 14; ++i)
{
    Segm1[i] += Position2[i % 2];
}

Kurze Erklärung: Es werden offensichtlich alle Elemente in Segm1 verändert, aber von Position2 wird nur das letzte Bit (Gerade/Ungerade) betrachtet. Daher kann man es auch so schreiben:
C:
for(size_t i = 0; i < 14; ++i)
{
    Segm1[i] += Position2[i & 1];
}

Aus Gründen der Übersicht ist aber Modulo vorzuziehen, der Compiler wird sowas ohnehin optimieren.

Ein sehr viel effizienterer Weg (der von guten Optimizern aber auch genommen wird), sind die SIMD-Instruktionen, aber das wäre hier Overkill (würde aber noch kürzeren Code erlauben).

Oder gibt es da noch eine viel einfachere Lösung?
Nein, einfacher wird es nicht.

Vielen Dank für eure Hilfe und einen guten Rutsch ins neue Jahr.
Danke gleichfalls :)

Gruss
cwriter
 

sheel

I love Asm
Hi und Willkommen bei tutorials.de :)

Das Arrayproblem ist nicht schwer:

In der Grundschule wirst du sicher irgendwann mal eine Division mit Rest (statt Kommazahlen) gemacht haben, zB. 14/4 ist 3, und 2 Rest. Um von einer (int-)Division den Rest zu bekommen gibt es in C einen eigenen Operator mit dem Zeichen % ("Modulo"). Folgender Code
C++:
int i = 14 % 4;
ergibt also 2 in der Variable i.

Wozu das jetzt gut ist: Eine Zahl Modulo 2 ist 0 falls die Zahl gerade war, sonst 1. Damit kann man sich einfach etwas mit if zusammenbauen...
C++:
for(int i = 0; i < 14; i++)
{
    if((i % 2) == 1) Segm1[i] += Position2[0];
    else Segm1[i] += Position2[1];
}

Ein paar andere Varianten vom selben Code:
C++:
for(int i = 0; i < 14; i++)
{
    if(i % 2) Segm1[i] += Position2[0];
    else Segm1[i] += Position2[1];
}
Wenn man keinen Vergleich wie ==1 oder so hat ist die Bedingung dann erfüllt, wenn der Zahlenwert nicht 0 ist - daher hier kein Vergleich nötig.
C++:
for(int i = 0; i < 14; i++)
{
    Segm1[i] += (i%2) ? Position2[0] : Position2[1];
}
Hier eine mögliche verkürzte Schreibweise vom if, der "ternäre Operator". "Bedingung ? WennJa : WennNein"

...

Zu einem anderen Thema noch: graphics.h.

Dir ist sicher bewusst, das die IT-Welt sehr schnelllebig ist, und die meisten Programme usw. von zB. 1990 heute für die meisten Leute uninteressant sind, es auf modernen Computern nicht mehr funktioniert. usw.usw.
graphics.h ist so ein Fall - es war nie Teil vom "offiziellen" C, sondern eine Dazuerfindung eines einzelnen Compilerherstellers zu seinem Compiler, und dieser Compiler ist seit 1994 aufgegeben.

Mit verschiedenen umständlichen Methoden bekommt man Code damit auch heute noch zu Laufen (vorausgesetzt die anderen Sachen passen), aber: Du lernst da nichts was für einen durchschnittlichen C-Programmierr im Jahr 2018 irgendwie nützlich ist. Und ich vermute, das ist nicht das einzige Problem mit deiner Ausbildung - schlechte C-Kurse sind eine Seuche, die sich deswegen halten können, weil die Kursteilnehmer zu dem Zeitpunkt noch nicht wissen, dass sie schlecht sind.

...was ich sagen will, wenn du später beruflich was mit C zu tun haben willst, besser auch außerhalb vom Kurs lernen. Es gibt eine Reihe guter Bücher, auch online, usw. (und natürlich auch das Forum hier :D)
 

KoRnFreaK1984

Grünschnabel
Hey.
Vielen Dank für die super schnellen Antworten.
Mit der for-Schleife war das total easy.

upload_2017-12-31_14-14-1.png

Hat super geklappt!
Das Ergebnis spricht für sich =)=)=)

upload_2017-12-31_14-16-15.png


Leider weiß ich nun auch, dass der Anbieter, den ich für die Fortbildung gewählt habe, nicht mehr auf dem neuesten Stand ist.
Da ich aber nur noch 3 Monate bis zum Abschluss habe, lohnt es sich nicht mehr ihn abzubrechen und einen besser Anbieter zu suchen... =(
Ob ich beruflich mal mit dem C-Programmieren zu tun haben werde, ist derzeit noch nicht klar, Interesse besteht aber ;-)

Vielen Dank nochmal für eure Antworten.
Gruß KoRnFreaK1984