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 :

memcpy et deux tableaux


Sujet :

C

  1. #1
    Membre éclairé Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : auto-entrepreneur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    Par défaut memcpy et deux tableaux
    bonjour,
    Je suis sur un code dans lequel on demande à l'utilisateur de saisir la taille de deux tableaux. Puis de les remplir l'un apres l'autre.
    ex en entrée
    6 4
    5 4 3 2 1 0
    9 8 7 6
    et je veux obtenir en sortie :
    0 1 2 3 4 5 6 7 8 9
    pour cela j'utilise la fonction memcpy();
    mais le résultat obtenu n'est pas bon.
    Pourquoi ?
    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
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define NB_ELEM_MAXI 20000
     
     
    /* Algorithme de tri à bulle */
     
    static void TriBulle(int *T, int taille){
    	int i, k, temp;
    	k = taille - 1;
    	/* pour chaque passe */
    	while(k > 0){
    		/* on fait remonter le plus grand */
    		for (i = 1; i <= k; i++){
    			if (T[i] < T[i-1]){
    				/* échange de T[i-1] et T[i] */
    				temp = T[i];
    				T[i] = T[i-1];
    				T[i-1] = temp;
    			}
    		}
    		k--;
    	}
    }
     
    int main(void){
    	int N, M; /* nombre de bacs du stock */
    	int i;
    	int Tab1[NB_ELEM_MAXI];
    	int Tab2[NB_ELEM_MAXI];
    	scanf("%d %d", &N, &M);
    	for(i = 0; i < N; i++)
    		scanf("%d", &Tab1[i]);
    	for(i = 0; i < M; i++)
    		scanf("%d", &Tab2[i]);
    	memcpy(Tab1,Tab2,sizeof Tab1);
     
     
    	TriBulle(Tab1, N+M);
    	for(i = 0; i < N+M; i++)
    		printf("%d ", Tab1[i]);
    	printf("\n");
    	return 0;
    merci,

  2. #2
    Membre chevronné Avatar de jbarreau-mainson
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    446
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 446
    Par défaut
    Es-tu oblige d'utiliser cette fonction ?

    Tu peux egalement faire un tableau de la taille de la somme des deux tableaux précédents puis trier par ordre croissant ...

    Si la taille de tes tableaux sont définis par l'utilisateur et donc peuvent mettre n'importe quelle taille, tu vas avoir besoin de l'allocation dynamique (cf malloc )


  3. #3
    Membre éclairé Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : auto-entrepreneur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    Par défaut
    je crois que j'ai trouvé une solution.
    est-ce correcte?
    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
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define NB_ELEM_MAXI 20000
     
     
    /* Algorithme de tri à bulle */
     
    static void TriBulle(char *T, int taille){
    	int i, k, temp;
    	k = taille - 1;
    	/* pour chaque passe */
    	while(k > 0){
    		/* on fait remonter le plus grand */
    		for (i = 1; i <= k; i++){
    			if (T[i] < T[i-1]){
    				/* échange de T[i-1] et T[i] */
    				temp = T[i];
    				T[i] = T[i-1];
    				T[i-1] = temp;
    			}
    		}
    		k--;
    	}
    }
     
    int main(void){
    	int N, M; /* nombre de bacs du stock */
    	int i;
    	char Tab1[NB_ELEM_MAXI];
    	char Tab2[NB_ELEM_MAXI];
    	char chaine[NB_ELEM_MAXI];
    	scanf("%d %d", &N, &M);
    	for(i = 0; i < N; i++)
    		scanf("%d", &Tab1[i]);
    	for(i = 0; i < M; i++)
    		scanf("%d", &Tab2[i]);
    	strcpy(chaine,Tab1);
    	strcat(chaine,Tab2);
     
     
    	TriBulle(chaine, N+M);
    	for(i = 0; i < N+M; i++)
    		printf("%d ", chaine[i]);
    	printf("\n");
    	return 0;
    }

  4. #4
    Membre éprouvé Avatar de bobmidou
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2008
    Messages : 121
    Par défaut
    salut

    je pense que memcpy écrase ton premier tableau et tu perd ses données

    je pense qu'il faut procéder autrement

    bonne chance

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Ce n'est pas correct.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	char Tab1[NB_ELEM_MAXI];
    	char Tab2[NB_ELEM_MAXI];
    	char chaine[NB_ELEM_MAXI];
    ...
    	for(i = 0; i < N; i++)
    		scanf("%d", &Tab1[i]);
    	for(i = 0; i < M; i++)
    		scanf("%d", &Tab2[i]);
    Tes tableaux sont des tableaux de char, alors que le %d indique que tu lis des int (qui occupent 2 ou 4 fois plus de place typiquement qu'un char). De plus, ces valeurs sont partiellement écrasées par l'entrée suivante et ne gardent que le byte de tête. Il te semble que ça marche parce que tu t'es contenté d'entrer des petites valeurs qui tiennent sur 1 byte et que ton système met le byte de poids faible en tête.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	strcpy(chaine,Tab1);
    	strcat(chaine,Tab2);
    Ces fonctions ne marchent que pour des chaînes de caractères terminées par 0, pas pour des tableaux d'entiers qui ne sont pas eux à priori terminé par un byte à 0.

Discussions similaires

  1. PL/SQL COMPARAISON DE DEUX TABLEAUX APRES BULK
    Par mimi_été dans le forum PL/SQL
    Réponses: 5
    Dernier message: 30/06/2009, 12h14
  2. Concaténation de deux tableaux
    Par mego dans le forum Langage
    Réponses: 6
    Dernier message: 19/11/2008, 11h52
  3. Réponses: 54
    Dernier message: 16/03/2006, 11h42
  4. comparer deux tableaux
    Par djibril dans le forum Langage
    Réponses: 4
    Dernier message: 15/11/2005, 15h26
  5. Réponses: 4
    Dernier message: 11/10/2005, 10h17

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