Aller au contenu

Le Bar de la programmation


Messages recommandés

  • Réponses 745
  • Créé
  • Dernière réponse

Meilleurs contributeurs dans ce sujet

Meilleurs contributeurs dans ce sujet

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"
Lien vers le commentaire
Partager sur d’autres sites

  • 3 mois après...

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:

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

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.

Lien vers le commentaire
Partager sur d’autres sites

  • 4 mois après...

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.

Lien vers le commentaire
Partager sur d’autres 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
Modifié par foetus
Lien vers le commentaire
Partager sur d’autres 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.

Lien vers le commentaire
Partager sur d’autres sites

  • 5 mois après...

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:

Modifié par foetus
Lien vers le commentaire
Partager sur d’autres 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.

Lien vers le commentaire
Partager sur d’autres 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).

Modifié par Kernelcoffee
Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

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

Lien vers le commentaire
Partager sur d’autres 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;}
Modifié par foetus
Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.


×
×
  • Créer...