Jump to content
theocrite

Le Bar de la programmation

Recommended Posts

Parce que justement tu utilises un autre bash. il faut rajouter "#! /bin/sh" en première ligne :p

Edited by foetus

Share this post


Link to post
Share on other sites
Du coup j'enchaîne sur une question de bash (le printf c'est plus du C que du php pour moi ^^), pourquoi quand je mets un truc dans le genre :

alias recompile="root=$(pwd); cd ~/Documents/Projet && make > /dev/null; cd $root"

dans mon .bash_profile la variable root n'a pas l'air de vouloir se mettre à jour ) l'exécution ? (je me retrouve toujours dans le même dossier à la fin en fait, qqsoit l'endroit où j'exécute l'alias.

En fait c'est très simple : le contenu de ton fichier .bash_profile est évalué lorsque tu te connectes à une nouvelle instance du shell. C'est à ce moment-là et pas après que $(pwd) est évalué, c'est pourquoi après exécution de ta commande tu n'es pas là où tu t'y attends.

En fait, il suffit d'échapper le $ de la sous-commande à l'aide d'un antislash.

Accessoirement, pour ton alias ici décrit, on peut même faire encore plus simple en utilisant la variable d'environnement $OLDPWD. Au final, ta commande deviendrait :

alias recompile="cd ~/Documents/Projet && make > /dev/null; cd \$OLDPWD"

Share this post


Link to post
Share on other sites

Nickel merci :-)

J'ai encore appris des trucs en bash ^^

Merci à tous les deux pour vos réponses :-D

Share this post


Link to post
Share on other sites

Bonjour les gens !

Je profite de mon premier post ici pour vous demander votre avis sur Java. Avec encore une belle fournée de failles toutes plus critiques les unes que les autres, je me demande si on peut encore faire confiance aux implémentations de ce langage.

