[win32][c][dev-c++] auto list en html

Soyez le premier à donner votre avis sur cette source.

Vue 4 784 fois - Téléchargée 672 fois

Description

Bonjours a tous et toutes ^^

une petite source qui permet la génération automatique d'une liste de fichier sous forme de tableau en fichier html:

- liste des fichiers, puis répertoire avec leur taille + la durée (suivant les formats de fichiers)
- les formats de fichiers pour lesquelles la durée est affiché sont : AVI, DIVX, MP4, ASF, WMV, MOV, NSV

La source est un peu codé barbare je la mettrais à jour avec le temps :)

le binaire est présent;
renommer le fichier "AutoListHtml.exe_" par "AutoListHtml.exe"

j'attend vos remarques :p

Source / Exemple :


//------------------------------------------------------------------------------
// Projet AutoListHtml  : génération de liste automatique
// Auteur               : Hanteville Nicolas
// Fichier              : main.c
// Version              : 0.1
// Date de modification : 25/07/2008
// Site                 : http:\\omni.a.free.fr
//------------------------------------------------------------------------------
// gestion des includes
//------------------------------------------------------------------------------
#include "ressources.h"
//------------------------------------------------------------------------------
//emplacement de l'application en cours
void GetMyDirectory(char *path, unsigned int TAILLE)
{
  char *c = path+GetModuleFileName(0, path,TAILLE);
  while(*c != '\\') c--;
  c++;

  • c = 0;
} //------------------------------------------------------------------------------ //convertion de nombre hexa sur 8 caractères en decimal unsigned long HexaToDec(char *hexa,unsigned int taille) { unsigned long k=0;//resultat unsigned long j=1,i; // j =coef multiplicateur et i variable de boucle //traitement de la valeur hexa for (i=(taille-1);i>0;i--)//calcul de la valeur hexa en decimal { switch(hexa[i]) { case '1':k=k+j;break; case '2':k=k+(2*j);break; case '3':k=k+(3*j);break; case '4':k=k+(4*j);break; case '5':k=k+(5*j);break; case '6':k=k+(6*j);break; case '7':k=k+(7*j);break; case '8':k=k+(8*j);break; case '9':k=k+(9*j);break; case 'a':k=k+(10*j);break; case 'A':k=k+(10*j);break; case 'b':k=k+(11*j);break; case 'B':k=k+(11*j);break; case 'c':k=k+(12*j);break; case 'C':k=k+(12*j);break; case 'd':k=k+(13*j);break; case 'D':k=k+(13*j);break; case 'e':k=k+(14*j);break; case 'E':k=k+(14*j);break; case 'f':k=k+(15*j);break; case 'F':k=k+(15*j);break; }; j=j*16; }; return k; }; //------------------------------------------------------------------------------ //lecture de la durée du fichier suivant le type void LireDuree(char*fic,char*duree) { //http://www.codeproject.com/KB/audio-video/mpegaudioinfo.aspx unsigned short taille = strlen(fic); unsigned long int time=0, frame=0; unsigned long int final_time; DWORD lue; duree[0]=0; //OK: AVI, DIVX, MP4, ASF, WMV, MOV, NSV //identiques : AVI/MP4/DIVX // a faire : MP3/MPG/MPEG/MKV/OGG/RM/RMVB/FLV //MPG, FLV //MKV header Format //NSV if(fic[taille-3]=='.' && (fic[taille-2]=='n' || fic[taille-2]=='N') && (fic[taille-1]=='s' || fic[taille-1]=='S')) { //on recherche en 1er le logo NSVf ou NSVs pour spéficier si streaming ou encodé HANDLE Hfic = CreateFile(fic,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0); if (Hfic != INVALID_HANDLE_VALUE) { //on lit les 512er octets char my_buffer[513]; SetFilePointer(Hfic,0,0,FILE_BEGIN);//on passe les 4er octets ReadFile(Hfic,my_buffer,512,&lue,0); //on test si un cmov (vidéo compressé) int i; BOOL ok = 1,stream=0; for (i=0;i<512 && ok;i++) { if (my_buffer[i] == 'N' && my_buffer[i+1] == 'S' && my_buffer[i+2] == 'V') { ok=0; if (my_buffer[i+3] == 's')stream=1; i--; } } if(ok) { //une video direct if(!stream) { char tmp[9]; sprintf(tmp,"%02X%02X%02X%02X",my_buffer[i+12]&255,my_buffer[i+13]&255,my_buffer[i+14]&255,my_buffer[i+15]&255); time = HexaToDec(tmp,8); if(time) { time = time/1000; if (time>1)sprintf(duree,"%02d:%02d:%02d",time/3600,(time%3600)/60,(time%3600)%60); } }//sinon streaming enregistré non traité } } CloseHandle(Hfic); }else if(fic[taille-4]=='.') { if(fic[taille-3]=='a' || fic[taille-3]=='A') { //AVI if(fic[taille-1]=='i' || fic[taille-1]=='I') { HANDLE Hfic = CreateFile(fic,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0); if (Hfic != INVALID_HANDLE_VALUE) { //on passe les 32 1er octets SetFilePointer(Hfic,32,0,FILE_BEGIN); //temps entre les images ReadFile(Hfic,&time,4,&lue,0); //on passe les 12 octets suivants SetFilePointer(Hfic,12,0,FILE_CURRENT); //nombres d'images ReadFile(Hfic,&frame,4,&lue,0); if(time && frame) { //temps total en secondes (avant = microsecondes) final_time = (time*frame)/1000000; if (final_time>0)sprintf(duree,"%02d:%02d:%02d",final_time/3600,(final_time%3600)/60,(final_time%3600)%60); } } CloseHandle(Hfic); //ASF }else if(fic[taille-1]=='f' || fic[taille-1]=='F') { HANDLE Hfic = CreateFile(fic,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0); if (Hfic != INVALID_HANDLE_VALUE) { //on passe les 24 1er octes SetFilePointer(Hfic,24,0,FILE_BEGIN); //on lit le nombre d'objets (entêtes) (4 octets) //ReadFile(Hfic,&frame,4,&lue,0); //on passe le nombre d'entête suivantes (256bits/) //on passe les 64 1er octets SetFilePointer(Hfic,/*(frame*32)+*/64+2+4,0,FILE_CURRENT); unsigned __int64 mytime; //durée ReadFile(Hfic,&mytime,8,&lue,0); if(mytime) { final_time = mytime/10000000; sprintf(duree,"%02d:%02d:%02d",final_time/3600,(final_time%3600)/60,(final_time%3600)%60); } } CloseHandle(Hfic); } }else if(fic[taille-3]=='m' || fic[taille-3]=='M') { //MP4 if(fic[taille-1]=='4') { HANDLE Hfic = CreateFile(fic,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0); if (Hfic != INVALID_HANDLE_VALUE) { //on passe les 32 1er octets SetFilePointer(Hfic,32,0,FILE_BEGIN); //temps entre les images ReadFile(Hfic,&time,4,&lue,0); //on passe les 12 octets suivants SetFilePointer(Hfic,12,0,FILE_CURRENT); //nombres d'images ReadFile(Hfic,&frame,4,&lue,0); if(time && frame) { //temps total en secondes (avant = microsecondes) final_time = (time*frame)/1000000; if (final_time>0)sprintf(duree,"%02d:%02d:%02d",final_time/3600,(final_time%3600)/60,(final_time%3600)%60); } } CloseHandle(Hfic); //MOV }else if(fic[taille-2]=='o' || fic[taille-2]=='O') { HANDLE Hfic = CreateFile(fic,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0); if (Hfic != INVALID_HANDLE_VALUE) { //on lit les 256er octets char my_buffer[257]; SetFilePointer(Hfic,0,0,FILE_BEGIN);//on passe les 4er octets ReadFile(Hfic,my_buffer,256,&lue,0); //on test si un cmov (vidéo compressé) int i; BOOL ok = 1; for (i=0;i<252 && ok;i++) { if (my_buffer[i] == 'c' && my_buffer[i+1] == 'm' && my_buffer[i+2] == 'o' && my_buffer[i+3] == 'v') { ok=0; } } if(ok) //une video non compressé { //on cherche mvhd = header video //on récupère sa position for (i=0;i<252 && ok;i++) { if (my_buffer[i] == 'm' && my_buffer[i+1] == 'v' && my_buffer[i+2] == 'h' && my_buffer[i+3] == 'd') { ok=0; i--; } } char tmp[9]; sprintf(tmp,"%02X%02X%02X%02X",my_buffer[i+16]&255,my_buffer[i+17]&255,my_buffer[i+18]&255,my_buffer[i+19]&255); frame = HexaToDec(tmp,8); sprintf(tmp,"%02X%02X%02X%02X",my_buffer[i+20]&255,my_buffer[i+21]&255,my_buffer[i+22]&255,my_buffer[i+23]&255); time = HexaToDec(tmp,8); if(frame && time) { time = time/frame; if (time>1)sprintf(duree,"%02d:%02d:%02d",time/3600,(time%3600)/60,(time%3600)%60); } } } CloseHandle(Hfic); } }else if(fic[taille-3]=='w' || fic[taille-3]=='W') { //WMA et WMV = ASF + media compressé if(fic[taille-2]=='m' || fic[taille-2]=='M') { HANDLE Hfic = CreateFile(fic,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0); if (Hfic != INVALID_HANDLE_VALUE) { //on passe les 102 1er octes SetFilePointer(Hfic,102,0,FILE_BEGIN); unsigned __int64 mytime; //durée ReadFile(Hfic,&mytime,8,&lue,0); final_time = mytime/10000000; if (final_time > 36000 || final_time<1) { SetFilePointer(Hfic,442,0,FILE_BEGIN); ReadFile(Hfic,&mytime,8,&lue,0); final_time = mytime/10000000; if (final_time > 36000 || final_time<1) { SetFilePointer(Hfic,444,0,FILE_BEGIN); ReadFile(Hfic,&mytime,8,&lue,0); final_time = mytime/10000000; if (final_time > 36000 || final_time<1) { SetFilePointer(Hfic,14,0,FILE_BEGIN); ReadFile(Hfic,&mytime,8,&lue,0); final_time = mytime/10000000; if (final_time < 36000 && final_time>0) sprintf(duree,"%02d:%02d:%02d",final_time/3600,(final_time%3600)/60,(final_time%3600)%60); }else sprintf(duree,"%02d:%02d:%02d",final_time/3600,(final_time%3600)/60,(final_time%3600)%60); }else sprintf(duree,"%02d:%02d:%02d",final_time/3600,(final_time%3600)/60,(final_time%3600)%60); }else sprintf(duree,"%02d:%02d:%02d",final_time/3600,(final_time%3600)/60,(final_time%3600)%60); } CloseHandle(Hfic); } } }else if (fic[taille-5]=='.') { //DIVX if ((fic[taille-4]=='d' || fic[taille-4]=='D') && (fic[taille-1]=='x' || fic[taille-1]=='X')) { HANDLE Hfic = CreateFile(fic,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0); if (Hfic != INVALID_HANDLE_VALUE) { //on passe les 32 1er octets SetFilePointer(Hfic,32,0,FILE_BEGIN); //temps entre les images ReadFile(Hfic,&time,4,&lue,0); //on passe les 12 octets suivants SetFilePointer(Hfic,12,0,FILE_CURRENT); //nombres d'images ReadFile(Hfic,&frame,4,&lue,0); if (time&&frame) { //temps total en secondes (avant = microsecondes) time = time*frame/1000000; if (final_time>0)sprintf(duree,"%02d:%02d:%02d",time/3600,(time%3600)/60,(time%3600)%60); } } CloseHandle(Hfic); } } } //------------------------------------------------------------------------------ //liste des répertoires dans le répertoire principal BOOL ListItems(const char *fic,char *concat,HANDLE Hdest) { WIN32_FIND_DATA data; char Rep [MAX_PATH]; char Concat[MAX_PATH]; __int64 taille_fic; char duree[256]; char tmp[MAX_PATH]; DWORD copiee; BOOL ret=0; // les fichiers HANDLE hfic = FindFirstFile(fic, &data); if (hfic != INVALID_HANDLE_VALUE) { do { if(data.cFileName[0] != '.') { strcpy(Rep,fic); Rep[strlen(fic)-3]=0; strncat(Rep,data.cFileName,MAX_PATH); if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//si un répertoire { }else if (!(!strcmp(data.cFileName,"Thumbs.db")))//sinon un fichier (sauf si un thumb) { ret=1; strncat(Rep,"\0",MAX_PATH); //taille du fichier taille_fic = (data.nFileSizeHigh * MAXDWORD) + data.nFileSizeLow; //durée du fichier LireDuree(Rep,duree); //affichage if (taille_fic>1048576) //supérieur a 1 mo sprintf(tmp," <tr><td><b>%s</b></td><td><b>%s</b></td><td><b>%2.2fmo</b></td><td><b>%s</b></td></tr>\r\n\0",concat,data.cFileName,taille_fic/1048576.0,duree); else if (taille_fic>1024) //supérieur a 1 ko sprintf(tmp," <tr><td><b>%s</b></td><td><b>%s</b></td><td><b>%2.2fko</b></td><td><b>%s</b></td></tr>\r\n\0",concat,data.cFileName,taille_fic/1024.0,duree); else sprintf(tmp," <tr><td><b>%s</b></td><td><b>%s</b></td><td><b>%do</b></td><td><b>%s</b></td></tr>\r\n\0",concat,data.cFileName,taille_fic,duree); WriteFile(Hdest,tmp,strlen(tmp),&copiee,0); } } }while(FindNextFile (hfic,&data)); //récupération des fichiers 1 par 1 } FindClose(hfic); //les répertoires hfic = FindFirstFile(fic, &data); if (hfic != INVALID_HANDLE_VALUE) { do { if(data.cFileName[0] != '.') { strcpy(Rep,fic); Rep[strlen(fic)-3]=0; strncat(Rep,data.cFileName,MAX_PATH); if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//si un répertoire { //traitement redondance strncat(Rep,"\\*.*\0",MAX_PATH); if (concat[0]!=0) sprintf(Concat,"%s\\%s",concat,data.cFileName); else strcpy(Concat,data.cFileName); if(ListItems(Rep,Concat,Hdest)) { strcpy(tmp," <tr bgcolor=\"#DDDDDD\"><td colspan=\"4\"></td></tr>"); WriteFile(Hdest,tmp,strlen(tmp),&copiee,0); } } } }while(FindNextFile (hfic,&data)); //récupération des fichiers 1 par 1 } FindClose(hfic); return ret; } //------------------------------------------------------------------------------ //liste des items présents dans un répertoire void ListRep(const char *fic,HANDLE Hdest) { WIN32_FIND_DATA data; HANDLE hfic = FindFirstFile(fic, &data); char Rep [MAX_PATH]; char Concat[2]=""; __int64 taille_fic; char duree[10]; char tmp[MAX_PATH]; DWORD copiee; if (hfic != INVALID_HANDLE_VALUE) { do { if(data.cFileName[0] != '.') { strcpy(Rep,fic); Rep[strlen(fic)-3]=0; strncat(Rep,data.cFileName,MAX_PATH); if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && !(!strcmp("System Volume Information",data.cFileName)) && !(!strcmp("RECYCLER",data.cFileName)))//si un répertoire { strncat(Rep,"\\*.*\0",MAX_PATH); //impression du titre et début tableau sprintf(tmp," <H2>%s</H2>\r\n" " <table border=\"0\" cellspacing=\"2\" cellpadding=\"1\">\r\n" " <tr><td BGCOLOR=#DDDDDD><b>Genre/serie</b></td><td BGCOLOR=#DDDDDD><b>Fichier</b></td><td width=\"120px\" BGCOLOR=#DDDDDD><b>Taille</b></td><td width=\"120px\" BGCOLOR=#DDDDDD><b>Durée</b></td></tr>\r\n" ,data.cFileName); WriteFile(Hdest,tmp,strlen(tmp),&copiee,0); ListItems(Rep,Concat,Hdest); //fin du tableau sprintf(tmp," </table>\r\n <BR/>\r\n"); WriteFile(Hdest,tmp,strlen(tmp),&copiee,0); } } }while(FindNextFile (hfic,&data)); //récupération des fichiers 1 par 1 } FindClose(hfic); } //------------------------------------------------------------------------------ //génération de la liste DWORD WINAPI GenList(LPVOID lParam) { char rep[MAX_PATH]; char repInit[MAX_PATH]; char tmp[MAX_PATH]; DWORD copiee; unsigned int max = SendMessage(H_LST,LB_GETCOUNT,(WPARAM)0,(LPARAM)0); if(max) { EnableWindow(H_start,0); //ouverture du fichier HANDLE Hdest= CreateFile(LIST_DEF,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_FLAG_SEQUENTIAL_SCAN,0); if (Hdest != INVALID_HANDLE_VALUE) { //début du fichier sprintf(tmp,"<html>\r\n"); WriteFile(Hdest,tmp,strlen(tmp),&copiee,0); while (max--) { SendMessage(H_LST,LB_GETTEXT,(WPARAM)0,(LPARAM)repInit); sprintf(tmp," <center><H1>%s</H1></center>\r\n",repInit); WriteFile(Hdest,tmp,strlen(tmp),&copiee,0); strncpy(rep,repInit,MAX_PATH); strncat(rep,"*.*\0",MAX_PATH); ListRep(rep,Hdest); //suppression du 1er item SendMessage(H_LST,LB_DELETESTRING,(WPARAM)0,(LPARAM)0); } //fin du fichier sprintf(tmp,"</html>\r\n"); WriteFile(Hdest,tmp,strlen(tmp),&copiee,0); } //fermeture du fichier CloseHandle(Hdest); //ouverture du fichier résultat GetMyDirectory(tmp,MAX_PATH); strncat(tmp,LIST_DEF,MAX_PATH); strncat(tmp,"\0",MAX_PATH); ShellExecute(NULL,"Open",tmp, NULL, NULL, SW_SHOWNORMAL); EnableWindow(H_start,0); } } //------------------------------------------------------------------------------ //gestion des appels et msg sur le fenêtre principale HRESULT DlgProc(HWND hwnd,UINT Msg,WPARAM Wparam,LPARAM lParam) { HDROP H_DropInfo; int nb,i; switch(Msg) { case WM_INITDIALOG: InitCommonControls(); //récupération des handl généraux H_LST = GetDlgItem(hwnd,LST); H_start = GetDlgItem(hwnd,BT_START); //application d'une icone SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)LoadIcon(Hinst, MAKEINTRESOURCE(ID_ICON))); break; case WM_CLOSE: EndDialog(hwnd,0); //PostQuitMessage(0); break; case WM_COMMAND : if ((LOWORD(Wparam) == BT_SUP) && (HIWORD(Wparam) == BN_CLICKED)) { unsigned int nb = SendMessage(H_LST,LB_GETSELCOUNT,(WPARAM)0,(LPARAM)0); if (nb>1) { //récupération des IDs des Items sélectionnés int Items[MAX_PATH]; if (SendMessage(H_LST,LB_GETSELITEMS,(WPARAM)MAX_PATH,(LPARAM)Items)!= LB_ERR) { for (i=nb-1;i>-1;i--) { SendMessage(H_LST,LB_DELETESTRING,(WPARAM)(const)Items[i],(LPARAM)0); } } }else { //suppression de la sélection int nb = SendMessage(H_LST,LB_GETCURSEL,(WPARAM)0,(LPARAM)0); if (nb>-1) { SendMessage(H_LST,LB_DELETESTRING,(WPARAM)nb,(LPARAM)0); if (nb-1 <0)SendMessage(H_LST,LB_SETSEL ,(WPARAM)TRUE,(LPARAM)0); else SendMessage(H_LST,LB_SETSEL ,(WPARAM)TRUE,(LPARAM)nb-1); } } }else if ((LOWORD(Wparam) == BT_START) && (HIWORD(Wparam) == BN_CLICKED)) { CreateThread(NULL, 0,GenList,0,0,0); }else if ((LOWORD(Wparam) == BT_A_PROPOS) && (HIWORD(Wparam) == BN_CLICKED)) { MessageBox(0,"AutoListHtml_V0.1 du 25/07/2008\n" "Par : Hanteville Nicolas\n" "Libre de droit et d'utilisations.\n" "Site Web : http:\\\\omni.a.free.fr" ,"A propos",MB_OK|MB_TOPMOST|MB_ICONINFORMATION); } break; case WM_DROPFILES: { char tmp[MAX_PATH]; //récupération de la liste des fichiers sélectionnés + traitemen H_DropInfo=(HDROP)Wparam;//récupération de la liste //traitement : nb de fichier en drag nb=DragQueryFile(H_DropInfo, 0xFFFFFFFF, NULL, 0 ); for (i=0;i<nb;i++) { DragQueryFile(H_DropInfo,i,tmp,DragQueryFile(H_DropInfo,i,0,0)+1 ); //récupération SendMessage(H_LST,LB_ADDSTRING,(WPARAM)0,(LPARAM)tmp); } DragFinish(H_DropInfo);//libération de la mémoire } break; } return 0; } //------------------------------------------------------------------------------ //fonction principal (main) int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hinstancePRECEDENTE, LPSTR CmdLine, int CmdShow) { Hinst = hInst; //création de la fenêtre DialogBox(0,MAKEINTRESOURCE(AutoListHtml),GetDesktopWindow(),(DLGPROC)DlgProc); return 0; }

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

