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


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

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



1 名前:デフォルトの名無しさん mailto:age [2007/07/24(火) 23:17:11 ]
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

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

教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 93代目
pc11.2ch.net/test/read.cgi/tech/1184506311/

291 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 00:34:48 ]
>>290
実行して確認するとかしてみたのか?
「8」はタブ文字を8個のスペースにしてるだけだ。
for文の前後3行を読むだけでわかる。

292 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 00:36:33 ]
>>291
ということは別に8である必要はないのかな

293 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 00:38:31 ]
Windowsならデフォルトは8じゃないか?Linuxとかは知らん。
デフォルトって言葉が正しいかどうかは知らんが、メモ帳とかはそうだよな。
ってか、8が何かわからんかったら10にして実行してみろ。

294 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 00:47:45 ]
なるほど
サントス

295 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 00:55:01 ]
俺のはシカト?

296 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 01:08:45 ]
おーい

297 名前:デフォルトの名無しさん [2007/08/01(水) 01:46:27 ]
#include <stdio.h>
main()
{
static int a[][3] = {{001, 010, 100}, {002, 020, 200}, {003, 030, 300}};

int i, j;

for (i=0; i<3; i++) {
for (j=0; j<3; j++) {
printf("%d\t", a[i][j]);
}
putchar('\n');
}
}

このプログラムの実行結果が下のなんですがなぜそうなるかわかりません。
教えてください。

1 8 100
2 16 200
3 24 300


298 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 01:50:11 ]
頭に0がついてると八進数になるから

299 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 01:50:36 ]
0から始る場合8進数になるから




300 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 01:51:10 ]
>>297
>{{001, 010, 100}, {002, 020, 200}, {003, 030, 300}}
これは0で始まってるから8進法で書かれてる
んでprintfでの出力は10進法になってる

301 名前:デフォルトの名無しさん [2007/08/01(水) 01:51:16 ]
#include <stdio.h>
main()
{
static char input[] = "B1LSWIELTECH1\1\11W\1EE1ELLST?";
int i, c;

for (i=0; (c=input[i]) != '\0'; i++) {
switch(c) {
case 'B' : putchar('A'); continue;
case '1' : break;
case 1 : while ((c=input[++i]) != '\1' && c != '\0');
case 9 : putchar('T');
case 'E' : case 'L' : continue;
default : putchar(c); continue;
}
putchar(' ');
}
putchar('\n');
}

実行結果 A SWITCH T ST?
A SWITCHから先の動きがわかりません。わかる方教えてください。

302 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 01:53:39 ]
ってちょっと言い方がまずかったな
>{001, 010, 100}
たとえばこの部分の001と010が8進法で100は10進法ね

303 名前:デフォルトの名無しさん [2007/08/01(水) 01:54:26 ]
#include <stdio.h>
char input[] = "SSSWILTECH1\1\11W\1WALLMP1";

main()
{
int i, c;

for (i=2; (c=input[i]) != '\0'; i++) {
switch(c) {
case 'a' : putchar('i'); continue;
case '1' : break;
case 1 : while ((c=input[++i]) != '\1' && c != '\0');
case 9 : putchar('S');
case 'E' : case 'L' : continue;
default : putchar(c); continue;
}
putchar(' ');
}
putchar('\n');
}

実行結果 SWITCH SWAMP
同じ感じなんですが、SWITCHから先の動きがわかりません。お願いします。

304 名前:297 [2007/08/01(水) 02:00:39 ]
ありがとうございます
解決しました

305 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 02:01:36 ]
while ((c=input[++i]) != '\1' && c != '\0');
ここで条件が真の間、iが+1ずつされていく。
whileをぬけたらbreakが無いので次のputschar('T')が実行されて・・・
って感じだ。
デバッガあるならステップ実行してみればわかる。
なければwhileを弄れば多少わかる?
while ((c=input[++i]) != '\1' && c != '\0')puts("[while中]");

306 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 03:28:00 ]
自分で考えるための方法を教える必要があるような状況だな。

