C言語なら俺に聞け( ..
[2ch|▼Menu]
369:デフォルトの名無しさん
07/11/15 18:38:07
>>366
時間のハンドリングの話じゃねーだろ。
なにを勉強すべきなんだって?

そもそも空いた時間で「再開発」やるって話じゃないのかね。
そんでそれは有用だよ、という。


370:デフォルトの名無しさん
07/11/15 18:39:09
>>364

>>361にとっていい経験だ、て話で誰も「お前らもやるべき」なんて言ってないと思うけど。

371:364
07/11/15 18:46:07
>>370
その解釈は誤り。
>>361の最後の文章は個人の経験の記述のように見せかけて最後の行で一般論に帰結させてる。
事実と意見を混同させる初歩的な手だ。

372:デフォルトの名無しさん
07/11/15 18:51:11
>>368
いきなりスイスイ進めねーよ
よほどの天才でもなけりゃあさ
つうかさ、一応ってなに?普段は他の言語やってんの?
独り言じゃないならこっちが答えやすいように質問してよ

373:デフォルトの名無しさん
07/11/15 18:55:21
「いちよう」とか言わないだけマシだと思え。

374:デフォルトの名無しさん
07/11/15 19:00:01
だから無駄にならない学習方法を教えてくれよ。
有用なライブラリは何も考えずに利用すべきであって、中身を知ろうとはするなってことか?
きっとその人は一生理解出来ないだけだと思うが。

375:デフォルトの名無しさん
07/11/15 19:13:23
ごめん俺エスパーじゃないから答えらんない

376:デフォルトの名無しさん
07/11/15 19:14:04
自分のしたい事してれば良いじゃない
学習するって事に拘るなよ

377:デフォルトの名無しさん
07/11/15 20:22:46
一応というかなんというか、
一日8時間みっちり学べば遅かれ早かれCの基礎はマスターできるんじゃないかね。

378:デフォルトの名無しさん
07/11/15 20:35:36
>>374
何が無駄で何が無駄でないかは
その無駄かも知れない何かを学び
発展途上の途中で無駄だったな
と無駄に無駄と言ってしまっても
その先で無駄ではないと思った
時点で無駄も無駄では無かった
と学ぶことでしょう。

379:デフォルトの名無しさん
07/11/15 20:52:51
文字列を仮想キーコードに変換するにはどうすればいいでしょうかv?

例:
string str="unk"

key( VK_U );
key( VK_N );
key( VK_K );


いっこいっこ調べるのが普通?しかしかなり面倒だ
if( str[0]=="a" ) key( VK_A );
if( str[0]=="b" ) key( VK_B );


if( str[0]=="z" ) key( VK_Z );

380:デフォルトの名無しさん
07/11/15 20:59:19
配列に入れておけばいいんじゃないか?
for(i=0;c=str[i];i++)key( keycode[c-'a'] );

381:デフォルトの名無しさん
07/11/15 23:18:31
ソートがわかるようでわからん・・・
配列に適当に数字おいて、一時的に保管しておく変数用意して、
ループの入れ子ループでカウントアップしつつ、
比較Aと比較Bで片方補完変数にいれてループ抜けて、
親ループでカウントアップさせて・・・ってやるんだけど、結果一番でかいのだけ連続して出力される('A`

382:デフォルトの名無しさん
07/11/15 23:19:34
ソースうp

383:デフォルトの名無しさん
07/11/16 00:03:35
ダメだ。アスタリスクを見るとポインタに見えてfor無限ループ(;;)を見ると顔文字に見えてしまったり
俺の頭はどうにかしてしまったのだろうか

384:デフォルトの名無しさん
07/11/16 00:05:00
->も然り

385:デフォルトの名無しさん
07/11/16 00:08:42
頼むから俺に聞くとき、変数 i を使わないでくれ
印刷したソース逆から見る俺の身にもなってくれ
なんでここで否定してんだって何度も思うじゃねえか

386:デフォルトの名無しさん
07/11/16 00:12:28
プログラムの仕事につくには英語を最低限身につけないといけないんですか?

387:デフォルトの名無しさん
07/11/16 00:15:37
>>386
最低限、英語で書かれた技術文書は、読める必要が必ずでてくる。
ただ、技術文書は平易な英語で書かれているから、すぐなれると
思うよ。

出世して、英語の契約書読む羽目になるとまた別だが。

388:デフォルトの名無しさん
07/11/16 00:19:20
完全に読めなくても、だいたいの意味はわからないか?
見たこと無い単語が出てきたら辞書引く程度で間に合うよ。

389:デフォルトの名無しさん
07/11/16 00:31:24
ときどき
printf("")のprintf文をいれなかったらセグメンテーションエラーでて
printf文をいれたらセグメンテーションエラー消えることがあるんですけど
これはどういうことなんでしょうか?

390:デフォルトの名無しさん
07/11/16 00:34:50
バグです(多分バッファオーバフローの)

391:デフォルトの名無しさん
07/11/16 00:47:38
>>381
ソートもアルゴリズムの分野だけど
理解できないんなら
有名どころのソート(6個くらい)
丸覚えしとけば良いじゃん。

まぁ、バブルソートぐらいは理解しといた
ほうが良いとは思うけど。

392:392
07/11/16 00:49:25
ある処理の実行時間の測定を次のようにしました。

start = clock();
なんらかの処理
end = clock();

time = (float) (end - start) / CLOCKS_PAR_SEC;
pirntf("実行時間%d\n", time);

これでtimeを出力すると、
536870912, 2147483648, 1073741824, 1610612736, 0
のうちのどれかの値に-ついたりつかなかったりして、出力されます。
「なんらかの処理」を変えても 上記の値しかでません。
どうしてこうなるのか分かりません。教えてください。

393:デフォルトの名無しさん
07/11/16 00:55:20
>>392
time という変数名がマズイ
time が実数型であるにもかかわらず %d で出力している
typo がある
の全てが原因でしょう

394:デフォルトの名無しさん
07/11/16 00:58:52
clock()が返すのはclock_tだが、startとendの型は?

395:392
07/11/16 01:04:08
>>393
timeという変数について調べてみます。
%fでしたね@@;
ありがとうございました!!

>>394
clock_tで宣言しています。
回答ありがとうございます!

396:デフォルトの名無しさん
07/11/16 01:18:02
しかし深夜にならないとプログラム作る気おきないのはなぜなんだろう

397:デフォルトの名無しさん
07/11/16 07:14:36
あるある

398:デフォルトの名無しさん
07/11/16 16:49:36
文字列を倍精度に変換する関数strtodにバグがあるようでうまく変換してくれません。

const char* pszInput = "9999999999999999999999999999999999999999999999999999999999999999999999999999999999";
char* pszStop;
double dOutput;
dOutput = ::strtod(pszInput, &pszStop);
::printf("input:%s\noutput:%f\nstop:%s\n", pszInput, dOutput, pszStop);

output:9999999999999999600000000000000000000000000000000000000000000000000000000
000000000.000000
となってしまいます。ERANGEも検出されません。
これはよく知られたバグなのでしょうか?また対策はあるのでしょうか?

よろしくお願いします。

399:デフォルトの名無しさん
07/11/16 16:51:47
>>398
「有効桁数」でググってきな

400:デフォルトの名無しさん
07/11/16 17:12:46
9999999999999999999999999999999999999999999999999999999999999999999999999999999999
約 10^83

有効桁数 83 桁の数値を扱うために最低限必要なビット数を x とすると
2^(x-1) < 10^83 < 2^x
x = ceil( 83 / log2 )
x = ceil( 83 / 0.301 )
x = 276
1 バイトを 8 ビットとして最低 35 バイトは必要

>>398 が自分で実装するのは無理だろうからライブラリを探した方がいいでしょう

401:デフォルトの名無しさん
07/11/16 17:14:01
>>400 は83桁じゃなくて82桁だった

402:デフォルトの名無しさん
07/11/16 19:18:42
質問:C言語の「volatile」の名前の由来について

質問です。
C言語には「volatile」という記号が あります。
これを記入すると、該当部分でのコンパイル時の最適化を抑制できます。
しかし、なぜ volatile(移り気な、気まぐれな)なのでしょうか。
最適化を抑制しているのですから、むしろ「変化しない」という意味に なるはずです。
つまり、volatile では なく、「un-volatile(不揮発の、変化しない)」になるべきでは ないでしょうか。
教えてください。よろしくお願い致します。

403:デフォルトの名無しさん
07/11/16 19:29:20
volatile 変数は移り気で勝手に変化するから、最適化せずに毎回ちゃんとメモリを読みにいかないと正しい結果を得られない、と考えてはいかが

404:デフォルトの名無しさん
07/11/16 19:31:36
快活に計算動作するから
最適化などで省略して定数になったり計算無効になったりしたらこちらは変化無い

405:デフォルトの名無しさん
07/11/16 20:57:33
最初に名前を入力させ、5件分の入力が行われるか、endと入力されたら、その分だけ出力させる
ただし名前入力の最初にendが入力された場合は、その旨のメッセージを出力して再入力させてください
名前は最大15文字入力とする

これのやり方を教えてください

406:デフォルトの名無しさん
07/11/16 21:10:12
初歩的な質問スミマセン

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
char *cp=NULL;
void *ptr=NULL;

if((ptr=(char*)calloc(10,sizeof(char)))==NULL){
printf("error\n");
exit(EXIT_FAILURE);}

if((cp=strchr(fgets(ptr,100,stdin),'\n'))!=NULL){
*cp='\0';}

printf("%s",ptr);

return EXIT_SUCCESS;
}

半角文字10文字分のメモリをcalloc関数で確保して
fgets関数で10文字以上入力しましたが
普通10バイト分の配列を用意しfgets関数でそれ以上の文字を入力すると
オーバーフローが起き、強制終了しますよね?
ですがこれでは起きないんです、何故でしょうか

407:デフォルトの名無しさん
07/11/16 21:13:04
>>402
どっかで勝手に値が変えられる可能性があるから volatile だな。

408:デフォルトの名無しさん
07/11/16 21:56:34
>>406
ひーぷに余裕があるからじゃね?

409:デフォルトの名無しさん
07/11/16 22:10:54
>>405
丸投げは宿題スレへ
スレリンク(tech板)l50

410:デフォルトの名無しさん
07/11/16 22:12:14
>>406
>オーバーフローが起き、強制終了しますよね? 

そうとは限らない
他のところで使ってるメモリ領域を黙って書き換えるだけの場合もある

411:デフォルトの名無しさん
07/11/16 22:16:27
>>409
あっすいませんでした

412:デフォルトの名無しさん
07/11/16 22:17:24
>>408
あ、そういうことか!!
どうもありがとうございました

413:デフォルトの名無しさん
07/11/16 22:37:56
>>402
「最適化しないだって?」
「ああ、今日はそんな気分なんだ」
「まったく気まぐれな奴だよ」

414:デフォルトの名無しさん
07/11/16 22:52:46
>>402
#define donotoptimize volatile

415:デフォルトの名無しさん
07/11/16 22:56:56
違うとおもいますよ。
綿密な計画と設計思想に基づいてボラタイルに したんです。
気まぐれで ボラッたわけでは ありません。

416:デフォルトの名無しさん
07/11/16 23:23:58
なぜmainはmainという名前にしたんだろう、startの方がよくない?と思ったことはあります

417:デフォルトの名無しさん
07/11/16 23:25:04
だったらstopも要ると思わないか

418:デフォルトの名無しさん
07/11/16 23:36:50
多分main,subで分けて書いたからじゃないかな。

419:デフォルトの名無しさん
07/11/16 23:46:05
>>417
関数の名前にしちゃうとその辺の理屈あわせが難しくなるよね
>>418
ああなるほど

関係ないけどmain"メソッド"には今でも違和感がある…

420:デフォルトの名無しさん
07/11/17 01:36:08
mainメソッド……てJAVA?

421:デフォルトの名無しさん
07/11/17 02:07:26
Cから始めた自分には違和感なかったけど、よくよく考えたら不思議な名前のメソッドだな。

422:デフォルトの名無しさん
07/11/17 02:17:27
mainと言いつつ、主要な処理は他のところでやってるしね。

423:デフォルトの名無しさん
07/11/17 02:22:01
主要な流れ、ということじゃないか?
主要な処理を他でやっていても、
全体通してのメインの流れを定めるのがmain関数

int main(){
first_step();
second_step();
third_step();
return 0;
}

424:デフォルトの名無しさん
07/11/17 03:51:36
構造体のメンバの数って制限あるのですか?

425:デフォルトの名無しさん
07/11/17 09:08:36
そりゃあるだろうが、限界まで使ったこと無いな。


426:デフォルトの名無しさん
07/11/17 09:18:17
ハード側の限界にぶつかったことならあるが、規格の限界は知らないな

427:デフォルトの名無しさん
07/11/17 19:17:14
MFCって何?

428:デフォルトの名無しさん
07/11/17 20:24:04
>>427
ググれ

429:デフォルトの名無しさん
07/11/17 20:33:33
HTMLのform解析をしたいのですが、
<form action="./int.php" method="post">
<input type="text" name="id" value="C">
<input type="submit" name="button" value="押す">actionは./int.php
methodはPOST
typeはtext、nameはbutton valueはC
というように<>内をそれぞれ抽出したいのですが、どのようにしたら出来ますでしょうか?

430:デフォルトの名無しさん
07/11/17 22:36:57
オイラだったら perl でやる。rubyも好いらしい。


431:デフォルトの名無しさん
07/11/17 22:42:25
字句解析はCよりPerlを勉強した方がはるかに楽だよ

432:デフォルトの名無しさん
07/11/17 23:01:25
>402

volatileは「最適化抑制」という意味じゃない。
「値が外的要因(ハードウェアなど)によって変化しうる」という意味。


433:デフォルトの名無しさん
07/11/17 23:05:27
>429

Win系だったらMFCや.NET Framework、UNIX系ならPerlを使ったほうがいいな。

Cでやるしかない、という場合だったら、methodなどのキーワードの後の"...;"の中を一々抽出するしかないな。


434:デフォルトの名無しさん
07/11/17 23:08:04
>>429
どっかから正規表現のライブラリ持ってくるのが楽じゃない?

435:デフォルトの名無しさん
07/11/17 23:11:01
HTMLのライブラリだって、探せばありそう。

436:デフォルトの名無しさん
07/11/17 23:19:45
>>435
たとえばWindowsならMSHTMLとかだな。

437:デフォルトの名無しさん
07/11/17 23:34:44
レスありがとうございます。
まずはCだけで頑張ってみます。

438:デフォルトの名無しさん
07/11/18 00:04:55
>>と>=で処理する式が違うんですけど、
プログラムを作るとき、どう区別すべきですか?

439:デフォルトの名無しさん
07/11/18 00:08:11
違うってわかってるんなら、区別できてるってことじゃないか

440:デフォルトの名無しさん
07/11/18 00:20:31
for(;i<10;)

for(;i<=9;)
の違いがわからんってこと?

441:デフォルトの名無しさん
07/11/18 00:23:01
>>は非常に左が大きいだけど
>=は以上ってことだし。

442:デフォルトの名無しさん
07/11/18 00:29:57
if(A>>B)    C=A
elseif(B>>A)   C=B
elseif(A>=B) C=A+1;
elseif(B>=A) C=B+1;

の条件分岐を作りたいんだけど
区別どうすればいいのかってね。




443:デフォルトの名無しさん
07/11/18 00:33:32
>if(A>>B) C=A
 
AがBより非常に大きいってことを言いたいのなら、
コンピュータは 「非常に」 なんて曖昧な条件は理解できないので、
どのくらいかを具体的に指示してやらないとだめ。

if (A >= B + 1000) C = A;
とか
if (A >= B * 10000) C = A;
とか。

444:デフォルトの名無しさん
07/11/18 00:34:25
>>>は非常に左が大きいだけど
C言語でそんな比較演算子は無い
単なる大小比較( > )にし問題を書き換えなさい

445:デフォルトの名無しさん
07/11/18 00:59:48
きっとビットシフトだ

446:デフォルトの名無しさん
07/11/18 07:12:45
良くも悪くもコンピュータは正直だから、命令されたことしかやらない。
「〜よりは大きいが常識の範囲内で」とか言われても判断できるわけがない。

447:デフォルトの名無しさん
07/11/18 07:37:40
おれもビットシフトだと思って、何のことだか全然わからんかった。
「非常に左が大きい」て何だよw


448:デフォルトの名無しさん
07/11/18 07:38:50
以前にも同じような質問してきた奴が居たから俺はわかった

449:デフォルトの名無しさん
07/11/18 08:23:39
unsigned A; の下位 B ビット以外が0であることを
判別する関数をつくりなさい。(10点)


450:デフォルトの名無しさん
07/11/18 08:30:08
int f(unsigned A, int B) { return !(A >> B); }

451:デフォルトの名無しさん
07/11/18 08:38:36
bool func(unsigned A, unsigned B) {return A >= (1 << B);}

452:デフォルトの名無しさん
07/11/18 08:44:45
後出しなのに・・・

453:デフォルトの名無しさん
07/11/18 09:15:50
すみません、まだC初めて一週間足らずの初心者ですが質問させてください。

課題で
void printIPAddress( unsigned int address )
{
printf("%d.%d.%d.%d",
(address & 『 @ 』 ) >> 24,
(address & 『 A 』 ) >> 16,
(address & 『 B 』 ) >> 8,
(address & 『 C 』 ));
}
ア.0x000000ff イ.0x0000ff00 ウ.0x00ff0000 エ.0xff000000

とありまして、@〜Cにア〜エから適切なものを選択して関数を完成させるというものです。
ネットなどで色々検索して、答はたぶん@:エ A:ウ B:イ C:アじゃないかと思ってるのですが
どうしてそれが正解?なのかがわかりません。(そもそも正解かどうかすらわかりません)

考え方としては例えば@:エなら0xff000000は11111111 00000000 00000000 00000000で
>>24というのが右に24bit(3byte)移動するという意味なんだろうか?と思ってるんですが
3byte移動したら11111111が一番→にきて後ろについてたたくさんの0は前に行くんでしょうか?
それがどうして正解?なんでしょうか?他のもの(例えば0x000000ffとか)が入ってはいけないんでしょうか?
&を使ってるという事は論理積を理解できてないとこの問題は理解できないんだと思うのですが
本や解説を見てる時はふんふんなるほどと思っても実際こうやって問題にされると全くわからなくてお手上げです…

長文すみませんがどなたかご教授お願いします。
もしスレチならどこか該当スレに誘導お願いします。
(最初ふらっとCスレに書き込もうとしたら1000スレ達成しちゃってました…)

454:デフォルトの名無しさん
07/11/18 09:27:51
>>453
論理演算とビットシフトでググればわかりそうなもんだが…

&はand演算だから、左右どちらも1なら真=1になる。そうでなければ0になる。
例えば、11001100 & 11000000の結果は11000000になる。
これを右に6ビットシフトすれば00000011が得られる。

455:デフォルトの名無しさん
07/11/18 09:38:37
アドレスは、
11100010  上位ビット
01100011  
00100100  
11011100  下位ビット

のように格納されている

0ビットシフトさせてff = 11111111とand取れば下位ビットが出てくる
8ビットシフトさせてff = 11111111とand取れば下から二つ目が出てくる

456:デフォルトの名無しさん
07/11/18 09:42:04
>>452
インライン展開するときに、Bが定数なら>451の方が効率がよくなる。

457:デフォルトの名無しさん
07/11/18 09:49:08
効率とか言うレベルじゃなくて、単純に間違ってるだけだろw

458:デフォルトの名無しさん
07/11/18 10:03:48
11000000 10101000 00000001 00000001 (3232235777 = 192.168.101.1)
11111111 00000000 00000000 00000000 (4278190080 = 0xff000000)
----------------------------------
11000000 00000000 00000000 00000000 (3221225472 = and後)
00000000 00000000 00000000 11000000 (192 = 24ビット右シフト後)

ビットシフトした後には0が入る。つまり1ビットシフトはx2か/2と同等。
これで理解できなければ諦めてくれ。

459:453
07/11/18 11:44:35
なるほどっ!
すごくわかりやすい解説ありがとうございます。
ビットシフト自体は皆さんのご説明ですぐに理解できたのですが

「だからどうして@:エ、A:ウ・・・・・になるの?」というところが
なかなか理解できずレスに時間かかりました><

ただ少しばかり>>458さんに確認も含めた質問があるのですが
もしご覧になってたらお時間あればレスいただけませんか?
一行目の(192.168,101.1)というIPアドレスが最初はどこから出てきたのかさっぱり???だったのですが
これはわかりやすく例をあげるために適当?に書いてくれたのかな?と解釈しました。それでよろしいでしょうか?
あと、同じくカッコの中の3232235777や4278190080、3221225472という数字がイマイチピンとこないのですが
これはそれぞれ110000001010100000000010000001という2進法の数値を10進法で現してるものでしょうか?
(ググレ!でしたらすみません・・・ビット換算表はぐぐって今見てるのですが数字が大きすぎて・・・orz)

結局、最初の質問であった「どうして@:エA:ウ・・・になるのか?」という質問についてはやっと理解できました。
みなさんご親切にどうもありがとうございました^^


460:デフォルトの名無しさん
07/11/18 12:08:51
>>459
ああ、スマン間違ってる。458の2進数表記だと192.168.1.1になるね。

IPアドレス自体は例として適当に書いただけ。
数字の部分は1バイトずつにそれぞれ192、168、1、1と当てはめたものを
4バイトのunsigned int型変数addressの10進数として表現したもの。

ちなみにこの処理は欲しい部分を切り取るのによく使われる方法で「マスク」等と呼ばれたりする。
まあ頑張ってや〜。

461:デフォルトの名無しさん
07/11/18 12:51:48
C言語によるリスト構造について質問させてください。

連結リストに末尾からデータを蓄えて指定した数字を削除し
削除後のリストを画面に表示するプログラムを作りたいのですが、
手元にある参考書を見たり、ネットで調べても分らなかったので
どなたかご教授お願いします。

462:デフォルトの名無しさん
07/11/18 12:58:05
URLリンク(www.google.co.jp)
ネットで調べてわからなかったらここで聞いてもわからないんじゃない?

まずは指定した数字が何番目にあるか判定するプログラムを作ってみて、
それができたら一つ前のデータと一つ後ろのデータを連結するように書いてみればいいんじゃない?
宿題スレにいって丸投げするのが一番早いと思うけど。

463:デフォルトの名無しさん
07/11/18 13:04:03
>>462
ありがとうございます。宿題スレいってみます。

464:デフォルトの名無しさん
07/11/18 15:18:47
URLリンク(www.uploda.org)
こういうプログラムを作ったのですが
これに「平均点順に並び替えて表示する」という操作を加えたいのですがよくわかりません。
お願いします。

465:デフォルトの名無しさん
07/11/18 17:31:47
>>464
そのプログラムを自分で作れるなら出来ると思うけな

466:459
07/11/18 17:32:31
>>460さん、レスありがとうございました^^
マスクという処理方法については
名前だけ知ってたものの具体的にどういうものかまだ知りませんでした。
数字についてはまだピンときてないので引き続き2進数10進数16進数についても色々勉強してみます。


また何かわからない事ありましたら皆さんよろしくお願いします!

467:デフォルトの名無しさん
07/11/18 18:05:59
>>465
よくわからないでございます

468:デフォルトの名無しさん
07/11/18 18:10:51
>>467
普通のソートと同じ

469:デフォルトの名無しさん
07/11/18 18:12:50
そうなの?
ちょっとやってみる。thx

470:デフォルトの名無しさん
07/11/18 18:40:46
n番目のcellのポインタを呼び出す関数(*cell getcell(n)とか)でも作って、
バブルソートで比較しては入れ替えを繰り返せばいいんじゃないか。
for(i=0;i<MAX-1;i++)for(j=0;j<i;j++){
x=getcell(j);
y=getcell(j+1);
if(x->heikin > y->heikin){xとyの入れ替え}
}
cellごと入れ替えるにはもう一個前にもアクセスせんといかんから、
cell内の値だけ入れ替えるのが楽なのかなぁ。

471:デフォルトの名無しさん
07/11/18 18:46:08
その変数がnanかそうでないかを判断するにはどうすればいいですか?

472:デフォルトの名無しさん
07/11/18 19:24:18
有名なイディオムx != x(IEEE 754なら確実;あほなコンパイラでない限り)
C99のisnan
一部の独自関数_isnan

473:デフォルトの名無しさん
07/11/18 21:18:54
NGワード:ご教授

474:デフォルトの名無しさん
07/11/19 16:36:19
ANSI-Cについて質問です。

#include <stdio.h>
int main(int argc, char *argv[])
{
int x = 10;
printf("x=%d¥n", x);
char *s = "foo"; /** should be error? **/
printf("s=%s¥n", s);
return 0;
}

というコードを gcc -Wall -ansi hoge.c としてコンパイルすると何のエラーもなくコンパイルできてしまったんですけど、
Cでは文のあとに変数宣言できましたっけ?できなかったと思うのですが。
今までダミーのブロックを使ってたけど、いらないということでしょうか。
なおGCCは4.0.1です。


475:デフォルトの名無しさん
07/11/19 16:46:34
>>474
従来のCではダメ
C99ならOK

476:デフォルトの名無しさん
07/11/19 17:21:09
>>475
なるほど!さんくす
ちなみによく知られているコンパイラのうち、C99に対応していないものはありますか。
変数宣言が先頭じゃなくていいのは大変便利なのでぜひ使いたいんですけど、世の中の対応状況次第ではやめとこうと思います。
調べてみたらGCCはver3から対応しているみたいでした。今のGCCはver4が主流だと思うので、GCCは大丈夫ですね。

477:デフォルトの名無しさん
07/11/19 19:20:14
途中宣言はキモイから使いたくないな。

478:デフォルトの名無しさん
07/11/19 19:24:47
途中宣言ってわけわからなくなったりしないのかな?

479:デフォルトの名無しさん
07/11/19 19:32:23
>>476
Visual C++は対応していない。
世間一般ではGCCのようなC99に対応しているCコンパイラのほうが珍しい。

ブロック途中での変数宣言はC++だと当然の機能なんだけどね。

480:デフォルトの名無しさん
07/11/19 19:41:20
自己参照構造体がイミフ
最初に用意したポインタの示す値をNULL(ストッパーの役割)にして
んで次に用意したポインタの示す構造体の内部の自己参照ポインタには、その直前にあった構造体のアドレスを代入して。
繰り返すごとにどんどん構造体が繋がるってのはわかるんだけど、
例えば先頭から10個目の構造体内部を書き換えたい!って場合はどうすりゃいいの?
予め10個目ってわかるように変数で振っとけばいいの?

481:デフォルトの名無しさん
07/11/19 19:45:40
>>480
構造体を先頭から辿るときに、いま何個目かわかるように、その辿った回数を数えとけばいい

482:デフォルトの名無しさん
07/11/19 19:48:20
結局ソレが一番無難ですかー。
習ってたものでは一つ一つに入力の際でも、内部処理としての変数でもカウントアップさせるようなものを用意して、
その番号に直。
か、または、たどる時に何個かこっちが指定するって感じですか・・・。
難しそうだ('A`

483:デフォルトの名無しさん
07/11/19 20:10:58
つまり、何番目にアクセスしたいという要求が頻繁にあるときには、
そういう線形リストは向いていない。配列が向いている。

484:デフォルトの名無しさん
07/11/19 20:11:35
>>480
自己参照構造体というか、線形リストのことでしょ。

485:デフォルトの名無しさん
07/11/19 20:49:54
なるほど・・・勉強になります。

486:デフォルトの名無しさん
07/11/19 23:50:37
>>479
狭い世間なんだね。

487:デフォルトの名無しさん
07/11/19 23:55:07
なんか妄想してる奴がいるな

488:デフォルトの名無しさん
07/11/19 23:56:02
構造体のメンバのアドレスって構造体の先頭のアドレスから
求められるものなの?

489:デフォルトの名無しさん
07/11/19 23:56:54
>>478
途中宣言のほうが格段に読みやすい。

490:デフォルトの名無しさん
07/11/20 00:00:33
関数の長さによるだろ。

491:デフォルトの名無しさん
07/11/20 00:03:41
関数の長さによらず、途中宣言のほうが読みやすい。

492:デフォルトの名無しさん
07/11/20 00:10:17
こんばんは
大学の課題のことで質問です。
文字列をクイックソートで並ぶかえるプログラムなのですが、エラーが出来ます。
void your_sort(char *s[NS][WC]) {

int pivot;
int l_hold,r_hold;
int x=0;
int left = 0;
int right = WC-1;
l_hold = left;
r_hold = right;
pivot = (left+right)/2;
while(x<WC){

while(left < right)
{
while(strcmp(&s[x][right],&s[x][pivot])>0)
right--;
if(left =right)
{
s[x][left] = s[x][right];
left++;
}


493:デフォルトの名無しさん
07/11/20 00:12:09
>>492
コンパイラの警告は無視しないできちんと対処しましょう。
もしそのコードで警告が出ないようなら、コンパイラのオプションを見直しましょう。
もし警告レベルを換えても警告が出ないようなら、そんなコンパイラは投げ捨てましょう。

494:デフォルトの名無しさん
07/11/20 00:12:23
while((strcmp( &s[x][pivot],&s[x][left])<0) &&(left <right))
right--;
if(left != right)
{
s[x][left] = s[x][right];
left++;
}
while((strcmp( &s[x][pivot], &s[x][left])>0)&&(left < right))
left++;
if(left != right)
{
s[x][right] = s[x][left];
right--;

}
left = l_hold;
right = r_hold;
if(left < pivot)
your_sort(s[x][pivot-1]);
if(right > pivot)
your_sort(s[x]pivot+1,right);
}
x++;
}
エラー:cpp(39) : error C2664: 'strcmp' : 1 番目の引数を 'char **__w64 ' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照)
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
どこがおかしいのか教えて下さい

495:宿題スレへ逝け
07/11/20 00:16:14
>どこがおかしいのか教えて下さい
あんたの頭。

496:デフォルトの名無しさん
07/11/20 00:26:48
>>474
今更っぽいけど、ちょい補足。
-ansiはc89相当だけど、gcc拡張機能として途中の宣言が出来るので何も言われない。
厳密にc89を適応したければ-pedanticか-pedantic-errorsを-ansiと一緒に指定する。

でもコレやると//でのコメントとかですら怒られるけどな。

497:デフォルトの名無しさん
07/11/20 00:32:57
>>495
いつもならこういう煽りは見ていて腹立たしくなるが今回は同意してしまった。

498:デフォルトの名無しさん
07/11/20 08:15:27
>>494
>どこがおかしいのか教えて下さい

strcmp の 1 番目の引数がおかしいって書いてあるじゃん

499:デフォルトの名無しさん
07/11/20 15:25:31
bool 型同士の比較演算の結果はどうなるのでしょうか?
true / false それぞれが何らかの整数に変換されてから
比較されるのでしょうか?

500:デフォルトの名無しさん
07/11/20 16:09:59
>>499
trueは非0、falseは0としてコンパイラが評価する。

501:デフォルトの名無しさん
07/11/20 16:14:20
>>499
C言語にbool型なんて無い。

502:デフォルトの名無しさん
07/11/20 16:40:31
>>501
c99はcではないとでも?

503:デフォルトの名無しさん
07/11/20 16:50:14
それ_Boolのtypedef。
1と0を保持する整数型で、比較演算では結局int型に格上げされるはず。

504:デフォルトの名無しさん
07/11/20 17:25:48
文字列0.051/0.056/0.095/0.010 msから
2番目の要素、上の文字列だと0.056を文字列検索かけてうまくとる方法教えてください

505:デフォルトの名無しさん
07/11/20 17:28:52
>>504
これでいいのかな?
#include <stdio.h>

int main(void){
char str[]="文字列0.051/0.056/0.095/0.010 msから";
char second_value[100];

sscanf(str, "%*[^/]/%[^/]", second_value);
puts(second_value);

return 0;
}

506:デフォルトの名無しさん
07/11/20 17:41:44
>>505
ありがとう、うまくいきました。
私が書いた正規表現が間違ってたみたいです。


507:476
07/11/20 21:55:54
>>479
遅れましたが、情報サンクスです。
VisualC++が対応していないというのは驚きですね。C++とみなしてコンパイルすればいいんだろうけど。
>>496
細かい情報ありがとう。-ansiで厳密なANSI準拠にならないというのはなんか間違ってる気がする。UIとして。


508:デフォルトの名無しさん
07/11/21 01:12:45
>厳密なANSI準拠
ここに矛盾を感じない人には丁度いいのでは?

509:デフォルトの名無しさん
07/11/21 10:18:11
もうテンプレに、このスレはC89用って書いとけよ

510:デフォルトの名無しさん
07/11/21 10:26:43
C90 じゃなくて?

511:デフォルトの名無しさん
07/11/21 10:30:37
うん

512:デフォルトの名無しさん
07/11/21 10:38:37
1年は365日ですけど、それを1月は31日、2月は28日、3月は31日・・・・12月は31日っいう感じに書き換えるプログラムを作りたいんですがどうすればいいでしょうか?

513:デフォルトの名無しさん
07/11/21 10:42:06
お前にはまだ早い

514:デフォルトの名無しさん
07/11/21 10:44:07
>>512
書き換えるの意味がわからん。
122日 -> 5月2日
という感じ?

515:デフォルトの名無しさん
07/11/21 10:45:02
>>514
そうです。

516:デフォルトの名無しさん
07/11/21 10:47:46
年はどうするの?
うるう年を考慮するのか、とか

517:デフォルトの名無しさん
07/11/21 10:50:25
今年の月日です。

518:デフォルトの名無しさん
07/11/21 10:59:47
>>517
自分で月数の配列作って計算してもいいけど、
標準関数使うなら、mktime で 2007年1月122日を設定(122はtm_mdayに入れる))すれば
tm_mon に0から始まる月、tm_mdayに1から始まる日が入るはず。

519:デフォルトの名無しさん
07/11/21 11:20:43
>>518
ありがとうございます!
…が、初心者の俺には難しいようでした。まったくわかりません。
お手数おかけしてすみませんでした。

520:デフォルトの名無しさん
07/11/21 11:27:40
void calendar(int day){
if(day > 0 && day <= 365){
int data[] = {31,28,31,30,31,30,31,31,30,31,30,31};
for(int i=0;i<12;i++){
if((day-=data[i])<= 0){
printf("%d月%d日\n",i+1,day+data[i]);
return;
}
}
}
else
printf("1〜365の間で入力してください。\n");
}

521:デフォルトの名無しさん
07/11/21 11:32:06
>>519
struct tm tm = {0};
tm.tm_year = 2007 - 1900;
tm.tm_mday = 122;
time_t t = mktime(&tm);

printf("%d月%d日", tm_mon + 1, tm.tm_mday);

522:デフォルトの名無しさん
07/11/21 12:38:46
#include <stdio.h>
int main(void)
{ char str[256];
char s[] = "This is a pen. That is an apple.";
int i,j,k,checker;
printf("This is a pen. That is an apple.\n\n");
gets(str);
for(j=0;j<256;j++)
{for(i=j,k=0;str[k]!='\0';k++,i++)
{if(str[k]==s[i])
{checker=1;
break;}
else
{checker=0;}}}
if(checker==1)
{printf("OK!その文字列は含まれています。。\n");}
else
{
printf("NG!その文字列は含まれていません。\n");}}

初期化した文字列(This is~)と, キーボードから入力した文字列 str に対し, 文字列中に str が出現するかどうかを判定して表示するプログラムを作成したいのですが、
なかなかうまくいきません。最初のifelse文においてのreturnが変だと思うのですが。
例えば This→OK That→OK is→OK apple→OK pple→OK…


523:デフォルトの名無しさん
07/11/21 12:43:41
>>522
#include <string.h>
char *strstr(const char *s1, const char *s2);

URLリンク(www9.plala.or.jp)
これじゃ駄目なの?



524:デフォルトの名無しさん
07/11/21 12:45:39
>>523
申し訳ないです。
stiring.hを使わず、for文でループして検索するっていう条件付です;


525:デフォルトの名無しさん
07/11/21 12:51:49
>>522
この前同じようなの見かけた
スレリンク(tech板:389-番)

526:デフォルトの名無しさん
07/11/21 12:54:12
>>522
×s[] について検索開始位置 (j=0 ; j<256; j++)とあるが、s[j] != '\0'でで辞めるべき
×1文字でも一致していると、処理を抜けてしまう
→1文字でも不一致で処理を抜けるべき

527:526
07/11/21 13:01:08
あと、2段目のforループで一致判定出たら、1段目のforループ抜けるのも
忘れずに

528:デフォルトの名無しさん
07/11/21 13:04:16
>>526
ってことは根本的には間違ってるんですかね?
数文でもいいので例をあげてもらえればうれしいです。

529:デフォルトの名無しさん
07/11/21 13:07:14
>>527
あっ、なるほど!
サンクスです。

530:デフォルトの名無しさん
07/11/21 13:08:29
>>522
なるべく原型を留めたつもり。

char *sp,*strp,*bsp;
for(sp = s; *sp!='\0';sp++){
for(strp = str, bsp=sp; *strp!='\0' && bsp != '\0';strp++,bsp++){
if(*strp == *bsp)
checker = 1;
else{
checker = 0;
break;
}
}
if(checker)
break;
}


531:デフォルトの名無しさん
07/11/21 13:12:26
やばいw
少しわかったつもりですが、forで混乱してるかも…
>>527のヒントがすごいわかり易いんですけど、こっからつまってます。

532:デフォルトの名無しさん
07/11/21 13:21:12
つーかchekerは0で初期化しといて、elseで代入はやめなよ

533:デフォルトの名無しさん
07/11/21 13:25:37
>>532なるほど

教えてくんでごめんなさい


534:デフォルトの名無しさん
07/11/21 15:07:20
整数型の数字を一文字ごとに分割したいので
sprintf(b,"%x",a);
としたのですが
printf("%s",b[0]);
としてみたところセグメントエラーが出てしまいます
どうしてでしょうか?
aはint型変数です

535:デフォルトの名無しさん
07/11/21 15:11:50
bの型は?
あと%xは16進数、%sは文字列だがいいのか?
b[0]がchar型なら、%cだろ?

536:デフォルトの名無しさん
07/11/21 15:12:17
bがchar*として考えると,printf("%s",b[0]);はprintf("%c",b[0]);

537:デフォルトの名無しさん
07/11/21 15:29:47
>>535>>536
sとcは違うんですねw
ありがとうございました

538:デフォルトの名無しさん
07/11/21 16:36:35
同じだと思ってたのか

539:デフォルトの名無しさん
07/11/21 16:56:03
>>536
ウソツケ

printf("%s",b[0])
はb[0]の値をアドレスとする番地から始まるゼロ終端文字列を表示し
printf("%c",b[0])
はb[0]の値を文字コードとする文字を表示する

540:デフォルトの名無しさん
07/11/21 17:07:12
質問から読んで書いてるのだろうか。

541:デフォルトの名無しさん
07/11/21 17:08:37
>>539
後者に直せって意味で書いた

542:デフォルトの名無しさん
07/11/21 17:13:21
何コイツ

543:539
07/11/21 17:40:45
>>541
スマン
イコールの意味だと勘違いしてた

544:デフォルトの名無しさん
07/11/21 17:53:09
m9(^Д

545:デフォルトの名無しさん
07/11/21 18:49:06
borlandからVisualStudio2005に変えたんですが、
VSだとexeファイルってできないんですかね


546:デフォルトの名無しさん
07/11/21 18:51:05
なぜそう思った?

547:デフォルトの名無しさん
07/11/21 19:24:48
debug フォルダの中にできてるよ。

548:デフォルトの名無しさん
07/11/21 21:23:29
初心者です。
return 0
がどういう意味なのかがどうしても分かりません。
return 0
があると、コンピュータは何をするのでしょうか?

549:デフォルトの名無しさん
07/11/21 21:28:57
まずmain内に記述してると思うけど、main関数(mainという小さなプログラム)があるんだ。
int main(void)って書いてるでしょ?
return 0;ってのは、OSに 正常終了しましたよ〜って知らせるための記述。
でなぜ0なのかってのはint main(void)ってコトからわかるように、
main関数には整数を返しますよってコトです。

まぁ余談になったけど、 正常終了 ってコトです。

550:デフォルトの名無しさん
07/11/21 21:31:20
>main関数には整数を返しますよってコトです。
「には」じゃなくて「は」だろ。

551:デフォルトの名無しさん
07/11/21 21:32:29
んじゃreturn 1だとしたらどうなるんです?

552:デフォルトの名無しさん
07/11/21 21:35:19
光あれと1と戻すだけ。
受け取る者がいなければ、
次のクロックで虚無に消える。


553:デフォルトの名無しさん
07/11/21 21:35:20
return 1って異常終了じゃないっけか?
exit(1)と同じだと認識してる・・・

554:デフォルトの名無しさん
07/11/21 21:39:37
受け取る側で判断するから異常とは限らないな

555:デフォルトの名無しさん
07/11/21 22:01:01
>>549
そうです。それがよく分からないんです。
正常終了したかどうかはコンピュータが判断することでは?
「これは正常終了したことにします」って人間が決めちゃうんですか?
「正常終了」の意味が分かってないんだと思います。
main()関数は引数として0か1を渡してあげないといけないということでしょうか?
1を渡した場合、どうなるのでしょうか?


556:デフォルトの名無しさん
07/11/21 22:03:03
2とか3とかも渡せるぞ

557:デフォルトの名無しさん
07/11/21 22:09:00
>>555
OSが何なのか分かってないのでは?

558:デフォルトの名無しさん
07/11/21 22:13:03
>>555
別にプログラムから1が返ってきたからってコンピュータはどうもしないけど、
シェルスクリプトやバッチファイルでコマンドの終了状態で処理を分岐したりだとか、
make中にコンパイルが失敗した時に処理を中断したりだとか、
そういう場面で使う。

俺的には「1つのプログラムで処理が完結する場合ばっかりじゃないので、
一応お約束が決まってます」ってぐらいだと思ってるけど。

559:デフォルトの名無しさん
07/11/21 22:14:25
>>555
コンピュータがどうやって「正常終了」の判断をするのかkwsk

560:555
07/11/21 22:19:56
スマン適当に言っただけだ。流してくれ。

561:デフォルトの名無しさん
07/11/21 22:21:03
>>555
main関数からどんな値を返そうと、WindowsやUnixなど大抵のOSは何も行わない。
ただ、その値を「欲しがっているところ」に引き渡すだけ。
「欲しがっているところ」とは、単に別のプログラム、大抵はバッチファイルやシェルスクリプト。

0が正常終了というのは、シェルスクリプトらとプログラムとの間の暗黙の了解。
当時の資料を探せば何か根拠が出てくるかもしれない。
Cはそれを標準規格へ取り込んだ。

562:デフォルトの名無しさん
07/11/21 22:32:10
正しいか正しくないかは人間がきめること。
CPUはただクロックを数えるのみ。


563:デフォルトの名無しさん
07/11/21 22:40:55
自己参照構造体のポインタの動きで頭がこんがらがりまくる・・・
繋ぎなおして先頭アドレスをmainに返すってのはわかるんだけど、
か、書けねえ・・・
なんかコツとかありますか('A`)

564:デフォルトの名無しさん
07/11/21 22:44:19
>>557-558、>>561
ありがとうございます。
どうやら
return 0;
が何かを理解するのに必要な知識がだいぶ不足しているようです。
OSが何なのかや「make中」などが分かりません。
あてどもなくググってみたところ、
URLリンク(www.mech.utsunomiya-u.ac.jp)
の下の方の記述を見つけ、ようやっと、「一応お約束」や「暗黙の了解」
という意味が分かりました。
ただ、
return 0;
を書いた段階でプログラムが終わってしまうのは知りませんでしたが、
引数を返した時点で関数というのはそれ以上見なくなってしまうものなんですね。
もう少し勉強が必要です。少し知識を身につけてから、また皆さんの書き込み
を見たら意味が理解できるのかもしれません。ありがとうございました。

565:デフォルトの名無しさん
07/11/21 22:44:37
紙に書いて考えれば?

566:デフォルトの名無しさん
07/11/21 22:45:22
>>563
構造体を四角、ポインタの指す方向を線で、紙に書いてやってみそ。
慣れたら、頭の中でできるようになる。

567:デフォルトの名無しさん
07/11/21 22:52:16
URLリンク(www.mech.utsunomiya-u.ac.jp)
の下の方のところ、貼っておきます。
------------------------------------
return 0 とは,プログラムの正常終了を意味している.とはいえ,これは UNIX 上でないとほとんど意味をなさないかもしれない.
UNIXでは,シェル(shell)と呼ばれるインタフェースプログラムを介してプログラムの実行が行われる. return 0 はこのシェルに
よってプログラムの終了状態に合わせた処理を行わせることができる.たとえば,Bash(Linux の標準シェル)の場合,

if program; then echo "OK"; else echo "ERROR"; fi

と記述することによって, program という名前のプログラムを実行し,もしそのプログラムが正常に終了した場合は OK を表示し,
正常に終了しなかった場合には ERROR を表示するようにすることができる. 正常に終了しなかった場合を表すには,たとえば次のよう記述する.
#include <stdio.h>

int main()
{
int a, b, c;

if (c != 0) {
a = b / 0;
} else {
printf("c = 0 なので割れません\n");
exit(1); /* 異常終了として1を返してプログラムを終了する */
}
return 0;
}

このプログラムでは, 0で割算を行わないように,まず変数 c がゼロでないかチェックし,もし変数 c がゼロのときには異常を
示してプログラムを終了する. exit() はプログラムを終了させるための関数で,引数の値が返される.一般的には,正常に終了
した場合には 0 を返すことにし,正常に終了しなかった場合には他の値を返すことになっている.だから,return 0 は
プログラムの正常終了を示すために必要なのである.また,main() の前の int は 0 や 異常終了の値の型を表している.

568:デフォルトの名無しさん
07/11/21 23:11:09
おそらく>>297は皆を困らせようとして書いただけだよ

569:デフォルトの名無しさん
07/11/21 23:50:47
xor eax, eax
ret


570:デフォルトの名無しさん
07/11/21 23:59:44
>>564
process.h のsystem関数で外部exeを実行できるんだけど、
system関数の戻り値がintでそのプログラムが返した値を返す。
最後にreturn 0;だったら0。return 10;だったら10。
void main()だと不定っぽい。

571:デフォルトの名無しさん
07/11/22 00:04:12
//child.c
#include <stdio.h>
int main(){
printf("hogeeeeeeee!!\n");
return 10;
}

//parent.c
#include <stdio.h>
#include <process.h>
int main(){
printf("system::%d", system("child"));
return 0;
}

二つをコンパイルしてparentを実行した結果
>hogeeeeeeee!!
>system::10

と出るはず。


572:デフォルトの名無しさん
07/11/22 01:13:16
プログラムの正常終了は0だが、各関数の正常終了も0を返すようにしてる?
if文やwhile文が0以外を真としたりするので、0を返しちゃうと判定で偽になるよね?
みんなは省略形は使わずに、必ず==で何かと比較してますか?


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4973日前に更新/195 KB
担当:undef