본문 바로가기

assortrock

구조체를 이용하여 배열 구현

<myArray.h>

#pragma once

// 구조체 선언
struct tag_myArray
{
	int* elementDataPtr; // 배열의 주소(할당 받을 대상)
	int	MaxCount; // 할당 받은 배열의 크기
	int curCount; // 배열 속 존재하는 요소의 개수
};

// 초기화 함수
void InitialArray(tag_myArray* _target);

// 데이터 입력 함수
void Push(tag_myArray* _target, int _data);

// 배열 해제 함수
void ReleaseArray(tag_myArray* _target);

<myArray.cpp>

#include <iostream>
#include <stdio.h>

// 구조체 선언
struct tag_myArray
{
	int* elementDataPtr; // 배열의 주소(할당 받을 대상)
	int	MaxCount; // 할당 받은 배열의 크기
	int curCount; // 배열 속 존재하는 요소의 개수
};

// 초기화 함수
void InitialArray(tag_myArray* _target) {
	_target->MaxCount = 2;
	_target->curCount = 0;
	_target->elementDataPtr = (int*)malloc(sizeof(int)*(_target->MaxCount));
};

// 데이터 입력 함수 첫번째 : 데이터 입력 함수에서 재할당까지 처리하는 경우 ( 오류가 있음 )
void Push(tag_myArray* _target, int _data) {
	if (_target->MaxCount <= _target->curCount) // 배열이 꽉차서 공간을 늘려야 할 경우 공간을 기존의 두배로 할당 받는다고 할 때
	{
		_target->MaxCount = (_target->MaxCount * 2); // 기존의 배열의 크기를 두배로 늘린다
		int* newDataPtr = (int*)malloc(sizeof(int)* _target->MaxCount);  // 늘어난 배열의 크기만큼 메모리를 할당 받는다
		if (newDataPtr != nullptr)
		{
			for (int i = 0; i < _target->curCount; ++i) {  // 기존의 배열을 새로운 배열로 대입한다.
				//newDataPtr[i] = _target->elementDataPtr[i]; // 아래는 오류가 안뜨고 이것은 오류가 뜨는 이유는?
				//*(newDataPtr + i) = *(_target->elementDataPtr + i);
				*(newDataPtr + i) = *(_target->elementDataPtr + i);
			}
		}
		free(_target->elementDataPtr); // 기존의 배열을 해제한다
		_target->elementDataPtr = newDataPtr; // 기존 배열의 이름에 새로운 배열을 대입한다.
	}
	if (_target->elementDataPtr != nullptr)
	{
		_target->elementDataPtr[_target->curCount++] = _data; // 마지막 요소 뒤에 매개인자를 추가하고 이에 따라 총 요소의 개수인 curCount를 증산연산한다.
	}
};

// 배열 해제 함수
void ReleaseArray(tag_myArray* _target) {
	free(_target->elementDataPtr);
};

 

<myArray.cpp> ( 재할당 부분을 따로 함수로 하는 경우)

#include <iostream>
#include <stdio.h>

// 구조체 선언
struct tag_myArray
{
	int* elementDataPtr; // 배열의 주소(할당 받을 대상)
	int	MaxCount; // 할당 받은 배열의 크기
	int curCount; // 배열 속 존재하는 요소의 개수
};

// 초기화 함수
void InitialArray(tag_myArray* _target) {
	_target->MaxCount = 2;
	_target->curCount = 0;
	_target->elementDataPtr = (int*)malloc(sizeof(int)*(_target->MaxCount));
};

// 데이터 입력 함수 두번째 : 데이터 입력함수와 재할당함수가 따로 있고 입력함수에서 재할당 함수를 가져와 쓰는 경우
void Realloc(tag_myArray* _target)
{
	_target->MaxCount = (_target->MaxCount * 2); // 기존의 배열의 크기를 두배로 늘린다
		int* newDataPtr = (int*)malloc(sizeof(int) * (_target->MaxCount));  // 늘어난 배열의 크기만큼 메모리를 할당 받는다
		if (newDataPtr != nullptr) // for 반복문 내의  newDataPtr의 null 역참조 경고에 대한 예외 처리
		{
			for (int i = 0; i < _target->curCount; ++i) {  // 기존의 배열을 새로운 배열로 대입한다.
				newDataPtr[i] = _target->elementDataPtr[i];
			}
		}
		free(_target->elementDataPtr); // 기존의 배열을 해제한다
		_target->elementDataPtr = newDataPtr; // 기존 배열의 이름에 새로운 배열을 대입한다.
}

//데이터 추가 함수
void Push(tag_myArray* _target, int _data)
{
	if (_target->MaxCount <= _target->curCount)
	{
		Realloc(_target);
	}
	_target->elementDataPtr[_target->curCount++] = _data;
}


// 배열 해제 함수
void ReleaseArray(tag_myArray* _target) {
	free(_target->elementDataPtr);
};

<main.cpp>

#include <iostream>
#include <stdio.h>
#include "myArray.h"

int main()
{
	tag_myArray array1 = {};

	InitialArray(&array1);

	for (int i = 0; i < 10; ++i)
	{
		Push(&array1, i);
	}

	for (int i = 0; i < array1.curCount; ++i)
	{
		std::cout << array1.elementDataPtr[i] << std::endl;
	}

	ReleaseArray(&array1);

	return 0;
}

 

오류

<exe_common.inl>

<myArray.cpp>

'assortrock' 카테고리의 다른 글

c++ 11일차  (0) 2022.05.31
c++ 10일차 1부  (0) 2022.05.21
c++ 8,9일차  (0) 2022.05.19
c++7일차  (0) 2022.05.19
c++ 6일차  (0) 2022.05.18