C++Guns – RoboBlog blogging the bot

25.11.2010

C gotoxy Konsole & ASCII Bildschirmschoner

Filed under: Allgemein — Tags: — Thomas @ 21:11

Möchte man ohne zusätzliche Libs den Cursor auf der Konsole frei bewegen, langt folgender kleiner Hack den man sich schnell aus dem Internet googelt.

Und schwubs di wupp war ein kleiner ASCII Bildschirmschoner hingezaubert.

#include < stdio.h >

void gotoxy(int x,int y)
{
  printf("%c[%d;%df",0x1B,y,x);
}

int main()
{
  int x = 0, y = 0;
  char c = 0;
  system("clear");

  while(1)
  {
    x = rand()%50;
    y = rand()%25;
    c = rand()%'z' + ' ';
    gotoxy(x,y);
    printf("%c", c);
    fflush(stdout);
    sleep(1);
  }
}

Und so schaut er aus

a  avD F        !    ` U /v   y'   z    Y y  j 5
 j   >         \            X         t
S     9                          e o          X
    R x              m    q            P c   E  >
-        7r .   =,  7          l       1
  r           m      e       c#     x     ]   "
         t  B       W  b          V
      G       l  m V  OO        zd
&   7        rX@"  >     dJ          3 )
h    &        H           R    F         3
   !    l   n     6 K m         #     @  u
        h  # |      O               ,    &
j  J        *   P     r c  E /      $
         S       \     S      ^  j5S%f          c
                         p     z_z l           n
               R        f       N   ;  7  q    0
     J   i&     H|   ?    *        y  I      s
a  |     #    Q   5   g\      D   F       e Ho
  f b  ]            
	

30.10.2010

C++ Hello World mal anders

Filed under: Allgemein — Tags: , — Thomas @ 17:10

int main()
{
double a[ ] = { 8.765776478827897e+228, 2.767901447961622e-315 };
const char* s = (char*)&a;
std::cout << s; } Output: hello world!

Dank an Paprikachu

23.08.2010

Objekterkennung mit OpenCV

Filed under: Allgemein — Tags: , — Thomas @ 20:08

Gerade beim aufräumen habe ich dieses alte Video von mir gefunden
http://www.dailymotion.com/video/xejjoz_objekterkennung-mit-opencv_tech

Mit OpenCV das Webcam Bild abgreifen und dann den Pavlidis Algo. laufen lassen (google it). Den Mittelpunkt merken und im nächsten Frame dort das Objekt wieder suchen. So ungefährt jedenfalls funktioniert es.

Der Code ist unter aller Sau. Müsste mir eigentlich mal die Zeit nehmen und das ordentlich machen. Immerhin boomen ja diese Gestik-Erkennungs-Geräte gerade. Besonders für Spiele ganz toll. Die Technik gibts schon lange, nur auf einmal wird sie populär.

15.08.2010

Game Of Life in BF to C

Filed under: Allgemein — Tags: , — Thomas @ 23:08

The Game of Life in Brainfuck geschrieben und mit einem BF2C Converter übersetzt und compiliert und dann noch statisch gelinkt.

Das klingt irgendwie absurd oder?

Im Anhang der Quelltext... (God gab ihn mir ;) )

gameoflifesource.tar

fucking C

Filed under: Allgemein — Tags: , — Thomas @ 20:08

Bei Lft Craft habe ich den wohl schrecklichsten C Code aller Zeiten gefunden.

char m[9999],*n[99],*r=m,*p=m+5000,**s=n,d,c;main(){for(read(0,r,4000);c=*r;
r++)c-']'||(d>1||(r=*p?*s:(--s,r)),!d||d--),c-'['||d++||(*++s=r),d||(*p+=c==
'+',*p-=c=='-',p+=c=='>',p-=c=='<',c-'.'||write(2,p,1),c-','||read(2,p,1));}

Leute die meinen Style schlecht reden habe einfach keine Ahnung ;)

Und ja, das Ding compiliert wirklich. In den letzten zwei Tage habe ich das mal in lesbares C übersetzt


// m enthaelt den kompletten bf code und den programm pointer
// also programm und daten, so ist es moeglich eine quine zu programmieren
// 0 bis 4999 ist der bf code in plain text
// n und s sind mir noch nicht so ganz klar
// r zeigt auf das aktuelle zeichen im bf code
// p der programm pointer
// d hat irgendwas mit schleifen zu tun
// c das aktuelle zeichen im bf code

char m[9999],*n[99],*r=m,*p=m+5000,**s=n,d,c;

main(){
// Lese maximal 4000 zeichen von stdin
// (was mag passieren wenn der bf code groesser als 4000 zeicen ist
// naja, wird wohl einfach ueberschrieben)
for(read(0,r,4000);c=*r;r++)
{
//c- ']' || (d>1 || (r=*p?*s:(--s,r)) , !d||d--);
if(c == ']')
{
if(d <= 1) { if(*p) { r = *s; } else { --s; } } if(d) d--; } //c- '[' || d++ || (*++s=r), if(c == '[') { if(d == 0) { d++; *(++s) = r; } } //d|| ( if(d == 0) { //*p+=c=='+', if(c == '+') *p += 1; //*p-=c=='-', if(c == '-') *p -= 1; //p+=c=='>',
if(c == '>')
p += 1;

//p-=c=='<'; if(c == '<') p -= 1; //c-'.'||write(2,p,1); if(c == '.') write(2,p,1); //c-','||read(2,p,1); if(c == ',') read(2,p,1); // ) } } }
(Leider geht die Formatierung in WordPress verloren).

Aber jetzt erstmal ein paar Erklärungen. Wenn man sich den Code genauer anschaut, wird man feststellen, dass wohl alle ";" durch "," ersetzt wurden. So kann man mehrere Anweisungen in eine Zeile schreiben.

a = 0, b = a+1, c = a+b;

Weiterhin fällt auf, dass es kein einziges if() gibt. Man kann ein if() durch ein logisches ODER ersetzen:

a || b++;

Der Ausdruckt stimmt so. Normalerweise erwartet man sowas in einer if(), aber es geht auch ohne. Das Programm wird von links nach rechts abgearbeitet.
Ein ODER ist dann wahr, wenn einer von beiden Argumenten wahr ist.

Also wenn a ungleich 0 ist, zählt das als wahr. Aber sagen wir lieber true, spricht sich schöner.
Wenn also a true ist, muss b++ nicht mehr ausgeführt werden.
Ist a hingegen 0, wird b++ ausgeführt.
So einfach kann es sein :)

Dann fallen Sachen wie p+=c=='>' auf. Auch das ist ganz einfach. Der Operator == wird vor += ausgewertet. Wenn also c=='>' ist, ergibt das true, also 1. Dann steht als zweites p+=1 da. Sollte c irgendein anderes Zeichen sein, wird p+=0 ausgeführt.

Folgender Code ist auch noch erwähnenswert

c- '[' || d++ || blubb

Das ist wieder eine geschachtelte if(). In c steht ein Zeichen vom Bf Code. Sollte in C nun das Zeichen '[' stehen, und subtrahiert man nun ein '[', ist das ergebis 0. Unsere if() wird also wahr und der nächste Ausdruck wird in Angriff genommen.

d++ || blubb

Das Problem mit dem ++ sollte ja bekannt sein, bei d++ wird erst d bentuzt, dann um eins erhöht. Bei ++d wird erst d um ein erhöht und dann benutzt. Ist also d gleich 0. Wird d um eins erhöht und dann blubb ausgewetet.

Mit diesem Wissen kann man schon fast den kompletten Code verstehen. Nur diese eine Zeile hat mich eine Weile beschäftigt

c- ']' || (d>1 || (r=*p?*s:(--s,r)) , !d||d--)

Schaut erstmal eine Weile drauf. Am Anfang eine if(), noch eine if(), noch eine if() und dann noh eine if() ;)

Interesannt ist nur der innerste Teil

r=*p?*s:(--s,r)

Da steht ?:
Und ?: geht vor dem = Operator. Wenn also *p nicht 0 ist, dann wird r = *s ausgeführt. Sollte *p 0 ergeben. Wird erst s um eins erniedrigt und dann r=r ausgeführt.
r=r ist natürlich doof, aber ohne das würde da stehen r=--s; und das ist ja nicht gewollt.

So und was ist das nun für ein Programm? Na ein Brainfuck Interpreter. Sieht man doch ;)

08.06.2010

Pointer und so

Filed under: Allgemein — Tags: — Thomas @ 21:06

Hier gefunden http://www.wachtler.de/ck/8_4_Grunddatentypen.html

C erhält durch Zeigerarithmetik erst richtig Leben; die größere Effektivität von Programmen in C rührt zu einem großen Teil davon. Angenommen, eine Funktion soll ein Feld mit double-Elementen löschen, also alle Werte zu 0.0 setzen. Ein ehemaliger FORTRAN- oder Pascal-Programmierer würde die Funktion vielleicht so schreiben:

/* grloel.c 31. 7.95 kw
*/

#include

void loesche_double( double feld[], size_t wieviele )
{
size_t i;

for( i=0 ; i < wieviele ; i++ ) feld[i] = 0.0; } Das funktioniert natürlich, aber die Lösung enthält überflüssige Berechnungen. Abgesehen von der nötigen Erhöhung des Schleifenzählers (Auswertung von ++) muß bei jedem Durchlauf die Adresse des Elementes feld[i] berechnet werden. Dazu muß das Programm die Adresse hernehmen, die mit dem Namen feld verbunden ist (das ist die Adresse des ersten Feldelements), und dazu ein Produkt addieren, nämlich i*sizeof(double) (zur Auswertung von feld[i]). Mit Zeigerarithmetik läßt sich die Funktion wesentlich schneller machen: /* grloes.c 31. 7.95 kw */ #include

void loesche_double( double *feld, size_t wieviele )
{
double *pfeld = feld;
double *pende = feld+wieviele;

while( pfeld < pende ) *pfeld++ = 0.0; } Jetzt wird der Parameter feld als Zeiger auf das erste Element aufgefaßt. Ein Zeiger (pfeld) wandert durch das Feld und zeigt nacheinander auf die zu löschenden Elemente. Neben der eigentlichen Zuweisung (=) muß in der Schleife nur noch zu pfeld bei jedem Durchlauf der Wert sizeof(double) addiert werden (Auswertung von ++). Die aufwendige Multiplikation entfällt, außerdem hat man statt zwei Additionen nur noch eine.

19.02.2009

itoa uitoa für AVRs

Filed under: Allgemein — Tags: — Thomas @ 23:02

Wer kennt das nicht, man möchte eine Zahl über USART ausgeben, scheut sich aber vor solche dicken Funktionen wie fprintf. Man höhrt dann öfters von einer itoa Funktion, die es aber nicht per default gibt. Hier ist meine uitoa Funktion, welche die Zahl gleich raussendet. Inspiriert vom midgard Projekt von buha.info . Die USARTtransmis* Funktionen sind von http://jump.to/fleury .

void USARTuitoa(uint16_t n)
{
// max. 5 stellige zahlen + die abschliessende 0 im string
unsigned char s[6];
// arrays fangen bei 0 an zu zählen. pos zeigt auf das letzte feld
register uint8_t pos = 5;

// den string mit einer 0 terminieren
s[pos] = (char) 0;

do {
uint8_t rest = n % 10;
n = (n - rest) / 10;

s[- -pos] = rest + '0';
} while(n && pos);

USARTtransmitString((unsigned char *) (s + pos));
}

« Newer Posts

Powered by WordPress