307 名前:デフォルトの名無しさん [2007/08/01(水) 11:32:27 ]
リンカする前の実行ファイルを起動すると一瞬で消えるんだが何故でしょうか?

308 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 11:45:28 ]
>>307
「リンカする」なんてことは通常できません。
リンクする前なら、それは実行ファイルになっていない筈です。
リンクされた実行ファイルについてなら、GUIを持たないプログラムを
GUIからダブルクリックで起動したら終了と同時に表示が消えるのは自明ですね。

309 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 11:50:37 ]
Ctrl-F5で解決する例のあれか



310 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 12:29:44 ]
昨日のお子様哀れすぎワロタ

311 名前:初心者 [2007/08/01(水) 15:14:36 ]
構造体の数値データからcsv形式のファイルを作りたいのですが、どうすればいいでしょうか。教えていただけるとありがたいです。

312 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 15:24:33 ]
構造体のメンバをcsv形式でファイルに書き込め

313 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 15:56:39 ]
C++なら簡単に出来るからC++スレで質問するといいよ^^

314 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 15:58:15 ]
まだ全然初歩のプログラムなのですが、わからないので教えてください。
プログラムファイル
入力データファイル
が用意されている。
問題
 文字データ中に含まれる文字の種類を調べるプログラムを作成しなさい。
[仕様]
・入力データ件数10件
  1件に最大100文字(半角とする)
  入力データは、文字型1次元配列(サイズ:101)に格納

・文字の種類は最大200種(文字型1次元配列使用)
 ただし、入力した文字中の改行(’¥n’)マークは処理対象外 とする

・文字コード順に並べ替えを行い出力する
・出力設計
 1行に最大25文字(文字区切りに1カラム空白)
 構成文字(並べ替え済み)を出力する

 X X X X X X X〜〜X X X X X X X

315 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 16:08:34 ]
>>314
自分がどこまでできてて、どこがわからないのか明確に
丸投げなら宿題スレに

C/C++の宿題を片付けます 94代目
pc11.2ch.net/test/read.cgi/tech/1185452895/

316 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 17:11:26 ]
プログラムは既に出来てるように思えた

317 名前:デフォルトの名無しさん [2007/08/01(水) 18:41:55 ]
>>314
です。入力データ、文字種を入力するところまではわかるのですが、どういう処理をすれば入力データに文字データが含まれているのか、また、そのデータを文字コード順に並べる処理がわからないです。アルゴリズムが浮かばなくて悩んでいます。お願いします。


318 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 18:47:33 ]
文字の種類が200種なんだから、int の配列[200]を用意して
文字種ごとに足していけばよかろう。
まあ文字種そのものは256個あるから[256]作ったほうが楽ではあるが。

319 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 19:18:22 ]
ちょっと今感動してる・・。
一ヶ月前の自分には解らなかった事が解るようになってる。
ニマニマしちゃうよ。



320 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 23:36:44 ]
>>318
回答ありがとうございます。文字種類の配列を用意するのは理解できました。もし
int i,n
char moji[100],shu[200]で入力しおえて
文字種ごとに足していくにはどのように書けばよいのでしょうかか?


321 名前:デフォルトの名無しさん [2007/08/02(木) 00:03:16 ]
>>320
char shu[256]={0}
としたうえで

for(i=0;i<100;i++) {
shu[moji[i]]++;
}


322 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 00:25:13 ]
>>321
素早い回答ありがとうございます。その文字種に含まれた文字はどのようにしたら文字コード順に並び替えられるのですか?

323 名前:デフォルトの名無しさん [2007/08/02(木) 00:28:42 ]
>>322
ちょっと根本的に分かってないみたいだけど
文字コードがインデックスになってるから

for(i < 256) {
for(j = 0 ; j < shu[i] ; j++){
putchar i
}
}

でおk

324 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 06:46:03 ]
分布数えソートだな。

325 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 08:05:01 ]
>>323
全然理解してなくて申し訳ないです。
回答ありがとうがざいました。これからプログラム書いてみようと思います。

