begin process at 2013 05 25 22:02:05
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichiers / Disque

 > MODIFIER LES SOUS TITRES. [LINUX]

MODIFIER LES SOUS TITRES. [LINUX]


 Information sur la source

Note :
Aucune note
Catégorie :Fichiers / Disque Classé sous :srt, sous, titres, super, cool Niveau :Débutant Date de création :08/06/2007 Date de mise à jour :09/06/2007 10:40:03 Vu / téléchargé :9 581 / 103

Auteur : manta7

Ecrire un message privé
Commentaire sur cette source (22)
Ajouter un commentaire et/ou une note

 Description

Le but est tout simple, il s'agit de décaler les fichiers de sous titres (.srt) en les décalant de tant de secondes ou de millisecondes.
J'ai codé ça parce que ça m'arrive souvent d'avoir un fichier décalé d'une demie seconde et c'est assez rageant :)
C'est sur que c'est parfois assez long et que le code pourrait etre optimisé mais bon ça suffit..

Un fichier srt est de cette forme :

Numéro des sous titres
xx:xx:xx,xxx --> xx:xx:xx,xxx
Sous titres

Ce programme cherche les expressions de temps (00:02:31,699) et les modifie

Source

  • #include <stdio.h>
  • #include <string.h>
  • #include <stdlib.h>
  • #include <ctype.h>
  • #define M 1000
  • int verifcmd(int argc, char *argv[]) //Vérification de la ligne de commande
  • {
  • FILE* F;
  • int i, s;
  • if( (F=fopen(argv[1],"r")) != NULL) //Test du fichier
  • {
  • s=strlen(argv[2]);
  • for(i=0;i<s;i++) //Test du nombre de seconde. argv[2] doit composé de chiffres avec peut etre le signe '-' en premier caractere
  • {
  • if( !isdigit(argv[2][i]) )
  • {
  • if(i==0 && argv[2][i]=='-')
  • ;
  • else
  • {
  • printf("Le nombre de secondes est errone.\n");
  • return 0;
  • }
  • }
  • }
  • if(argc==4) //On teste le nombre de millisecondes s'il ce parametre existe
  • {
  • s=strlen(argv[3]);
  • for(i=0;i<s;i++)
  • {
  • if( !isdigit(argv[3][i]) )
  • {
  • if(i==0 && argv[3][i]=='-')
  • ;
  • else
  • {
  • printf("Le nombre de millisecondes est errone.\n");
  • return 0;
  • }
  • }
  • }
  • }
  • }
  • else
  • {
  • printf("Le fichier est introuvable.\n");
  • return 0;
  • }
  • return 1;
  • }
  • char decalage(FILE* F, int n) //Effectue un placement précis dans une variable FILE *, n étant le nombre de caractere
  • {
  • FILE *FN=F;
  • char c;
  • int i=0;
  • if(n==0)
  • return 0;
  • for(i=0;i<n;i++)
  • fscanf(FN,"%c", &c);
  • return c;
  • }
  • int ligne(FILE *F1, int n) //Test si la l'expression qui suit est de la forme xx:xx:xx,xxx pour pouvoir la modifier
  • {
  • if(decalage(F1,3)==':' && decalage(F1,3)==':' && decalage(F1,3) == ',')
  • {
  • rewind(F1);
  • decalage(F1,n);
  • return 1;
  • }
  • rewind(F1);
  • decalage(F1,n);
  • return 0;
  • };
  • int dix(int x)
  • {
  • int i=0, n=1;
  • for(i=0;i<x;i++)
  • n*=10;
  • return n;
  • }
  • int ctoi(char* t, int n) //Transforme un char* en entier
  • {
  • int i, x=0;
  • for(i=0;i<n;i++)
  • x=x+dix(i)*(t[i]-48);
  • return x;
  • }
  • void itoc(int x, char* t) //Transforme un in en char*
  • {
  • int temp;
  • temp=x/100;
  • t[0]=temp+48;
  • x=x-temp*100;
  • temp=x/10;
  • t[1]=temp+48;
  • x=x-temp*10;
  • t[2]=x+48;
  • return;
  • }
  • void temps(char* expression, int sec, int mil) //Fonction qui ajoute ou supprime du temps
  • {
  • int m, p1, p2, p3; //Dans un fichier sous titres, un temps est de la forme p3:p2:p1,m
  • char t[3];
  • int temp,temp2;
  • t[0]=expression[11];
  • t[1]=expression[10];
  • t[2]=expression[9];
  • m=ctoi(t,3);
  • t[0]=expression[7];
  • t[1]=expression[6];
  • p1=ctoi(t,2);
  • t[0]=expression[4];
  • t[1]=expression[3];
  • p2=ctoi(t,2);
  • t[0]=expression[1];
  • t[1]=expression[0];
  • p3=ctoi(t,2);
  • //Algorithme
  • temp=m+p1*M+p2*M*60+p3*M*3600+mil+sec*M; //temp étant le temps total exprimé en millisecondes
  • if(temp<=0)
  • temp=0;
  • p3=temp/(M*3600); //Ensuite on convertit ce temps dans les variables p3, p2, p1 et m
  • temp2=p3*M*3600;
  • temp-=temp2;
  • p2=temp/(M*60);
  • temp2=p2*M*60;
  • temp-=temp2;
  • p1=temp/M;
  • temp2=p1*M;
  • temp-=temp2;
  • m=temp;
  • //Fin de l'Algorithme
  • itoc(m,t); expression[9]=t[0]; expression[10]=t[1]; expression[11]=t[2];
  • itoc(p1,t); expression[6]=t[1]; expression[7]=t[2];
  • itoc(p2,t); expression[3]=t[1]; expression[4]=t[2];
  • itoc(p3,t); expression[0]=t[1]; expression[1]=t[2];
  • return;
  • }
  • void srt(int argc, char *argv[]) //Fonction principale qui va lire un fichier caractere par caractere
  • {
  • FILE *F1, *F2;
  • int sec, mil;
  • int i, n=1; //n étant le compteur de F1
  • int cst=1, st;
  • char c;
  • char expression[12];
  • sec=atoi(argv[2]);
  • if(argc==4)
  • mil=atoi(argv[3]);
  • else
  • mil=0;
  • if(sec==0 && mil==0)
  • return;
  • if( (F1=fopen(argv[1],"r")) == NULL)
  • {
  • printf("Le fichier est introuvable.\n");
  • return;
  • }
  • if( (F2=fopen("temporaire","w")) == NULL)
  • {
  • printf("Erreur lors de la creation du fichier temporaire.\n");
  • return;
  • }
  • while(fscanf(F1,"%c", &c)!=EOF) //Traitement caractere par caractere
  • {
  • if(c=='\n'&&ligne(F1, n))
  • {
  • fprintf(F2,"\n"); n++;
  • //Premiere partie
  • for(i=0;i<12;i++)
  • {
  • fscanf(F1,"%c", &c);
  • expression[i]=c;
  • }n+=12;
  • temps(expression,sec, mil);
  • for(i=0;i<12;i++)
  • fprintf(F2,"%c",expression[i]);
  • //Seconde partie
  • for(i=0;i<5;i++)
  • {
  • fscanf(F1,"%c", &c);
  • fprintf(F2,"%c",c);
  • } n+=5;
  • for(i=0;i<12;i++)
  • {
  • fscanf(F1,"%c", &c);
  • expression[i]=c;
  • }n+=12;
  • temps(expression,sec, mil);
  • for(i=0;i<12;i++)
  • fprintf(F2,"%c",expression[i]);
  • }
  • else
  • {
  • n++;
  • fprintf(F2,"%c",c);
  • }
  • }
  • return;
  • }
  • void help() //Fonction d'aide
  • {
  • printf("srt fichier secondes (millisecondes)\n\n");
  • printf("exemples : \n");
  • printf("$ srt sous-titres.srt 5 : Avance les sous titres de 5 secondes.\n");
  • printf("$ srt sous-titres.srt -1 -500 : Recule les sous titres d'une seconde et demi.\n");
  • return;
  • }
  • int main(int argc, char *argv[])
  • {
  • char* nom; //Nom du fichier en ajoutant "old_" devant
  • int i;
  • if(argc>1)
  • {
  • nom=malloc( strlen(argv[1]) +4*sizeof(char) );
  • for(i=0;i<strlen(argv[1]);i++)
  • nom[i+4]=argv[1][i];
  • nom[0]='o';
  • nom[1]='l';
  • nom[2]='d';
  • nom[3]='_';
  • }
  • if(argc==1)
  • printf("Veuillez specifier une option. srt -help pour plus d'informations.\n");
  • else if(argc==2)
  • {
  • if(strcmp(argv[1],"-help") == 0)
  • {
  • help();
  • }
  • }
  • else if(argc==3 || argc==4)
  • {
  • if(verifcmd(argc, argv)) //On vérifie la ligne de commande
  • {
  • srt(argc, argv); //Fonction de traitement
  • }
  • }
  • rename(argv[1],nom);
  • rename("temporaire", argv[1]);
  • return 0;
  • }
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

