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

C言語なら俺に聞け(入門編)Part 60

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/01/31(日) 15:48:19
C言語の*入門者*向け解説スレッドです。
★前スレ
C言語なら俺に聞け(入門編)Part 59
http://pc12.2ch.net/test/read.cgi/tech/1263014439/
★過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
★初心者、初級者の方は他の質問スレのほうが良いかもしれません。
例えば
【初心者歓迎】C/C++室 Ver.70【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1258873470/
とか
★教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 133代目
http://pc12.2ch.net/test/read.cgi/tech/1260532772/
★C++言語についてはなるべく聞かないでください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
0153デフォルトの名無しさん2010/02/04(木) 16:03:20
>>152 n進数への応用がきかない。
0154デフォルトの名無しさん2010/02/04(木) 16:14:42
#include <stdio.h>
int main() {
int n = 7, i;
for (i = 0; i < sizeof n * 8; i++) {
printf("%d\n", !!(n & (1 << i)));
}
return 0;
}
0155デフォルトの名無しさん2010/02/04(木) 16:35:11
そもそも>>151の言うように、どういう出力を期待してるのか
質問者は書いてみてくれないか
0156デフォルトの名無しさん2010/02/04(木) 22:06:21
while(1)の中で
入力待ちをはさんでenter一回押して
次いくようにするにはどうすればいいですかね?
0157デフォルトの名無しさん2010/02/04(木) 22:09:20
環境にもよる
0158デフォルトの名無しさん2010/02/04(木) 22:14:17
>>156と似たようなことやりたくて、前にこんな書き方してたけど、問題ないですかね

void wait(void){
wchar_t enter[1];
fgetws(enter, 1, stdin);
while(getwchar() != L'\n');
}
0159デフォルトの名無しさん2010/02/04(木) 22:20:24
>>158
'\n' より先に EOF がくると無限ループしない?
01601562010/02/04(木) 22:42:16
なんかこれででけたわ。大丈夫かな?
char wait;

scanf("%c",&wait);
0161デフォルトの名無しさん2010/02/04(木) 23:17:58
変数を途中で初期化することは出来ますか?

int a=0;

〜 プログラム 〜

/* ここで、一旦0にリセットしたい。 */

〜 プログラム 〜
0162デフォルトの名無しさん2010/02/04(木) 23:23:40
>>161
代入ならできる
0163デフォルトの名無しさん2010/02/04(木) 23:27:57
そうですね。
単純なことを忘れてました。
0164デフォルトの名無しさん2010/02/04(木) 23:31:05
>>161
代入って代わりに入れるんですよね
どこに代わりに入れるんですか
0165デフォルトの名無しさん2010/02/04(木) 23:56:15
>>164
161の例でならaでしょ
01661582010/02/05(金) 00:35:30
>>159
有り難う御座います
Ctrl+ZでEOFを入力したところ無限ループにはならなかったのですが
入力した文字にEOFが含まれていると、fgetwsがもう一度入力を求めるような挙動になりました
これはどういうことなんでしょうか
0167デフォルトの名無しさん2010/02/05(金) 14:36:24
ファイルじゃなくて
メモリを
freadやfgetsとかする方法って無いですか?
0168デフォルトの名無しさん2010/02/05(金) 14:43:05
/dev/kmemでもオープンしてみる?
0169デフォルトの名無しさん2010/02/05(金) 14:44:05
イミフな質問だな
こいつは何がやりたいんだろう
0170デフォルトの名無しさん2010/02/05(金) 14:50:55
いちゃいちゃうふふ♪ をみたいのだろう。
0171デフォルトの名無しさん2010/02/05(金) 14:58:18
c言語、郵便料金の求め方

定形郵便
長さが14〜23.5cm、幅が9〜12cm、厚さが1cmまでのもの
重さが50gまでのもの
封書の長さ、幅、厚さ、及び重さを与えて、次の表から郵便料金を計算する。

定形外郵便
上記の条件をオーバーしているもの。



郵便料金

25gまで 定形80円 定形外130円
50gまで 定形90円 定形外130円
100gまで 定形外 190円
250gまで 定形外 270円
500gまで 定形外 390円
1kgまで 定形外 700円
2kgまで 定形外 950円
3kgまで 定形外 1150円
4kgまで 定形外 1350円

なお、次の条件を満たしていない場合は、第1種の郵便物の取り扱いとならないので、その旨の表示を行う。

長さが14cm以上60cm以下である。
幅が9cm以上である
長さ+幅+厚さが90cm以上である。
重さが4kg以下である。

つまりこの条件にひとつでも当てはまれば、(この郵便物は取り扱いできません。)と表示させれば大丈夫です。
0172デフォルトの名無しさん2010/02/05(金) 14:59:41
★教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 133代目
http://pc12.2ch.net/test/read.cgi/tech/1260532772/
0173デフォルトの名無しさん2010/02/05(金) 15:00:23
で、何?

宿題なら専門スレにどうぞ
0174デフォルトの名無しさん2010/02/05(金) 15:01:25
最新は134代目だったな。
0175デフォルトの名無しさん2010/02/05(金) 15:02:07
>>169
今までパッケージしていなかったファイルを
パッケージ化して一部取り出してメモリに格納して処理したい
一時ファイルを作らずにやりたい

で、ファイルでやっていた処理を
メモリ版として使いたい
なるべくソース書き換えたくない
freadならなんとかなるけど
fgets,fscanfとか書き換えるのめんどい

fopenをなんとかしたらなりそうな気がするけど無理か
01761752010/02/05(金) 15:02:57
宿題じゃないけど
宿題スレで聞いた方がいい?
0177デフォルトの名無しさん2010/02/05(金) 15:04:23
宿題じゃなきゃなんだよ。
趣味か?
まさか業務じゃあるまい。
0178デフォルトの名無しさん2010/02/05(金) 15:06:48
ん? 175=176≠171か。
0179デフォルトの名無しさん2010/02/05(金) 15:11:56
>>175
FILE *tmpfile(void);
で一時ファイルを作るのがいいと思う

実際にファイルが作られるかどうかは実装依存だけど
小さなものならメモリ上でうまくやってくれそうな気はする
0180デフォルトの名無しさん2010/02/05(金) 15:15:04
stringstreamみたいなのがアレばいいのにね
0181デフォルトの名無しさん2010/02/05(金) 15:16:28
tmpfileだとバイナリで
fscanf等、文字列系の処理がうまくいかない気がする
0182デフォルトの名無しさん2010/02/05(金) 15:24:35
memccpyとかscanfにするのではダメなのか
0183デフォルトの名無しさん2010/02/05(金) 15:25:28
似たような質問が

C言語の質問です。 mallocなどで確保した任意のメモリ領域をFILE構造体、またはファイルディスクリプタとして扱う方法はないでしょうか? OSに依存した方法でもかまわな.. - 人力検索はてな

http://q.hatena.ne.jp/1212571670
0184デフォルトの名無しさん2010/02/05(金) 15:28:51
つ fmemopen
0185デフォルトの名無しさん2010/02/05(金) 15:30:26
fopen( filename , "rt" )なのを
fopen_b( data , size , "rt" )
ってな感じに書き換えるだけで無いかなと
directXで言うD3DXCreateTextureFromFile、D3DXCreateTextureFromFileInMemoryみたいな

コード書き換えるか一時ファイル作ります

ありがとうございました
0186デフォルトの名無しさん2010/02/05(金) 15:32:06
>>184
うわああ
それです。
ありがとうございます
ありがとうございます
0187デフォルトの名無しさん2010/02/05(金) 16:50:40
>>186
うわああ
なんどもありがとうございますといってくれて
ありがとうございます
ありがとうございます
0188デフォルトの名無しさん2010/02/05(金) 19:08:31
fmemopen()てgcc限定?
0189デフォルトの名無しさん2010/02/05(金) 20:24:08
gccのbuiltinでは無い。
0190デフォルトの名無しさん2010/02/05(金) 20:54:25
今はまだglibc限定
0191デフォルトの名無しさん2010/02/05(金) 21:05:41
for(i=0;i<1;i=i+0.1)
 {

 }


と書くと、無限に動き続けるのはなぜですか?
0.1を1に直すと正常に動くので、小数のせいかなとも思ったのですが、
{}の中で、0.1刻みの計算をしたいのです。
0192デフォルトの名無しさん2010/02/05(金) 21:09:38
iはdouble or floatで宣言されてる?
0193デフォルトの名無しさん2010/02/05(金) 21:13:11
いつも「i++」と置いているので「int」になっていましたw
ちゃんと動くようになりました。
0194デフォルトの名無しさん2010/02/05(金) 21:26:06
コンパイラの警告レベルは高くしる
0195デフォルトの名無しさん2010/02/05(金) 22:00:04
printf("誤差率 %lf %",a);

誤差率 a %

のように表示させたいのですが、半角の%だと表示されません。
全角を使うしかないのでしょうか?
0196デフォルトの名無しさん2010/02/05(金) 22:04:45
>>195
%%
0197デフォルトの名無しさん2010/02/05(金) 22:05:47
printf("誤差率 %lf %c",a,'%');
0198デフォルトの名無しさん2010/02/05(金) 22:08:37
有難うございました。
0199デフォルトの名無しさん2010/02/06(土) 00:43:25
何か本当に入門スレだな
0200デフォルトの名無しさん2010/02/06(土) 01:27:47
それがなにか?
0201デフォルトの名無しさん2010/02/06(土) 06:55:30
ファイルがない場合は新規に作成する、名簿のプログラムを作りました↓
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10495.txt

コマンドプロンプトでは上手く表示されるのに、datファイルを開こうとすると
「Null文字を含むファイルです。Null文字は半角スペースへ変換しました。」
となり、文字化けしてしまいます。

文字化けを防ぐにはどうすればいいですか?

0202デフォルトの名無しさん2010/02/06(土) 07:04:04
>datファイルを開こうとすると
じゃなくて、
“このプログラムを使用して作成したdatファイルをテキストエディタ(TeraPad)で開こうとすると”
だろ。

このプログラムが作成しているのはテキストファイルじゃなくてバイナリファイルだから当然だ。
0203うんこ2010/02/06(土) 15:57:07
OS:Windows Vista
コンパイラ:Borland C++ 5.5.1 for Win32
ttp://homepage2.nifty.com/jr-kun/hidemaru_qa/make_dll.html#intro
上記のサイトを参考に秀丸エディタで利用できる「hello world!」を表示するDLLを作る方法を勉強しています
hidemaru.cというファイルに以下の内容を書きました↓
#define HIDEMARU_MACRO_DLL __declspec(dllexport)
HIDEMARU_MACRO_DLL /* __declspec(dllexport) */
LPCSTR hello(void) /* LPCSTR は const char* の typedef */
{
return "hello world!";
}
コマンドラインから「bcc32 -WD -hello_world.dll hidemaru.c」と打ったのですがエラーになってdllが作成されません
エラー内容→bcc32 -WD -hello_world.dll hidemaru.c
どのように修正したらdllが作れるのかどなたかご教示お願いします
0204デフォルトの名無しさん2010/02/06(土) 16:23:19
さあ、エラー内容を再掲する作業に戻るんだ↓
0205デフォルトの名無しさん2010/02/06(土) 16:24:21
つ

http://kineko.dyndns.org/~touhou/up/source/up3665.zip
0206デフォルトの名無しさん2010/02/06(土) 18:45:45
>>203
#include <windows.h>
0207デフォルトの名無しさん2010/02/06(土) 20:18:23
void *malloc_e( size_t size, char *name )
{
char *str;
void *buf;

buf = (void*) malloc( size );
if ( buf == NULL ) {
str = strerror( errno );
fprintf( stderr, "malloc failed (%s): %s\n size: %d\n", name, str, size );
exit( EXIT_FAILURE );
}
return( buf );
}

のとこで
malloc failed (left): Not enough space
size: 7064

ってでたんだけど容量不足?
0208デフォルトの名無しさん2010/02/06(土) 20:35:44
>>207
おそらく容量不足なんだろうね
もしくはメモリ管理してる部分を破壊したか
02092032010/02/06(土) 20:44:44
>>204-206
エラー貼り付け忘れましたすみませんでした。

大変分かりやすいソースコードをアップしてくださり頂きありがとうございました。
頂きましたソースコードを元に勉強してみます
0210デフォルトの名無しさん2010/02/06(土) 21:50:40
>ポインタ型は、明示的にキャストすることで、非常にユニークな使い方ができます
>C/C++ 言語の経験者にとっては、お馴染みの作業かもしれませんが
>Java から C# 言語に移行してきた人であれば、ポインタの威力を肌で感じることでしょう

voidのポインタを調べていたら、こんな記事を発見
これでは偉そうな事を言っているけど、Javaとか.netのobjectと同じなんですよね?
無理やりObjectクラスを作っているような気がする
0211デフォルトの名無しさん2010/02/06(土) 21:56:50
>>207
だけど、sizeが大きすぎるのが問題?小さすぎるのが問題??
0212デフォルトの名無しさん2010/02/06(土) 22:37:21
1 それ以前に沢山mallocした。
2 それ以前にメモリアロケータが管理用に使用している領域を破壊した。

オレの勘では2
0213デフォルトの名無しさん2010/02/06(土) 22:48:46
>>212
1だとfree()つかってれば開放してれば問題ない??
2は解決策ありますか?
0214デフォルトの名無しさん2010/02/06(土) 22:52:06
バグを取り除く
0215デフォルトの名無しさん2010/02/07(日) 02:22:53
今時のOSにメモリ容量を考えればメモリ領域の不足にmallocエラーはあまり考えにくいよな
95とかNTの時代には結構あったけど
0216デフォルトの名無しさん2010/02/07(日) 03:11:26
>>210
Object型ってメモリ・マップドI/Oに利用出来るの?
0217デフォルトの名無しさん2010/02/07(日) 03:27:08
>>215
リアルタイム系OSの場合は規定時間以内に処理が出来なかった
場合はtime_outフラグを設定してエラー値を返すように
拡張されている標準関数も多いです。
mallocもその例外ではなく、指定時間以内にallocに成功しなかった
(システムがディスクスワップやI/Oで忙しい時とか)場合は
NULLが返ってくるでしょう。これは勿論メモりが不足している
という意味ではありません。暫く待ってからリトライして
くれという意味になります。
0218デフォルトの名無しさん2010/02/07(日) 09:40:38
>>217
質問スレッドであって知識をひけらかすスレッドじゃない。
元質問者のレベルを推測して発言しようね。
0219デフォルトの名無しさん2010/02/07(日) 10:21:32
>>217 へー。それ何ていうOS?
標準ライブラリと同じ名前で動作が違う関数なんて使いにくそう。
0220デフォルトの名無しさん2010/02/07(日) 11:22:03
>>217
使う側から見れば便利だけど、カーネルの中のつくりは大変そうだ。
タイムアウトになったら、そこまでのカーネルの中の処理は全部
キャンセルなんでしょ?
ロックの粒度が荒くなって、ヘタするとこの仕様自体が処理遅延の
要因になりかねないな
0221デフォルトの名無しさん2010/02/07(日) 11:32:24
ページフォルトのキューを貯めていっても
「じゃ諦めます」てなアプリがどれくらい含まれてるかも考慮する必要があるしね
0222デフォルトの名無しさん2010/02/07(日) 11:45:05
ページフォールトというかページングなんかが起きるようじゃダメでしょ
最悪実行時間が計れない
必要なページはあらかじめ全部読み込んでおかないと
0223デフォルトの名無しさん2010/02/07(日) 12:14:45
PCでも一度にでかすぎるブロックをmallocしようとすると合計使用メモリにかかわらず失敗するよ。
いまgccで試してみたら2GBで失敗した。ちなみにWinXPで物理メモリは3.25GB。
0224デフォルトの名無しさん2010/02/07(日) 12:23:49
>>223
最初の質問をrefer
0225デフォルトの名無しさん2010/02/07(日) 12:31:41
ああ、sizeは小さかったのね。スマソ
0226デフォルトの名無しさん2010/02/07(日) 14:02:29
>>223
OS起動時に/3GBオプション設定してる?
0227デフォルトの名無しさん2010/02/07(日) 14:12:23
そりゃMSのXPx86はOS管理用に2GBのメモリ割り当ててるんだから
mallocで2GB以上割り当てようとしたらエラーになるだろ
0228デフォルトの名無しさん2010/02/07(日) 14:28:15
>>220
逆。プロセスのロジックは若干増える。
システムに協調的にしなければならない
から。システムコールする度にそれに
かかった時間もプロセスのどっかに書
かれて戻るからそれを見て処理手順
をプロセスレベルで変更できる。
0229デフォルトの名無しさん2010/02/07(日) 18:10:16
人名を配列に入れて扱いたいのですが、できなくて困っています。
name[0]="山田" name[1]="鈴木" name[3]="佐々木"
のようにしたいのですが 
初心者なので変な質問かもしれませんが、代案があれば教えていただきたいです。
0230デフォルトの名無しさん2010/02/07(日) 18:13:06
>>229
nameがcharの配列の配列であることを前提として、strcpy。
0231デフォルトの名無しさん2010/02/07(日) 18:20:30
stringつかえ
初心者はC++STLが一番。
name[0]="山田";と出来るぞ
0232デフォルトの名無しさん2010/02/07(日) 18:22:53
>>229
char name[4][10]={"渡辺","佐藤","山田","井上"};
0233デフォルトの名無しさん2010/02/07(日) 18:27:11
佐々木さんとか東さんはどうすればいいの?
0234デフォルトの名無しさん2010/02/07(日) 18:28:26
C++最高いやっほーう!!
0235デフォルトの名無しさん2010/02/07(日) 18:29:59
>>229
char *name[]={"渡辺", "鈴木", "佐々木"}; 
でいいのでは
02362292010/02/07(日) 18:34:22
みなさん、ありがとうございました。
こんなにすぐに回答していただいて、びっくりしました(^^)
0237デフォルトの名無しさん2010/02/07(日) 19:43:19
環境 mac os
gcc -o b.exe daytimetcpcli.c でコンパイルすると下記のエラーが出てしまいます。
ソースは提供されているソースをコンパイルしたものですが、どのようにすれば
コンパイルが成功するのでしょうか?よろしくお願いいたします


In file included from daytimetcpcli.c:1:
unp.h:7:66: error: ../config.h: No such file or directory
unp.h:200:30: error: ../lib/addrinfo.h: No such file or directory
In file included from daytimetcpcli.c:1:
unp.h:214: error: redefinition of ‘struct timespec’
unp.h:294: error: conflicting types for ‘gai_strerror’
/usr/include/netdb.h:263: error: previous declaration of ‘gai_strerror’ was here
unp.h:298: error: conflicting types for ‘getnameinfo’
/usr/include/netdb.h:272: error: previous declaration of ‘getnameinfo’ was here
unp.h:302: error: conflicting types for ‘gethostname’
/usr/include/unistd.h:451: error: previous declaration of ‘gethostname’ was here
unp.h:318: error: conflicting types for ‘inet_ntop’
/usr/include/arpa/inet.h:99: error: previous declaration of ‘inet_ntop’ was here
0238デフォルトの名無しさん2010/02/07(日) 19:51:04
>unpv12e.tar.gz を持ってきて試してみたところ…README にやり方が
>ちゃんと書いてありますがな。ドキュメントはちゃんと読みましょう。
> % ./configure
> % cd lib
> % make
> % cd ../intro
> % make daytimetcpcli
>でうまくいきました。
0239デフォルトの名無しさん2010/02/07(日) 21:08:26
配列をサブルーチンに送りたいのですが、
スタイルキャストが必要
とか言って、エラーが出てきてしまいます・・・。
この場合はどうしたら良いんでしょうか?
0240デフォルトの名無しさん2010/02/07(日) 21:19:16
ソースを出せ
0241デフォルトの名無しさん2010/02/07(日) 22:36:36
いやです。醤油じゃだめ?
0242デフォルトの名無しさん2010/02/07(日) 23:27:29
fpos_t についてですが、ファイルに変更を加えなければ、何度ファイルを開いても
同じ fpos_t値 は常に同じところを指すのでしょうか? おしえてください。
0243デフォルトの名無しさん2010/02/07(日) 23:31:13
>>238
すみません。その操作はいったいなにをしているのでしょうか?
0244デフォルトの名無しさん2010/02/07(日) 23:42:35
うわー
0245デフォルトの名無しさん2010/02/08(月) 01:17:10
>>242
いいえ
0246デフォルトの名無しさん2010/02/08(月) 07:26:05
>>243
わかんないなら、あきらめれ
0247デフォルトの名無しさん2010/02/08(月) 08:14:20
>>243
ここみて、わかんないなら、ほんとうにあきらめれ
ttp://www7b.biglobe.ne.jp/~tsu/mac/unpv12e.html
0248デフォルトの名無しさん2010/02/08(月) 12:41:53
スティーヴンス本は、プログラマのバイブルだよな
0249デフォルトの名無しさん2010/02/08(月) 13:44:43
猫プロでウィンドウが閉じません
http://www.kumei.ne.jp/c_lang/sdk/sdk_10.htm

if(id == IDYES)
{
if(KillTimer(hWnd, ID_MYTIMER) == TRUE)
{
}
 DestroyWindow(hWnd);
}

どちらか片方をコメントにすると閉じるのですが、なにがまずいんでしょか
0250デフォルトの名無しさん2010/02/08(月) 14:25:05
猫の話をここでするな
02512492010/02/08(月) 14:35:35
ごめんなさい
0252デフォルトの名無しさん2010/02/08(月) 14:38:58
Solarisたんの mkfile コマンドを、遊びでLinuxに移植しようと
思うのだが、zero埋めってどうやればベストなのかな?

zeroのバッファを用意してwriteしまくる、だと遅いのかな。
truncate(2) の方がいい?

# いや head とか dd 使えばいいだろ、とか言わないで ><
■ このスレッドは過去ログ倉庫に格納されています