teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

m

2018/12/07 16:18

投稿

yumetodo
yumetodo

スコア5852

answer CHANGED
@@ -1,15 +1,22 @@
1
1
  ```c
2
2
  #include <stdlib.h>
3
3
  #include <stdbool.h>
4
+ typedef struct MISSILE {
5
+ double x;
6
+ double y;
7
+ double angle;
8
+ double speed;
9
+ }
4
10
  typedef struct tag_missile_vec {
5
11
  MISSILE* data;
6
12
  size_t size;
7
13
  size_t capacity;
8
14
  } missile_vec;
9
15
 
10
- missile_vec* missile_vec_new(size_t size, double x, double y, double angle, double speed) {
16
+ missile_vec* missile_vec_new(size_t size, size_t capacity, double x, double y, double angle, double speed) {
17
+ if(capacity < size) return NULL;
11
18
  missile_vec* missile;
12
- if(NULL = (missile->data = malloc(size * sizeof(MISSILE))) return NULL;
19
+ if(NULL = (missile->data = malloc(capacity * sizeof(MISSILE))) return NULL;
13
20
  for(size_t i = 0; i < size; ++i){
14
21
  MISSILE* m = &missile->data[i];
15
22
  m->x = x;
@@ -18,8 +25,21 @@
18
25
  m->speed = speed;
19
26
  }
20
27
  missile->size = size;
28
+ missile->capacity = capacity;
21
29
  return missile;
22
30
  }
31
+ bool missile_vec_push(missile_vec* missile, const MISSILE* data)
32
+ {
33
+ if(NULL == missile || NULL == data) return false;
34
+ if(capacity < size + 1){
35
+ const size_t new_capacity = ((SIZE_MAX / 2) < missile->capacity) ? SIZE_MAX : missile->capacity * 2;
36
+ if(NULL == (missile->data = realloc(missile->data, capacity * sizeof(MISSILE)))) return false;
37
+ missile->capacity = new_capacity;
38
+ }
39
+ missile->data[missile->size] = *data;
40
+ ++missile->size;
41
+ return true;
42
+ }
23
43
  void missile_vec_delete(missile_vec* missile)
24
44
  {
25
45
  if(NULL != missile) free(missile->data);
@@ -27,10 +47,11 @@
27
47
  }
28
48
  void missile_vec_draw(missile_vec* missile)
29
49
  {
50
+ if(NULL == missile) return;
30
51
  //do something
31
52
  }
32
53
  int main(){
33
- missile_vec* missile = missile_vec_new(10, 0, 0, 0, 0);
54
+ missile_vec* missile = missile_vec_new(10, 20, 0, 0, 0, 0);
34
55
  if(NULL == missile) return 1;
35
56
  missile_vec_draw(missile);
36
57
  missile_vec_delete(missile);