cの関数で2D配列をコピーできません。ここでは、コードは次のとおりです。memcpy()が正しく動作しない
void Add(Lista* list,int** estado, char* sec, int size)
{
if(list->last==NULL)
{
list->last = calloc(1,sizeof(element));
list->last-> secuencia = sec;
list->last->next = NULL;
list->last->prev = NULL;
list->last-> estado = (int**)calloc(size,sizeof(int));
memcpy(&list->last->estado,&estado,size*sizeof(int));
list->cantidad++;
}
else
{
list->last-> next = calloc(1,sizeof(element));
list->last-> next -> secuencia = sec;
list->last->next->next = NULL;
list->last->next->prev = list->last;
list->last =list->last->next;
list->last->estado = (int**)calloc(size,sizeof(int));
memcpy(&list->last->estado,&estado,size*sizeof(int));
list->cantidad++;
}
}
ここでは、構造体リスタと要素
typedef struct element
{
char* secuencia;
struct element* next;
struct element* prev;
int** estado;
}element;
typedef struct Lista
{
int cantidad;
element* last;
}Lista;
があるという考えはリスタの「要素」を追加することで、それは最後に追加された要素を返す基本的なリストです。問題は、リストに格納されているすべての要素が同じ "estado"(2D int配列)を返すことです。要素estadoのいずれかを変更すると、すべての要素estadoは同じ変更を行います。ですから、memcpy()は値をコピーして、両方の配列を互いに独立させなければならないので、どこに問題があるのか分かりません。
PS:それはうまく説明されていなかった場合は申し訳ありませんが、私が話すスペイン語
EDIT
だから、私は変更するには、このへの回答に基づいて、私のコード:今すぐ
void Add(Lista* list,int** estado, char* sec, int size)
{
if(list->last==NULL)
{
list->last = calloc(1,sizeof(element));
list->last-> secuencia = sec;
list->last->next = NULL;
list->last->prev = NULL;
list->last-> estado = (int**)calloc(size,sizeof(int));
memcpy(list->last->estado,estado,size*sizeof(int));
list->cantidad++;
}
else
{
list->last-> next = calloc(1,sizeof(element));
list->last-> next -> secuencia = sec;
list->last->next->next = NULL;
list->last->next->prev = list->last;
list->last =list->last->next;
list->last->estado = (int**)calloc(size,sizeof(int));
memcpy(list->last->estado,estado,size*sizeof(int));
list->cantidad++;
}
}
Iエラーを起こしていないが、私は問題を抱えている(あるアレイを変更すると、他のアレイは変更を受ける)
EDIT2
だから、私は、コードをチェックし始め、コールが追加する前に、()配列の不正確な逢引があったことは、(常に関数に同じ配列を渡される)とEDIT1の変更は私の問題を解決しました。
PS2:私は、ポインタに深く感謝
'int **'は 'int'の2次元配列を指すのではなく、' int'のポインタへのポインタを指します。 – alk
'int'の配列を指すポインタの配列を使用していますか?または、行と列から適切な要素を見つけるために余分な数学を使って1つのチャンクにすべて割り当てられていますか? – Dmitri
@Dmitriそれは数字で作成された最初のものを除き、すべて1つのチャンクに割り当てられます(私は.txtファイルから取得しました) –