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

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

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん2008/05/14(水) 01:00:02
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.53【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1208989385/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0896デフォルトの名無しさん2008/06/12(木) 23:41:13
>>891
クラスなど、無名名前空間にできてstaticでは不可能な
ものがあるということが大きな違いだと俺は思っている。

もともとの趣旨はstaticを静的確保の意味だけにする
(可視性制御の意味をなくす)ということだったと思うけど。
0897デフォルトの名無しさん2008/06/12(木) 23:43:06
>>895
struct hoge;に対してsizeof(hoge)の結果を任意に決めたいってこと?
08988952008/06/12(木) 23:48:34
>>897
いえ、例えば
#if sizeof(int) == 4
#define int32 int
#elif sizeof(int) == 8
#define int64 int
#else
#error("unsupported")
#endif
といったような感じです。通りませんけど。
0899デフォルトの名無しさん2008/06/12(木) 23:51:08
>>898
目的がよく分からないんだけど
int と書いたほうが処理速度が速くなるんじゃなくて
処理速度が速いものが int だと思ったほうがいいよ
0900デフォルトの名無しさん2008/06/12(木) 23:51:40
それを自分でやりたい理由が分からんが。
intのサイズは処理系依存で、大抵はその処理系のヘッダファイルにサイズ保証の整数型がtypedefされている。
09018952008/06/12(木) 23:54:58
>>899-900
まあ上の例はただの例なんですけど、
やっぱりできないみたいなのでまた別の方法を考えてみます。
どうもありがとうございました。
0902デフォルトの名無しさん2008/06/12(木) 23:56:06
sizeofの結果が得られるタイミングって、コンパイラによって違うんだっけ
0903デフォルトの名無しさん2008/06/12(木) 23:56:40
C99だと場合によっては実行時だしな。
0904デフォルトの名無しさん2008/06/12(木) 23:58:34
じゃあ必然的にプリプロセッサには使えないな
0905デフォルトの名無しさん2008/06/13(金) 00:00:49
>>871
レスありがとうございます。
以下の認識でOKですか?

>構造体チェック用の関数を作る
>さらに構造体メンバそれぞれについてチェック用の関数を作る
→bool CSerialCom::CheckParam(SERIAL_PARAM *pParam) { bool ret = checkBaud(pParam->dwBaudRate); ...}

>構造体自身を隠蔽して(不完全型)セッターでのアクセスしかできないようにする
>C++ならセッターで制限する
→bool CSerialCom::Open() {}
bool CSerialCom::SetParam(void *pParam) {... m_Param = *(SERIAL_PARAM *)pParam) ...}
0906デフォルトの名無しさん2008/06/13(金) 00:04:33
>>898の例は意味わからんけど、
型のサイズに応じて別な型をtypedefするってことなら
まさにテンプレートの領域じゃないか?
selector<sizeof(hoge)>::fuga_type fuga; // hogeのサイズによってfugaの型が変わる
0907デフォルトの名無しさん2008/06/13(金) 00:45:05
指定ビット数の整数型が欲しいなら、<stdint.h>使えばいいよ。
0908デフォルトの名無しさん2008/06/13(金) 00:54:36
結局何をやりたいのか言わずに去ったからな。
09098712008/06/13(金) 01:04:02
>>905
改行で間を空けてあるのは、それぞれ別の方法
つまり三つの方法を書いてあるだけなのでいずれか一つを採用すればおk
09109052008/06/13(金) 01:17:46
>> 871
早々のご回答ありがとうございます。
便乗して追加質問よいですか?

>構造体自身を隠蔽して(不完全型)セッターでのアクセスしかできないようにする
>C++ならセッターで制限する

無学で申し訳ないですが、上記2案の差分がモヤモヤしてました。
もう少し詳しく意見をいただけませんか?(サンプルコードがあると助かります)
09118712008/06/13(金) 01:46:02
>>910 Cの場合とC++の場合の対処方法が違うだけ
Cの場合には不完全型にしないと隠蔽できないから
// ----- hoge.h -----
typedef struct tagSerialParam SERIAL_PARAM;
SERIAL_PARAM *hoge_alloc(void);
void hoge_free(SERIAL_PARAM *param);
int hoge_BaudRate_set(SERIAL_PARAM *param);