326 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 09:39:43 ]
プログラムファイルは用意されてたんじゃなかったのかよw
sageは半角でな

327 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 09:45:47 ]
分布数えソート大好き

328 名前:デフォルトの名無しさん [2007/08/02(木) 09:59:24 ]
分布数えソートはもっと巧妙だけどな
アイディアは同じ

329 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 10:08:09 ]
Linux環境で半角の円マーク(\)打つのってどうやればいい?



330 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 10:08:49 ]
英字キーボードで、と言った方が良かったかも

331 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 10:17:11 ]
バックスラッシュと円マークの文字コードは
ASCII コードの範囲内でなら同一。
あとはフォントの問題。

どうしても混在させたいなら、ユニコードで何とかするしかない。
00A5 が円マークだ。
もちろん、エスケープ記号としては使えんがな。

332 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 13:38:15 ]
Linuxでの最長パス名なのですが、#defineされているものに
MAX_PATH とか MAXPATHLEN とかありますが
どれを#includeしてどの#defineを使うのが一般的なのでしょうか。
なんかいろいろあってわからなくなった。
教えて下さい。


333 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 17:08:43 ]
Linuxは知らないが、標準Cには<stdio.h>にFILENAME_MAXという定数がある。

334 名前:デフォルトの名無しさん [2007/08/03(金) 00:02:15 ]
int a[3][4];
int b[4];

と宣言した際に

a[0] = b;

がNGなんですか?

C言語の2次元配列は配列の配列と習ったんで
aのゼロ番目に大きさ4の配列を入れれると思ったんです。



335 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 00:07:29 ]
配列の配列と2次元配列は別物だよ

336 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 00:17:43 ]
というか、int a[3], b[3];だったとしても、
a = b; みたいな代入はできない。

337 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 00:21:15 ]
>>336みたいなのが何で出来ないんですか?って質問されたら
言語仕様です。としかいえないよな。
それでもなんで?って聞いてきたら教えるのをあきらめる。


338 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 00:30:31 ]
Cを作った人や、後にコンパイラを実装した人達が
できなくてよいという判断を下したから。

339 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 00:47:16 ]
配列の代入はできません。



340 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:01:38 ]
>>335
規格票では全く同一のものとなっていますが何か?

341 名前:デフォルトの名無しさん [2007/08/03(金) 01:08:11 ]
配列の配列
配列へのポインタ
ポインタの配列

などの細かなこと知らなくても問題ないよ


342 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:09:38 ]
いや、それは問題ある。

343 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:17:23 ]
構文上は配列の配列と思っておくと都合がいいけど、
Cでは配列の配列とは別に2次元配列が存在するわけでもないので、
少なくともCでは両者の言葉が区別されることなく使われている。

こう言えばいいか?

344 名前:デフォルトの名無しさん [2007/08/03(金) 01:21:08 ]
>>342
ないよ

そんな細かなこと知っててもなんの役にもたたん

345 名前:デフォルトの名無しさん [2007/08/03(金) 01:24:34 ]
int (*a)[10];

って大きさが10のintの配列へのポインタですよね

これの配列(大きさ20)はどう宣言すればいいのですか?

346 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:26:09 ]
そんなの自分で考えろよ

int (*a)[10][20];


死ねよ


347 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:28:43 ]
>>344
int n[10][10]; を int** に渡せないとか言う人の相手をしなきゃいけない身になってみろ。

348 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:33:51 ]
>>346
君が死んだほうがいいような・・・

349 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:42:50 ]
配列は 「変数名の直後に [サイズ] を書く」
ポインタは 「変数名の直前に * を書く」

括弧があろうがこれは変わらない。

それだけ覚えていれば何も迷うことは無い。



350 名前:デフォルトの名無しさん [2007/08/03(金) 02:28:56 ]
>>346
最初の一行、このスレのタイトルからしてお前が来なきゃ良いんじゃね?って
周りに思われていることに気づいた方が良いんじゃね?
自分が嫌うものをわざと見つけて、勝手にその対象物を叩いてイラついている
基地外にしか見えない・・・

