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

C言語なら俺に聞け(入門篇) Part 19

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2007/09/21(金) 11:43:13
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 18
http://pc11.2ch.net/test/read.cgi/tech/1187213990/

教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 96代目
http://pc11.2ch.net/test/read.cgi/tech/1190331997/
0412デフォルトの名無しさん 2007/10/03(水) 04:18:45
>>411
やる気が出たんなら、まずコンパイラをインストールしろ
C99じゃなくてC89でもCを学ぶのに特に問題なし
0413デフォルトの名無しさん2007/10/03(水) 08:35:42
http://www005.upp.so-net.ne.jp/h-masuda/cl/CStrPnt/c1050.html
0414デフォルトの名無しさん2007/10/03(水) 09:08:11
>>412
VC2005EEとBCC55、あとMinGW入れて細々とやっております
一応本とか大量に買い込んだんだけど良書が一つも無かったので
そこあたりのお勧め本とか教えてもらえるとうれしいっす
0415デフォルトの名無しさん2007/10/03(水) 09:32:52
すみません。質問です。

typedef struct{
UCHAR aa[3];
USHORT bb;
UCHAR cc[5];
UCHAR dd;  ←ここで問題が・・・
UCHAR ee[3];
}AA;

上のような構造体のサイズを調べたらUCHAR dd、つまり添え字のないunsigned char型は
2バイトでカウントされているみたいなのですが、1バイトではないのでしょうか?

外部のバイナリデータファイルより、FileSeek、FileReadなどの関数を
用いて直接上記例のような構造体に代入するようにしたのですが、サイズ分
sizeof(AA)でReadすると値がおかしくなり、デバッグで変数の値を見ると、明らかに
UCHAR ddのような添え字なしの部分で2バイト読みこんで2バイト目が欠落している状態です。

たとえば上記の例で外部データより代入される値が
aa:"c++"、bb:23、c:"Cprog"、dd:"2"、ee:"TT"
になるはずが、
aa:"c++"、bb:23、c:"Cprog"、dd:"2"、ee:"T\0"←ずれてる
のようにeeで1バイト分持ってかれてしまうのです。
どのようにしたらうまく行くでしょうか?

ちなみにコンパイラはBCB5を使ってます。
スレ違いだったらごめんなさいm(__)m



0416デフォルトの名無しさん2007/10/03(水) 09:52:39
それが噂の境界調整というやつ
0417デフォルトの名無しさん2007/10/03(水) 10:01:03
確かに、構造体のサイズを調べたら俺んとこじゃ16になってた・・・
まぁ、そこは仕様ってことに”しよう”
0418デフォルトの名無しさん2007/10/03(水) 10:05:52
Borlandなら#pragma pack(push, 1)と#pragma pack(pop)で挟め。
04194152007/10/03(水) 10:47:27
>>416
プロジェクトオプションのコンパイラタブみたら
まさにそれでした。うまくいきました。
ありがとうございますm(__)m

>>418
それは今回初めて知りました。
もっと勉強してきます。ありがとうございますm(__)m

0420sage2007/10/03(水) 12:25:11
昨日から勉強はじめたものすごい初心者なんですけど
テストプログラムで変なコーディングして異常終了した後に
修正してコンパイル(LSIC330C)かけようとするとなんか画面が変に
なって正常動作しない(カーソルが画面中心部に移動してコンパイルされない)
んですけどこれってどうすれば直りますか?

一応
1.現在のコマンドプロンプトを閉じる
2.めもりくりーなーで掃除する
3.再びコマンドプロンプトを立ち上げる
で直してるんですけど、やり方あってます?
0421デフォルトの名無しさん2007/10/03(水) 12:35:19
LSI C をやめて別のコンパイラにするのがいいと思うよ
0422デフォルトの名無しさん2007/10/03(水) 12:40:29
やべw名前にsageって書いちゃったw
0423デフォルトの名無しさん2007/10/03(水) 17:34:46
最近、javaとかC言語を知ったのですが、これって例えばどういう作品を
作るのに使用するものなのでしょうか?身近なものがあれば教えて下さい。

0424デフォルトの名無しさん2007/10/03(水) 17:42:02
プログラムといった作品を作るのに使用するものですよ
0425デフォルトの名無しさん2007/10/03(水) 17:42:45
最近、ハングルとか中国語を知ったのですが、これって例えばどういう作品を
作るのに使用するものなのでしょうか?身近なものがあれば教えて下さい。
0426デフォルトの名無しさん2007/10/03(水) 17:43:19
プロパガンダといった作品を作るのに使用するものですよ
0427デフォルトの名無しさん2007/10/03(水) 17:48:25
>>426
つ 座布団
0428デフォルトの名無しさん2007/10/03(水) 18:58:40
>>423
C言語/C++言語−>Windows、Excel、WORD
Java−>携帯アプリ
0429デフォルトの名無しさん2007/10/03(水) 22:01:05
http://tool-6.net/?xxy
ウィンドウのサイズ等を変更すると、描画が消えてしまうのですが、どうしたらいいですかね?
0430デフォルトの名無しさん2007/10/03(水) 22:06:22
>>429
ちゃんと見てないけど、WM_SIZEとか来たときに描画したら良いんじゃね?
0431デフォルトの名無しさん2007/10/03(水) 22:09:50
>>429
別に消えなくね?
0432デフォルトの名無しさん2007/10/03(水) 22:50:46
一様分布で乱数を発生させるには、どうすればいいんですか?
誰か教えてください。
0433デフォルトの名無しさん2007/10/03(水) 23:00:05
サイコロを振ればいいんじゃない?
0434デフォルトの名無しさん2007/10/03(水) 23:20:05
>>432
標準のrand関数ではどこか不満?
0435デフォルトの名無しさん2007/10/03(水) 23:44:08
擬似乱数はダメです
0436デフォルトの名無しさん2007/10/03(水) 23:47:35
>>435
無理www

評価する人(プログラム?)が擬似乱数を擬似乱数と見抜けなければおk
rand() が気に入らないなら MT でググれ
0437デフォルトの名無しさん2007/10/03(水) 23:50:58
>>435
じゃあランダムデバイスから読み込むとか
http://www.linux.or.jp/JM/html/LDP_man-pages/man4/random.4.html
0438デフォルトの名無しさん2007/10/04(木) 00:30:21
>>435
完全なる乱数を生成するアルゴリズムは現時点で存在していない(よね?)
そんなもんできたら暗号化技術が飛躍的に向上するだろうな。

MT乱数でも無理なの?
0439デフォルトの名無しさん2007/10/04(木) 00:37:55
サイコロ使えって
0440デフォルトの名無しさん2007/10/04(木) 00:53:23
さいころだって、面が減ってる部分がどうのこうのって
確率的に全て一緒ではないとか無茶言われてんじゃん。
0441デフォルトの名無しさん2007/10/04(木) 00:59:34
あきらめたほうがいいんじゃね?
0442デフォルトの名無しさん2007/10/04(木) 01:10:46
>>432で「一様分布」って条件が指定されてるけど、rand()にはそういう規定はあるの?
0443デフォルトの名無しさん2007/10/04(木) 01:16:19
ふつう乱数ったらデフォは一様分布だろ
0444デフォルトの名無しさん2007/10/04(木) 05:18:05
ctype.hのisalpha関数とかisspace関数の名前の頭に付いてる
isってどういう意味なんでしょうか
0445デフォルトの名無しさん2007/10/04(木) 05:26:32
be動詞の三人称単数現在形?
0446デフォルトの名無しさん2007/10/04(木) 05:38:18
〜 is alphabet or not みたいなことでしょうか
0447デフォルトの名無しさん2007/10/04(木) 05:48:58
isalpha=is an alphabetic character


if (isalpha(c)) {・・・・} は

if c is an alphabetic character then ・・・

となります。
0448デフォルトの名無しさん2007/10/04(木) 06:10:42
>>447
詳しい説明ありがとうございます
0449デフォルトの名無しさん2007/10/04(木) 07:44:54
配列って前から処理するより
後ろから処理をさせるようにプログラム組んだほうが
処理時間短くなるって本当ですか?
0450デフォルトの名無しさん2007/10/04(木) 08:27:54
どこの情報だよwwww
ポインタ使えば若干早いかもしれない
どっちにしろ、最適化すれば一緒。
0451デフォルトの名無しさん2007/10/04(木) 09:04:35
>>449
最適化の妨げになるので却って遅くなります。
0452デフォルトの名無しさん2007/10/04(木) 20:11:06
最適化されなくても、今のコンピュータは高性能だから一緒

プログラマーが処理時間を考慮する場合
5秒を3秒にするのは十分考慮する価値がある
0.2秒を0.1秒にするのはやってもやらなくても同じ
わかりやすいコードで実装できる方を優先すべき
0453デフォルトの名無しさん2007/10/04(木) 20:21:16
場所によっては2倍速はかなりおいしいけどな
0454デフォルトの名無しさん2007/10/04(木) 20:31:14
wcex.hdrBackground = CreatePatternBrush(LoadBitmap(hInstance,MALEINTRESOURCE(IDB_BITMAP1)));
クライアント領域を塗り潰せないのですが、なぜ塗り潰せないのかがわかりません?
0455デフォルトの名無しさん2007/10/04(木) 21:40:04
自己解決しました。
0456デフォルトの名無しさん2007/10/04(木) 22:11:11
環境によっちゃ0.1秒も処理が長くなれば大問題ってこともある。
0457デフォルトの名無しさん2007/10/04(木) 22:28:48
言いたい事は分かるが0.2秒を0.1秒にするのは十分考慮する価値があるだろ
0458デフォルトの名無しさん2007/10/04(木) 22:30:57
プログラムの起動から終了までが0.2秒なんじゃね
0459デフォルトの名無しさん2007/10/04(木) 22:42:34
aho darake
0460デフォルトの名無しさん2007/10/04(木) 22:57:22
用語に関して気になった事で質問したいのですが、
%d、%f、%cなどを変換指定子と覚えていたのですが、
本などによって出力変換仕様と呼んでいたり、
dやfの部分だけを変換指定子、もしくは変換指定文字と呼んでいたりするので
どれが正しいのかわからず混乱しています。
これらは状況によって使い分けがあるのでしょうか?
0461デフォルトの名無しさん2007/10/04(木) 22:59:54
フォーマット指定子とも呼ぶ
0462デフォルトの名無しさん2007/10/04(木) 23:04:54
>>460
ISO X 3010読めばいいと思うよ。
§7.19.6に定義が書いてある。

「変換指定子」は変換指定の一番最後の一文字(d,f,e,a,...)だけを指す言葉。
0463デフォルトの名無しさん2007/10/04(木) 23:39:44
>>457
アプリによってはそうかもしれな
04644602007/10/04(木) 23:40:33
ありがとうございます。
ISO X 3010は知らなかったので今調べてみましたが
普通には売ってない上に値段も結構するようなので
いつかは買って手元に置いときたいと思います。
0465デフォルトの名無しさん2007/10/04(木) 23:46:07
>>462
JIS X 3010だろう
0466デフォルトの名無しさん2007/10/05(金) 00:12:28
>>464
ネットでPDF閲覧できるよ
印刷も検索も出来ないけど
0467デフォルトの名無しさん2007/10/05(金) 00:50:26
>>466
それってファイルサイズが異様にでかくない?
開くとスクロールするのも重いんだ。PCが貧弱なせいか?
文字が粗いし、質の悪い画像を貼っつけた感じに見える。
0468デフォルトの名無しさん2007/10/05(金) 01:49:30
初心者で申し訳ありませんが
UNIX GUNコンパイラ環境で ディレクトリー内ファイル名を取得してchar型の配列に格納する方法を教えていただけないでしょうか?
0469デフォルトの名無しさん2007/10/05(金) 02:03:47
opendir->readdir->closedirじゃまいか?
0470デフォルトの名無しさん2007/10/05(金) 02:11:03
>>468
つ[popen()]
0471デフォルトの名無しさん2007/10/05(金) 02:17:57
大人げないのでGUNコンパイラに突っ込むぜ
0472 ◆mzJ2j3E1Wc 2007/10/05(金) 12:49:06
テキストファイルのデータを読み込んで、そのデータを使って演算して、
拡張子を変えて別なテキストファイルに書き込むプログラムを作っているのですが、
テキストファイルからデータを持ってくるやりかたが解りません。

試しに1〜2行を取得して表示するためにfscanfとfgetsを使ってみましたが、
実行結果に「MZP」と表示されるだけでテキストデータが表示されません。

どうやったら解決できるでしょうか?
0473デフォルトの名無しさん2007/10/05(金) 12:57:34
開くときファイル名に argv[0] を指定してる予感
0474デフォルトの名無しさん2007/10/05(金) 13:05:51
>>472
ソースを提示しろよ
0475 ◆mzJ2j3E1Wc 2007/10/05(金) 13:22:06
今出来てる分だとこれだけですが・・・
よろしくおねがいします。

#include<stdio.h>

void load_data(char *fname);

// メイン
int main(int argc , char *argv[]) {
load_data(*argv);
return 0;
}

