質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

1598閲覧

C++の変数の型"P1m"について知りたい。

man_

総合スコア45

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/05/19 10:26

#困っている点。
C++のtypeid().name()という関数を使用して変数の型を確認したところ、"P1m"という名前の型が出力されました。
しかし、インターネットで"C++ P1m"と検索してもP1mに関する情報が得られませんでした。
そこで、P1mという型について詳しく教えてください。

有識者の方々、ご助力お願いします。

#ソースコード
以下にソースコードがあるgithubのリンクを示します。
https://github.com/yzaki/verus

本コードは、上記のページの/src/verus_client.cppというファイルになります。
また、typeid().name()の出力は下記のコードの90行目で行っています。

cpp

1#include "verus.hpp" 2 3int len_inet; // length 4int s,err; 5 6char* port; 7char* srvr_addr; 8unsigned int delay = 0; 9 10bool receivedPkt = false; 11bool terminate = false; 12 13struct sockaddr_in adr_srvr; 14struct sockaddr_in adr_srvr2; 15struct sockaddr_in adr; 16 17pthread_t timeout_tid; 18pthread_t sending_tid; 19 20typedef struct { 21 udp_packet_t *pdu; 22 long long seconds; 23 long long millis; 24} sendPkt; 25 26std::vector<sendPkt*> sendingList; 27pthread_mutex_t lockSendingList; 28 29boost::asio::io_service io; 30boost::asio::deadline_timer timer (io, boost::posix_time::milliseconds(SS_INIT_TIMEOUT)); 31 32static void displayError(const char *on_what) { 33 fputs(strerror(errno),stderr); 34 fputs(": ",stderr); 35 fputs(on_what,stderr); 36 fputc('\n',stderr); 37 exit(1); 38} 39 40void TimeoutHandler( const boost::system::error_code& e) { 41 int z; 42 43 if (e) return; 44 45 z = sendto(s,"Hallo", strlen("Hallo"), 0, (struct sockaddr *)&adr_srvr2, len_inet); 46 if ( z < 0 ) 47 displayError("sendto(Hallo)"); 48 49 //update timer and restart 50 timer.expires_from_now (boost::posix_time::milliseconds(1000)); 51 timer.async_wait(&TimeoutHandler); 52 53 return; 54} 55 56void* sending_thread (void *arg) 57{ 58 int s1, z; 59 struct timeval timestamp; 60 sendPkt *pkt; 61 62 memset(&adr_srvr,0,sizeof adr_srvr); 63 64 adr_srvr2.sin_family = AF_INET; 65 adr_srvr2.sin_port = htons(atoi(port)); 66 adr_srvr2.sin_addr.s_addr = inet_addr(srvr_addr); 67 68 if ( adr_srvr2.sin_addr.s_addr == INADDR_NONE ) { 69 displayError("bad address."); 70 } 71 72 s1 = socket(AF_INET,SOCK_DGRAM,0); 73 if ( s1 == -1 ) { 74 displayError("socket()"); 75 } 76 77 while (!terminate) { 78 gettimeofday(&timestamp,NULL); 79 80 pthread_mutex_lock(&lockSendingList); 81 82 if (sendingList.size() > 0) 83 pkt = * sendingList.begin(); 84 85 // since tc qdisc command in Linux seems to have some issues when adding delay, we defer the packet here 86 if (sendingList.size() > 0 && (timestamp.tv_sec-pkt->seconds)*1000.0+(timestamp.tv_usec-pkt->millis)/1000.0 > delay) { 87 // sending ACK 88 z = sendto(s1, pkt->pdu, sizeof(udp_packet_t), 0, (struct sockaddr *)&adr_srvr2, len_inet); 89 // ここで出力している。 90 std::cout << typeid(pkt->pdu).name() << "\n"; 91 free (pkt->pdu); 92 93 if (z < 0) 94 if (errno == ENOBUFS || errno == EAGAIN || errno == EWOULDBLOCK) 95 std::cout << "reached maximum OS UDP buffer size\n"; 96 else 97 displayError("sendto(2)"); 98 99 sendingList.erase(sendingList.begin()); 100 pthread_mutex_unlock(&lockSendingList); 101 } 102 else{ 103 pthread_mutex_unlock(&lockSendingList); 104 usleep(0.01); 105 } 106 } 107 108 return NULL; 109} 110 111void* timeout_thread (void *arg) 112{ 113 boost::asio::io_service::work work(io); 114 115 timer.expires_from_now (boost::posix_time::milliseconds(SS_INIT_TIMEOUT)); 116 timer.async_wait(&TimeoutHandler); 117 io.run(); 118 119 return NULL; 120} 121 122int main(int argc,char **argv) { 123 int z; 124 int i = 1; 125 char command[512]; 126 char tmp[512]; 127 128 udp_packet_t *pdu; 129 sendPkt *pkt; 130 struct timeval timestamp; 131 setbuf(stdout, NULL); 132 std::ofstream clientLog; 133 134 pthread_mutex_init(&lockSendingList, NULL); 135 136 if (argc < 4) { 137 std::cout << "syntax should be ./verus_client <server address> -p <server port> [-d <additional link delay in ms>] \n"; 138 exit(0); 139 } 140 141 srvr_addr = argv[1]; 142 143 while (i != (argc-1)) { // Check that we haven't finished parsing already 144 i=i+1; 145 if (!strcmp (argv[i], "-p")) { 146 i=i+1; 147 port = argv[i]; 148 } else if (!strcmp (argv[i], "-d")) { 149 i=i+1; 150 delay = atoi(argv[i]); 151 }else { 152 std::cout << "syntax should be ./verus_client <server address> -p <server port> [-d <additional link delay in ms>] \n"; 153 exit(0); 154 } 155 } 156 157 memset(&adr_srvr,0,sizeof adr_srvr); 158 159 adr_srvr.sin_family = AF_INET; 160 adr_srvr.sin_port = htons(atoi(port)); 161 adr_srvr.sin_addr.s_addr = inet_addr(srvr_addr); 162 163 if ( adr_srvr.sin_addr.s_addr == INADDR_NONE ) { 164 displayError("bad address."); 165 } 166 167 len_inet = sizeof adr_srvr; 168 169 s = socket(AF_INET,SOCK_DGRAM,0); 170 if ( s == -1 ) { 171 displayError("socket()"); 172 } 173 174 std::cout << "Sending request to server \n"; 175 176 //printf("Sending Hallo to %s:%s\n", srvr_addr, port); 177 z = sendto(s,"Hallo", strlen("Hallo"), 0, (struct sockaddr *)&adr_srvr, len_inet); 178 if ( z < 0 ) 179 displayError("sendto(Hallo)"); 180 181 if (pthread_create(&(timeout_tid), NULL, &timeout_thread, NULL) != 0) 182 std::cout << "can't create thread: " << strerror(err) << "\n"; 183 184 if (pthread_create(&(sending_tid), NULL, &sending_thread, NULL) != 0) 185 std::cout << "can't create thread: " << strerror(err) << "\n"; 186 187 188 // starting to loop waiting to receive data and to ACK 189 while(!terminate) { 190 pdu = (udp_packet_t *) malloc(sizeof(udp_packet_t)); 191 192 socklen_t len = sizeof(struct sockaddr_in); 193 z = recvfrom(s, pdu, sizeof(udp_packet_t), 0, (struct sockaddr *)&adr, &len); 194 if ( z < 0 ) 195 displayError("recvfrom(2)"); 196 197 if (pdu->ss_id < 0) { 198 clientLog.close(); 199 terminate = true; 200 } 201 202 // stopping the io timer for the timeout 203 if (!receivedPkt) { 204 sprintf (command, "client_%s.out", port); 205 clientLog.open(command); 206 receivedPkt = true; 207 io.stop(); 208 std::cout << "Connected to server \n"; 209 } 210 211 gettimeofday(&timestamp,NULL); 212 sprintf(tmp, "%ld.%06d, %llu\n", timestamp.tv_sec, timestamp.tv_usec, pdu->seq); 213 clientLog << tmp; 214 215 pkt = (sendPkt *) malloc(sizeof(sendPkt)); 216 pkt->pdu = pdu; 217 pkt->seconds = timestamp.tv_sec; 218 pkt->millis = timestamp.tv_usec; 219 220 pthread_mutex_lock(&lockSendingList); 221 sendingList.push_back(pkt); 222 pthread_mutex_unlock(&lockSendingList); 223 224 } 225 226 std::cout << "Client exiting \n"; 227 close(s); 228 return 0; 229} 230

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WoodenHamlet