Alors sans remettre sur le tapis les problèmes de sécurités sous-jacents (droits d'exécution administrateur (ou root), clic "un-peu-trop-rapide" sur "Ignorer cette alerte de sécurité", j'aimerais savoir si, selon vous, on peut encore avoir confiance en java pour développer des logiciels.

Merci pour vos lumières :chinois:

Share this post


Link to post
Share on other sites

Bonjour les gens !

Je profite de mon premier post ici pour vous demander votre avis sur Java. Avec encore une belle fournée de failles toutes plus critiques les unes que les autres, je me demande si on peut encore faire confiance aux implémentations de ce langage.

Alors sans remettre sur le tapis les problèmes de sécurités sous-jacents (droits d'exécution administrateur (ou root), clic "un-peu-trop-rapide" sur "Ignorer cette alerte de sécurité", j'aimerais savoir si, selon vous, on peut encore avoir confiance en java pour développer des logiciels.

Merci pour vos lumières :chinois:

Je n'ai pas d'avis particulier sur java, ça fait une plombe que je n'y ai pas touche.

après je dirais que tout dépend de ce que tu veux faire, si l'applicatif est expose au public (genre site web / web service / applicatif réseau), perso non je ne m'y risquerais pas, puisque les failles de sécurité font presque partie de l'API a ce niveau la.

si c'est sous contrôle avec seulement l'utilisateur au commande, ou en background avec un middleware qui n'est pas en java, je pense que ça passe.

Share this post


Link to post
Share on other sites

Ouis mais Android = Java + Dalvik ou Android = C via JNI non documenté

Alors oui JAVA a plein de problèmes, mais des fois il faut faire avec :siffle:

Share this post


Link to post
Share on other sites

Moué du coup, c'est plus à éviter qu'autre chose ...

Mais pour une appli web je suis pas hyper fan de PHP ... c'est trop simple de faire des conneries avec :s (trop habitué aux langages fortement typés)

Peut-être RoR ?

Share this post


Link to post
Share on other sites

Ruby est encore moins typé que PHP, mais a l'inverse est un vrai langage objet (et pas speudo-orienté objet comme PHP), et en combinaison avec rails te permet de faire des webapp équivalent a une webapp php en moins de ligne de code et de façon plus maintenable.

Share this post


Link to post
Share on other sites

Ca le concept objet, c'est assez important ! Ca avec le cloisonnement précis de l'espace de nommage, et pas un fourre-tout comme le fait PHP, où t'as parfois le malheur d'écraser une variable que t'as pas nommé correctement ...

Share this post


Link to post
Share on other sites

Bon histoire de relancer le topic, commençons par un bon petit troll :

J'ai lu par inadvertance ce post d'un topic récent et je ne peux m'empêcher de me demander : pourquoi un return dans un if, c'est moche ? Ça a pourtant le mérite d'éviter du traitement inutile si le résultat escompté était achevé plus tôt que prévu au sein de la fonction.

Share this post


Link to post
Share on other sites

Autant pour moi: :transpi:

C'est dans le else, parce que je mets des return dans des if (même beaucoup :dd: )

C'est parce que je suis assez strict: Après on peut me le reprocher :windu:

Pour moi une fonction/ méthode doit avoir cette approche là:

XXXX toto (....) {// Postconditionif ( someCondition1 ) return YYY;// Even more postconditionsif ( someCondition2 ) return ZZZ;....if ( someConditionN ) return UUU;// All logic here.....// Final returnreturn VVV;}

Cela facilite la lecture, la maintenance (<- pincettes).

Avis personnel: il faut éviter d'avoir des return sauvages.

Ici, la fonction fait 3 lignes. Mais lorsque ta fonction/ méthode fait 25-30 lignes, il ne faut pas louper un return (surtout lors de la lecture du corps de la méthode/ fonction)

Sinon surprise :fou::fou:

Niveau compilateur: peut être un rien en plus, mais je ne pense pas :ane:

Pour revenir à la fonction "fautive", c'est parce qu'elle ne fait pas grand chose. Donc elle reste lisible (et le débat peut être long :devil: )

Déjà on peut la modifier avec mon approche. Mais cela ne change rien.

Le plus gros changement, serait de mettre un return avec un test ternaire ((condition)? (true): (false));

En C, je ferai un #define parce qu'il n'y a pas d'allocations :ouioui:

De façon extrême ( :siffle: ), compter son occurrence dans le code et en fonction du nombre soit

  1. la supprimer :devil:
  2. la hardcoder
  3. trouver son équivalent. Parce que si je comprends bien le développeur a fait un "module" avec des fonctions plus ou moins officieuses qui lui manquait
Edited by foetus

Share this post


Link to post
Share on other sites

Certaines fonctions apparemment n'existaient pas lors de l'écriture du code, et le développeur a arrêté il y a un bon moment. Trouver l'équivalent nécessite aussi quelques modifications dans les paramètres, j'ai eu l'occasion de me rappeler les "pattern" pour des preg_match().

Perso j'évite le return en plein milieu pour privilégier une variable locale retournée à la fin quand je crée une fonction. Mais faut dire que pour l'instant le code que j'ai pu écrire n'était pas d'une très grande complexité non plus.

Share this post


Link to post
Share on other sites

Est-ce que quelqu'un a une idée de pourquoi gcc pourrait me balancer un warning tel que implicit declaration of strdup, pwrite, pread, mais parviens quand même à compiler et que le binaire fonctionne normalement?

(sur un linux, gcc en v 4.4.7)

Sinon c'est pas grave ça fonctionne mais c'est bizarre ^^

Share this post


Link to post
Share on other sites

The pread() and pwrite() system calls were added to Linux in version 2.1.60; the entries in the i386 system call table were added in 2.1.69. C library support (including emulation using lseek(2) on older kernels without the system calls) was added in glibc 2.1.

strdup() est conforme à SVr4, BSD 4.3 et POSIX.1-2001. strndup(), strdupa() et strndupa() sont des extensions GNU.

:siffle:

Donc ouais, le compilateur/ linker ne les voit pas parce qu'elles sont dans le kernel, la libriaire système [whatever] et non pas dans une librairie .h .def .o .lib .dll [whatever]

:siffle:

Edited by foetus

Share this post


Link to post
Share on other sites

implicit declaration c'est que t'a oublie d'include un header.

dans le doute testons :

reboot fedora 20.....uncrypt harddrive.....open session....done

check version gcc

[kernelcoffee@homeDesktopLinux.kernelcoffee.org test_1]$ cc --version
cc (GCC) 4.8.2 20131212 (Red Hat 4.8.2-7)

bon c'est pas tout a fait la meme version, mais ca n'a pas vraiment d'importance dans ce cas.

ecrivons un bout de code C rapidement.

int main(void) {
  char* str = strdup("test_write 1");
  printf("test -> %s\n", str);
  return(0);
}

on compile sans les header

[kernelcoffee@homeDesktopLinux.kernelcoffee.org test_1]$ cc test.c                                                                                                                                                                                                                          
test.c: In function ‘main’:
test.c:2:15: warning: incompatible implicit declaration of built-in function ‘strdup’ [enabled by default]
   char* str = strdup("test_write 1");
               ^
test.c:3:3: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default]
   printf("test -> %s\n", str);
   ^

Bon sans les headers j'ai les warnings, jusque la tout va bien, c'est normal.

man 3 printf me dit que la fonction est declare dans stdio.h
man 3 strdup me dit que la fonction est declare dans string.h

je rajoute les includes

#include <string.h>
#include <stdio.h>

int main(void) {
  char* str = strdup("test_write 1");
  printf("test -> %s\n", str);
  return(0);
}

ca compile desormais sans les warnings.

donc ce sont des fonctions qui sont inclus dans le kernel, cependant elles sont declare dans leur header respectif, gcc est assez intelligents pour le savoir mais gueule parce que les includes ne sont pas la.

Share this post


Link to post
Share on other sites

My bad j'aurais du préciser que sur mon mac ça compile sans warning, et pour cause, j'ai bien include string.h, stdio, stdlib et unistd :-) (string que pour le fichier avec strdup mais je doute que pread et pwrite soient dedans ^^)

Share this post


Link to post
Share on other sites

donc sur ton mac (un BSD) ca compile sans soucis

sur ton linux ca compile avec les warning

c'est le meme code pour les deux et les hearders sont bien la ou il faut sur les deux plateforme ?

tu as des options specifique quand tu compile ? je crois me souvenir qu'il y avais des soucis d'implementation de la norme C99 a une epoque.

le "implicit declaration" c'est le coup ou gcc qui ne voit de declaration de fonction mais sais qu'elles existent (via l'AST), et du coup fait un include implicite (d'ou le nom du warning).

Edited by Kernelcoffee

Share this post


Link to post
Share on other sites

Le linux est pas à moi en vrai. C'est uns erveur qu'on nous fournit pour notre cours, et notre code doit compiler dessus.

J'ai les flags suivant: -Wall -Wextra -g -O3 -I $(HDIR) -std=c99

Le c99 est là car sinon je me tappes des warnings sur les trucs du genre for(int k = 0, ...

Share this post


Link to post
Share on other sites

si tu veux activer tout les check de gcc, je crois que c'est -Weverything (a la place de -Wall) my bad c'est avec clang

C'est bien du C ton code ?

Qu'est ce qui se passe si tu rajoute

#define _POSIX_C_SOURCE 1

?

Edited by Kernelcoffee

Share this post


Link to post
Share on other sites

Oui c'est bien du C ^^

Alors si je rajoute ton define, ça fout la merde sur mon mac, et ça change rien sur linux :transpi:

Share this post


Link to post
Share on other sites

Ça a rien changé non plus. Par contre j'ai changé le c99 en gnu99 et tous les warnings sont partis donc...

Merki les gens :-)

Share this post


Link to post
Share on other sites

Autre question pour un autre programme!

En c++11 cette fois! Je m'amuse avec les expressions régulières, et je suis persuadé que la réponse à ma question est sur google mais je n'arrive pas à bien la formuler il faut croire...

Truc tout con, j'analyse une string de la forme \d+/\d+/\d+ (autrement dit, trois nombres séparés par '/').

Donc je fais un:

std::string input; // paramètre de la méthode en vraistd::smatch m;std::regex_match(input, m, std::regex("^(?:(\\d+)/){2}(\\d+)$")

Le but de la chose est donc de vérifier que la string a bien la bonne tête, et en plus de récupérer les nombres en question dans m. Alors oui vu ce que j'ai je peux le faire à la main en remplaçant la regex par (\\d+)/(\\d+)/(\\d+), mais le jour où je voudrai faire la même avec 40.000 au lieu de 2 ce sera :transpi:

Pour l'instant, m contient (input = std::string("11/22/33")) :

11/22/33

22

33

Il me manque donc le 11.

En fait, c'est surtout que pour le (?:.(.)){4} il me renvoie que le dernier.

Comment est-ce que je peux corriger ça?

Merci :chinois:

[EDIT] En plus je peux tricher pour que ça marche pour le coup, vu que derrière je fais des atoi() pour avoir la valeur en entier, la première chaîne de charactère (input) me renvoie 11. Mais une fois de plus, le comportement n'est pas celui attendu. Et si j'avait 7 nombres ça ne marcherait pas comme ça...

Share this post


Link to post
Share on other sites

strtok

/* strtok example */#include <stdio.h>#include <string.h>int main() {  char str[] = "11/22/33";  printf("Splitting string \"%s\" into tokens:\n", str);  char* pch = strtok(str, "/");  while(pch != NULL) {    printf("%s\n", pch);    pch = strtok(NULL, "/");  }  return 0;}
Edited by foetus

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

×
×
  • Create New...