for文の使い方について質問

このQ&Aのポイント
  • プログラムの一部にあるfor文の使い方について質問があります。
  • 8行目のfor文の意味が分かりません。
  • 8行目のfor文でsにns[0]を入れる意味がないと思いますが、なぜここでfor文が使われているのでしょうか?
回答を見る
  • ベストアンサー

for 変数 in ・・・ の使い方について

for 変数 in ・・・ の使い方について 以下のプログラムの一部について質問です。 require 'socket' port = 2000 server = TCPServer.open(port) socks = [server] while true ns = select(socks) next if ns == nil for s in ns[0] if s == server (以下略) 8行目のfor s in ns[0]の使われ方が納得できません。 sにns[0]を入れると、<<を使っても変更されないから、意味がないと思うのですが、なぜここでforを使ってるんでしょうか? ns[0]を消去するようなメソッドはforの下ではつかわれていないようにみえるのですが・・・。

  • ghfjri
  • お礼率92% (372/403)
  • Ruby
  • 回答数1
  • ありがとう数7

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.1

>sにns[0]を入れると、<<を使っても変更されないから、意味がないと思うのですが、なぜここでforを使ってるんでしょうか? >ns[0]を消去するようなメソッドはforの下ではつかわれていないようにみえるのですが・・・。 このあたりの意味が不明ですが、ns には、nil(タイムアウト)でない場合、三要素の配列が返りますが、ns[0]が入力、ns[1]が出力、ns[2]が例外のそれぞれ配列になります。 この例だと、select時に、入力のみ引数に渡して、それも一要素だけ渡しているので、実際には、ns は nil もしくは [[server],[],[]] のどちらかしかあり得ません。従って、 for s in ns[0] if s == server ~ end end でなく、 s=ns[0][0] ~ でも同じです。 一般には、ns[0]が一要素とは限らないため、要素数だけ繰り返しが必要になりますし、出力待ちもしている場合はns[1]も見る必要があります。

ghfjri
質問者

お礼

回答ありがとうございました。 selectが3つの要素を持つ配列を返すということが理解できていなかったのが誤解の原因のようです。 助かりました。

関連するQ&A

  • なぜ?グローバル変数に代入できません!

    お世話になります。 以下、例文です。 flag = new Array();//グローバル変数として用意 function selectCount() { for (count = 0; count <= document.form1.length - 1; count++) { if (form1.elements[count].type == "select-one") { itemflag[count] = true; alert(itemflag[count]); } } alert(itemflag[1]+'aa'); } <body onLoad = "selectCount();"> htmlの中にあるselectオブジェクトの数を調べ、 その数の分フラグを作成し、true指定するメソッドを作成したつもりです。 しかし、for文を抜けたところにalertを置き、実際に trueが代入されているか調べたところ、値はundefineになってしまいました。for文内で値が代入されていることは確認されているにも関わらず、です。 なぜでしょうか?for文でのtrue、false指定は,for文外では機能しないのでしょうか? ご存じの方いらっしゃいましたら、ご教授宜しくお願い致します。

  • perlのfor文について

    perlなのですが、以下のfor文の書き方について教えてください。 for($var1,$var2,$var3,$var4){ s/^(?:Company|Organization|Office|Location)\s*:\s*// if( $_ ); s/"(?:[^"]|\")*"//g if( $_ ); 1 while s/\([^()]*\)//g if( $_ ); } これは、どのようなfor文なのでしょうか。 for文の最後に「1 while」とあるのですが、最後の行の1とは どういう意味で、ここでは何をしているのでしょうか。 また、if文が置換の処理より後ろにかかれていますが、実際は if文が先に動いているのでしょうか。 それと、「 1 while s/\([^()]*\)//g if( $_ );」が以下のようにエラー がでます。 「syntax error at x.pl line x, near "s/\([^()]*\)//g if"」 エラーを出さないようにするにはどうしたらよいでしょうか。

  • TCPプログラミング

    以下のプログラムをコンパイルして実行したら Exception in thread "main" java.lang.IllegalArgumentException: Paraneter(s):<Server> <Word> [<Port>] at TCPEchoClient.main(TCPEchoClient.java:9) というメッセージが表示されました。 このメッセージの意味が全く分かりません。 分かる方がいらっしゃいましたら教えてください。 お願いします。 本来なら Received:****(←****は自分が指定した文字列) となるはずなんですが… このプログラムはTCPを使ってエコーサーバと通信するクライアントです。 import java.net.*; import java.io.*; public class TCPEchoClient{ public static void main(String[] args)throws IOException{ if((args.length < 2)||(args.length > 3)) throw new IllegalArgumentException("Parameter(s):<Server><Word>[<Port>]"); String server = args[0]; byte[] byteBuffer = args[1].getBytes(); int servPort = (args.length == 3) ? Integer.parseInt(args[2]) : 7; Socket socket = new Socket(server,servPort); System.out.println("Connected to server...sending echo string"); InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); out.write(byteBuffer); int totalBytesRcvd = 0; int bytesRcvd; while(totalBytesRcvd < byteBuffer.length){ if(bytesRcvd = in.read(byteBuffer, totalBytesRcvd, byteBuffer.length - totalBytesRcvd) == -1) throw new SocketException("Connection closed prematurely"); totalBytesRcvd += bytesRcvd; } System.out.println("Received: " + new String (byteBuffer)); socket.close(); } }

  • TCPのプログラムで例外エラーが出て困っています

    java eclipeを使って通信のプログラムを作ろうとしています。 参考にしている本は、TCP/IPソケットプログラミングjava編です。 本に書かれてるソースコードのとおりに入力したら、 Exception in thread "main" java.lang.IllegalArgumentException: Parameter(s): <Server> <word> [<Port>] at socket_33.TCPEchoClient.main(TCPEchoClient.java:15) というエラーが出ました。 このエラーを調べると、 「不正な引数、または不適切な引数をメソッドにわたしたことを示すためにスローされる」とかかれていました。 また、 <Server> <word> [<Port>] に何か文字を入力すればよいとも書かれていました。 具体的には、何を入力すればよいのでしょうか? 他のページを見て試してみても、例外エラーがとれません。 下にソースコードを載せますので、おかしな部分がありましたら、 そちらのご指導もお願いします。 package socket_33; import java.net.*; // Socketに必要 import java.io.*; // IOException,Input/OutputStreamに必要 public class TCPEchoClient { /** * @param args */ public static void main(String[] args) throws IOException { if ((args.length < 2) || (args.length > 3)) // 引数の数が正しいかどうかを調べる throw new IllegalArgumentException("Parameter(s): <Server> <word> [<Port>]"); String server = args[0]; // サーバ名またはIPアドレス // デフォルトの文字エンコード方式を使って入力Stringをバイトに変換する byte[] byteBuffer = args[1].getBytes(); int servPort = (args.length == 3) ? Integer.parseInt(args[2]) : 7; // サーバの指定されたポートに接続するソケットを作成する Socket socket = new Socket(server, servPort); System.out.println("Connected to server...sending echo string"); InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); out.write(byteBuffer); // エンコードされた文字列をサーバに送信する // サーバから同じ文字列を受信する int totalBytesRcvd = 0; // これまでに受信した合計バイト数 int bytesRcvd ; // 前回の読み込みで受信したバイト数 while (totalBytesRcvd < byteBuffer.length){ if ((bytesRcvd = in.read(byteBuffer,totalBytesRcvd,byteBuffer.length - totalBytesRcvd)) == -1) throw new SocketException("Connection closed prenmaturely"); totalBytesRcvd += bytesRcvd; } System.out.println("Received: " + new String(byteBuffer)); socket.close(); // ソケットとストリームをクローズする } }

  • inの使い方について

    以下の分でなぜinが使われているかわかりません。 The actual delivery time for the item(s) in your order どちらかと言えば以下のようにofのような気がするのですが。 The actual delivery time for the item(s) of your order inはtimeにかかっていると思うのですがこれだとニュアンス的に オーダーの中の時間となり違和感があるのですが、 英語ではこれが普通なのでしょうか? The actual delivery time in your order もしそうであれば、どのようなときにこの文法が使われるか教えていただけますでしょうか? よろしくお願いいたします。 全文 You have chosen to ship your order via expedited shipping. The delivery estimate for this method to your address is 2 to 5 business days after shipping. The actual delivery time for the item(s) in your order will depend on the shipping policies of CABOARDZ and when the item(s) are available to ship.

  • C言語で作成するチャットについて

    LinuxでC言語のチャットプログラムを作成しています。プログラムを作ってみましたがうまく動きません。悪い個所が分からないのでお力を貸して頂きたいです課題の提出が迫っているので、よろしくお願いいたします。 <server> #include省略 #define PORT 5320 char *show_ip(char *ip_address); int main(void){ int soc, acc, size, child[3],width,i,count,pos,ret; char buffer[80]; struct sockaddr_in client, server; struct sockaddr_storage from; struct hostent *server_host; socklen_t len; fd_set mask; char host_name[257]; int temp; memset(host_name, 0, sizeof(host_name)); gethostname(host_name, 256); server_host = gethostbyname(host_name); printf("\n-------- informations of server ----------\n"); printf("Host name:%s\n", host_name); printf("IP = %s\n", show_ip(server_host->h_addr)); printf("\n\n"); soc = socket(AF_INET, SOCK_STREAM, 0); memset((char *)&server, 0, sizeof(server)); server.sin_family = AF_INET; server.sin_addr.s_addr = htonl(INADDR_ANY); server.sin_port = htons(PORT); bind(soc, (struct sockaddr *)&server, sizeof(server)); size = sizeof(client); listen(soc, 5); for (i = 0; i < 3; i++){ child[i] = -1; } for (;;) { FD_ZERO(&mask); FD_SET(soc, &mask); for (i = 0; i < 3; i++) { if (child[i] != -1){ FD_SET(child[i], &mask); if(child[i]+1 > width){ width = child[i]+1; } } } switch(select(soc+1, (fd_set *) &mask, NULL, NULL, NULL)) { case -1: perror("select"); break; case 0: break; default: if (FD_ISSET(soc, &mask)){ len = (socklen_t) sizeof(from); if((acc = accept(child[i], (struct sockaddr *)&from, &len)) == -1){ if(errno != EINTR){ perror("accept"); } }else{ if(child[0]&&child[1]&&child[2]!=-1){ fprintf(stderr,"child is full : cannot accept\n"); close(acc); }else{ if(child[0] == -1){ child[0] = acc; }else if(child[1] == -1){ child[1] = acc; }else{ child[2] = acc; } } } } for(i=0;i<3;i++){ if(child[i]!=-1){ if(FD_ISSET(child[i],&mask)){ memset(buffer, '\0', sizeof(buffer)); recv(child[i], buffer, 80, 0); printf("%s> ", show_ip((char *)&client.sin_addr)); printf("%s", buffer); if(strncmp(buffer, "exit", 4) == 0) break; for(i=0;i<3;i++) { send(child[i],show_ip((char *)&client.sin_addr),80,0); send(child[i],buffer,80,0); close(child[i]); } (void) close(child[i]); child[i] = -1; } } break; } } } } char *show_ip(char *ip_address){ static char ip[7]; char ipnum[4]; bcopy(ip_address, ipnum, 4); sprintf(ip, "%u.%u.%u.%u",(unsigned char)ipnum[0], (unsigned char)ipnum[1], (unsigned char)ipnum[2],(unsigned char)ipnum[3]); return ip; } <client> #include省略 #define STDIN_FD 0 #define PORT 5320 int select_func(int sockfd); void err_func(char *msg){ perror(msg); exit(EXIT_FAILURE); } int main(int argc, char **argv){ int sockfd, len; char buf[BUFSIZ]; struct sockaddr_in serv; unsigned short port; if(argc != 3){ printf("usage: progname serv_ip serv_port\n"); exit(EXIT_FAILURE); } if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) err_func("socket"); serv.sin_family = PF_INET; port = (unsigned short)atoi(argv[2]); serv.sin_port = htons(port); inet_aton(argv[1], &(serv.sin_addr)); if(connect(sockfd, (struct sockaddr *)&serv, sizeof(struct sockaddr_in)) < 0) err_func("connect"); do{ if(select_func(sockfd) == 0){ len = recv(sockfd, buf, BUFSIZ, 0); buf[len] = '\0'; printf("-> %s\n", buf); }else{ len = read(STDIN_FD, buf, BUFSIZ); len = send(sockfd, buf, len, 0); } }while(strncmp(buf, "EXIT\r\n", 6) != 0 && strncmp(buf, "EXIT\n", 5) != 0); close(sockfd); return 0; } int select_func(int sockfd){ fd_set rfds; FD_ZERO(&rfds); FD_SET(sockfd, &rfds); FD_SET(STDIN_FD, &rfds); if(select(sockfd+1, &rfds, NULL, NULL, NULL) < 0) err_func("select"); if(FD_ISSET(STDIN_FD, &rfds)) return STDIN_FD; return sockfd; }

  • Vista 非同期接続

    Vista と VC++2005 でソケット関連のソフトを作っています。  下のようなコードでは BEGIN_MESSAGE_MAP(SQMailDLDlg, CDialog) // Don't show process //{{AFX_MSG_MAP(MailRecDlg2) ON_MESSAGE(SM_ASYNC, HandleAsyncMsg) //}}AFX_MSG_MAP END_MESSAGE_MAP() として、登録してある関数 HandleAsyncMsg() が呼び出されないのですが、 どこに原因があるのでしょうか? SendMessage(SM_ASYNC); とすれば、もちろん呼び出せます。 RetVal = getaddrinfo(gszServerName, Port, &Hints, &AddrInfo); if (RetVal != 0) { sprintf(outbuf3, "Cannot resolve address [%s] and port [%s], error %d: %s\n", Server, Port, RetVal, gai_strerror(RetVal)); WSACleanup(); return;// -1; } for (AI = AddrInfo; AI != NULL; AI = AI->ai_next) { ConnSocket = socket(AI->ai_family, AI->ai_socktype, AI->ai_protocol); if (ConnSocket == INVALID_SOCKET) { sprintf(outbuf3,"Error Opening socket, error %d: %s\n", WSAGetLastError(), DecodeError(WSAGetLastError())); continue; } if (WSAAsyncSelect(ConnSocket, *this, SM_ASYNC, FD_READ|FD_WRITE|FD_CLOSE|FD_CONNECT) == SOCKET_ERROR){ MessageBox("WSAAsyncSelect() failed","Error", MB_OK); closesocket(ConnSocket); ConnSocket = INVALID_SOCKET; continue; } if (connect(ConnSocket, AI->ai_addr, AI->ai_addrlen) == SOCKET_ERROR){ if(WSAGetLastError() != WSAEWOULDBLOCK){ closesocket(ConnSocket); ConnSocket = INVALID_SOCKET; continue; } break; } } if (AI == NULL) { sprintf(outbuf3, "Fatal error: unable to connect to the server.\n"); WSACleanup(); return;// -1; } よろしくお願いします。

  • ruby for文

    for文を用いる s=1+2+5+10+17...+50 s=0;i=1;j=1 for i in 1..100 s+=1 i+=j if i>50 break end j+=2 end puts s この問題の意味がよくわかりません。。 よかったら説明してくれると助かります。。 j+=2 ここはなんで2なんしょうか? 特にここのところはなんでこうなっているんですか? iとかjとかを使っている意味がわかりません。。

    • ベストアンサー
    • Ruby
  • 英語 完了形の期間はforかinかoverか?

    英作文の勉強をしているものですが解決できない疑問にぶつかりました. ある本に,以下のような説明がありました. 1. S + 現在完了形(動作動詞) + in/over 期間 2. S + 現在完了形(状態動詞) + for 期間 (連続性が無い場合はinもありうる) 3. S + 現在完了進行形(動作動詞) + for 期間 しかし以下の日本文に対する英文が何故このようになるか説明がつきません. Answer1について現在完了進行形だからforなのは分かりますが,Answer2はなぜforはダメで overなのでしょうか?Answer1と2の違いは,その節の書き出しを more and moreから the number ofの形に変えただけだと思うのですが. 【日本文】 数年前から東京に来るツバメの数が減っているというが,確かな原因は分かってない. 【英文】 Answer 1. Fewer and fewer swallows have been returning to Tokyo for the last few years, but nobody knows why. Answer 2. For some reason, the number of swallows returing to Tokyo have been decreasing over[for△] the last few years.

  • TCPプログラミング

    次のコードを入力したのですが、コンパイルできません。 エラーについても良く分かりません。 import java.net.*; import java.io.*; public class TCPEchoClient{ public static void main(String[] args)throws IOException{ if((args.length < 2)||(args.length > 3)) throw new IllegalArgumentException("Parameter(s):<Server><Word>[<Port>]"); String server = args[0]; byte[] byteBuffer = args[1].getBytes(); int servPort = (args.length == 3) ? Integer.parseInt(args[2]) : 7; Socket socket = new Socket(server,servPort); System.out.println("Connected to server...sending echo string"); InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); out.write(byteBuffer); int totalBytesRcvd = 0; int bytesRcvd; while(totalBytesRcvd < byteBuffer.length){ if(bytesRcvd = in.read(byteBuffer, totalBytesRcvd, byteBuffer.length - totalBytesRcvd) == -1) throw new SocketException("Connection closed prematurely"); totalBytesRcvd += bytesRcvd; } System.out.println("Received: " + new String (byteBuffer)); socket.close(); } } これについて、 if(bytesRcvd = in.read(byteBuffer, totalBytesRcvd, byteBuffer.length - totalBytesRcvd) == -1) この行にエラーがあるらしいです。 どう解決していいのか分かりません。 どなたか説明してもらえませんか。

    • ベストアンサー
    • Java

専門家に質問してみよう