// ファイルロード
void load_data(char *fname) {
FILE *fp;
int num;
char str[256] , str2[256];
double f;

if((fp = fopen(fname , "r")) == NULL ) {
puts( "Can't Open File." );
}
printf("File Open.");

while (fgets(str, 256, fp) != NULL) {
printf("%s", str);
}
fclose(fp);
}
0476デフォルトの名無しさん2007/10/05(金) 13:23:48
>>475
load_data(*argv);
↓
load_data(argv[1]);


>>473
!!!
0477 ◆mzJ2j3E1Wc 2007/10/05(金) 14:11:45
>>476
ありがとうございます。
ちょっとやってみます。
0478デフォルトの名無しさん2007/10/05(金) 14:39:46
なぜコテ
0479 ◆mzJ2j3E1Wc 2007/10/05(金) 14:42:32
>>473,>>476
お蔭様でファイルの読み込みまでいけました。
この調子で頑張ってみます。
ありがとうございました。

>>478
ID出ないから、一応トリつけました。
0480デフォルトの名無しさん2007/10/05(金) 16:21:32
>>475
関係ないが、そのソースだとファイルオープン失敗しても、普通に処理続けちゃうぞ
0481デフォルトの名無しさん2007/10/05(金) 18:59:20
このスレに本物のエスパーがいると聞いて飛んできました
0482デフォルトの名無しさん2007/10/05(金) 19:21:05
二次元配列を引数にした関数ってどうやって書くの?
char str[HOGE_NUM][HOGE_LEN];
みたいな配列があったとして
void getlist( char *str[HOGE_LEN] );
と書けばいいの?
0483デフォルトの名無しさん2007/10/05(金) 20:43:55
perlで言う所の $string=〜s/hoge/foo/g; とか
@array=split(/\s+/,$string); みたいな関数って
C言語にはないのですか?
もし無いとすれば自作するしか無いと思いますが
その場合、典型的なアルゴリズムってどうなりますか?
0484デフォルトの名無しさん2007/10/05(金) 20:45:23
strstr, strtok
0485デフォルトの名無しさん2007/10/05(金) 20:48:04
ありがとうございます
さっそく練習してみます
0486デフォルトの名無しさん2007/10/05(金) 21:59:13
>>482
void getlist(char str[][HOGE_LEN])
か
void getlist(char (*str)[HOGE_LEN])
0487デフォルトの名無しさん2007/10/05(金) 23:30:29
>>483
正規表現だよな?
Cはおろか、C++だって標準では対応されていない。
ライブラリなら結構あるから探してみては?
0488デフォルトの名無しさん2007/10/06(土) 09:45:32
n×n行列のカギカッコみたいなのってどうやったら表示できますか?

a[0][0]=0.0; a[1][0]=1.0; a[2][0]=2.0;
a[0][1]=10.0;a[1][1]=11.0;a[2][1]=12.0;
a[0][2]=20.0;a[1][2]=21.0;a[2][2]=22.0;
とプログラムを作成してもできません。
あとdoubleで↑のとおりやっているのですが小数点を消す場合はcharにしないと無理なんでしょうか?
0489デフォルトの名無しさん2007/10/06(土) 10:51:31
>>488
お前プログラミング止めたほうが良いよ
0490デフォルトの名無しさん2007/10/06(土) 12:23:19
表示しなきゃ表示されるわけないじゃん
0491デフォルトの名無しさん2007/10/06(土) 14:46:55
C言語の勉強を始めて1週間の、高校1年生です。
簡単なシューティングゲームを作りたいのですが、
初めてC言語をやり始めてた人で、どれくらい時間かかりますかね?
0492デフォルトの名無しさん2007/10/06(土) 14:51:42
個人差によって、3日〜300年くらいじゃね?
0493デフォルトの名無しさん2007/10/06(土) 14:53:17
C言語→(ポインタ)
→Win32API→(イベントドリブンプログラム)
→DirectX(簡単なCOMの知識 画像、音声、音楽等マルチメディア系に関しての知識)
→3Dに関する知識(高校レベルの数学 行列、ベクトル)
→ゲーム製作(最適化、タスクシステム)

真面目にやるなら道のりは長い

HSPとかでいいんんじゃね
0494デフォルトの名無しさん2007/10/06(土) 15:13:36
シューティングを題材にした教本を買ってくれば?一番確実だと思う
0495デフォルトの名無しさん2007/10/06(土) 21:08:56
>>491
DirectX使用みたいでこんな解説サイトもあるよ。
http://l.huu.cc/s/

