トップページ⇒tech
1001コメント301KB

【初心者歓迎】C/C++室 Ver.49【環境依存OK】

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん2008/02/20(水) 12:33:41
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.48【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1202141921/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0896デフォルトの名無しさん2008/02/27(水) 09:02:30
>>895
ありがとー 出来ました。
コンパイルは出来てましたがNULLが表示されました。
getchar();しないと画面が速攻閉じてしまうので、画面確認用にです。
0897デフォルトの名無しさん2008/02/27(水) 09:06:36
>>896
修正したソースを張ってみないと有効な回答は得られないと思うよ。
0898デフォルトの名無しさん2008/02/27(水) 09:09:57
int* random_array(int n);
shared_ptr<int> p(random_array(100));
というように書けないのですが、shared_ptrの作成時って、必ずnew[100]とかって
やらないとだめなのですか?
0899デフォルトの名無しさん2008/02/27(水) 09:30:04
>>898
arrayの共有にはshared_arrayな。
それとエラーメッセージ書かないとエスパーしか解答できない。
0900デフォルトの名無しさん2008/02/27(水) 11:36:18
system("path %PATH%; C:\\hofe;");
が有効になりません・・・
なぜでしょう
0901デフォルトの名無しさん2008/02/27(水) 11:59:17
>>900
環境変数はプロセスごとに別々だから
子プロセスを起動してPATHを設定させても自プロセスには影響しない
0902デフォルトの名無しさん2008/02/27(水) 12:07:43
改行しても無理でした パスを直うちするか、そこへ移動するしかないですか?
APIでPath設定できるか調べてみます
system("path C:\\hofe; \n abc.exe");
0903デフォルトの名無しさん2008/02/27(水) 12:20:15
pathを追加する方法教えてください わかりませんでした
0904デフォルトの名無しさん2008/02/27(水) 12:24:10
SetEnvironmentVariable
0905デフォルトの名無しさん2008/02/27(水) 12:30:25
サンクス
長い実行パスと、長いパラメータパスで困ってました
これで解決しそうです
0906デフォルトの名無しさん2008/02/27(水) 13:29:07
#include "stdafx.h"
#include <string>
#include <stdio.h>
#include <iostream>

using namespace std;

略)

string x;

sprintf(x, "%02x%02x%02x%02x%02x\n", buf[0], buf[1], buf[2], buf[3], buf[4]);

これで、buf[0], buf[1], buf[2], buf[3], buf[4]の値をstring型 でx代入したいんですけど
xが定義されていないと怒られてしまいます。どうしたら良いのでしょうか?
0907デフォルトの名無しさん2008/02/27(水) 13:39:20
string x(11,'\0');

sprintf(&x[0], "%02x%02x%02x%02x%02x\n", buf[0], buf[1], buf[2], buf[3], buf[4]);

これは無理?
0908デフォルトの名無しさん2008/02/27(水) 13:51:44
>>907
テラThanks
0909デフォルトの名無しさん2008/02/27(水) 13:57:03
まず間違いなく大丈夫ではあるものの一応標準外の仕様だと心にとどめておくといい
0910デフォルトの名無しさん2008/02/27(水) 14:02:11
winsockを使うときエコーバックするのは普通ですか?
それとも負荷を下げるためにしませんか?
少量ずつデータ受け取ればミスしにくくなると思うんですけど
少しずつ受け取って確認無しでいいですか
0911デフォルトの名無しさん2008/02/27(水) 14:02:13
次の改訂で標準になるけど、コンパイラの対応が普及するまで合わせると、
問題ないと言えるのは何年も先かなぁ。
0912デフォルトの名無しさん2008/02/27(水) 14:09:00
http先のファイルのサイズやcrcを取得する方法教えてください
それみてデータが正常が判定したいです
0913デフォルトの名無しさん2008/02/27(水) 14:23:32
>>910
何をどこにエコーバックするんだ
ミスって何のだ

>>912
ファイルサイズは全部受信すればわかるだろう
CRCの計算方法はこれ↓
http://en.wikipedia.org/wiki/Computation_of_CRC
0914デフォルトの名無しさん2008/02/27(水) 14:40:20
>>912
サイズはレスポンスヘッダのContent-Length (ない場合もある)
CRC は無理かと
09159072008/02/27(水) 14:46:39
もう一つ教えて下さい。

char str[100];

sprintf(str, "%02x%02x%02x%02x%02x\n", buf[0], buf[1], buf[2], buf[3], buf[4]);

char str0[100];
char str1[] = "01061719d0";
char str2[] = "0106171f34";

if (strcmp(str, str1) == 0){
printf("この番号は登録されています�@\n番号%s\n",str);
}
else if (strcmp(str, str2) == 0){
printf("この番号は登録されています�A\n番号%s\n",str);
}
else {
printf("この番号は登録されていません\n番号%s\n",str);
}
このようなif文にしたいのですが、登録したbuf[]を読み込んでも"この番号は登録されていません"
と表示されてしまいます。なぜでしょうか?
0916デフォルトの名無しさん2008/02/27(水) 14:53:34
std::vectorとCStringでは、empty() (とEmpty()) の意味違うのね〜

しばらく騙されてました。
0917デフォルトの名無しさん2008/02/27(水) 14:54:36
stlのset使った方がいいんじゃない
0918デフォルトの名無しさん2008/02/27(水) 15:03:58
>>915
strを表示させてみるんだ
0919デフォルトの名無しさん2008/02/27(水) 15:06:37
>>914
GETでして送られてくるヘッダをみるんですよね?
2chのスレURLいれるとサイズ書いてないです
できる限りなんとか取得する方法無いですか?
0920デフォルトの名無しさん2008/02/27(水) 15:08:28
送受信のデータです

GET http://live27.2ch.net/test/read.cgi/livemarket2/1202634378/ HTTP/1.0

HTTP/1.1 200 OK
Date: Wed, 27 Feb 2008 06:07:25 GMT
Server: Apache/2.0.59 (Unix) PHP/4.4.2 mod_ssl/2.0.59 OpenSSL/0.9.7e-p1
Vary: Accept-Encoding
Connection: close
Content-Type: text/html
0921デフォルトの名無しさん2008/02/27(水) 15:12:53
動的に変化するから無理そうですね
通信切れで見られないHMLの取得を避けたいんですけどいい方法ありませんか
0922デフォルトの名無しさん2008/02/27(水) 15:15:27
最後に </html> が無かったら途中で切れたと判断するとか
0923デフォルトの名無しさん2008/02/27(水) 15:20:51
普通のテキストならどうしたらいいですか?
もともと不完全なHTMLならどうしたらいいですか?
サーバーのファイルと一致していてもエラーになります
09249152008/02/27(水) 15:23:30
>>918
str は 0106719d0 になっているようです><
なんでうまくいかないんだろう。。
0925デフォルトの名無しさん2008/02/27(水) 15:25:54
>>922
HTML4では </html> は省略可能なので万能じゃない

>>920
Connection: close
って書いてあるから接続断まで読めばそれで全部。

あと、なるべくHTTP/1.1使え
手元で確認した限り、HTTP/1.1でアクセスすると
chunked で送ってくるので末尾がちゃんと確認できる
09269202008/02/27(水) 15:28:36
サンクス
0927デフォルトの名無しさん2008/02/27(水) 15:34:26
>>924
sprinf で \n を付けているのに str1, str2 には付いていないぞ
0928デフォルトの名無しさん2008/02/27(水) 15:35:55
HTMLパーサは↓程度はきちんと解析してくれないとねぇ‥‥

46 名前:デフォルトの名無しさん[sage] 投稿日:2008/01/27(日) 00:38:23
これだって正しいでっせ

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<title>テスト</>
<p><em/ほげほげ/
<p style=width:50px<strong>ふーばー</strong</p>
0929デフォルトの名無しさん2008/02/27(水) 15:42:57
1.0から1.1にするとバットリクエストのエラーになります
書式が違うんでしょうか_

buf="GET " + path + " HTTP/1.1\r\n\r\n";
n=send(sock, buf.c_str(), buf.size(), 0);
0930デフォルトの名無しさん2008/02/27(水) 15:44:16
1.1はHostヘッダの送信が必須
0931デフォルトの名無しさん2008/02/27(水) 15:44:52
1.1だと、ユーザー情報も送信しないと無理になるんですか
0932デフォルトの名無しさん2008/02/27(水) 15:54:08
なおらないです どうすればいいですか?

GET /test/read.cgi/livemarket2/1202634378/ HTTP/1.1
Accept: */*
Referer: http://live27.2ch.net/
Accept-Language: ja
Host: live27.2ch.net
Connection: Keep-Alive

HTTP/1.1 400 Bad Request

ソース
buf="GET " + ko+ " HTTP/1.1\r\n\r\n";
cout<<buf; n=send(sock, buf.c_str(), buf.size(), 0);
buf="Accept: */*\r\n\r\n";
cout<<buf; n=send(sock, buf.c_str(), buf.size(), 0);
buf="Referer: http://"+sev+"/"+"\r\n\r\n";;
cout<<buf; n=send(sock, buf.c_str(), buf.size(), 0);
buf="Accept-Language: ja\r\n\r\n";
cout<<buf; n=send(sock, buf.c_str(), buf.size(), 0);
buf="Host: "+sev+"\r\n\r\n";
cout<<buf; n=send(sock, buf.c_str(), buf.size(), 0);
buf="Connection: Keep-Alive\r\n\r\n";
cout<<buf; n=send(sock, buf.c_str(), buf.size(), 0);
0933デフォルトの名無しさん2008/02/27(水) 15:58:54
改行大杉
0934デフォルトの名無しさん2008/02/27(水) 16:01:24
2回改行するのは最後だけ
09359152008/02/27(水) 16:02:42
>>927
盲点でした。
やっと次の作業に進めそうです。本当にありがとうございます。
0936デフォルトの名無しさん2008/02/27(水) 16:06:31
サンクス 改行削って上手くいきました
あと受け取るバッファを多くすると返却値を間違えるようなんです
どうやれば直りますか?
n = recv(sock, &buf[0], 128000, 0);
としてnまで表示するとデータ入ってないときがあります
0937デフォルトの名無しさん2008/02/27(水) 17:05:30
めっちゃミジンコの質問させて下さい。
図書館で借りてきた本のページが抜けてて%cはどういう時に使うのか
わかりません;
%はぐぐれないみたいで困ってます。
0938デフォルトの名無しさん2008/02/27(水) 17:08:24
>>937
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/printf.3.html

文字じゃね?
09399372008/02/27(水) 17:16:21
>>938
まだ始めたばかりなのでこのサイトはちょっと厳しいです・・・。

文字ということで本を読みすすめてみます。
有難うございました。
0940デフォルトの名無しさん2008/02/27(水) 19:49:40
>>932,936
send も recv も、指定したサイズ未満しか送受信できないことがあるので、
その場合にも対応すること。
あと、エラー処理もちゃんと毎回やること。
0941デフォルトの名無しさん2008/02/27(水) 20:53:29
HTTPで初めにサイズだけ取得したとして、読む位置をデータの始まりにシークできますか?
初期化からやり直した方がいいですか?
データ位置を自前で判別して方がネットワークの負荷は少なくなりますが
0942デフォルトの名無しさん2008/02/27(水) 20:55:33
自己解決しました
いったん全部読み込んで、ヘッダとデータを分離してサイズが不一致なら再送にします
0943デフォルトの名無しさん2008/02/27(水) 20:56:50
すいません。タイトルにふさわしく初歩的な質問ですが、
ポインタはメモリを格納しているアドレスの位置を指す
と言いますが、ではそのポインタの情報はどこに格納
されるのでしょうか?

0944デフォルトの名無しさん2008/02/27(水) 21:01:14
実行時なら、それを格納しているのがポインタ変数。

コンパイル時、&xという記述からどうやってxのアドレスを知るかと言うことなら、
それはコンパイラの仕事、コンパイラが決めること。
0945デフォルトの名無しさん2008/02/27(水) 21:08:38
つまりint とか char とかと同じような感じでアドレスが入ってる変数があるってだけさ
0946デフォルトの名無しさん2008/02/27(水) 21:09:38
ごめん語弊がありますねすいません
(入ってるのアドレスだけじゃないですね)
0947デフォルトの名無しさん2008/02/27(水) 21:11:45
普通はアドレスだけだと思うが。
メンバポインタとかは別だが。
0948デフォルトの名無しさん2008/02/27(水) 21:12:50
string x, y="*****"; となっていたとして、
xとyのデータを一致するようにできますか コピーではなくて
0949デフォルトの名無しさん2008/02/27(水) 21:14:24
int a,b=10;
&a=&b;のような事はできないですよね?
0950デフォルトの名無しさん2008/02/27(水) 21:14:35
string x = "*****", y = x;

という話ではなくて?
0951デフォルトの名無しさん2008/02/27(水) 21:16:08
string だと共用体が使えないから
参照にするしかないな。

string y = "*****", &x = y;
0952デフォルトの名無しさん2008/02/27(水) 21:16:48
同一アドレスの同一データにしたいのですが 無理ですよね
0953デフォルトの名無しさん2008/02/27(水) 21:18:11
x も xもポインタにして確保した同じとこさせばいいんじゃね?
0954デフォルトの名無しさん2008/02/27(水) 21:19:46
>>949
アドレス演算子の結果は右辺値だと思った。
0955デフォルトの名無しさん2008/02/27(水) 21:21:38
>>949
int *ap = &a;
int *bp = &b;

ap = bp;
0956デフォルトの名無しさん2008/02/27(水) 21:25:39
>>952
何でそう言う事がしたいの?
0957デフォルトの名無しさん2008/02/27(水) 21:36:28
すでに確保された変数のアドレスを書き換えるテクがあるかなと思った
0958デフォルトの名無しさん2008/02/27(水) 21:38:06
アドレスはマシン語にそのまま組み込まれてるんだぜ?
0959デフォルトの名無しさん2008/02/27(水) 21:40:37
変数は極端な話レジスタに載ってるかも知れないわけで。

string x,y="...";
#define x y
0960デフォルトの名無しさん2008/02/27(水) 21:43:17
string y = "*****", &x = y;

とした場合、最適化で x と y が同一視される可能性はあるんじゃないかな。
0961デフォルトの名無しさん2008/02/27(水) 21:47:24
>>957
変数のアドレスは、変数が確保されたときに固定されるものだろ。
「すでに確保された変数のアドレスを書き換えるテク」を期待する目的がわからん。
0962デフォルトの名無しさん2008/02/27(水) 21:50:29
論理アドレスくらいなら書き換えることは可能かもしれない。
0963デフォルトの名無しさん2008/02/27(水) 22:22:39
class CSample2{};

class CSample
{
public:
  void get( CSample2 *obj_s2 ){obj_s2 = &m_obj_s2
private:
  CSample2 m_obj_s2;
};

main{
  CSample1 obj_s1;
  CSample2 *obj_s2 =NULL;
  obj_s1.get( obj_s2 );
}

これでmain内のobj_s2がobj_s1.m_obj_s2と同じ物を指すようにしたかったのですが、NULLを指したままかわりません。
参照戻しではできたのですが、これで出来ない理由がわからず気持ち悪いです。
どなたか原因のご教授お願いします。
0964デフォルトの名無しさん2008/02/27(水) 22:23:37
vectorに関数ポインタを格納するにはどうしたらいいでしょうか?

vector<bool (*func)(int)> EroeroFunction;
 ↑<>の中のカッコが悪戯してうまくコンパイルが通らなくて困ってます。

構造体に関数ポインタを入れればなんとかなるんですが、メンバが1つしかないのでなんとも。
0965デフォルトの名無しさん2008/02/27(水) 22:27:29
かなりのFAQ。引数経由でポインタを戻すなら、ポインタのポインタかポインタ参照か
どっちかつかえ。

<  void get( CSample2 *obj_s2 ){obj_s2 = &m_obj_s2

>  void get( CSample2 *&obj_s2 ){obj_s2 = &m_obj_s2;}

>  void get( CSample2 **obj_s2 ){*obj_s2 = &m_obj_s2;
}
0966デフォルトの名無しさん2008/02/27(水) 22:27:58
>>963
get関数内でobj_s2を書き換えても、呼び出し側のobj_s2は書き換わらない。
関数に引数を渡す際の基本だろ?
ポインタを書き換えたいなら、ポインタをアドレス渡しでもすればいい。
void get( CSample2** ppobj_s2 ) { *ppobj_s2 = &m_obj_s2; }
obj_s1.get( &obj_s2 );
0967デフォルトの名無しさん2008/02/27(水) 22:29:45
>>964
vector<bool (*)(int)> じゃないの?
0968デフォルトの名無しさん2008/02/27(水) 22:33:46
vector<char>って後方に同じ型を連結できますか
そういう関数ありますか
0969デフォルトの名無しさん2008/02/27(水) 22:34:45
>>968
言ってる意味が分からない。
0970デフォルトの名無しさん2008/02/27(水) 22:35:22
push_backでは一つしか増やせません 一度に増やすやつないですか
0971デフォルトの名無しさん2008/02/27(水) 22:36:14
>>968
std::copyとstd::back_inserterを組み合わせるんじゃねーの?
0972デフォルトの名無しさん2008/02/27(水) 22:36:42
>>968
こういうこと?
vector<char> v1, v2;
v1.insert(v1.end(), v2.begin(), v2.end()); // v1の末尾にv2の全要素を追加
0973デフォルトの名無しさん2008/02/27(水) 22:37:22
vector<int> x,y;

x={1,2,3}
y={4,5,6}

x.push_back(y)={1,2,3,4,5,6}

こういうやつです
0974デフォルトの名無しさん2008/02/27(水) 22:39:20
それでできますかサンクス
0975デフォルトの名無しさん2008/02/27(水) 22:41:49
まんまinsertでいいんじゃね?
0976デフォルトの名無しさん2008/02/27(水) 22:42:56
insertやね
operator+=を外部に定義しておくと便利かも
0977デフォルトの名無しさん2008/02/27(水) 22:47:04
要素の連結か、要素ごとの+=か曖昧なので、そんなのいらんかも
0978デフォルトの名無しさん2008/02/27(水) 23:07:18
C言語なんですが
配列でポインタ表現を使ってアクセスしてインクリメントようと思って
*(array+i)++としたら'++'には左辺値が必要です、とエラーが出てきました
これは配列で宣言したからだと思うんですが
ポインタで宣言した場合は値が飛び飛びになるので、*(array+i)みたいな表現できないでしょうし
どうすればいいでしょう?
0979デフォルトの名無しさん2008/02/27(水) 23:09:43
(*(array+i))++;
++*(array+i);

変なことになったらとりあえず優先順位を疑うのは基本。
0980デフォルトの名無しさん2008/02/27(水) 23:10:19
*((array++)+i) // arrayを増やす場合
*(array+i++) // iを増やす場合
0981デフォルトの名無しさん2008/02/27(水) 23:11:35
*(array+i) と array[i] は優先順位以外は等価。
0982デフォルトの名無しさん2008/02/27(水) 23:12:23
>>979
できました。ありがとうございます。
優先順位って今まで全然気にしてませんでしたので
今後注意して行こうと思いますorz
0983デフォルトの名無しさん2008/02/27(水) 23:14:10
>>979 と >>980 のどちらを意図してるんだろうか。

それはともかく、array[i]++; と書けばいいのに
何でそうしないのか本気で理解できない。
0984デフォルトの名無しさん2008/02/27(水) 23:27:31
i++[array]と書くのが漢
0985デフォルトの名無しさん2008/02/27(水) 23:30:03
漢すぎるwwwwww
0986デフォルトの名無しさん2008/02/27(水) 23:39:05
(*(array + i))++; ←等価→ array[i]++; ←等価→ i[array]++;
array++[i]; ←等価→ *((array++)+i) ←等価→ i[array++];
i++[array]; ←等価→ array[i++]; ←等価→ *(array+i++);
0987デフォルトの名無しさん2008/02/27(水) 23:40:43
はじめて見た。
誰だよこんな書き方見つけた奴……
0988デフォルトの名無しさん2008/02/27(水) 23:43:59
*(E1+E2) と E1[E2] の挙動は等価だと規格に書いとるべ。
*(array+i) と *(i+array) が等価なのと同じく
array[i] と i[array] も等価だべ。
0989デフォルトの名無しさん2008/02/27(水) 23:44:30
array[i]を*(array+i)の糖衣構文とすることを発案した人が真っ先に見つけただろうな。
で、誰?
0990デフォルトの名無しさん2008/02/27(水) 23:45:42
(i % 16)["0123456789ABCDEF"]
0991デフォルトの名無しさん2008/02/27(水) 23:45:54
string x,y; N=0; x.resize(0); に対して

x+=y;
と
memcpy(&x[N],&y[0], y.size()); N+=y.size;

は同じのはず
yがバイナリデータだと上が失敗することが多いです
0992デフォルトの名無しさん2008/02/27(水) 23:47:15
>>990
すげぇwwww感動したwwwwwww
0993デフォルトの名無しさん2008/02/27(水) 23:49:12
>>991
x のメモリ確保はどこ行った。
0994デフォルトの名無しさん2008/02/27(水) 23:50:05
メモリ確保はあらかじめしておいてください あと最後にNでresizeも
0995デフォルトの名無しさん2008/02/27(水) 23:50:49
>>991
stringに文字列以外入れるなよ。
あと、x.capacity() >= y.size() でないとmemcpyがメモリ壊すぞ。
レス数が950を超えています。1000を超えると書き込みができなくなります。