Oui un jeu dans ce forum wink

Le principe est simple, quelqu'un poste un bout de code, et il faut deviner ce qu'il fait smile




Allez premier code à deviner :
tmp = (dI&0x0F) + (dJ&0x0F); if ((tmp & 0xFF) > 0x09) tmp = 0x10 | (tmp ^ ((0x2 | ~(tmp<<1)&0x4 | ((((tmp>>2)&1) | (((tmp>>1)&1)))<<3)) & 0x0F)); tmp += (dI&0xF0) + (dJ&0xF0); if ((tmp & 0xFF0) > 0x90) { tmp = tmp ^ (0x20 | ~(tmp<<1)&0x40 | (((tmp>>2)&0x10 | ((tmp>>1)&0x10))<<3)); }
Que fait ce code?
avatarProud to be CAKE©®™
The cake is a lie! - Love your weighted companion cube

->986-Studio's Wonder Project!<-
yN a cassé ma signature :o
Addition de quartets BCD, dI et dJ étant vraisemblablement des octets (uint8_t ou équivalent) ?
Je n'ai pas testé ce code, mais je pense à l'addition BCD à cause des traitements spéciaux si la valeur du quartet actuellement considéré dépasse 9.
avatarMembre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.
Prafo ! smile

edit:
Oui dI et dJ sont les octets d'entree (en BCD bien sur) et bien des uint8_t, ce code est malheureusement bugge sur le second quartet, certaines additions ne retournent pas le bon resultat)
avatarProud to be CAKE©®™
The cake is a lie! - Love your weighted companion cube

->986-Studio's Wonder Project!<-
yN a cassé ma signature :o
J'aime bien ce jeu smile
#include <stdio.h> int i = 0; int main(int argc, char *argv[printf("%d\n", i++)]) { return (i <= 1000) && main(argc, argv); }

Que fait ce code ?
il compte jusqu'à 1000, c'est osé comme initialiseur grin

gcc -O0 -fomit-frame-pointer -S

        .file   "test.c"
.globl i

        .bss
        .align 4
        .type   i, @object
        .size   i, 4
i:
        .zero   4

        .section        .rodata
.LC0:
        .string "%d\n"

        .text
.globl main
        .type   main, @function
main:
        pushl   %ebp
        movl    %esp, %ebp
        andl    $-16, %esp
        subl    $16, %esp

        movl    i, %eax

        movl    %eax, %edx
        addl    $1, %eax

        movl    %eax, i
        movl    $.LC0, %eax
        movl    %edx, 4(%esp)
        movl    %eax, (%esp)
        call    printf

        movl    i, %eax
        cmpl    $1000, %eax
        jg      .L2

        movl    12(%ebp), %eax
        movl    %eax, 4(%esp)
        movl    8(%ebp), %eax
        movl    %eax, (%esp)
        call    main

        testl   %eax, %eax
        je      .L2

        movl    $1, %eax
        jmp     .L3

.L2:
        movl    $0, %eax

.L3:
        leave
        ret
        .size   main, .-main
        .ident  "GCC: (Debian 4.4.5-8) 4.4.5"
        .section        .note.GNU-stack,"",@progbits


smile
Surprenant qu'on puisse utiliser une fonction dans ces circonstances
avatarProud to be CAKE©®™
The cake is a lie! - Love your weighted companion cube

->986-Studio's Wonder Project!<-
yN a cassé ma signature :o
très bon grin
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
./6 : pencil, faut un compilo très tolérant grin
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo
ça marche même avec --std=c89 dans gcc. Comment on désactive les extensions gcc? grin
clang compile, mais le code genere segfault


Tiens:

root@sd-27878:~# clang -pedantic -std=c89 testouille.c -o pouic
testouille.c:9:30: warning: variable length arrays are a C99 feature, accepted as an extension [-pedantic,-Wvla]
int main(int argc, char *argv[printf("%d\n", i++)]) {
                             ^
1 warning generated.



Marrant avec -O3 il semble stipper le call a printf
avatarProud to be CAKE©®™
The cake is a lie! - Love your weighted companion cube

->986-Studio's Wonder Project!<-
yN a cassé ma signature :o
Pas de problème avec mon clang moi :elbarto@atlantis> clang -v FreeBSD clang version 3.4.1 (tags/RELEASE_34/dot1-final 208032) 20140512 Target: x86_64-unknown-freebsd10.0 Thread model: posix Selected GCC installation:
Zerosquare (./8) :
./6 : pencil, faut un compilo très tolérant


Pas vraiment, c'est un abus difficile a repérer du C99.
Un appel de fonction reste une expression, les variables lenght arrays prennent une expression donc bon ...

Pour l'histoire de ce code, un mec sur stackoverflow cherchais des moyen en C/C++ pour afficher tout les nombre de 0 a 1000 sans boucle et un pote a pondu ca, j'ai du relire plusieurs fois avant de comprendre ce que le code fesais smile
Godzil (./1) :
Oui un jeu dans ce forum wink

Le principe est simple, quelqu'un poste un bout de code, et il faut deviner ce qu'il fait smile




Allez premier code à deviner :
tmp = (dI&0x0F) + (dJ&0x0F); if ((tmp & 0xFF) > 0x09) tmp = 0x10 | (tmp ^ ((0x2 | ~(tmp<<1)&0x4 | ((((tmp>>2)&1) | (((tmp>>1)&1)))<<3)) & 0x0F)); tmp += (dI&0xF0) + (dJ&0xF0); if ((tmp & 0xFF0) > 0x90) { tmp = tmp ^ (0x20 | ~(tmp<<1)&0x40 | (((tmp>>2)&0x10 | ((tmp>>1)&0x10))<<3)); }
Que fait ce code?

Ca c'est un DAA non ?
avatarHighway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741
ElBarto (./4) :
J'aime bien ce jeu smile
#include <stdio.h> int i = 0; int main(int argc, char *argv[printf("%d\n", i++)]) { return (i <= 1000) && main(argc, argv); }

Que fait ce code ?


Aucun warning des compilateurs sur ce code !!!! Arrgg !!!!
C'est con, je me demande quel code ça génère. C'est un tableau à taille dynamique, mais comme c'est un paramètre en pratique c'est juste un variable sized array (char[]). Mais ouais grammaticalement ça a du sens en tous cas, juste pas fonctionnellement...
avatarHighway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741
Réponse générale pour les deux cas (et je suppose pour aussi la plupart de ceux à venir) : ce code vous fait avoir des problèmes avec votre responsable qualité logicielle et l'autorité compétente de certification embarrassed
avatarQue cache le pays des Dieux ? - Ximoon's Box - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.
Responsable quoi ? Autorité compéquoi ? Tu as une de ces imaginations, Ximoon cheeky
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo
C'est ce que j'allais dire, au vu des exemples qu'on voit fleurir ici et là, au vu même de ce qu'on lit parfois sur yN, j'imaginnais que c'était des postes qui n'avaient pas encore d'existence grin
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
Va dire ça au mec de l'ESA avec qui je vais passer la journée demain tiens grin

(ceci dit il est marrant ce topic oui)
avatarQue cache le pays des Dieux ? - Ximoon's Box - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.
Ximoon (./18) :
Va dire ça au mec de l'ESA avec qui je vais passer la journée demain tiens grin

ESA ou EASA ?
int i= 0 ;
i+= i+++i---i+++i ;
Rien du tout si le compilateur est malin, vu que i n'est pas utilisé. Sinon c'est dépendant de l'implémentation. C'est pas drôle embarrassed
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo
En JAVA je suis sûr que c'est spécifié embarrassed
Je ne touche pas aux drogues dures embarrassed
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo
Godzil (./1) :
tmp = (dI&0x0F) + (dJ&0x0F); if ((tmp & 0xFF) > 0x09) tmp = 0x10 | (tmp ^ ((0x2 | ~(tmp<<1)&0x4 | ((((tmp>>2)&1) | (((tmp>>1)&1)))<<3)) & 0x0F)); tmp += (dI&0xF0) + (dJ&0xF0); if ((tmp & 0xFF0) > 0x90) { tmp = tmp ^ (0x20 | ~(tmp<<1)&0x40 | (((tmp>>2)&0x10 | ((tmp>>1)&0x10))<<3)); }

J'avais implémenté ça de façon plus lisible quand même tongue// http://www.ftp83plus.net/Tutorials/z80inset_fullA.htm // Exemple: 0x8 + 0x3 = 0xb -> 0x11 (+6) if ((accu & 0xf) >= 0xa || flags.halfcarry) accu += flags.n ? -6 : 6; // Pareil pour le digit du haut if ((accu & 0xf0) >= 0xa0 || flags.carry) { accu += flags.n ? -0x60 : 0x60; flags.carry = 1; } else flags.carry = 0; flags.halfcarry = 0; flags.zero = (accu == 0);
avatarHighway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741
Zerosquare (./21) :
Sinon c'est dépendant de l'implémentation.

Pas exactement. Là c'est du "undefined behavior", ce qui n'est pas la même chose que "implementation-defined behavior" si on veut être précis #modpo#
Pphd> ESA
avatarQue cache le pays des Dieux ? - Ximoon's Box - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.
Brunni: j'ai posté l'asm généré par le code zarb.
Brunni (./24) :
Godzil (./1) :
tmp = (dI&0x0F) + (dJ&0x0F); if ((tmp & 0xFF) > 0x09) tmp = 0x10 | (tmp ^ ((0x2 | ~(tmp<<1)&0x4 | ((((tmp>>2)&1) | (((tmp>>1)&1)))<<3)) & 0x0F)); tmp += (dI&0xF0) + (dJ&0xF0); if ((tmp & 0xFF0) > 0x90) { tmp = tmp ^ (0x20 | ~(tmp<<1)&0x40 | (((tmp>>2)&0x10 | ((tmp>>1)&0x10))<<3)); }

J'avais implémenté ça de façon plus lisible quand même tongue// http://www.ftp83plus.net/Tutorials/z80inset_fullA.htm // Exemple: 0x8 + 0x3 = 0xb -> 0x11 (+6) if ((accu & 0xf) >= 0xa || flags.halfcarry) accu += flags.n ? -6 : 6; // Pareil pour le digit du haut if ((accu & 0xf0) >= 0xa0 || flags.carry) { accu += flags.n ? -0x60 : 0x60; flags.carry = 1; } else flags.carry = 0; flags.halfcarry = 0; flags.zero = (accu == 0);


Mon algo peux paraitre bizzare, mais il est base sur les equation logiques interne du 6502
avatarProud to be CAKE©®™
The cake is a lie! - Love your weighted companion cube

->986-Studio's Wonder Project!<-
yN a cassé ma signature :o
 
Ha oui
avatarProud to be CAKE©®™
The cake is a lie! - Love your weighted companion cube

->986-Studio's Wonder Project!<-
yN a cassé ma signature :o