#define M 1000

int verifcmd(int argc, char *argv[]) //Vérification de la ligne de commande
{
	FILE* F;
	int i, s;
	
		if( (F=fopen(argv[1],"r")) != NULL) //Test du fichier
		{
			s=strlen(argv[2]);
			for(i=0;i<s;i++) //Test du nombre de seconde. argv[2] doit composé de chiffres avec peut etre le signe '-' en premier caractere
			{
				if( !isdigit(argv[2][i]) ) 
				{
					if(i==0 && argv[2][i]=='-')
						;
					else
					{
						printf("Le nombre de secondes est errone.\n");
						return 0;
					}
				}
			}
			if(argc==4) //On teste le nombre de millisecondes s'il ce parametre existe
			{
				s=strlen(argv[3]);
				for(i=0;i<s;i++)
				{
					if( !isdigit(argv[3][i]) )
					{
						if(i==0 && argv[3][i]=='-')
						;
						else
						{
							printf("Le nombre de millisecondes est errone.\n");
							return 0;
						}
					}
				}
			}
		}
		else
		{
			printf("Le fichier est introuvable.\n");
			return 0;
		}
	return 1;
}

char decalage(FILE* F, int n) //Effectue un placement précis dans une variable FILE *, n étant le nombre de caractere
{
	FILE *FN=F;
	char c;
	int i=0;
	
	if(n==0)
		return 0;
	
	for(i=0;i<n;i++)
		fscanf(FN,"%c", &c);
	return c;
}

int ligne(FILE *F1, int n) //Test si la l'expression qui suit est de la forme xx:xx:xx,xxx pour pouvoir la modifier
{
	if(decalage(F1,3)==':' && decalage(F1,3)==':' && decalage(F1,3) == ',')
	{
		rewind(F1);
		decalage(F1,n);
		return 1;
	}
	rewind(F1);
	decalage(F1,n);
	return 0;
};	

int dix(int x)
{
	int i=0, n=1;
	for(i=0;i<x;i++)
		n*=10;
	
	return n;
}
	

int ctoi(char* t, int n) //Transforme un char* en entier
{
	int i, x=0;
	
	for(i=0;i<n;i++)
		x=x+dix(i)*(t[i]-48);
		
	return x;
}

void itoc(int x, char* t) //Transforme un in en char*
{
	int temp;
	
	temp=x/100;
	t[0]=temp+48;
	x=x-temp*100;
	temp=x/10;
	t[1]=temp+48;
	x=x-temp*10;
	t[2]=x+48;
	
	return;
}

void temps(char* expression, int sec, int mil) //Fonction qui ajoute ou supprime du temps
{
	int m, p1, p2, p3; //Dans un fichier sous titres, un temps est de la forme p3:p2:p1,m
	char t[3];
	
	int temp,temp2;
	
	t[0]=expression[11];
	t[1]=expression[10];
	t[2]=expression[9];
	m=ctoi(t,3);
	
	t[0]=expression[7];
	t[1]=expression[6];
	p1=ctoi(t,2);
	
	t[0]=expression[4];
	t[1]=expression[3];
	p2=ctoi(t,2);
	
	t[0]=expression[1];
	t[1]=expression[0];
	p3=ctoi(t,2);
	
	//Algorithme 
	
	temp=m+p1*M+p2*M*60+p3*M*3600+mil+sec*M; //temp étant le temps total exprimé en millisecondes
	
	if(temp<=0)
		temp=0;
	
	p3=temp/(M*3600); //Ensuite on convertit ce temps dans les variables p3, p2, p1 et m
	temp2=p3*M*3600;
	temp-=temp2;
	
	p2=temp/(M*60);
	temp2=p2*M*60;
	temp-=temp2;
	
	p1=temp/M;
	temp2=p1*M;
	temp-=temp2;
	
	m=temp;
	
	//Fin de l'Algorithme
		
	itoc(m,t); expression[9]=t[0]; expression[10]=t[1]; expression[11]=t[2];
	itoc(p1,t); expression[6]=t[1]; expression[7]=t[2];
	itoc(p2,t); expression[3]=t[1]; expression[4]=t[2];
	itoc(p3,t); expression[0]=t[1]; expression[1]=t[2];
		
	return;
}

void srt(int argc, char *argv[]) //Fonction principale qui va lire un fichier caractere par caractere
{
	FILE *F1, *F2;
	int sec, mil;
	int i, n=1; //n étant le compteur de F1
	int cst=1, st;
	
	char c;
	char expression[12];
		
	sec=atoi(argv[2]);
	if(argc==4)
		mil=atoi(argv[3]);
	else
		mil=0;
	
	if(sec==0 && mil==0)
		return;
	
	if( (F1=fopen(argv[1],"r")) == NULL)
	{
		printf("Le fichier est introuvable.\n");
		return;
	}
	if( (F2=fopen("temporaire","w")) == NULL)
	{
		printf("Erreur lors de la creation du fichier temporaire.\n");
		return;
	}
	
	while(fscanf(F1,"%c", &c)!=EOF) //Traitement caractere par caractere
	{
		
		if(c=='\n'&&ligne(F1, n)) 
		{
			fprintf(F2,"\n"); n++;
			//Premiere partie
			
			for(i=0;i<12;i++)
			{
				fscanf(F1,"%c", &c);
				expression[i]=c;
			}n+=12;
			
			temps(expression,sec, mil);
			
			for(i=0;i<12;i++)
				fprintf(F2,"%c",expression[i]);
			
			//Seconde partie
			for(i=0;i<5;i++)
			{
				fscanf(F1,"%c", &c);
				fprintf(F2,"%c",c);
			} n+=5;	
			
			for(i=0;i<12;i++)
			{
				fscanf(F1,"%c", &c);
				expression[i]=c;
			}n+=12;
			
			temps(expression,sec, mil);
			
			for(i=0;i<12;i++)
				fprintf(F2,"%c",expression[i]);
			
		}
		else
		{
			n++;
			fprintf(F2,"%c",c);
		}
			
	}

	return;
}
void help() //Fonction d'aide
{
	printf("srt fichier secondes (millisecondes)\n\n");
	printf("exemples : \n");
	printf("$ srt sous-titres.srt 5 : Avance les sous titres de 5 secondes.\n");
	printf("$ srt sous-titres.srt -1 -500 : Recule les sous titres d'une seconde et demi.\n");
	
	return;
}

int main(int argc, char *argv[])
{
	char* nom; //Nom du fichier en ajoutant "old_" devant
	int i;
	
	if(argc>1)
	{
		nom=malloc(  strlen(argv[1]) +4*sizeof(char) );
	
		for(i=0;i<strlen(argv[1]);i++)
			nom[i+4]=argv[1][i];
		nom[0]='o';
		nom[1]='l';
		nom[2]='d';
		nom[3]='_';
	}
	
	if(argc==1)
		printf("Veuillez specifier une option. srt -help pour plus d'informations.\n");
	else if(argc==2)
	{
		if(strcmp(argv[1],"-help") == 0)
		{
			help();
		}
	}			
	else if(argc==3 || argc==4)
	{
		if(verifcmd(argc, argv)) //On vérifie la ligne de commande
		{
			srt(argc, argv); //Fonction de traitement
		}
	}

	rename(argv[1],nom);
	rename("temporaire", argv[1]);
	
	return 0;
}

 Conclusion

Ecrivez moi si vous avez des remarques, des suggestions a faire pour améliorer le programme ou pour ajouter de nouvelles fonctions.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  • srtTélécharger ce fichier [Réservé aux membres club]10 888 octets
  • srt.cTélécharger ce fichier [Réservé aux membres club]Voir ce fichier4 380 octets

Télécharger le zip


 Historique

