IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Lecture par fenêtre d'une chaîne de caractère


Sujet :

C

  1. #1
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 859
    Points : 4 813
    Points
    4 813
    Par défaut Lecture par fenêtre d'une chaîne de caractère
    Bonjour

    J'ai un petit problème : je dispose d'une séquence qui est une (grande) chaîne de caractère. Je veux parcourir toute ma chaîne afin d'en retirer des petites chaînes de caractères d'une taille définie. L'objet finale est d'avoir une liste chaînée de ces petits éléments.
    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #include "Sequence.h"
    #include "Parameters.h"
     
    struct siRNA{
    	char *sequence;
    	long start;
    	int size;
    	double Tm;
    	double GC;
    	struct siRNA *next;
    };
     
    int window;
    struct siRNA *head;
     
    /**
     * TODO
     * 
     * Apparemment, j'ai des problèmes avec cette fonction, la chaîne de caractères
     * est aberrante.
     */
     
    char *substr(char *seq, int start, int end){
    	char *tmp = malloc(end*sizeof(char));
    	int i;
    	if(tmp==NULL){
    		fprintf(stderr, "Memory allocation error !\n");
    		exit(2);
    	}
    	for(i=start; i<start+(end); i++){
    		tmp[i] = Sequence[i];
    	}
    	return tmp;
    }
     
    double getGC(char *seq){
    	double percent = 0;
    	int cpt = 0;
    	int i;
    	for(i=0; i<strlen(seq); i++){
    		if(seq[i]=='G' || seq[i]=='C')
    			cpt++;
    	}
    	percent = (100*cpt)/strlen(seq);
    	return percent;
    }
     
    struct siRNA *newSI(int start){
    	struct siRNA *rna;
    	rna = malloc(sizeof(struct siRNA));
    	if(rna==NULL){
    		fprintf(stderr, "Memory allocation error !\n");
    		exit(2);
    	}
    	rna->start = start;
    	printf("Start = %ld\n", rna->start);
    	rna->next=NULL;
    	rna->sequence = malloc(window*sizeof(char));
    	if(rna->sequence==NULL){
    		fprintf(stderr, "Memory allocation error !\n");
    		exit(2);
    	}
    	rna->sequence = substr(Sequence, start, window);
    	printf("Sequence = %s\n", rna->sequence);
    	rna->GC = getGC(rna->sequence);
    	printf("GC = %lf\n", rna->GC);
    	return rna;
    }
     
    void makeList(void){
    	int i;
    	window = atoi(parameters[1]);
    	head = NULL;
    	for(i=0; i<strlen(Sequence); i++){
    		if((i+window)>strlen(Sequence))
    			break;
    		head = newSI(i);
    	}
    }
    Et voici ma sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    Start = 0
    Sequence = CCGCGGCGCCGATCCCGGCTG
    GC = 85.000000
    Start = 1
    Sequence = XCGCGGCGCCGATCCCGGCTGA
    GC = 77.000000
    Start = 2
    Sequence = X\uffffGCGGCGCCGATCCCGGCTGAG
    GC = 73.000000
    Start = 3
    Sequence = X\ufffftCGGCGCCGATCCCGGCTGAGG
    GC = 70.000000
    Start = 4
    Sequence = X\ufffft
    GC = 0.000000
    Au premier tour, ça semble aller bien, mais pour la suite, aïe, aïe, qu'est-ce qui a bien pû se passer ???

    Merci d'avance de vos réponses.

    @++

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    J'ai juste regarder la fonction substr... Encore une fois, fait attention à ta façon d'allouer la mémoire et t'en servir...

    char *substr(char *seq, int start, int end){
    char *tmp = malloc(end*sizeof(char));
    int i;
    if(tmp==NULL){
    fprintf(stderr, "Memory allocation error !\n");
    exit(2);
    }
    for(i=start; i<start+(end); i++){
    tmp[i] = Sequence[i];
    }
    return tmp;
    }
    Il serait peut-être plus intéressant de faire ceci (j'ai commenté+corrigé):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    char *substr(char *seq, int start, int end){
       /* -fy- La taille serait plutôt end-start+1, non? 
      sizeof(char) toujours inutile... La taille d'un caractère c'est toujours 1 
      */
       char *tmp = malloc(end-start+1);
       int i;
       if(tmp==NULL){
          fprintf(stderr, "Memory allocation error !\n");
          exit(2);
       }
       for(i=start; i<start+(end); i++){
          /*-fy- Hmmm tmp commence à 0, non? ce serait mieux de faire ceci: */
          tmp[i-start] = Sequence[i];
       }
       /* -fy- Et pour faire bien, on va rajouter un '\0'*/
      tmp[i-start] = '\0';
     
       return tmp;
    }
    Jc

  3. #3
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 859
    Points : 4 813
    Points
    4 813
    Par défaut
    Décidément fearyourself, tu me sauves encore.
    @ charge de revanche en Perl ou Java !

    @++

  4. #4
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 859
    Points : 4 813
    Points
    4 813
    Par défaut
    fearyourself, il y a quand même un petit souci que j'ai résolu. Mes chaînes de caractères rendus par ma fonction substr ont des tailles "fixes". Je m'explique, l'objet est de rendre une sous-chaîne à partir d'une première string avec la position de début de la sous-chaîne et sa taille.
    Mais j'ai modifié le code en ce sens et ça marche.
    Merci encore de ton aide.

    @++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RegEx] Test d'une chaîne de caractère par expression rationnelle
    Par sliderman dans le forum Langage
    Réponses: 6
    Dernier message: 28/03/2008, 12h51
  2. Lire les caractères un par un d'une chaîne unicode
    Par vanbesienv dans le forum Général Python
    Réponses: 4
    Dernier message: 09/03/2008, 14h09
  3. Remplacer une chaîne de caractéres par une autre
    Par koKoTis dans le forum Linux
    Réponses: 6
    Dernier message: 15/10/2007, 09h00
  4. Scinder une chaîne de caractère par rapport à un séparateur
    Par Tontorise dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/07/2007, 13h28
  5. Réponses: 8
    Dernier message: 15/07/2006, 18h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo