[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 2chのread.cgiへ]
Update time : 07/29 12:15 / Filesize : 128 KB / Number-of Response : 591
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 11:40:35 ]
C言語の入門者向け解説スレです。

教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
  C/C++の宿題を片付けます 115代目
  pc11.2ch.net/test/read.cgi/tech/1217741118/

・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
  C言語なら俺に聞け(入門篇) Part 35
  pc11.2ch.net/test/read.cgi/tech/1219761846/
過去スレ
  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

357 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 14:24:28 ]
正しいと思う場所に入れてみたら?

358 名前:350 mailto:sage [2008/09/27(土) 14:38:05 ]
勉強になりました。ありがとうございます。

359 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 14:44:27 ]
>>349
そのていどwebで十分


360 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 15:46:20 ]
>>355-357
goto入れる場所変えたらどうにかなるもんでもないでそ。
>>355のgoto文以外の並びじゃどうあがいても無理。

361 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 17:27:47 ]
皮肉もわからないのかお前は

362 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 20:19:29 ]
か・・皮肉?

363 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 21:35:05 ]
kuma-

364 名前:デフォルトの名無しさん [2008/09/27(土) 21:44:46 ]
goto を教条主義的に忌避している者は、いざ使おうとすると付け焼き刃で桁下がりが出まくり

365 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 22:12:52 ]
switch( !条件1 ){
 case 0:
  処理1;
  if( 条件2 ){
   処理2;
   break;
  }
 case 1:
  処理3;
}



366 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 22:17:12 ]
しつこい

367 名前:デフォルトの名無しさん [2008/09/27(土) 22:57:13 ]
Cに限らないかもしれないけど
0 < hoge
みたいに比較演算子使うときに定数を左辺に持ってくる書き方は
どのようなメリットがあるのですか?

368 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 22:59:09 ]
見た目が分かりやすくなるという人も居る

369 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 22:59:50 ]
>>367
イメージとして数直線があるとき

370 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 23:01:03 ]
0 < hoge && hoge < 10
なんかだと数学の書き方にちょっと似る

371 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 23:08:13 ]
もう何年も>演算子を使っていない

372 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 23:09:49 ]
>>370
0 ≦ hoge ≦ 10 みたいな書き方からの連想だよね。

373 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 23:10:10 ]
>>371
よう俺

374 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 23:12:44 ]
>>368
自分は代入演算子と間違えないためかと思ってました

>>369
なるほど〜
数直線なんて単語すっかり忘れてました

>>370
そういう使い方もあるのですね

とても参考になりました
ありがとうございます

375 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 02:25:39 ]
int配列で hoge[] = {1,2,3,4} みたいな物を
1234と連結させたint型に直したい時に
なにか賢い方法ありますか?



376 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 02:27:34 ]
>>375
1234と連結させたint型とはなんですか?
10進数の1234ですか。

377 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 02:28:14 ]
ごめんなさい、そうです

378 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 02:34:06 ]
for(i=0,n=0;i<hogelen;i++) n=10*n+hoge[i];

379 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 08:17:06 ]
標準ライブラリの関数ってどのぐらい早いの?

380 名前:デフォルトの名無しさん [2008/09/28(日) 08:47:23 ]
Windowsで、system("test.exe")と実行ファイルを呼び出したとき、
test.exeはどのパスにあるか調べる方法はありますか?

381 名前:デフォルトの名無しさん [2008/09/28(日) 08:50:53 ]
もしくは、test.exeが利用可能か調べる方法でも良いです。

382 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 08:58:32 ]
>>380
つmain

383 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 09:01:41 ]
>>379
例えばmemcpyはバイト数指定なのに32bit単位でコピーして端数処理もやってるのもあるから、そこそこ速い

384 名前:デフォルトの名無しさん [2008/09/28(日) 09:02:59 ]
>>382
もうちょい教えてください。やり方判りません

385 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 09:40:52 ]
>>382じゃないけどargc、argvを貰えと言ってるんだと思う



386 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 09:43:21 ]
二次元配列を別の関数へ渡す時
なぜこの方法で渡せるのかわかりません。
[2][2]で受け渡したいです。

void func(int array[][2]); //関数宣言

void mainf(){

int array[2][2]={1,2,
3,4};

func(array)

}

void func(int array[][2]){
}

387 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 10:01:23 ]
[2][2]でも渡せる。
なぜ[][2]で渡せるかは配列の構造を調べてみるべし

388 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 10:05:12 ]
>>387
配列は
最初のアドレスとデータ型さえわかれば

次の番地がわかるってことですか?
そんでNULLまでが範囲ってことですか?

2次元だと添字情報がないと
次の番地がわからないので
書かなきゃいけないってことですね?

日本語でちゃんと説明できませんが
なんとなくわかりました。

389 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 10:11:02 ]
>>388
ただし、範囲のチェックはやってない。

390 名前:マジレスチュウ ◆MaJi/01g.w mailto:sage [2008/09/28(日) 11:49:54 BE:418780962-2BP(100)]
>>380
環境変数のPATHのディレクトリを順に参照していってtest.exeを探していくんじゃダメ?
なかったら最後にカレントディレクトリ調べて、それでもなければ利用不可能って事になる。

391 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 11:57:31 ]
>>390
カレントディレクトリは一番最初でしょう。

392 名前:マジレスチュウ ◆MaJi/01g.w mailto:sage [2008/09/28(日) 12:34:20 BE:1710022177-2BP(100)]
内部コマンド → カレントディレクトリ → PATHに記述されたディレクトリ
の順番か。ごめんなさい><

393 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 12:42:25 ]
違うだろ

394 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 13:19:25 ]
環境による

395 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 13:21:16 ]
windowsの話してるんだろ



396 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 13:44:40 ]
というかC関係ないね

397 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 15:12:09 ]
だよな

398 名前:くさかべ様 [2008/09/28(日) 16:44:19 ]
まあ俺に聞けばなんでもわかる、mixiでもIRCでも俺が相手になってやる。



399 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 16:48:57 ]
豆でも食ってろ

400 名前:デフォルトの名無しさん [2008/09/28(日) 18:18:09 ]
すみません。友達にEclipseっていうののコンパイラだと何も設定しなくても
使えるときいたのですが、本当ですか?

以前、ボーランドという会社のコンパイラを使おうと思ったのですが
うまくいかなかったので。。

もし、なにも設定しなくてもいいなら、つかってみたいんですが。
よろしくお願いします。

401 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 18:21:46 ]
Eclipseはコンパイラじゃないよ

402 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 18:23:06 ]
>>400
なにも設定したくないならvisualstudioおすすめ

403 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 18:26:45 ]
PCの基礎知識が無いのにプログラミングは早すぎる

404 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 18:38:19 ]
パスも通せないでプログラムですか

405 名前:400 mailto:sage [2008/09/28(日) 18:40:10 ]
みなさん、ありがとうございます。やはり、私には無理みたいですね。
一度プログラムというのをやってみたいと思っていたのです。
visualstudioでググってみましたら、ただらしいですね。そいつでやってみます。
このいたの上にも情報があるみたいですね。ありがとうございました。



406 名前:デフォルトの名無しさん [2008/09/28(日) 19:24:39 ]
>>405
がんがれノシ

407 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 19:31:03 ]
>>405
まあ、これで覚えろ

きっかけが無いと覚えれないしな。

408 名前:デフォルトの名無しさん [2008/09/28(日) 22:19:16 ]
main関数の2番目の引数の char *argv[]
って、argv[]っていう配列へのぽちんたという意味なのか、
ぽちんた変数配列argvっていう意味なのかどっちなの?

教えてエロイ人。

409 名前:408 [2008/09/28(日) 22:20:06 ]
まちがえた。

ぽちんた変数配列argvっていう意味
     ↓
ぽちんた変数の配列argvっていう意味

410 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 22:25:00 ]
char *argv[]っていう書式的にはぽちんた変数の配列argv
っていう意味で合ってる

でも実際はchar **argvだけど

411 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 22:26:37 ]
ぽちんた変数と呼ぶのが今の流行りなのか?

412 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 22:34:33 ]
幼稚な奴にあわせる必要は無い

413 名前:408 mailto:sage [2008/09/28(日) 22:56:14 ]
みんなどうもありがとう。ぽちんた変数の配列argvっていう意味なんだね。

細かいところがむずかしいね。ありがとう。よくわかったよ。

414 名前:デフォルトの名無しさん [2008/09/28(日) 23:05:44 ]
ぽちんた言いたいだけやろ


415 名前:デフォルトの名無しさん [2008/09/28(日) 23:26:54 ]
fgetsでstdinから文字を取得します。改行文字まで取得してしまうそうですが、
改行文字をなくしたいです。どうすればいいですか?



416 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 23:28:23 ]
>>415
最後の改行文字をヌル文字に書き換える

417 名前:416 [2008/09/28(日) 23:39:06 ]
なるほど、感涙。ありがとうございました。>>416

418 名前:デフォルトの名無しさん [2008/09/29(月) 01:29:14 ]
ある本を本でいたら(1990年くらいの本)、文字列はこう表現しますなんて記述で
*str = "abcde";
ってかいてあったんだ。でも今の本はたいてい char str[80] = "abcde"ってかいてある。

最初の本のことが頭にあったから、char *str1=""; *str2="";と宣言してそれにgetsで読み込ませたら
str1のあとに必ずstr2の文字まで連結されて格納されてしまうんだけど、それはやっぱそういうことで
stdinから読み込ませる文字列を格納するのは、ポインタでなく配列で宣言しなくちゃいけないわけなの?

なんか、こないだ立ち読みしてた本でも文字列はポインタで表現みたいな事が強調してあったから
読み込ませる文字列もポインタに読み込ませればいいのかなとおもったんだけど。

すまそ。寝るのでお礼は明日になります。教えてくれる方、よろしくお願いします。

419 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 01:38:11 ]
結論から言うと全然違う
おまえが無茶苦茶してるだけ
眠い上に長くなるから今説明しないけど

420 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 01:39:30 ]
結論だけ言うと、配列で宣言しなくちゃいけない

421 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 04:15:22 ]
ファイルから13バイトのデータを読むために
struct database {
char boolen;
long data[3];
};
このような構造体を作ってfreadで読み込んだのですが
charのところで4バイト読み込み、最初の1バイトだけ変数に入れて3バイト破棄するという変な動作をします。
printf("%d\n",sizeof(struct database));
で表示させたところ16と表示されどうにもこうにもできません。
どうすればちゃんと1バイトだけ読み込むのか教えてください。お願いします。

422 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 04:42:34 ]
>>421 構造体メンバのアライメント(バウンダリ)の問題だと思う。

423 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 04:45:07 ]
そのコンパイラでは以下のようなアラインメントになっている

*--- char boolean
**** float data[1]
**** float data[1]
**** float data[2]

424 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 04:47:51 ]
1バイト読む->boolenに格納
4バイト読む->data[0]に格納
4バイト読む->data[1]に格納
4バイト読む->data[2]に格納

とすればおk


425 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 05:35:56 ]
1バイト読んでから再度freadで12バイト読まないとダメ



426 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 06:15:10 ]
#pragma pack()とかパディングを無くす抜け道はある
しかし>>424,425さんのように手間を惜しまない方が賢明

427 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 08:37:49 ]
>>418
とりあえず、本は買って隅から隅まで読め

428 名前:421 mailto:sage [2008/09/29(月) 09:50:01 ]
>>422-426
ありがとうございます。
コンパイラの仕様でそうなっているんですか。
やっぱり一気に読むより個別に読んだほうが確実ですね。

429 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 09:59:04 ]
まあ個別に読むのもいいけど、アライメントについて調べておいたほうがいいよ。
書くときにも同じことやりそうだし。

430 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 14:05:10 ]
>>421
union chinpo
{
char str1[13];
struct database {
char boolen;
long data[3];
};
ユニオン使って、srt1で一括読み込みすればいいですよ。

431 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 14:21:47 ]
>>430
うそつくな

432 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 14:50:48 BE:556925928-2BP(40)]
>>430
>>429

433 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 20:02:24 ]
>>418
> でも今の本はたいてい char str[80] = "abcde"ってかいてある。

そんなことねーだろ。

434 名前:430 mailto:sage [2008/09/29(月) 22:28:12 ]
カンで書いてみたけどやっぱダメかw
ごめんねごめんね^^

435 名前:デフォルトの名無しさん [2008/09/29(月) 22:31:16 ]
>>434
せめてやりとりぐらいは呼んでからレスしてね



436 名前:デフォルトの名無しさん [2008/09/29(月) 22:53:58 ]
カタカナ表記のユニオンがいいな
ユニックス的でいかすぜ

437 名前:418 mailto:sage [2008/09/30(火) 00:56:23 ]
>>419-420 どうもありがとうございます。これからは、標準入力から入力する文字列は
必ず、配列で宣言するようにします><;ありがとうございました。

438 名前:デフォルトの名無しさん [2008/09/30(火) 00:57:38 ]
すみません。グローバル変数とローカル変数を同じ名前にしてしまい、
printfで出力しようとおもったら、困りました。出力できませんかね?

439 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 00:58:06 ]
片方の名前を変えればおk

440 名前:438 mailto:sage [2008/09/30(火) 01:29:39 ]
>>439
やはり無理みたいですね。ローカル変数の名前を変えます。ありがとうございました。