JPR74
Messages postés
9
Date d'inscription
mercredi 1 août 2007
Statut
Membre
Dernière intervention
16 mars 2009
-
Bonjour,

Je suis désolé si vous avez mal compris mon commentaire.
Je n'ai pas l'impression de me moquer de qui que ce soit quand je dis qu'un programme peut aussi être agréable à parcourir et facile à modifier quand il est bien écrit, quel que soit le langage utilisé.
C'est vrai qu'il n'y a aucune règle définie pour l'écriture d'un programme, ce qui conduit, hélas, aux abus que je déplore.
L'utilisation d'un langage objet n'empêche pas d'écrire des horreurs...

Restons en là pour l'instant mais il n'est pas exclu qu'une nouvelle colère me pousse à déposer un exemple de programme facile à lire sans avoir à manipuler sans arrêt l'ascenseur pour voir le bout des lignes.
cs_omnia
Messages postés
240
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
22 mars 2009
-
Bonjour,

merci pour le commentaire.

Pour information cette source est une ébauche et quand je dis "écrit un peu barbare" c'est surtout pour la fonction de calcul/lecture de la durée des fichiers multimédia.

On remarque notement que ce code est indenté (et je ne connais aucune norme qui fixe une taille d'indentation) commenté même si pas suffisement (mais je ne vais pas non plus commenté des if)

Pour ce qui est des articles, possible a toute personne de faire par à la communauté.

Pour ce qui est des élèves je donne aussi des cours de c et d'administration et je developpe en de multiples langage depuis plus de 10 ans maintenant si c'est du code objet qu'il vous faut faite du java du python ...

Je n'ai pas de mauvaise pensé envers ce commentaire mais je pense qu'il faut arrêter de ce f. du monde!
JPR74
Messages postés
9
Date d'inscription
mercredi 1 août 2007
Statut
Membre
Dernière intervention
16 mars 2009
-
Programme sans doute intéressant (surtout en Dev-CPP) mais, comme presque tous ceux qui sont présentés, assez difficile à lire car écrit sans la moindre rigueur (cadrages, tabulations fantaisistes, lignes trop longues, etc) !
Mais au moins, l'auteur a le courage de l'annoncer ("écrit un peu barbare"...) !
C'est pourtant si simple d'écrire proprement dés le début et les modifications sont ensuite beaucoup plus faciles.
C'est dommage car il y a souvent de bonnes idées dans les programmes proposés...
Si, comme je le redoute, cela continue, je finirai par proposer un article sur la façon d'écrire le C (et C++) pour obtenir des programmes faciles à lire et à modifier.
Quant à l'orthographe ... je préfère ne rien en dire !
Programmant depuis plus de 40 ans (assembleur, Cobol, Fortran, Basic, C et C++), je sais de quoi je parle et je vourais bien en faire profiter les autres !
L'expérience la plus redoutable (pour mes élèves) est de leur faire modifier un programme écrit par un autre car là, ils comprennent vite la nécessité de bien écrire (même pour soi même).
A suivre...

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.