351 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:40:09 ]
配列へのポインタの配列が必要になる状況って考え付かないんだけど、どんなの?

352 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:44:52 ]
double x y;
scanf("%f%f",&x,&y);

1.0 1.0
と取り込んだら
printf("x y = %f %f\n",x,y);

x y = 0.000000 0.000000
と出力された。
なんで???

353 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:46:04 ]
%lf

354 名前:352 mailto:sage [2007/08/03(金) 02:48:12 ]
わいわ…アホや…

355 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 03:04:33 ]
>>351
必要になるならないは問題ではない
どう書けるかときいているのです。

356 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 03:08:06 ]
そんなどうでもいいこと気にする前にもっと学ばなきゃいけないことがたくさんあると思うけど。

357 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 03:33:49 ]
わからないならわからないっていえよ
しったかぶってんなよw

358 名前:デフォルトの名無しさん [2007/08/03(金) 03:35:56 ]
教えられないくせに学べだの説教するやつは痛過ぎ・・・

359 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 03:36:37 ]
>>351
回転行列へのポインタの配列とか。



360 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 03:37:26 ]
あげくのはてには、必要ないだってw



361 名前:デフォルトの名無しさん [2007/08/03(金) 03:41:54 ]
int (*(*(*p[1])[2])[3])();

を3秒以内に理解できるかい?

362 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 03:43:06 ]
そこまですっきりしてると分かりやすい。

363 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 03:45:00 ]
int (*(*p)(int (*)(int (*)[20])))[10];

364 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 03:49:20 ]
それを有効に使ったコード書いてみてくれw

365 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 04:07:32 ]
ごめん、無理。

366 名前:デフォルトの名無しさん [2007/08/03(金) 05:42:26 ]
・C言語の欠陥
関数アドレスを返す関数において、その関数と同じ型の関数アドレスを
返す型の循環構造を定義できない。

typedef func_t (*func_t)(); // エラー
func_t f();

367 名前:デフォルトの名無しさん [2007/08/03(金) 05:58:18 ]
こういう場合は構造体を定義するしかない。
struct _s_t;
typedef struct _s_t (*func_t)();
typedef struct _s_t {
func_t f;
} s_t;

s_t f() {
s_t s = {f};
printf("f()");
return s;
}

main () {
// f()()()()()(); 本来期待する呼び出し形式
f().f().f().f().f().f();
}

結果:
f()f()f()f()f()f()

368 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 06:35:56 ]
それ聞いたことはあるけど、どういう場合に使うの?

369 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 07:34:06 ]
にわかプログラマーは心の狭いやつが多いねぇ
おまけにちょっと噛み付かれたらギャーギャー喚き散らさないと気がすまないらしい



370 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 08:12:21 ]
kmaebashi.com/programmer/pointer.html

371 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 08:39:05 ]
   / ̄ ̄\
 /   _ノ  \
 |   ( ●)(●)  < スレタイ読めないならどっか余所へ行けよ
. |     (__人__)____
  |     ` ⌒/ ─' 'ー\
.  |       /( ○)  (○)\
.  ヽ     /  ⌒(n_人__)⌒ \
   ヽ   |、    (  ヨ    | ← にわかプログラマー
   /    `ー─−  厂   /
   |   、 _   __,,/     \

372 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 11:57:59 ]
>>370
他の解説読んでたけどif文にセミコロンいらないの知らなかった…
でもコード見たらちゃんと書けてた

