2010-12-10 7 views
1

s'il vous plaît pouvez-vous m'aider? Comment copier une partie d'un tableau int dans un autre tableau int?Comment copier une partie d'int array vers un autre tableau int en C/C++?

Exemple:

typedef struct part { 
    int * array; 
} PART; 

int array[] = {1,2,3,4,5,6,7,8,9}; 
PART out[] = new PART[3]; 

for (int i = 0; i < 3; i++) 
{ 
    memcpy((char *)array[i * 3], (char *)out[i].array, 3 * sizeof(int)); 
} 

Mais cela ne ne fonctionne pas ... :(

+2

, votre utilisation 'memcpy' est probablement faux. le premier argument de 'memcpy' est le _destination_, pas la source. – lijie

+2

Je vois que votre question a une balise C++, si c'est le cas, n'usez pas votre code avec "typedef struct" et n'utilisez pas memcpy, C++ a std :: copy pour cela. C'est aussi une bonne idée d'utiliser les noms ALL_CAPS uniquement pour les macros. –

Répondre

7

Ok, vous avez 3 problèmes

  1. Vous jetant un int à un char * (char *)array[i * 3]

    Qu'est-ce que vous voulez vraiment dire est (char *)&array[i * 3]. c'est-à-dire prendre l'adresse du i * 3e élément.

  2. vous essayez de copier des données à partir d'un tableau non initialisé.

    Vous devez allouer de la mémoire à out [i] .array.

  3. Vous semblez avoir votre memcpy à l'envers.

Le code suivant fonctionnera mieux:

typedef struct part { 
    int * array; 
} PART; 

int array[] = {1,2,3,4,5,6,7,8,9}; 
PART out[] = new PART[3]; 

for (int i = 0; i < 3; i++) 
{ 
    out[i].array = new int[3]; 
    memcpy((char *)out[i].array, (char *)&array[i * 3], 3 * sizeof(int)); 
} 

Assurez-vous que vous vous souvenez de supprimer [] la mémoire allouée à des [i] .array ...

+0

Merci, en effet, dans le vrai problème, j'initialise le tableau en struct et utilise memcpy avec le bon ordre d'arguments, le problème était dans "&". Merci encore, erreur stupide ... :) –

+0

@Sebastian: Si la réponse résout vos problèmes, n'hésitez pas à accepter ma réponse en cliquant sur le "tick" en haut à gauche de mon message :) – Goz

3

Vous devez allouer de la mémoire pour * array avant de faire memcpy

Quelque chose comme ceci:.

typedef struct part { 
    int * array; 
} PART; 

int array[] = {1,2,3,4,5,6,7,8,9}; 
PART out[] = new PART[3]; 

for (int i = 0; i < 3; i++) 
{ 
    out[i].array = malloc(9*sizeof(int)); 
    // will copy 9 array values into out[i].array 
    memcpy(out[i].array, array, 9 * sizeof(int)); 
} 
+0

Plus précisément, vous avez un tableau de PART. Le 'int * tableau' à l'intérieur de cette structure n'est pas initialisé. Il doit être initialisé. –

+0

erm. Je pense qu'il a juste besoin de 3 'int' dans chaque 'PART'. – lijie

+0

N'est-il pas OP essayant de copier le tableau entier sur chaque 'PART'? –

1

La partie struct C'est un peu hors de propos. Ce que vous essayez de faire peut être accompli de cette façon:

int src[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; 
int part[3][3]; 

for (int i = 0; i < 3; ++i) 
{ 
    std::copy(src + (3 * i), src + (3 * (i + 1)), part[i]); 
} 

Une solution encore mieux peut être fait en utilisant std::vector au lieu de tableaux de style C: en plus de la réponse ci-dessous

std::vector<int> a(src, src + 9); 
std::vector<std::vector<int> > b; 

for (int i = 0; i < 3; ++i) 
{ 
    std::vector<int> c(a.begin() + (3 * i), a.begin() + (3 * (i + 1))); 
    b.push_back(c); 
} 
Questions connexes