<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 |