【初心者歓迎】C/C++室 Ver.20【環境依存OK】
>>920 分かってるとは思うけど一応書いておくと、
CHoge hoge;
hoge++++;
を防止するために返値はconstにすべき
>>923 JISに16x16のドットパターンなかったっけ?
昔使った記憶があるのだけれど。
#但し、JIS1973だったかも知れず。
928 :
デフォルトの名無しさん:2005/09/01(木) 12:29:34
Red Hat Linuxのgcc3.0にて
CTestcls::temp(int ifd)
{
ifstream test(ifd);
というようなifstreamをファイルディスクリプタで
扱うことをやっていたのですが
gccのバージョンがあがったら
ifstream(int fd) : fstreambase(fd)
の定義が無くなっちゃいました。
これどうしたらよいんでしょうか?
>>926 意味のない操作だからといって禁止する必要があるとは思えないんだが。
どちらかというとインターフェースを標準ライブラリに合わせる方が重要じゃないか?
>>929 int i;
i++++;
と同じくエラーするってことだろ。
malloc使って領域確保するのとnew演算子で確保するのって
どっち使ったほうがいいですか?
それぞれ特徴があったら教えていただけませんか?
malloc: 失敗したらNULL返す
new: 失敗したらbad_alloc例外投げる 構造体ならコンストラクタが呼べる
newは領域確保するだけじゃないので、同列に扱うのはどうかと。
malloc
・指定したサイズの領域を確保し、そのポインタを返す
・型を気にせず(キャストして)領域を使える
・コンストラクタは呼ばない
new
・指定した型の変数を作り、そのポインタを返す
・コンストラクタを呼ぶ(クラス/構造体の場合)
(※deleteの場合はデストラクタ)
・配列で確保する場合は[]を付けなければならない
・オーバーロード可能
OpenDialogで開いたRAWデータ(16bitグレースケール)をFileReadを使って読み込み、
long型配列databoxに書き込みたいんですがさっぱり分かりません。ご助力お願いします。
if(OpenDialog2->Execute() == false) return;
// ファイルを開く
int theFile = FileOpen(OpenDialog2->FileName, fmOpenRead);
FileSeek (theFile,0,0);
buf=new char[3];
for(int j=0; j<Image1->Picture->Bitmap->Height;j++){
for(int i=0; i<Image1->Picture->Bitmap->Width; i++){
FileRead(theFile,buf,2);
databox[i][j]=strtol(buf,&emdptr,10);
}
}
FileClose(theFile);
例外投げないでNULL返すnewもあるだろ。
nothrow指定すりゃな。
>>935 OpenDialog()云々とファイル取り扱いは問題を分けるべきだし、コードも分けるべきだ。
後者は、RAWデータはバイナリなのではないのかな?
だとすればdatabox[i][j] = buf[0] | buf[1] << 8;でいいと思うのだが。
エンディアンが逆ならば、buf[0] << 8 | buf[1]でいい。
#つーか、文字列とバイト列の違いがわかっていない悪寒。
皆さんこんにちは。プログラマーではなく、私的な仕事ツールとしてスクリプトや簡単なC++を
使っている者です。
環境はVisual Studio .NET、MinGW on WIndowsXP、RHEL上のg++といったところです。
文字列処理は昔からstrstreamを使っていたのですが、そろそろ「古い機能使うなや」warning
がウザくなってきたのでstringクラスかなにかにシフトしようと考えています。
今まで、こんなふうに書いていました。
string a = "taskfile_";
int b = 10; // 番号変えて別ファイルを作ったりするため
string c = ".txt";
char fnbuf[255];
ostrstream ostr(fnbuf, sizeof fnbuf);
ostr << a << b << c << ends;
ofstream fout(fnbuf, ios::trunc);
....
で、こいつをstringで書こうとすると、int bを文字列に変換するのにsprintf使う方法しか
思いつかない自分がいました。
itoa関数はVC++とMinGWにはあるけどgccにはありません。
みなさんはこういう場合、どうコーディングされてます?
stringstream、あるいはboost::lexical_cast。
strstreamの代わりにstringstreamを使え。以上
C言語でcsvファイルから要素をint型で読み込みたいのですが、なかなか難しいです。
strtokを使えばなんとかなるらしいのですが、正しいでしょうか?
ほかにもっと良い方法などあればお教えください。
>>942 strtokで可能
後はscanfで読み込むとか、getcで読んでいってカンマが出た時点で区切るとか
>>942 strlen関数を自作してみればやり方が分かると思うお
分割した文字列からの変換はatoiでやれば済む話だし
>>939 プログラマのプロはプロフェッショナルのプロじゃないから、
カテゴリとしては君もプログラマだと思う。
プロテイン・グラマー
>>943-944 ありがとうございます。何とかなりそうです。
strtokとatoiを使ってやってみようと思います。
948 :
偽616:2005/09/01(木) 21:43:04
>942
こんなんでよければどうぞ
void csvread(int intList[], char *str)
{
int i;
char *p, *pp;
char tmp;
p = str;
for(i=0;;i++){
pp = p;
while(isdigit((int)*p))p++;
if(*p == ','){
tmp = *p;
*p = '\0';
intLlist[i] = atoi(pp);
*p = tmp;
}else{
break;
}
}
}
949 :
偽616:2005/09/01(木) 21:45:37
*p = tmp;
の下に
p++;
を追加しておいて
950 :
デフォルトの名無しさん:2005/09/01(木) 22:01:04
カエレ
953 :
950:2005/09/01(木) 22:16:48
私は何かのマナー違反したのでしょうか?
直したいので教えてください。
レスはリンク先って書いておけばマルチじゃないと思っていましたが・・・
リンク先を読んでる人がいないのでは?と思いここにレスしたのですが。
955 :
950:2005/09/01(木) 22:26:56
>>954 ごめんなさい。
「レスはリンク先に」でもマルチになるんですね。
スレ汚しは重ね重ねごめんなさい。
>>953 ・動作チェックしてくれと言うだけで、どこがどうおかしいかも書かない。
・他人にモノを頼んでおいてレスはリンク先へと我が儘放題。
・どんなクラスかどんな関数なのか一切情報がない。
・コードが最低最悪。
これだけ揃ってれば>952も当然だな。
>>953 自分が作ったプログラムのデバッグを
他人にやらせるのはどうかってことでしょ。
仕様が良く分からないプログラムを動かしたら
何が起きるかわからないわけだし。
最低限、簡単な機能仕様を提示して
ソースに処理の内容がわかる程度にコメントが付いてれば
添削してくれる人はいるかもね。
手抜きで書いたソースなぞ見たくもないがな。
958 :
950:2005/09/01(木) 22:27:41
sage忘れてしまいました。ごめんなさい。
959 :
957:2005/09/01(木) 22:28:22
960 :
偽616:2005/09/01(木) 22:39:32
三度目の正直だったらバイト先の好きな子に日曜日告白
バグはないよね・・・
void csvread(int intList[], char *str)
{
int i;
char *p, *pp;
char tmp;
p = str;
for(i=0;;i++){
pp = p;
while(isdigit((int)*p))p++;
tmp = *p;
*p = '\0';
intLlist[i] = atoi(pp);
*p = tmp;
if(*p == ','){
p++;
}else{
break;
}
}
}
南無三
961 :
偽616:2005/09/01(木) 22:41:48
intLlist[i] = atoi(pp);
~
intList[i] = atoi(pp);
三度目の正直じゃなかったけど、告白
962 :
デフォルトの名無しさん:2005/09/01(木) 22:43:48
質問です。
signed→unsigned変換、unsigned→signed変換をするために
こんな感じで書きました。
変換の過程でデータが誤変換することは考えられますか?
またもっと良い変換方法はありますか?
signed char sc_before[5] = {0,-1,2,-3,4};
signed char sc_after[5];
unsigned char uc_after[5];
int i;
for(i=0; i<5;i++) {
uc[i] = sc_before[i];
}
/* ucを処理 */
for(i=0; i<5;i++) {
sc_after[i] = uc[i];
}
isdigit()の定義域は 0..255 と EOF(-1)
char が signed char の環境では、 isidigit((int)*p) は間違い。
964 :
偽616:2005/09/01(木) 22:52:40
memcpy(uc, (unsigned char *)sc_before, 5);
/* ucを処理 */
memcpy(unsigned char *)sc_after, uc, 5);
memcpy()については自分で調べてちょ
>963
ありがとうございます。
こんなの見つけてきました。
str[i]が数字でないのにisdigitが真になってしまうバグがありました。
str[i]が負になっていたことが原因でした。
isdigitなどctype.hのマクロの引数は-1〜255でなければならないそうです
(man isdigit)。この引数の型がcharの場合、-128〜127の値になるので、誤動
作を起こすことがあります。
isalnum, isalpha, isascii, isblank, iscntrl, isdigit, isgraph,
islower, isprint, ispunct, isspace, isupper, isxdigit
これらのマクロを使う場合は
isdigit((unsigned char)c)
のようにunsigned charにキャストする必要がありそうです。
。・゚・(ノД`)ヽ
>>962 元を残しておく必要がなければ、こうできる。
unsigned char *uc_after = reinterpret_cast<unsigned char *>(sc_before);
/* ucを処理 */
後はsc_beforeが元のコードのsc_afterとして使える。
ただ規格では負の値をunsignedへ変換するのは問題ないが、その逆は未定義か何かだったはず。
966 :
939:2005/09/01(木) 22:57:37
ありです。コンテナには結局ないんですねえ。明日会社行ったら試してみます。
>>945 Σ('A`) なぬ
それじゃグラマーなだけの営業屋だと思っていた俺は
>>966は
∩
_( ⌒) ∩__
//,. ノ ̄\ / .)E)
/i"/ /|_|i_トil_| / / / ̄ ̄ ̄ ̄ ̄
|ii.l/ /┃ ┃{. / / < ぱいぱい ボイン!ボイン!ボイン!
|i|i_/''' ヮ''丿i_/ \_____
i|/ ,ク ム"/ /
|( ヽ _,.-===、j、
ゞヽ‐イ/´ ヽ ヽ、
\! ::c:: ! :p
}ヽ __ ノ、_ノ
/ ノ ノ´
なのか?
968 :
デフォルトの名無しさん:2005/09/02(金) 00:19:53
>>965 ありがとうございます。
>ただ規格では負の値をunsignedへ変換するのは問題ないが、
>その逆は未定義か何かだったはず。
ということは私のコードでも965さんのコードでも
問題ありということですよね。
そこを解決できないでしょうか?
signedのデータをある製品の関数に渡さなければいけないのですが、
製品の関数の入力と出力がunsignedで、出力されたunsignedを
元のsignedに変換する必要があるのです。
969 :
966:2005/09/02(金) 00:26:02
>>967 違います。そんなAA貼って楽しいですか?
char* a=(char*)malloc(100)と
char* b=(char*)calloc(100,1)と
char* c=(char*)calloc(1,100)とでは
確保されるメモリ領域のサイズは同じ?
972 :
デフォルトの名無しさん:2005/09/02(金) 07:05:34
fwrite,freadの2、3番目の引数って一つで十分なんじゃ
ないですか?
エンディアンもこれは関係なさそうな気が
>>966 std::stringstreamは入出力両用で、ostrstreamに対応するのはstd::ostringstreamだ。
>>968 すまん。規格見たら「処理系定義の値になる」だった。
>>972 例えばintが16ビットの環境で64K以上アクセスするときに便利。