|
초짜 님이 쓰신 글 :
: 궁금한 점이 있어 이렇게 몇자 적어봅니다.
: 다름이 아니고 ..
:
: int a[100],b[100];
: 이런식으로 정수형 배열을 2개 선언했습니다.
:
: 그 다음에 a[1]..부터[100] 까지 int형 data를 Return받아 대입시켰구요..
: 담 부터가 문제가 되네요..
:
: a[1]....부터 a[100]까지의 Return받은 Data를 b[1]...b[100]까지 똑 같이 넘겨줄수있는
: 방법이 있을까요?
: 궁금합니다.
: 답변 좀 부탁드리겠습니다.
가장 단순한(무식한?) 방법은 그냥 for루프를 써서 대입하면 됩니다.
C에서 좀더 세련된 방법은 memcpy()를 쓰는 방법이 있습니다.
#include <stdio.h>
#include <mem.h>
#include <assert.h>
int main(int argc, char* argv[])
{
#define ARR_SIZE 100
int a[ARR_SIZE], b[ARR_SIZE], i;
for (i = 0; i < ARR_SIZE; ++i)
a[i] = i;
assert(memcpy(b, a, sizeof a) != NULL);
for (i = 0; i < ARR_SIZE; ++i)
assert(a[i] == b[i]);
puts("-- Ok --");
return 0;
}
memcpy를 쓴다고 for루프를 쓴 것보다 빠르지 않습니다.
memcpy도 루프로 만들어진 겁니다. 컴파일된 어셈블리 코드는 거의 비슷하게 나올 겁니다.
C++에서는 copy 알고리듬을 사용하면 매우 깔끔하게 쓸 수 있습니다.
다음은 위의 코드와 같은 기능을 하는 ANSI C++ 코드입니다.
memcpy와는 데이터 이동 방향이 반대임에 유의하세요.
#include <cassert>
#include <iostream>
#pragma hdrstop
#include <algorithm>
#include <numeric>
using namespace std;
int main()
{
const int ARR_SIZE = 100;
int a[ARR_SIZE], b[ARR_SIZE];
iota(&a[0], &a[ARR_SIZE], 0); // iota(a, a + ARR_SIZE, 0);로 써도 됨
copy(&a[0], &a[ARR_SIZE], &b[0]); // copy(a, a + ARR_SIZE, b);로 써도 됨
for (int i = 0; i < ARR_SIZE; ++i)
assert(a[i] == b[i]);
cout << "-- Ok --\n";
return 0;
}
|