質問編集履歴

3

ソースコードの変更

2019/11/21 08:54

投稿

ht3433
ht3433

スコア19

test CHANGED
File without changes
test CHANGED
@@ -116,4 +116,36 @@
116
116
 
117
117
  }
118
118
 
119
+
120
+
121
+ int main(){
122
+
123
+ int result;
124
+
125
+ struct in_addr in_addr;
126
+
127
+
128
+
129
+ result = inet_pton("130.0.7.23", &in_addr);
130
+
131
+ assert(result == 1 && in_addr.s_addr == ((23<<24)|(7<<16)|(0<<8)|130));
132
+
133
+
134
+
135
+ result = inet_pton("130.00.7.23", &in_addr);
136
+
137
+ assert(result == 0);
138
+
139
+
140
+
141
+ result = inet_pton("130.01.7.23", &in_addr);
142
+
143
+ assert(result == 0);
144
+
145
+
146
+
147
+ return(0);
148
+
149
+ }
150
+
119
151
  ```

2

タイトルの変更

2019/11/21 08:54

投稿

ht3433
ht3433

スコア19

test CHANGED
@@ -1 +1 @@
1
- Linuxコマンドのinet_ptonを作りたいです。
1
+ void型をuint32_t型にキャストしたい
test CHANGED
@@ -1,8 +1,8 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
- Linuxのinet_ptonを作りたいです。
3
+ ネットで調べながらーディグしてみたですが、void型をuint32_t型にキャストしたいですがエラーになってしまい、どう対処すればよいか困っています
4
4
 
5
- ネットで調べながらーディグしてみたですが、void型をuint32_tにキャストしたいのですがエラーになってしまい、どう対処すればよいか困っています
5
+ 最終的にはLinuxのinet_ptonを作るつもりです。
6
6
 
7
7
  お力添えいただければ幸いです。
8
8
 

1

ソースコードの変更

2019/11/21 06:11

投稿

ht3433
ht3433

スコア19

test CHANGED
File without changes
test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Linuxコマンドのinet_ptonを作りたいです。
4
4
 
5
- ネットで調べながらコーディングしてみたのですが、エラーになってしまい、どう対処すればよいか困っています。
5
+ ネットで調べながらコーディングしてみたのですが、void型をuint32_tにキャストしたいのですがエラーになってしまい、どう対処すればよいか困っています。
6
6
 
7
7
  お力添えいただければ幸いです。
8
8
 
@@ -18,17 +18,15 @@
18
18
 
19
19
  ```
20
20
 
21
- エラー: ‘uint32_t {aka unsigned int}’ から ‘const char*’ への無効な変換です [-fpermissive]
21
+ エラー: ‘uint32_t {aka unsigned int}’ から ‘const void*’ へ の無効な変換です [-fpermissive]
22
22
 
23
- src = net_No;
23
+ memcpy( dst, No.number1, 4);
24
24
 
25
- エラー: expected unqualified-id before ‘=’ token
26
25
 
27
- in_addr = src;
28
26
 
29
- エラー: expected primary-expression before)’ token
27
+ エラー: initializing argument 2 of ‘void* memcpy(void*, const void*, size_t)’ [-fpermissive]
30
28
 
31
- strcpy( dst, in_addr );
29
+ extern void *memcpy (void *__restrict __dest, const void *__restrict __src,
32
30
 
33
31
  ```
34
32
 
@@ -52,9 +50,19 @@
52
50
 
53
51
 
54
52
 
55
- int inet_pton(const char *src,void *dst )
56
53
 
54
+
55
+ int inet_pton(const char *src, void *dst ){
56
+
57
+
58
+
57
- {
59
+ // 変数の宣言
60
+
61
+ int suuti1,suuti2,suuti3,suuti4;
62
+
63
+
64
+
65
+ // 共用体の型の定義
58
66
 
59
67
  union number{
60
68
 
@@ -64,73 +72,47 @@
64
72
 
65
73
  };
66
74
 
67
- union number No;
68
75
 
69
- uint32_t net_No;
70
76
 
71
- No.number2[0] = 130;
77
+ // 共用体の変数名の宣言
72
78
 
73
- No.number2[1] = 0;
79
+ union number No;
74
-
75
- No.number2[2] = 7;
76
-
77
- No.number2[3] = 23;
78
80
 
79
81
 
80
82
 
81
- net_No = htonl( No.number1 );
83
+ // srcの文字列を数値に変換する
84
+
85
+ sscanf( src, "%d.%d.%d.%d", &suuti1, &suuti2, &suuti3, &suuti4 );
82
86
 
83
87
 
84
88
 
85
- // srcをIPv4のネットワークアドレス構造体に変換
89
+ // 数値に変換したものを変数に格納する
86
90
 
87
- src = net_No;
91
+ No.number2[0] = suuti1;
92
+
93
+ No.number2[1] = suuti2;
94
+
95
+ No.number2[2] = suuti3;
96
+
97
+ No.number2[3] = suuti4;
88
98
 
89
99
 
90
100
 
101
+ // void型のdstをuint32_t型にキャストする
102
+
91
- in_addr = src;
103
+ No.number1 = ( uintptr_t )&dst;
92
104
 
93
105
 
94
106
 
95
- // dstにコピーする
107
+ // number1の4バイト分のメモリをdstにコピーする
96
108
 
97
- strcpy( dst, in_addr );
109
+ memcpy( dst, No.number1, 4);
98
110
 
99
111
 
100
112
 
101
- return( 0 );
102
-
103
- }
104
113
 
105
114
 
106
-
107
- int main(){
108
-
109
- int result;
110
-
111
- struct in_addr in_addr;
112
-
113
-
114
-
115
- result = inet_pton("130.0.7.23", &in_addr);
116
-
117
- assert(result == 1 && in_addr.s_addr == ((23<<24)|(7<<16)|(0<<8)|130));
118
-
119
-
120
-
121
- result = inet_pton("130.00.7.23", &in_addr);
122
-
123
- assert(result == 0);
124
-
125
-
126
-
127
- result = inet_pton("130.01.7.23", &in_addr);
128
-
129
- assert(result == 0);
130
-
131
-
132
-
133
- return(0);
115
+ return( 1 );
134
116
 
135
117
  }
136
118