// ----- hoge.c -----
#include"hoge.h"
struct tagSerialParam {
DWORD dwBaudRate; // 取り得る値 9600/19200/38400
BYTE byByteSize; // 取り得る値 4/5/6/7/8
・・・ // 上記以外の5個ほどの変数
};
static const DWORD dwBaudRateList[]={9600, 19200, 38400};
SERIAL_PARAM *hoge_alloc(void){
SERIAL_PARAM *param;
param=malloc(sizeof(*param));
param->dwBaudRate=dwBaudRateList[0];
param->... // 色々有効範囲内になるよう初期設定
return param;
}
int hoge_BaudRate_set(SERIAL_PARAM *param, DWORD dwBaudRate){
int i;
for(i=0;i<ARRAY_SIZE(dwBaudRateList);i++)
if(dwBaudRate==dwBaudRateList[i]){
param->dwBaudRate=dwBaudRate;
return 1;
}
return 0;
}
0912デフォルトの名無しさん2008/06/13(金) 10:36:26
フリーソフトでメジャーなコンパイラとエディタってどんなのがありますか?
自分はBorland C++ CompilerってのとBCC Developer 1.2.21使ってるんですが
勉強になるかもしれないし他のやつ使ってみたいです
0913デフォルトの名無しさん2008/06/13(金) 11:17:42
>>912
VC++ Express (コンパイラとエディタとその他もろもろのセット)とか。
GCC と Emacs とか。
0914デフォルトの名無しさん2008/06/13(金) 12:21:33
>>913
エディタとしてインストールするのもありだな。これはいいこと聞いた
0915デフォルトの名無しさん2008/06/13(金) 12:42:37
基本クラスを作る場合と、テンプレートを使う場合を比べると
テンプレートを使うメリットと言うのは何になるんでしょうか。

自分なりに考えた結論としては下記のような感じなんですが
・コードを書く量が少なくて済む
・変数を扱う場合、型を指定しなくて良いので柔軟に出来る
0916デフォルトの名無しさん2008/06/13(金) 12:45:44
>>915
目的も効果も違う2つを比べる意味がわからない。
何をするときの話?
0917デフォルトの名無しさん2008/06/13(金) 12:45:48
基本クラスも作ってテンプレートも使えば?
比べるものではないと思うけど。
0918デフォルトの名無しさん2008/06/13(金) 12:52:16
>>913
ありがとうございます
0919デフォルトの名無しさん2008/06/13(金) 13:25:53
てっきり同じ物かと思ってました
どんなときにテンプレートを使ったりするんでしょうか
0920デフォルトの名無しさん2008/06/13(金) 13:28:13
>>919
とりあえず Google に聞いてみろ。ひとつでも解説ページを見れば同じ物だなんて思わないはずだから。
0921デフォルトの名無しさん2008/06/13(金) 17:36:35
質問です
昔から愛用していたVC6.0製品版から、このたびVC9.0(VS2008)の無料版に乗り換えました。
VC6.0用のプロジェクトを9.0用に変換し、コンパイルを通したのですが、実行速度にだいぶ差があるように見えます。

単純なファイルコンバータプログラムなのですが、だいたい9.0版のほうが1.5倍程度時間がかかります。
両方最適化をONにしていますし、ソースも当然同一のものです。
時代が経過して性能が下がったというのは不思議なのですが、そんなものなのでしょうか?

2008質問スレで聞こうかと思ったのですが、そういうスレがなかったのでここで質問させていただきました。
よろしくお願いします。
0922デフォルトの名無しさん2008/06/13(金) 17:48:28
安全性チェックのためのコードが挿入されて遅くなってるのかもね。
コンパイラオプション調べて弄ってみろとしか言えない。
0923デフォルトの名無しさん2008/06/13(金) 17:50:25
エンコードの違いかな。
まぁ、2008のスレはあるけどね。
0924デフォルトの名無しさん2008/06/13(金) 17:52:33
>>921
以前libc.lib(シングルスレッド版のCランタイム)を使っていたのなら、
マルチスレッド版ランタイムを使うようになったためである可能性が高いかな。
libc.libはVC7.1以前のデフォだが、VC8以後は無くなって、現在は
マルチスレッド版のCランタイムしかない。マルチスレッド版ランタイムは
デフォで排他制御を行うので、何も考えずにgetc()のようなものを使うと
パフォーマンスへの影響がデカい。
一応その対策として、_getc_nolock()のような関数が用意されているんだが。

MSDNの「マルチスレッドライブラリのパフォーマンス」の項目を
参照。
ttp://msdn.microsoft.com/ja-jp/library/ms235505(VS.80).aspx
0925デフォルトの名無しさん2008/06/13(金) 18:02:18
すばやいお返事ありがとうございます。
>>922
なるほど。確かにそのとおりです。オプション調べてみます

>>923
2008スレ自体はあったのですが、なんだかピリピリしていて・・・

>>924
あ、ほんとですね。マルチにさせられてます。
リンク先を読んで、改良してみようと思います。
シングルスレッド版のころそのもののスピードはでなくても、近い速度が出るといいなぁ

ありがとうございました。
改良してテストしたら、また報告に伺います
0926デフォルトの名無しさん2008/06/13(金) 18:07:52
すいません、結構改造所がありそうだったので「また報告に〜」なんていいましたが、>>924のリンクの最後に

とりあえず #define _CRT_DISABLE_PERFCRIT_LOCKS しとけば、ファイルアクセスは全部nolock版使うよ

とあったので速攻試せました。
速度はがっつりあがり、VC6.0版の半分程度の時間で処理が終わるようになりました。

やっぱり最適化の部分は進化してたんですね!
アドバイスありがとうございました。
0927デフォルトの名無しさん2008/06/13(金) 18:18:00
vectorに文字列を追加しつつ、
今までvectorに追加した文字列全てを
ひとつの文字列にして返す関数が欲しくて
以下のように書いたのですが

vector<const char*> ログ;

char* ログ追加・取得(const char* getstr)
{
ログ.push_back(getstr);

char logs[1000];

for(int i = 0; i<ログ.size() - 1 ; ++i)
{
strcat(logs,ログ[i]);
}

return logs;
}

strcatのところで入力した文字が化けてしまいます
どこがまずいでしょうか?
0928デフォルトの名無しさん2008/06/13(金) 18:20:08
vector<>とか使うんなら、ついでにstringも使えばいいのに
0929デフォルトの名無しさん2008/06/13(金) 18:28:53
・strcatって、'\0'を見つけるまでコピーするんだぜ?
・ローカル変数を返してどーする
0930デフォルトの名無しさん2008/06/13(金) 19:20:41
vectorから取得したbegin()やend()についてiteratorと同様に扱えないのは仕様でしょうか。

class Hoge{
int hogehoge;
public:
Hoge(int hogehoge){this->hogehoge = hogehoge;}
int getHogehoge(){return hogehoge;}
}

int main(){
Hoge hoge1(1);
Hoge hoge2(2);

std::vector<Hoge> vhoge;
vhoge.push_back(hoge1);
vhoge.push_back(hoge2);

std::cout << *(vhoge.begin()).getHogehoge(); <-この辺が上手くいかない
std::cout << *(--vhoge.end()).getHogehoge(); <-
}

例えばvectorの先頭要素と終端要素を比較したい場合にこういうのを使いたいのですが、
うまくコンパイルできません(getHogehoge()などというメソッドは無いと言われる)。
環境はcygwin g++です。解決策等あればよろしくお願いします。
0931デフォルトの名無しさん2008/06/13(金) 19:26:07
>>930
× *(vhoge.begin()).getHogehoge()
○ (*vhoge.begin()).getHogehoge()
0932デフォルトの名無しさん2008/06/13(金) 19:26:19
>>930
なんで全部hogeにするかなあ?
foo とか bar とか分けてくれないと難読化したようにしか思えないわ
0933デフォルトの名無しさん2008/06/13(金) 19:34:39
>>931
それだー。ありがとうございます。

>>932
すみません。対称性が好きなもので。以後気をつけます。
0934デフォルトの名無しさん2008/06/13(金) 20:13:58
MSVCRT.lib(crtexew.obj) : error LNK2001: 外部シンボル "_WinMain@16" は未解決です
:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\kadai\Release\kadai.exe : fatal error LNK1120: 外部参照 1 が未解決です。

このようなエラーがでてきてコンパイルできてもビルドできません
どうすれば良いのか教えてください
使用ソフトはVC++2008EEです
0935デフォルトの名無しさん2008/06/13(金) 20:16:12
>>934
いいからコードをよこせ
0936デフォルトの名無しさん2008/06/13(金) 20:19:03
>>934
コンソールアプリケーションなのにウィンドウアプリだと思ってリンクしようとして
エラーになっているんだよ
プロジェクトを作り直せ
0937デフォルトの名無しさん2008/06/13(金) 20:29:08
>>929
\0ないとコピーし続けるって始めて聞きますた

>>928
charはもういや
string使うことにします
0938デフォルトの名無しさん2008/06/13(金) 20:36:41
>>935
一応解決しました、また問題が発生した時はコードも一緒に張るのでその時はよろしくお願いします
>>936
解決しました
ありがとうございます
0939デフォルトの名無しさん2008/06/13(金) 20:39:11
>>937
文字列を扱う関数はほぼ全部\0を終端の判断に利用するんだよ
だから\0は常につけとけ
0940デフォルトの名無しさん2008/06/13(金) 21:00:56
Javaそれなり、C初心者です。

ビルドに関してなのですが、エラー0行目と表示されています。
Eclipseで確認しながら作成したのでおそらく書いたコード自体にはエラーはないと思います。
エラーがどういう意味なのかが分からないので質問させて頂きました。

作成したプログラムはソケット関連で、
「TCP/IPプログラミング C言語編」の一番最初のコードです。

エラーの詳細表示は
Eclipse
make: ***[libtcp_ip1.dylib] Error 1    line0
Undefined symbols:           line0

Eclipse コンソール
/usr/bin/libtool: internal link edit command failed
make: *** [libtcp_ip1.dylib] Error 1

となっています。
これはどのように解釈すればいいのでしょうか?
0941デフォルトの名無しさん2008/06/13(金) 21:07:31
>>940
ソースどっかにアップしたら?
0942デフォルトの名無しさん2008/06/13(金) 21:11:48
少し長いので2つにわけます。

#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define RCVBUFSIZE 32

void DieWithError(char *errorMessage);

int main(int argc, char *argv[]){

int sock;
struct sockaddr_in echoServAddr;
unsigned short echoServPort;
char *servIP;
char *echoString;
char echoBuffer[RCVBUFSIZE];
unsigned int echoStringLen;
int bytesRcvd, totalBytesRcvd;

if((argc < 3) || (argc > 4)){
fprintf(stderr, "Usage: %s <server IP> <Echo Word> [<Echo Port>]n", argv[0]);
exit(1);
}

0943デフォルトの名無しさん2008/06/13(金) 21:12:24
servIP = argv[1];
echoString = argv[2];

if (argc == 4){
echoServPort = atoi(argv[3]);
}else{
echoServPort = 7;
}

if((sock = socket(PF_INET, SOCK_STREAM, 0)) < 0){
DieWithError("socket() failed");
}

memset(&echoServAddr,0,sizeof(echoServAddr));
echoServAddr.sin_family = AF_INET;
echoServAddr.sin_addr.s_addr = inet_addr(servIP);
echoServAddr.sin_port = htons(echoServPort);

if(connect(sock, (struct sockaddr *)&echoServAddr, sizeof(echoServAddr)) < 0){
DieWithError("connect() faild");
}

echoStringLen = strlen(echoString);

if(send(sock, echoString, echoStringLen, 0) != echoStringLen){
DieWithError("send() sent a different number of bytes than expected");
}
0944デフォルトの名無しさん2008/06/13(金) 21:13:01
totalBytesRcvd = 0;
printf("Received: ");

while(totalBytesRcvd < echoStringLen){

if((bytesRcvd = recv(sock, echoBuffer, RCVBUFSIZE -1, 0)) <= 0){
DieWithError("recv() faild or connection closed prematurely");
}
totalBytesRcvd += bytesRcvd;
echoBuffer[bytesRcvd] = '0';
printf(echoBuffer);
}

printf("n");

close(sock);
exit(0);

}


よろしくお願いします。
0945デフォルトの名無しさん2008/06/13(金) 21:15:09
別ファイルです。記載し忘れてました。

#include <stdio.h>
#include <stdlib.h>

void DieWithError(char *errorMessage){
perror(errorMessage);
exit(1);
}
0946デフォルトの名無しさん2008/06/13(金) 21:38:45
>>940
まずはシェルから自分で直接ccでコンパイルしてみて、
「何が」エラーを出しているのか切り分けたらいいと思うよ
0947デフォルトの名無しさん2008/06/13(金) 21:38:56
どこかにアップしろっていう言葉が見えなかったの?って言われそうですね。
がんばって耐えるんだよ。
0948デフォルトの名無しさん2008/06/13(金) 22:14:04
>>946
明日やってみます。

>>947
ごめんなさいwww
0949デフォルトの名無しさん2008/06/13(金) 23:10:07
>>942
どこかにアップしろっていう言葉が(ry
ってのは冗談だけど、次に貼るときがあればインデント付けてね。

半角空白は消えるから全角空白で。
スレ上でも読みやすし、全角空白→半角空白の置換は簡単だから。
09504382008/06/14(土) 00:39:55
お礼カキコ忘れていました。だいぶ前ですが・・
ありがとうございましたm(_ _)m
0951デフォルトの名無しさん2008/06/14(土) 09:52:47
てst
0952デフォルトの名無しさん2008/06/14(土) 10:02:22
>>942
インデントを気にするくらいなら、アップローダを使えばいい。
>949のような専用ブラウザも使わない阿呆は放置でいいからね。
0953デフォルトの名無しさん2008/06/14(土) 10:13:59
専ブラ使わないやつはもれなく阿呆ですかそーですか
0954デフォルトの名無しさん2008/06/14(土) 10:36:01
その点は間違いない
0955デフォルトの名無しさん2008/06/14(土) 10:37:02
>>952
>専用ブラウザも使わない阿呆は
専ブラは全て同じ仕様だと思ってる阿呆ですか。
文句なら壷作ったマァブ達に言ってくれ。
0956デフォルトの名無しさん2008/06/14(土) 11:42:08
んじゃ、訂正しておこう。
専用ブラウザも使わない、或いはインデントごときで駄々を捏ねる阿呆ってことで。
ちょっと手元のエディタにコピペして、インデント掛けさせるだけのことができないってどんだけかと。
0957デフォルトの名無しさん2008/06/14(土) 12:18:43
で、それがこのスレと関係あるのかな
【初心者歓迎】C/C++室 Ver.54【環境依存OK】だろ
スレとは関係無い所であおってばかりだな
何のスレかよく考えろよ
0958デフォルトの名無しさん2008/06/14(土) 13:20:00
「インデントごときもかけない質問者」なんて思われたくないんで、俺は質問する時全角スペースインデントするよ
0959デフォルトの名無しさん2008/06/14(土) 13:26:48
>>956
お前の頭にはemacsしか無いのかもしれないが、
多くの環境で、自動的にインデント掛けるより
全角空白を半角空白に置換する方が容易。

また、コピペするまでも無く読みやすい。
専ブラなどの余計な前提無しにな。

少なくとも、その程度のことも分からないお前に
阿呆と呼ばれる筋合いは無いな。

ちなみに質問者がロダにも上げず、半角空白のまま
貼ったとしても責める気は無いし、責めたことも無い。
より良いという話をしているだけだ。
0960デフォルトの名無しさん2008/06/14(土) 13:29:18
初心者歓迎スレだから、初歩的な質問がどうしても他より多くなる。
で、初心者って、例を最少にする技術がまだまだだから、貼るソースが長くなりがちだし、
書き方も洗練されていないから、内容的に読み取りづらかったりするよね。
つまり、初心者歓迎スレであるが故に、「要所を押さえた貼り方をしなかった時の害」が、
通常より大きいってことなんだ。

つまり、ここが
【初心者歓迎】C/C++室 Ver.54【環境依存OK】
であるから、こういう話が通常より濃く交わされる、というのは、少なからず言える。

>>957
だから、関係関係と連呼するほど、関係無くはないんじゃないかな。
0961デフォルトの名無しさん2008/06/14(土) 13:53:19
初心者に「インデント」だの「全角空白」とか言っても通じないから、
アップローダをつかってもらうの推奨ってことでおk?
0962デフォルトの名無しさん2008/06/14(土) 13:55:10
まあ初心者歓迎と書いてある以上は全角スペースだろうが半角スペースで消えようが妥協して嫁ってことでいいだろ
0963デフォルトの名無しさん2008/06/14(土) 14:07:35
質問です
VC2008で_CrtSetDbgFlagを使い、メモリリークのチェックをしたところ

Detected memory leaks!
Dumping objects ->
f:\dd\vctools\crt_bld\self_x86\crt\src\mbctype.c(593) : {4} crt block at 0x003D3728, subtype 0, 544 bytes long.
Data: < > 02 00 00 00 A4 03 00 00 01 00 00 00 11 04 00 00
f:\dd\vctools\crt_bld\self_x86\crt\src\ioinit.c(136) : {2} crt block at 0x003D2110, subtype 0, 2048 bytes long.
Data: < > FE FF FF FF C1 0A 00 00 00 00 00 00 00 00 00 00
f:\dd\vctools\crt_bld\self_x86\crt\src\tidtable.c(394) : {1} crt block at 0x003D1EC0, subtype 0, 532 bytes long.
Data: <X > 58 12 00 00 FF FF FF FF 00 00 00 00 00 00 00 00
Object dump complete.

とメモリリークが検出されたんですが、
1.出力されたディレクトリのパスに自分のソースもVCのソースも入ってない
2.上記3つのソースはVCのディレクトリに入っていたので、ここがメモリリークの原因だとは思えない

この2つの理由から対処に困っています。
この場合どうすればいいのでしょうか?
OSはXPです。
0964デフォルトの名無しさん2008/06/14(土) 14:17:30
空白が消えるのは2ちゃんの仕様ですでいいだろ
0965デフォルトの名無しさん2008/06/14(土) 14:29:17
>>963
_CrtSetDbgFlagの下で_CrtSetBreakAlloc(4)とかやってみる
0966デフォルトの名無しさん2008/06/14(土) 14:30:06
>>963
_CrtSetBreakAlloc
呼び出し履歴
0967デフォルトの名無しさん2008/06/15(日) 00:29:38
>>959
おおむね同意。
置換だけならXP以降のメモ帳でもできるしね。

補足として、再インデント可能なエディタは割と多いですよ。
元がトラップ気味なインデントであることを考慮すると再インデントして
読むようにしてます。
if (hoge)
   A;
   B;
みたいなね;-)
0968デフォルトの名無しさん2008/06/15(日) 00:38:59
全角空白インデントよりは、インデントなしのほうがいい。
とりあえずそのままコンパイルできるから。

逆に言えば、VC++とかGCCが全角空白を受け付けてくれるようになれば、
全角空白でも別にいいと、俺は思う。
0969デフォルトの名無しさん2008/06/15(日) 00:40:08
>>968
makefile を使うのはどうだろう?
0970デフォルトの名無しさん2008/06/15(日) 00:41:12
俺は空白は&nbsp;に置換してるんだけどこれで困る人いる?

コピペったときにU+0160になってしまうようだと困るのかなと
思うのだけれど
09719632008/06/15(日) 00:42:03
>>965-966
無事場所が分かりました!
mapのinsertの中でメモリリークが起きていました。
ただ、mapには120個くらいデータを挿入しているんですが、
メモリリークが起きるタイミングがまちまちで、メモリリークの合計が3回ということもあり、今一原因が分かりません。
オーバーフローが起きていると考えていいのでしょうか?
mapはmap<wstring, list<wstring> >で宣言してあります。
0972デフォルトの名無しさん2008/06/15(日) 00:56:12
>>971
> オーバーフロー

なんで?
0973デフォルトの名無しさん2008/06/15(日) 01:02:07
>>970
わざわざそうするならうpすればいいのに。
検索エンジンに引っかかるように、あえてスレにソースを載せたいのかな?
0974tst2008/06/15(日) 01:21:27
none
    1tab
        ;2tab

>>974

専ブラのレス参照では参照されなかったりする
0975デフォルトの名無しさん2008/06/15(日) 01:22:13
>>973
2chに貼り付けるのは、数行のコードだからねぇ
「わざわざ」ってのは、意味が分からないな
それこそ、「わざわざ」手で置換するわけがないでしょ?
プログラマ板の住人ならさ
0976デフォルトの名無しさん2008/06/15(日) 01:22:31
一番の問題はコピペ時にスペースにならんところか
0977デフォルトの名無しさん2008/06/15(日) 01:31:43
&#32;[ ]
NBSP(U+A0)つかわないでも、普通のSPでいいでしょ。
0978デフォルトの名無しさん2008/06/15(日) 01:35:42
言われてみればそうだな、今後はそうしよう
0979デフォルトの名無しさん2008/06/15(日) 01:39:00
おっぱい
おっぱい
おっぱい
0980デフォルトの名無しさん2008/06/15(日) 01:41:28
インデントを全角空白に置き換えるってどうやんの?
0981デフォルトの名無しさん2008/06/15(日) 01:41:55
置換すらできないのか
0982デフォルトの名無しさん2008/06/15(日) 01:43:43
いや、置換はできるけど、行頭の空白orタブを相当数の全角空白に置換ってどうやればいいのかなって。
0983デフォルトの名無しさん2008/06/15(日) 01:45:56
ああ、深く考えなくてもTABを全角空白に変えてるのか。
開発対象によってはスペースでインデントすることもあるから妙に気にしてしまった。
0984デフォルトの名無しさん2008/06/15(日) 01:48:27
s/\t| {4}/ /;
とかでいいんでねえの。
インデント以外でスペース4個以上の連続なんてそうそう出てこないだろ。
0985デフォルトの名無しさん2008/06/15(日) 01:49:53
>>971
newしてるような箇所は無いのか?
mapにwstringにlistだと問題なさそうだけど
0986デフォルトの名無しさん2008/06/15(日) 01:52:12
>>982
俺はこんな感じのやつをviから%!で噛ませてる
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6908.zip

バイト数=文字幅とは限らない環境でマジメにタブを開くには、
EAST_ASIAN_WIDTHとか見る必要があると思う
0987デフォルトの名無しさん2008/06/15(日) 02:00:05
>>986
ふぅむ。
タブインデントを空白インデントにするだけならvimで
:set et
ggVG=
ってやってる。
0988デフォルトの名無しさん2008/06/15(日) 02:06:26
>>987
で、その後で空白を全部エンティティ参照に置換するとレス長が無駄に長くなるので、
置換をなるべく押さえた上で一発で仕事が済むようにプログラムを書いたわけですよ

まあ馬鹿げてるとは思うが
0989デフォルトの名無しさん2008/06/15(日) 02:09:22
単純に、"SPSP"の連続を"&#32;SP"に置換すればいいだけなんじゃ。
0990デフォルトの名無しさん2008/06/15(日) 02:16:01
>>989
行頭だけは特別扱いする必要あるけど、
1) タブを開く
2) 行頭のSPを&#32;に置換
3) SPSPを&#32;SPに置換
でいいのかな
0991デフォルトの名無しさん2008/06/15(日) 02:38:01
ああ、奇数タブならそういう必要も出てくるんかな。よくわからんけど。
0992デフォルトの名無しさん2008/06/15(日) 02:40:45
>>991
いや、行頭に空白一文字だけあるときに潰れてしまうことだけが問題
書いてから気づいたが、2)と3)は逆順のほうがいいな
0993デフォルトの名無しさん2008/06/15(日) 02:43:02
タブを&#32;SPあるいはその繰り返しの並びに直接置換したらダメなの?
もちろん、必要に応じて空白から&#32;SPの並びへの置換もやるとして。
0994デフォルトの名無しさん2008/06/15(日) 02:46:05
>>993
タブ位置が行頭以外の場合、いくつの空白に置換すべきかが自明ではないでしょ。
だから、「きちんと」タブを開いてから空白だけを処理したほうが楽だと思う。

Unixのexpandコマンドは、バイト数=文字幅が成り立たない環境では
役に立たないものがほとんどだと思うけれど。
0995デフォルトの名無しさん2008/06/15(日) 02:49:17
そういうことかすまん。
自分が行頭インデントにしかタブを使わないんで、
常にタブ1つを機械的に置換できると思い込んでいた。
レス数が950を超えています。1000を超えると書き込みができなくなります。