441 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 01:36:52 ]
>>438
影響範囲が大きすぎて触るのが怖い場合は、グローバル変数にアクセスするための関数を作ればおk
#include<stdio.h>
int value=1234;
char string[256]="this is global.";
int *global_value(void){
return &value;
}
char *global_string(void){
return string;
}
int main(void)
{
int value=2345;
char string[256]="this is local.";

printf("value=%d\n", value);
printf("string=%s\n", string);
printf("value=%d\n", *global_value());
printf("string=%s\n", global_string());

return 0;
}

442 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 08:42:43 ]
グローバル変数ってあんま使わないほうがいいの?
ゲーム作ろうとするとグローバルのほうが簡単に書けるような気がするんだけど

443 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 08:46:38 ]
>>442
そのグローバル領域の使い方次第じゃないの?

アクセス速度ばっかり追求しすぎて別ソースに書かれてる
領域へexternでアクセスしてればわかりにくいソースになるし。
速度は犠牲になるけど、別ソースで持ってる領域へアクセスする場合は
アクセス用関数を用意して領域をいじるとかね。

あとは命名規則をしっかり作って、どこ管理の関数・領域かが
一目でわかるようにしてあればexternで触っても問題ないだろうし。

444 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 10:25:57 ]
Insufficient memory(out of memory)
in function cvalloc

というエラーが出てプログラムがとまってしまいます。
これを防ぐにはどうしたらいいでしょうか。

445 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 10:31:17 ]
>>444
メモリが足らない、と言ってる
・メモリを増やす
・メモリの使い方を見直して無駄遣いを減らすなり節約するなり



446 名前:デフォルトの名無しさん [2008/09/30(火) 17:25:04 ]
>>442
そう思うなら、とことんやってみれ
なんでダメなのかもわからん奴が教条主義的に嫌って書いたコードは
おぬしのコードよりダメだぜ、きっと

447 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 17:50:35 ]
void ChangeWtoM(char *malt, char *wide, int len_wide)
{
int i, j;

for(i = 0, j = 0; i < len_wide*2; i++){
if(wide[i] != '\0')
malt[j++] = wide[i];
}

malt[j] = '\0';
}

int main()
{

TCHAR wide[64] = L"testテストですtest";
char malt[64];

ChangeWtoM(malt, (char*)wide, lstrlen(wide));
printf("%s", malt);

return 0;
}

ワイド文字文字列をマルチバイト文字列に変換する関数を作りたいのです。
いろいろ試してみたのですが上手く行きません。
これは何がいけないのでしょうか。

448 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 18:04:05 ]
そもそもTCHAR型がなんなのか理解しているか

449 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 18:08:39 ]
突っ込みどころが多すぎる。
環境は?汎用的に作ると長くなるから特定したほうがいいかも。

450 名前:447 mailto:sage [2008/09/30(火) 18:10:13 ]
1文字に2バイト使うcharで1バイトしか要らない場合は'\0'が入ってる
だと思っているんですけど

451 名前:447 mailto:sage [2008/09/30(火) 18:11:59 ]
>>449
OSはWindowsXP、コンパイラはVisualC++2008です。

452 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 18:12:55 ]
>>450
実際のワイド文字列とマルチバイト文字列を見比べてみ
void p(char *p, int len) {
int i;
for (i = 0; i < len; i++)
printf("%02x ", p[i] & 255);
printf("\n");
}
int main() {
wchar_t *wide = L"testテストですtest";
char *mb = "testテストですtest";
p((char*) wide, wcslen(wide) * 2);
p(mb, strlen(mb));
}

453 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 18:13:35 ]
>>450
文字コードの種類を一度勉強したほうがいいよ。
どうせS-JIS、JIS,

454 名前:453 mailto:sage [2008/09/30(火) 18:14:21 ]
途中になった
EUC,UTF系との相互変換とかくらいだろうし

455 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 18:17:02 ]
Windowsなら、WideCharToMultiByte()APIがあるから、それ使うか、
VC++なら、CStringを使って、、、っとこれはC++だからスレ違いか。



456 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 18:21:52 ]
>>452-455
ありがとうございます
アドバイスを元にいろいろ調べてみます

457 名前:デフォルトの名無しさん [2008/09/30(火) 20:00:21 ]
関数ポインタの配列を使って、色々と作成してるんだけど、
たとえば int (*p[5])(int x, int y)っていう関数へのポインタ変数の配列pをつくったとする
この配列に格納できる関数は戻り値がint型で、引数はint型を2つとる関数じゃないと
だめみたいなんだけど、Cでは色んな型の戻り値や引数を持つ関数をたくさん収納できる
配列っていうのは、作成できないんですか?よくわからないけど、void型で宣言しておいてあとでキャストするとかしても
無理なんでしょうか?よろしくお願いしますm(_ _)m






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<128KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef