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

このエントリーをはてなブックマークに追加
926デフォルトの名無しさん:2005/09/01(木) 12:09:22
>>920
分かってるとは思うけど一応書いておくと、
CHoge hoge;
hoge++++;
を防止するために返値はconstにすべき
927デフォルトの名無しさん:2005/09/01(木) 12:24:56
>>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)

の定義が無くなっちゃいました。
これどうしたらよいんでしょうか?
929デフォルトの名無しさん:2005/09/01(木) 12:34:41
>>926
意味のない操作だからといって禁止する必要があるとは思えないんだが。
どちらかというとインターフェースを標準ライブラリに合わせる方が重要じゃないか?
930デフォルトの名無しさん:2005/09/01(木) 12:55:50
>>929
int i;
i++++;
と同じくエラーするってことだろ。
931デフォルトの名無しさん:2005/09/01(木) 16:40:02
malloc使って領域確保するのとnew演算子で確保するのって
どっち使ったほうがいいですか?
それぞれ特徴があったら教えていただけませんか?
932デフォルトの名無しさん:2005/09/01(木) 16:42:04
malloc: 失敗したらNULL返す
new: 失敗したらbad_alloc例外投げる 構造体ならコンストラクタが呼べる
933デフォルトの名無しさん:2005/09/01(木) 17:04:43
newは領域確保するだけじゃないので、同列に扱うのはどうかと。
934デフォルトの名無しさん:2005/09/01(木) 17:53:05
malloc
・指定したサイズの領域を確保し、そのポインタを返す
・型を気にせず(キャストして)領域を使える
・コンストラクタは呼ばない

new
・指定した型の変数を作り、そのポインタを返す
・コンストラクタを呼ぶ(クラス/構造体の場合)
  (※deleteの場合はデストラクタ)
・配列で確保する場合は[]を付けなければならない
・オーバーロード可能
935デフォルトの名無しさん:2005/09/01(木) 18:25:58
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);
936デフォルトの名無しさん:2005/09/01(木) 18:43:16
例外投げないでNULL返すnewもあるだろ。
937デフォルトの名無しさん:2005/09/01(木) 18:46:47
nothrow指定すりゃな。
938デフォルトの名無しさん:2005/09/01(木) 19:09:49
>>935
OpenDialog()云々とファイル取り扱いは問題を分けるべきだし、コードも分けるべきだ。
後者は、RAWデータはバイナリなのではないのかな?
だとすればdatabox[i][j] = buf[0] | buf[1] << 8;でいいと思うのだが。
エンディアンが逆ならば、buf[0] << 8 | buf[1]でいい。
#つーか、文字列とバイト列の違いがわかっていない悪寒。
939デフォルトの名無しさん:2005/09/01(木) 19:58:08
皆さんこんにちは。プログラマーではなく、私的な仕事ツールとしてスクリプトや簡単な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にはありません。
みなさんはこういう場合、どうコーディングされてます?
940デフォルトの名無しさん:2005/09/01(木) 20:07:09
stringstream、あるいはboost::lexical_cast。
941デフォルトの名無しさん:2005/09/01(木) 20:07:29
strstreamの代わりにstringstreamを使え。以上
942デフォルトの名無しさん:2005/09/01(木) 21:05:53
C言語でcsvファイルから要素をint型で読み込みたいのですが、なかなか難しいです。
strtokを使えばなんとかなるらしいのですが、正しいでしょうか?
ほかにもっと良い方法などあればお教えください。
943デフォルトの名無しさん:2005/09/01(木) 21:09:55
>>942
strtokで可能
後はscanfで読み込むとか、getcで読んでいってカンマが出た時点で区切るとか
944デフォルトの名無しさん:2005/09/01(木) 21:10:07
>>942
strlen関数を自作してみればやり方が分かると思うお
分割した文字列からの変換はatoiでやれば済む話だし
945デフォルトの名無しさん:2005/09/01(木) 21:10:58
>>939
プログラマのプロはプロフェッショナルのプロじゃないから、
カテゴリとしては君もプログラマだと思う。
946デフォルトの名無しさん:2005/09/01(木) 21:15:38
プロテイン・グラマー
947デフォルトの名無しさん:2005/09/01(木) 21:19:28
>>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
http://pc8.2ch.net/test/read.cgi/tech/1080569567/29
これなんですけど、動作チェックをお願いできませんか?
レスはリンク先にお願いします。

上記を利用して
http://www5b.biglobe.ne.jp/~NAS6/html/Others.htm
*:2chのスレッドレス数の監視とコテハンの発言日時をダンプします。ソースつき。
こんなの作ったんですが・・・いや宣伝です。
951デフォルトの名無しさん:2005/09/01(木) 22:04:06
カエレ
952デフォルトの名無しさん:2005/09/01(木) 22:08:45
>>950
最低な奴だな
953950:2005/09/01(木) 22:16:48
私は何かのマナー違反したのでしょうか?
直したいので教えてください。
レスはリンク先って書いておけばマルチじゃないと思っていましたが・・・
リンク先を読んでる人がいないのでは?と思いここにレスしたのですが。
954デフォルトの名無しさん:2005/09/01(木) 22:23:04
>>953
とりあえずマルチはやめろと

691 名前:634[] 投稿日:2005/09/01(木) 14:51:40
http://www5b.biglobe.ne.jp/~NAS6/html/Others.htm
*:2chのスレッドレス数の監視とコテハンの発言日時をダンプします。

出来た〜!晒しちゃおう。手抜きだけど、ソースつき。
是非是非、DLしてね。

>>637さん重ね重ね有難う。
955950:2005/09/01(木) 22:26:56
>>954
ごめんなさい。
「レスはリンク先に」でもマルチになるんですね。
スレ汚しは重ね重ねごめんなさい。
956デフォルトの名無しさん:2005/09/01(木) 22:27:19
>>953
・動作チェックしてくれと言うだけで、どこがどうおかしいかも書かない。
・他人にモノを頼んでおいてレスはリンク先へと我が儘放題。
・どんなクラスかどんな関数なのか一切情報がない。
・コードが最低最悪。

これだけ揃ってれば>952も当然だな。
957デフォルトの名無しさん:2005/09/01(木) 22:27:36
>>953
自分が作ったプログラムのデバッグを
他人にやらせるのはどうかってことでしょ。

仕様が良く分からないプログラムを動かしたら
何が起きるかわからないわけだし。

最低限、簡単な機能仕様を提示して
ソースに処理の内容がわかる程度にコメントが付いてれば
添削してくれる人はいるかもね。

手抜きで書いたソースなぞ見たくもないがな。
958950:2005/09/01(木) 22:27:41
sage忘れてしまいました。ごめんなさい。
959957:2005/09/01(木) 22:28:22
>>956
うはwかぶったww
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];
}
963デフォルトの名無しさん:2005/09/01(木) 22:44:21
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にキャストする必要がありそうです。

。・゚・(ノД`)ヽ
965デフォルトの名無しさん:2005/09/01(木) 22:53:39
>>962
元を残しておく必要がなければ、こうできる。
unsigned char *uc_after = reinterpret_cast<unsigned char *>(sc_before);
/* ucを処理 */
後はsc_beforeが元のコードのsc_afterとして使える。

ただ規格では負の値をunsignedへ変換するのは問題ないが、その逆は未定義か何かだったはず。
966939:2005/09/01(木) 22:57:37
ありです。コンテナには結局ないんですねえ。明日会社行ったら試してみます。

>>945

Σ('A`) なぬ
それじゃグラマーなだけの営業屋だと思っていた俺は

967デフォルトの名無しさん:2005/09/01(木) 23:55:17
>>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に変換する必要があるのです。
969966:2005/09/02(金) 00:26:02
>>967
違います。そんなAA貼って楽しいですか?
970デフォルトの名無しさん:2005/09/02(金) 00:31:46
char* a=(char*)malloc(100)と
char* b=(char*)calloc(100,1)と
char* c=(char*)calloc(1,100)とでは
確保されるメモリ領域のサイズは同じ?
971デフォルトの名無しさん:2005/09/02(金) 00:33:53
>>970
同じ
972デフォルトの名無しさん:2005/09/02(金) 07:05:34
fwrite,freadの2、3番目の引数って一つで十分なんじゃ
ないですか?
エンディアンもこれは関係なさそうな気が
973デフォルトの名無しさん:2005/09/02(金) 07:37:47
>>966
std::stringstreamは入出力両用で、ostrstreamに対応するのはstd::ostringstreamだ。
974デフォルトの名無しさん:2005/09/02(金) 07:38:53
>>968
すまん。規格見たら「処理系定義の値になる」だった。
975デフォルトの名無しさん
>>972
例えばintが16ビットの環境で64K以上アクセスするときに便利。