(´・ω・`)??
とりあえず気付けてよかった

373 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 12:51:25 ]
>>345
ヒント:a[20]と書くとaと[がとても強くくっつくので、「aは20個の要素を持つ配列です」ということになります。

374 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 14:58:37 ]
ポインタについて質問なのですが、軽くググった感じではポインタとは
ガーベッジコレクタを利用した変数という認識で良いのでしょうか

375 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 15:06:18 ]
全然違います。
アドレスを保持する変数です。

376 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 15:06:38 ]
>>374
びっくりするぐらいダメ


377 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 15:06:54 ]
>>374
ぜーーーんぜん違いますw

ポインタ = 変数や関数のアドレスを格納した変数。値はつねにアドレスになる。


378 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 15:07:54 ]
なにこの同時ダメだしw ワロタ

379 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 15:08:42 ]
wwwwwwwwwwwwwwwwwwwwwwww



380 名前:374 mailto:sage [2007/08/03(金) 15:10:06 ]
私も吹きました。修行不足のようですね。出直してきます

381 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 15:45:39 ]
そもそもCにガベコレなんて無いし

382 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 16:50:41 ]
軽くググってガベージクレクタにたどり着いた道程に興味があります。

383 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 17:10:33 ]
童貞に興味があります

384 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 17:10:51 ]
>>383
いりますか?

385 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 17:10:59 ]
俺は無い

386 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 18:56:25 ]
質問です。
@wininetを使ってhtmファイルを読み込みtemp.htmで出力。
Aそのtemp.htmを読み込み、必要な部分をaaa.htmで出力。
ということをしたいのですが、1度ならできたのですが、
while文で2回以上ループさせると@のtemp.htmをwモードで
fopenするとエラーが出てうまくいきません。
一応大まかなソースを書いておきます。よろしくお願いします。

void create_htm(int times){
 FILE *wfp;
 FILE *rfp;
 if((wfp = fopen("temp.htm, "w")) == NULL){ ←2回目になるとここでエラーが発生し強制終了。しかしfprintfは実行されないまま。
  fprintf(stderr, "--- wfp error");
  exit(1);
 }
 get_htm(wfp, times); /*@の関数*/
 fclose(wfp);
 if((rfp = fopen("temp.htm", "r")) == NULL){
  fprintf(stderr, "--- rfp error times = %d", times);
  exit(2);
 }
 diet_htm(rfp, times); /*Aの関数*/
 fclose(rfp);
}

main(){
 int times;
 get_config(); /*gettimesをファイルから取得。gettimesはグローバル変数*/
 for(times = 0; times < gettimes; times--){
  create_htm(times);
 }
}

387 名前:386 mailto:sage [2007/08/03(金) 18:59:51 ]
すいません。while文ではなくfor文でループしてます。
mainのfor文はtimes--ではなくtimes++です。
よろしくおねがいします。

388 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 19:15:36 ]
問題の無い部分を手書きで書いて見せたって何にもならんと思うのだが。
せめてエラーのときはerrnoくらい出してよ。

389 名前:386 mailto:sage [2007/08/03(金) 19:35:44 ]
問題のある部分がcreate_htm関数のif((wfp = fopen("temp.htm, "w")) == NULL)
の部分でエラーが出るのですが。すみません。errnoはどのように出すのでしょうか。
ネットで調べてみて、問題のある部分のあとに書いたのですが、強制終了されるので
出力されないのですが。



390 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 19:53:26 ]
そもそもこれはファイル名の後に"が抜けててコンパイルもできないだろ
問題のあったソースをコピペすることもできんのか
エラー処理もしないでそこで落ちるというのはどうやって判明したんだ?

391 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 19:55:41 ]
強制終了って、アクセス違反?
どっかぜんぜん別のところでメモリ破壊を起こしてるのかもね。
get_htm や diet_htm の中身を見ないと解決できない気がする。
>>386に載ってる部分では特に問題なさげ。

392 名前:386 mailto:sage [2007/08/03(金) 20:05:19 ]
>>390
あ、すみません。抜けてました。
そこで落ちるというのは、一行ごとにprintfでどこがエラーかをみてみたら、
その部分でprintfがされなかったので判明しました。


>>391
メモリ破壊ですか。メモリ破壊を調べる方法とかないですか?


393 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 21:04:33 ]
gdb使えよ

394 名前:386 mailto:sage [2007/08/03(金) 21:48:16 ]
windowsでもgdbは使えますか?
turbo debuggerというので動かしてみると、例外が出たと言われました。

395 名前:デフォルトの名無しさん [2007/08/03(金) 21:56:31 ]
いまどきCなんて使う機会ってあるの?
OSを書く
組み込み系

これくらいにしか使わないよね

396 名前:386 mailto:sage [2007/08/03(金) 21:56:57 ]
何度も失礼します。
gdbをするには、gcc -g program.cをすればいいですよね?
でも、コンパイル時にwininet.hのInternetOpenなどでエラーが出るのですが
どうしたらいいですか?

397 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 22:03:15 ]
>>395
LinuxアプリとかR&Dとか

398 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:55:07 ]
>>396
そもそも何使って開発してるのよ。VCのデバッガ使えば?

399 名前:386 mailto:sage [2007/08/04(土) 01:06:28 ]
windows XP、bccを使っています。
すみません、自己解決できそうです。
メモリ破壊というものをネットで調べながらソースとにらめっこしてたら、
どうやら、Aの関数内でmallocでサイズを確保するときに、strlenではなく
sizeofを使ってしまっていたのが原因のようでした。お騒がせしました。
また、新たなエラーが発生した際にはお邪魔させていただきます。



400 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 01:12:41 ]
もう来るな

401 名前:デフォルトの名無しさん [2007/08/04(土) 01:13:26 ]
>>400
お前みたいな奴に質問に答えてもらわんでも結構、お前が来るな

402 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 01:14:47 ]
sizeofをどう使ってたんだ?

403 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 01:15:34 ]
>>400-401
邪魔

404 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 01:18:15 ]
>>402
ポインタに使ってばぐったんだろ。

405 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 01:19:16 ]
だから他の関数も最初から晒(ry

406 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 01:20:40 ]
>gdbをするには、gcc -g program.cをすればいいですよね?
>windows XP、bccを使っています。
質問される方の身になってください。

類似例
www.nicovideo.jp/watch/sm8005

407 名前:デフォルトの名無しさん [2007/08/04(土) 06:45:47 ]
>>403 お前も邪魔。いちいちうるせー

408 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 13:11:15 ]
>>407-408
邪魔

409 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 16:56:50 ]
質問ですが、

int main() {
int w;
printf("0から6までの整数を入力してください!\n");
scanf("%d",&w);
switch (w) {
case 0: printf("日曜日です。\n"); break;
case 1: printf("月曜日です。\n"); break;
case 2: printf("火曜日です。\n"); break;
case 3: printf("水曜日です。\n"); break;
case 4: printf("木曜日です。\n"); break;
case 5: printf("金曜日です。\n"); break;
case 6: printf("土曜日です。\n"); break;
default:printf("???\n");
} return 0; }

の4行目のscanfで("%d\n",&w)と間違えて打ったら2度入力が求められ、
結果には、1回目の入力が反映されました。なぜでしょうか?
使っているコンパイラはborland c++ 5.5.1で、OSはビスタです。





410 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 17:06:32 ]
>>409
scanf()は、エラーの場合、そのデータが取り除かれないで、入力ストリームに残ったままになるから。
エラー処理をしっかりしたかったら、scanf()は使わないほうがいいよ。

411 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 17:09:29 ]
>>409
scanfは"%d\n"の書式に合う文字列を入力したあとに改行が押されるまで待ってる
つまり1回目の改行は書式の中で要求されてるからそっちで使われていて2回目の改行でscanfが終了できる

412 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 17:16:33 ]
>>410, >>411
す、素早い!
ありがとうございます。勉強になった。

413 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 17:40:34 ]
scanf("%d\n", &w) の場合、%d と \n の2個分の入力が要る。

414 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 19:58:53 ]
マクロでこうゆうのは有りですか?(使われていたりしますか?)
※VFuncは動的引数持ちの関数

#define MACRO_HOGE(inA, inB)   inA = VFunc inB

-使用例-----------------------------------
void main(void){
int V;

MACRO_HOGE(V, (A, B, C));
}

例は適当に書きましたがようするにMACRO_HOGEの第2引数に"()"付きで複数の引数を書き並べることについてです。

415 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 20:08:35 ]
なんでまたそんなことをしたいと?

416 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 20:09:58 ]
>>414
(コーディング規約などで制限されていない限り)誰も止めはしないと思うよ。
デバッグ出力用途で時折見掛けるしね。

417 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 20:24:59 ]
>>414

×こうゆう
○こういう

418 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 20:29:40 ]
>>415
引数の数が不定の関数に対するマクロを作る必要がありました。
マクロの内容も実際には複数行にわたっており、その中でin_Aの値を使用するためこのような形になってしまっています。

>>416
製品に組み込まれるソースではなく、社内でデバック用に開発メンバーのみで使用するものです。
他のところでも使われているようでちょっと安心しました。

ありがとうございました。

>>417
「・・・・・・・・・・・・・・・・・・。」

419 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 20:51:59 ]
>>414
c99で可変長引数のマクロつかえば.




420 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 21:10:38 ]
> >>417
> 「・・・・・・・・・・・・・・・・・・。」

ガキか


421 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 22:06:47 ]
int *p;
は、「intへのポインタ」ってことらしいけど
「ポインタが指している変数の型がint」ってこと?

422 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 22:14:55 ]
うん。
int *p; は *p が int になる。

423 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 22:23:24 ]
サントス

噂に聞いていたがポインタは難しい…

424 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 22:44:18 ]
難しいと思ってるから難しいんだよ。一度分かれば何が難しかったのか理解するのが難しくなる

425 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 23:02:18 ]
ポインタは、変数の置いてある場所を入れておくもの。
置いてある場所が分かれば、そこにある値も操作できるはず。

426 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 23:06:34 ]
とにかくいろいろ読んだり組んだりしなきゃダメだな
がんばるぜ

じゃーの


427 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 23:28:58 ]
fopenでファイルがオープンされなかったらNULLが返ってくるけど
rはファイルがなかった場合などが挙げられる。
じゃーwだったらどういうときにそうなるの?

428 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 23:31:34 ]
>>427
存在しないディレクトリだとか。

429 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 23:31:41 ]
書き込みロックされてる場合とか



430 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 23:32:17 ]
ディレクトリを fopen しようとした時とか

431 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 23:57:35 ]
ファイルの作成をOSに拒否されたときとか

432 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 00:14:17 ]
ファイルの開き過ぎとか

433 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 00:18:56 ]
How many files(0-15)?

434 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 05:58:56 ]
ファイルを書き込むのに十分な空き容量がないとか
書き込めない場所への書き込みをしようとしたとか

435 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 06:30:36 ]
ディレクトリに書き込み権限がないとか。

って、切りがないよw

436 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 06:42:56 ]
入れる穴がないからといって後ろの(ry

437 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 12:31:35 ]
アッーー!

438 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 13:17:12 ]
なるほど。勉強になった。
fopen・fcloseをちゃんとしてれば、その一連は何度もループできるの?
それとも上限回数とかあったりするの?

439 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 13:55:08 ]
容量は有限なんだから、書き込みで新しいファイルを作っていけばいつかは上限に達する。



440 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 14:02:14 ]
しかし、既にあるファイルを開いて閉じてなら、永遠に繰り返していい。

441 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 14:45:00 ]
できました〜。ありがとうございます。

442 名前:デフォルトの名無しさん [2007/08/05(日) 18:21:27 ]
無償リンクソフトは無いのでしょうか?
もし無いのであれば有名なリンクソフトを教えて頂けないでしょうか?

443 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:23:35 ]
リンクソフトって何のことよ?
リンカーのことなら、GNU ld か?
目的を書いた方がいいと思うよ

444 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:24:14 ]
コンパイラ入れたら大抵リンカも入ってるだろ

445 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 21:01:14 ]
質問ですが
「C言語のプログラムをアセンブリ・コードに変換せよ」
という課題が出されたのですが、変換するツールのようなものはありますか?

446 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 21:03:45 ]
あります。

447 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 21:04:46 ]
コンパイラで出来たような気がする

448 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 21:05:32 ]
コンパイラがやってくれる
gcc なら -S オプションつけてコンパイルしてみ






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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