09 juin 2007 10:38:05 :
J'ai fait une petite mise a jour avec un peu de commentaires et 2 ou 3 trucs simplifiés.
09 juin 2007 10:39:18 :
J'ai fait une petite mise a jour avec un peu de commentaires et 2 ou 3 trucs simplifiés.
09 juin 2007 10:40:03 :
J'ai fait une petite mise a jour avec un peu de commentaires et 2 ou 3 trucs simplifiés.

 Sources du même auteur

Source avec Zip ANALYSE DES MOTS D'UN TEXTE
Source avec Zip INTELLIGENCE ARTIFICIELLE AUX ÉCHECS.
RECHERCHE DE CHEMIN (RECURSIVITÉ ET BACKTRACKING)
** PALINDROME.CPP : RÉECRIT UN CHIFFRE OU UN TEXTE À L'ENVER...
-PROGRAMME SERVANT A CALCULER PI, TESTE SOUS VC++ ET DEVC++

 Sources de la même categorie

COMPTER LE NOMBRE DE PAGES D'UN FICHIER PDF par Renfield
Source avec Zip Source avec une capture GENERE BMP par lajouad
Source avec Zip Source avec une capture GETIONNAIRE D'UNE BIBLIOTHÉQUE EN C par benzarabel
FONCTION D'ÉDITION DE FICHIER BIT À BIT [C-MULTIPLATEFORME] par lynxtyle
Source avec Zip Source avec une capture UN GESTIONNAIRE DU FICHIER par benzarabel

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture [DEVC++] SPLITTER DE FICHIER .SRT (SOUS-TITRES) par alkove

Commentaires et avis

Commentaire de Mic32768 le 09/06/2007 09:45:22

Salut, bravo pour l'idée qui est très bonne, et ton programme qui peut être très utile!

Cependant, j'ai quelques remarques chiantes à faire.

Premièrement, on n'est pas censé mettre des return partout comme ça, c'est de la mauvaise programmation. Il faut que le programme se déroule de manière fluide et élégante si possible, mais là ça coupe partout. Mettre autant de return ne vaut pas mieux qu'utiliser les goto! Essaie plutôt d'utiliser des boucles while avec des variables bool pour gérer si le programme doit quitter, mais surtout pas plein de return!

Pourquoi mettre "return;" à une procédure void? On sait de toute façon qu'elle ne retourne pas de valeur!

Cette fonction est franchement horrible:

int dix(int x)
{
  if(x==0)
    return 1;
  if(x==1)
   return 10;
  if(x==2)
   return 100;

  return 0;
}

Tu aurais pu remplacer par:

int dix(int x)
{
  int retour = 0;
  if(x == 1)
    retour = 10;
  else if(x == 2)
    retour = 100;
  return retour;
}

qui est déjà un peu mieux, même si je suis certain qu'il y a moyen de faire mieux. Mais là, c'est quand même la base, tu devrais essayer de t'améliorer niveau algorithmie!

De plus, il y a beaucoup trop de nombres magiques ce qui rendra ton programme très difficile à modifier.

Chose certaine, tu devrais revoir la logique de ton programme, parce qu'il y a (trop) place à l'amélioration!

Désolé de faire le chialeux, mais il fallait que je le dise, je veux juste t'aider. Mais encore une fois, je te dis bravo d'avoir pensé à ça et je me servirais surement de ce prog s'il prenait en charge les fichiers .ass!

Commentaire de manta7 le 09/06/2007 09:52:42

Ok pour les return je savais pas que ma fonction dix était moche.
Par contre je suis d'accord ça aurait pu etre plus poussé, plus performant et mieux codé mais j'ai fait ça en 2 jours pour pouvoir modifier d'une demi seconde les sous titres de scanner for a darkly :) donc je me suis pas fait chier a faire un truc optimal

Genre la fonction ajout qui fait

#  t[0]=expression[11];
# t[1]=expression[10];
# t[2]=expression[9];
# m=ctoi(t,3);
#
# t[0]=expression[7];
# t[1]=expression[6];
# p1=ctoi(t,2);
#
# t[0]=expression[4];
# t[1]=expression[3];
# p2=ctoi(t,2);
#
# t[0]=expression[1];
# t[1]=expression[0];
# p3=ctoi(t,2);

c'est sur qu'il aurait mieux valu faire une fonction que l'on appelle 4 fois plutot que ça

Sinon c'est quoi les fichier .ass ?

Commentaire de Patrice99 le 09/06/2007 09:55:36

Je ne suis pas du même avis : il vaut mieux mettre If ... Return, que de mettre des If ... Else à n'en plus finir : la raison est que la première solution est une procédure linéaire simple à lire, alors que la seconde est hiérarchique donc plus difficile à lire, surtout s'il y a d'autre If imbriqués.

Commentaire de Mic32768 le 09/06/2007 10:02:55

Patrice99: C'est sur que c'est plus simple à lire, mais on ne devrait jamais mettre plusieurs return dans une fonction à moins de ne pas avoir le choix. C'est vrai que sa fonction est plus simple à lire, mais il faut tout de même faire éviter de faire ainsi, c'est comme mettre des goto. Remarque également qu'un switch aurait aussi fait l'affaire car plus lisible, mais c'est inutile de faire un switch avec seulement 2 tests.

Les fichiers .ass sont un autre format de fichiers de sous-titres que j'utilise souvent.

Salut et bonne chance, je vais me coucher il est 4h du matin chez moi :sommeil:

Commentaire de manta7 le 09/06/2007 10:04:53

En tout cas dites moi si ça vous sert et si y'a d'autres fonctions qui pourrait vous aider c'est toujours sympa a coder..

Commentaire de manta7 le 09/06/2007 10:31:41

Et puis hors de question de mettre des bool dans mon programme :)

Commentaire de Mic32768 le 09/06/2007 18:48:08

Pourquoi pas de bool?

Commentaire de SAKingdom le 10/06/2007 00:18:13

Parce que s'il travail en C, les bool n'existes tout simplement pas.

Et pourquoi devrait-on éviter de mettre plusieurs return dans une fonction ? Faire un return direct d'une valeur ou variable est plus rapide que de transférer la valeur dans une variable temporaire puis retourner ensuite.
Deplus, il n'y a aucune raison de ne pas utiliser de goto dans un code si ce n'est d'une question d'esthétique qui d'ailleurs, dans certains cas, peut être remit en cause.

Commentaire de manta7 le 10/06/2007 01:04:33

Avec un langage structuré comme le C, meme si c'est directement un héritage de l'assembleur, c'est assez stupide pour utiliser un goto quand meme...

Commentaire de SAKingdom le 10/06/2007 01:48:51

Il n'y a absolument rien de stupide là dedans. Bien sûr, je ne parle pas d'en mettre partout mais uniquement à des endroits "stratégiques". Si on sait comment l'utiliser, on peut éviter une duplication inutile de code.

Commentaire de Mic32768 le 10/06/2007 02:53:28

C'est franchement une mauvaise habitude à prendre, surtout si l'on veut se mettre au C++ et à la POO plus tard. Il y a presque toujours une solution alternative aux goto pour peu que l'on soit capable d'être assez logique.

Commentaire de SAKingdom le 10/06/2007 03:13:56

Mais qui parle d'habitude ? Et quel est le rapport avec la POO ? Ce n'est pas parce que quelqu'un a dis que les goto n'étaient pas bon qu'il faut forcément l'exclure de tout. Ce que je dis, c'est qu'un goto bien utilisé empêche une duplication du code comme par exemple (très basique):

Sans goto
int fonction (...)
{
   ...
   if(!x) {
      free(mem);
      return;
   }
   ...
   if(!y) {
      free(mem)
      fclose(file);
      return;
   }

   ...

   free(mem);
   fclose(file);
}

free revient 3 fois, fclose 2 fois et return 3 fois.

Avec goto
int fonction (...)
{
   ...
   if(!x) goto freebuf;
   ...
   if(!y) goto closefile;
   ...
closefile:
   fclose(file);
freebuf:
   free(mem);
   return 0;
}

fclose free et return n'apparaisse qu'une seule fois et 2 goto.

Commentaire de katsankat le 10/06/2007 03:22:16

Salut il a l'air sympa ce programme.

Le type bool a été introduit avec le C99.

Pour le goto... Sujet qui a usé beaucoup de claviers. En fait le goto évoque le BASIC, donc péjoratif. Or le code C est transformé par le compilateur en instructions assembleur. Si quelqu'un trouve un jour un programme asembleur sans instruction jump je lui paye la bière et le café. L'optimisation de code C passe par le goto: un exemple qui peut inspirer http://fr.wikipedia.org/wiki/Optimisation_de_code