2021/05/19 10:39

grepしてみても、P1mという記述が見当たらないのですが…?
guest

回答3

0

typeinfo::name() が返す文字列は"実装依存"、
型に対しコンパイラが内部的に付与した(単なる)シンボルです。

型 A, B に対し
同じ型なら typeid(A).name() と typeid(B).name() は同じ
異なる型なら typeid(A).name() と typeid(B).name() は異なる
ことが保証されているに過ぎません。

投稿2021/05/19 10:39

編集2021/05/19 10:40
episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

man_

2021/05/19 11:05

回答ありがとうございます。 typeid関数をpythonのtype関数のようなものだと勘違いしていました。
guest

0

ベストアンサー

type_infoname実装定義、つまりコンパイラの都合で勝手に決められる名前を返してきます(cpprefjp)。人間が直接読んで意味のある値かどうかもコンパイラ次第です。

コードをたどると、pkt->pduの型はudp_packet_t *です。

投稿2021/05/19 10:38

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

man_

2021/05/19 11:13

回答ありがとうございます。
guest

0

typeid().name() と abi::__cxa_demangle() を参考にしてください。

C++

1#include <iostream> 2#include <typeinfo> 3#include <string> 4#include <vector> 5#include <cxxabi.h> 6using namespace std; 7 8class m; 9 10int main() 11{ 12 cout << typeid(m *).name() << ": m *" << endl; 13 int status; 14 cout << abi::__cxa_demangle("P1m", 0, 0, &status) << endl; 15 cout << "---\n"; 16 cout << typeid(int).name() << ": int" << endl; 17 cout << typeid(unsigned int).name() << ": unsigned int" << endl; 18 cout << typeid(short).name() << ": short" << endl; 19 cout << typeid(unsigned short).name() << ": unsigned short" << endl; 20 cout << typeid(long).name() << ": long" << endl; 21 cout << typeid(unsigned long).name() << ": unsigned long" << endl; 22 cout << typeid(long long).name() << ": long long" << endl; 23 cout << typeid(unsigned long long).name() << ": unsigned long long" << endl; 24 cout << typeid(bool).name() << ": bool" << endl; 25 cout << typeid(char).name() << ": char" << endl; 26 cout << typeid(signed char).name() << ": signed char" << endl; 27 cout << typeid(unsigned char).name() << ": unsigned char" << endl; 28 cout << typeid(float).name() << ": float" << endl; 29 cout << typeid(double).name() << ": double" << endl; 30 cout << typeid(long double).name() << ": long double" << endl; 31 cout << typeid(int *).name() << ": int *" << endl; 32 cout << typeid(int [3]).name() << ": int [3]" << endl; 33 cout << typeid(string).name() << ": string" << endl; 34 cout << typeid(vector<int>).name() << ": vector<int>" << endl; 35 cout << "---\n"; 36 cout << abi::__cxa_demangle("NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", 0, 0, &status) << endl; 37 cout << abi::__cxa_demangle("St6vectorIiSaIiEE", 0, 0, &status) << endl; 38}

実行結果

text

1P1m: m * 2m* 3--- 4i: int 5j: unsigned int 6s: short 7t: unsigned short 8l: long 9m: unsigned long 10x: long long 11y: unsigned long long 12b: bool 13c: char 14a: signed char 15h: unsigned char 16f: float 17d: double 18e: long double 19Pi: int * 20A3_i: int [3] 21NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE: string 22St6vectorIiSaIiEE: vector<int> 23--- 24std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > 25std::vector<int, std::allocator<int> >

投稿2021/05/19 15:17

編集2021/05/19 15:27
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問