詳しく見たことないんで、中身の良し悪しは知らん。
0496デフォルトの名無しさん2007/10/06(土) 22:49:46
char *p = "ABC";

これはわかるんですが、

char *p;
p = "ABC";

こういう書き方が何故可能なのかがわかりません。
pってアドレスを指しているんですよね?それに直接文字列を代入ってどういうことでしょう。
0497デフォルトの名無しさん2007/10/06(土) 22:55:33
>>496

上だろうが下だろうが"ABC"っていう文字列が、
「プログラムが格納されているメモリ」のどこかに格納されている
ということはわかる?
0498デフォルトの名無しさん2007/10/06(土) 22:56:08
""は文字リテラルに対するアドレスだ。
前者が分かる時点で後者もわかるはず。
わからないのは何か勘違いをしている。
0499デフォルトの名無しさん2007/10/06(土) 22:58:09
たぶん上は *p = とかいているのに
下は p = と書いてあるから勘違いしているんだと思われ


0500デフォルトの名無しさん2007/10/06(土) 23:03:45
>char *p;
char* p;
自分はいつもこう書いてる
昔499のような事で混乱してたけどこれだと少し理解しやすいと思った
まぁどうでもいいんだけど
0501デフォルトの名無しさん2007/10/06(土) 23:11:05
>>497
はい、それはもちろん

>>498
アドレスなんですか?それだと今度は上がおかしくなってしまうような…。
ポインタって、*pでアドレスpの指す中身を示しているんですよね。
その中身をアドレスにしてしまったら、文字列はどこへ行ってしまうんでしょう?
0502デフォルトの名無しさん2007/10/06(土) 23:13:49
やっぱり>>499の言ってる勘違いをしてるようだな
0503デフォルトの名無しさん2007/10/06(土) 23:13:57
文字リテラルはメモリ上のどこかに確保されている。
char * p;で確保されるのはポインタ。
上も何もおかしくないけど・・・
0504デフォルトの名無しさん2007/10/06(土) 23:14:33
>>501
Cはポインタの宣言まわりが腐ってるから、あんまり気にスンナ。
0505デフォルトの名無しさん2007/10/06(土) 23:15:04
>>502
っぽいよな、上も下もしていることは基本的に何も変わらない。

char * p;はchar *型のpという変数を定義している。
0506デフォルトの名無しさん2007/10/06(土) 23:24:21
>>501

char *p = "ABC";
↑このときの * は逆参照演算子(間接参照演算子)ではないんですよ。

http://kmaebashi.com/programmer/pointer.html
ここが詳しい。
0507デフォルトの名無しさん2007/10/06(土) 23:30:54
char* p = "ABC";の方がわかりやすいんじゃない?
0508デフォルトの名無しさん2007/10/06(土) 23:36:11
>>505
char *型のpという変数は、アドレスを格納する値ですよね。
つまり下の場合、文字列リテラルのアドレスをpに格納してるってことですか。
printf("%s",*p)とすればABCが表示されるということですね。

それならば上はどういう意味なのでしょう?
アドレスpの中身に文字列リテラルのアドレスを格納してるってことになりませんか?
それだとprintfした時にABCでなくアドレス値が表示されてしまうと思うのですが…


>>506
>宣言の中の * と式の中の * とでは意味が全く異なるにも関らず 同じ記号が使われている。
>前者はポインタを意味し、後者は間接参照を 行なう演算子である。

なるほど、しかしポインタとはWikiによると

>ポインタ (pointer)とは、あるオブジェクトがなんらかの論理的位置情報で
>アクセスできるとき、その位置を表現する変数の事をいう。

とあるのですが、では宣言の中の*は、それ自体が変数ってことですか?
それはちょっとおかしいと思うのですがどうなってるんでしょう…?
0509デフォルトの名無しさん2007/10/06(土) 23:41:55
*はポインタ変数を宣言するために付ける必要がある
0510デフォルトの名無しさん2007/10/06(土) 23:49:00
参照演算子をつけた*pは文字列じゃないよ。
pというアドレスにある「char型の値」、すなわちこの場合'A'の1文字だけを指す。
0511デフォルトの名無しさん2007/10/06(土) 23:51:50
*p == 'A'
*(p+1) == 'B'
*(p+2) == 'C'
*(p+3) == '\0'
これくらい分解して考えればわかりやすいんじゃないか?
■ このスレッドは過去ログ倉庫に格納されています