Je suis également pour l'utilisation des return;

Bonne prog et vive Linux.

Commentaire de SAKingdom le 10/06/2007 03:36:15

Petite erreur dans mes exemples. J'ai oublié de changer le type de retour de la fonction:

Sans goto
void fonction (...)
{
   ...
   if(!x) {
      free(mem);
      return;
   }
   ...
   if(!y) {
      free(mem)
      fclose(file);
      return;
   }

   ...

   free(mem);
   fclose(file);
}

free revient 3 fois, fclose 2 fois et return 3 fois.

Avec goto
void fonction (...)
{
   ...
   if(!x) goto freebuf;
   ...
   if(!y) goto closefile;
   ...
closefile:
   fclose(file);
freebuf:
   free(mem);
}

fclose free et return n'apparaisse qu'une seule fois et 2 goto.

Commentaire de Patrice99 le 10/06/2007 08:14:54

Tout à fait d'accord avec SAKingdom : les Goto et les Return permettent d'avoir un code optimisé et lisible, il ne faut donc pas écouter bêtement ce que les jargonneux veulent nous faire croire, à savoir que le code source doit être pénible à écrire, lent en exécution et difficile à lire :-)

Commentaire de Mic32768 le 11/06/2007 00:10:56

Au contraire, les goto n'aident en rien l'optimisation du code. Si tu crois que mettre des goto optimisent le code, et bien c'est totalement faux puisque le compilateur optimisera bien mieux que le programmeur. Or, certains compilateur vont jusqu'à ne pas optimiser du tout une fonction qui contient un goto. Il faut également savoir que l'on ne parle pas ici d'assembleur, mais bien de C où le programmeur se doit de structurer correctement son programme. Gardons également à l'esprit que c'est un langage de haut niveau. Les jump et tout le tralala, c'est au compilateur de gérer ça, pas au programmeur. Les goto brisent une bonne structure de programme et prendre l'habitude de mettre des goto, surtout dans l'exemple de SAKingdom qui peut revenir très souvent, est mal programmer. Je vois très mal un programme utiliser des goto à chaque fois que le code de ton exemple revient. En basic, on utilisait les goto, mais là on est en C et on a bien assez d'outils plus évolués(et surtout un compilateur qui fait de l'excellent travail) que le goto pour s'en sortir. Mettre des goto en croyant que l'on optimise le code, c'est faire le contraire. À part pour sortir des boucles(bien que ce ne soit pas élégant du tout), goto ne devrait JAMAIS être utilisé avec un langage comme le C ou le C++.

Commentaire de BruNews le 11/06/2007 00:34:28 administrateur CS

"... devrait JAMAIS être utilisé ..."
Il n'y a rien qui ne doit jamais être utilisé en prog, faut comparer et mesurer ce qui sort du compilo. Tout le reste est discours de secte et philo nuisible.
Il ne faut pas se laisser bourrer le crane par les soit disant grands gourous, encore moins essayer de refourguer aux autres ce qu'on t'a inculqué.
Va donc lire Michael Abrash et tu verras ce qu'il en est des tabous quand il s'agit d'optimiser.

Commentaire de SAKingdom le 11/06/2007 04:14:29

Mic32768 >> Mon exemple est parfaitement structuré et je n'est jamais vue de compilateur refuser l'optimisation parce qu'il y a un jmp volontairement ajouté dans le code. Je serais curieux de voir comment tu peux reproduire l'exemple que j'ai donné plus haut avec ta soi-disent programmation structuré et optimisé.
Pour le reste, BruNews a totalement raison. Il ne faut pas croire tout ce qui sort de la bouche de ces "programmeurs". Si tu trouve que les goto n'ont pas leurs place, c'est que tu ne sais pas les utiliser tout simplement.

Commentaire de SAKingdom le 11/06/2007 05:07:25

Bon d'accord, mon exemple n'est peut-être pas si dur changer car il est extrêmement basique:
void fonction (...)
{
   ...
   if(x) {
      ...
      if(y) {
         ...
      }
      fclose(file);
   }
   free(mem);
}

N'empêche que sur des codes légèrement plus complexes, on ne peut pas utiliser cette méthode sans dupliquer des morceaux de codes et aussi rendre le code très compliqué à lire et très peu "élégant".

Commentaire de SAKingdom le 11/06/2007 07:01:18

Bon là, je vais reformuler tout ça, car j'ai fais plein d'erreurs:

Mic32768 >> Mon exemple est très bien structuré. Aussi, je n'est jamais vue de compilateur refuser l'optimisation parce qu'il y a un jmp volontairement ajouté dans le code.

Pour le reste, BruNews a totalement raison. Il ne faut pas croire
sur parole tout ce qui sort de la bouche des "grands" programmeurs. Il faut aussi se baser sur sa déduction et sur le résultat (le listing par exemple). Si tu trouve que les goto n'ont pas leur place, c'est que tu ne sais pas où et comment bien les utiliser tout simplement, car les goto on leur raison d'être (je ne crois pas que Ritchie les aient intégrés au langage pour rien).

Il peut, en effet, exister un moyen de se passer des goto. Cependant, on peut générer une structure de code bien plus difficile à lire et voir même à coder.

Commentaire de Patrice99 le 11/06/2007 08:19:59

D'autant plus que, pour ce qui est du DotNet, c'est très facile de vérifier l'implémentation via Reflector : cet outil gratuit permet de voir le code pré-assembleur MSIL désassemblé dans le langage de ton choix, donc de vérifier les optimisations du compilateur.

Commentaire de anjayl le 22/11/2007 00:37:40

Bonjour à tous.

Je débarque un peu au hasard pour tout vous dire... et je ne suis pas du tout trempé dans la programmation.

J'ai effectivement pas mal de fichiers .srt en décalage, souvent de 2 à 5 secondes; et pour que je comprenne bien, tout ce qu'il y a au dessus n'est absolument pas abordable pour un newbie comme moi... ? navré si je dérange, je recherche juste un petit programme tout simple qui permette de décaler les sous titres, et gogole m'a envoyé ici...

Mais je comprends qu'à moins d'être un programmeur, il n'y a aucune solution...    hu?!

bonne route

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Cool le site c super ! [ par mmuller57 ] Alors là, je dis bravo ! C'est un site ultra-supra-giga cool ! Je débute en C++ et c'est cool de voir que y'a de l'entraide entre développeur ! Voilà, Truc super simple mais je n'y connais rien... ;-) [ par JEROMAX ] SalutJe suis en train de faire un petit prog dans un autre langage que ce cher C++J'aurai besoin de savoir comment on fait pour concaténer 2 chaine de Super débutant [ par Sphaxs ] Donc si quelqu'un pouvait m'expliquer (dans les grandes lignes (pour ne pas trop lui faire perdre de temps)) comment utilisé ce language, ca me rendra Super débutant [ par Sphaxs ] Salut tout le monde,Ca fait 1 an que je programme en Vb, mais certains de mes programmes ont une facheuse tendance à être LENTS, c'est pourquoi je vou SUPER IMPORTANT / EST CE POSSIBLE [ par bily ] Vegeta :-)salut a tous, je vourdai savoir comment faire en programmation la lecture de l'adresse physique de la carte reseau, lorsqu'on tape "ipconfig SUPER IMPORTANT / EST CE POSSIBLE [ par bily ] Vegeta :-)salut a tous, je vourdai savoir comment faire en programmation la lecture de l'adresse physique de la carte reseau, lorsqu'on tape "ipconfig Trivial Poursut en C++ (bonne version) [ par miko51 ] Voila , salut tout le monde je suis un débutant en programmation je suis dans une ecole d ingenieur en informatique et c est super honteux je n arrive Changer le texte dans la barre des titres (Win32 API) [ par Viper31 ] Salut tout le monde !!J aimerai savoir si quelqu'un sait comment changer le texte dans la barre des titres (caption) sachant que ma fenetre est une bo SONDAGE !!! RSVP !!! [ par Guidelor ] Bonjour Ca serait cool si le plus de monde possibles pouvait répondre à ma petite question !!!Existe-t-il un fichier.log sur votre ordinateur qui affi super urgent :probleme de creation d'un nombre indefini de boutons [ par chriscrepin1 ] je dois crée un nombre indefini de bouton dans un dialog j'ai reussi mais je n'arrive pas a gerer les evenement dessus j'ai defini un evenement pour l


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,248 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales