C言語なら俺に聞け( ..
369:デフォルトの名無しさん
07/06/30 11:42:12
forは式を省略できるがwhileは省略できない。
なので、無限ループはwhile (1) {...;}ではなくfor (;;) {...;}を使う。
370:デフォルトの名無しさん
07/06/30 11:47:09
もうしわけないです、コーディングは以下の理解でよいでしょうか。
だめ:×
if (f=fopen(filename,"r"))
よい:○
f=fopen(filename,"r");
if(f!=NULL)
371:デフォルトの名無しさん
07/06/30 11:47:14
>>367
malloc したら free しないとダメじゃん。
管理の手間が増えるからなるべくやりたくない。
必要な時はするがね。
ガベコレのある言語と一緒に考えない方がいいよ。
372:デフォルトの名無しさん
07/06/30 11:48:39
>>370
「だめ」ではなくて、「好ましくない」程度で。
他人が書いたものを読むときに、「だめ」と思わずに許容してあげましょう。
373:デフォルトの名無しさん
07/06/30 11:48:56
>>370
文法上の問題はないが推奨されない:△
if (f=fopen(filename,"r"))
よい:○
f=fopen(filename,"r");
if(f!=NULL)
374:デフォルトの名無しさん
07/06/30 11:50:26
whileでは無限ループはできないんですか?
375:367
07/06/30 11:54:14
>371
どもです。なるほど。確かにガベコレある言語でしかマジメに開発したことがないので、納得できていませんでした。
別物ですね。別物。
でも、その際に使用するMAX_BUF_NUMとかは一般的に1024とか使用されているのですが、何ゆえその数字が決まるのですか?
質問ばかりですいません。
376:デフォルトの名無しさん
07/06/30 12:07:15
1KB程度でいいんじゃねって感じじゃね?
377:367
07/06/30 12:15:56
> 376
サンクス
しかし、1KBにするか4KBにするかといったことに悩むんですよね。
作りたいアプリの仕様が1KB程度だから、ここは1KBにするか、と考えるのは普通のような気もするのですが、
アプリを作りたいのではなくて、自分用の便利ライブラリを作成する際にどの数字を採用するか、
と考えるのが非常につらい。
つか、こんな考え方の俺ってガベコレ言語を使いすぎですか。
378:デフォルトの名無しさん
07/06/30 12:20:37
ライブラリならバッファの大きさなんてユーザから指定を受け付けるものに決まっているだろ。
379:デフォルトの名無しさん
07/06/30 12:23:07
C が嫌なら C++ で string とか vector とか使えばいいよ。
380:デフォルトの名無しさん
07/06/30 12:23:59
>>369
for(;;) は可読性が乏しいから while(1) の方が好きだな。
381:デフォルトの名無しさん
07/06/30 12:25:18
>>372 373
ありがとうございました。
382:デフォルトの名無しさん
07/06/30 12:33:22
>>377
Cでライブラリ作るときは内部でバッファを抱えない。
(char *buf, size_t bufsize)
で受けるのがお約束。
高級にやりたいならmalloc, freeでやってバッファがあふれたらreallocで拡張。
手を抜きたいなら#defineで固定バッファであふれたらASSERTでとめるか放置してバッファオーバーフロー。
大体この三種類だな。重要度とパフォーマンスを秤にかけて好きにしとけ。
1kbと4kbのどっちが妥当かなんて答えようがない。
383:367
07/06/30 12:45:56
>> 382, 379, 378
どうもありがとうございました。
後は、自分で考えることができそうです。
ついでにもう一つ聞いてもいいですか?
文字列の配列を作るときに、
ダブルポインタを採用するのがいいか、リンクリストを採用するのがいいか迷っています。
どちらがお勧めですか?
384:デフォルトの名無しさん
07/06/30 12:48:35
それは定数か? それとも実行中に作りたいのか?
385:デフォルトの名無しさん
07/06/30 12:50:49
>>383
使い方によるだろ
よくわからないならダブルポインタの方が扱いやすいかな?
386:デフォルトの名無しさん
07/06/30 12:55:20
リストなんて糞なもん使わずにchar**な配列作っとけ
387:367
07/06/30 13:02:55
>>385, 384
ありがとうございます。
構造体でどちらで定義しようかな、と考えていました。
typedef struct {
char *dstr;
int dlen;
} DATUM;
typedef struct {
DATUM *ptr;
int size;
} DATUMLIST;
とするか、
typedef struct _DATUMLIST {
char *dstr;
char dlen;
struct _DATUMLIST *next;
} DATUMLIST;
とするか迷っていたのです。まぁ、迷わずに実装してしまえば、どちらでもいいような気がしますが。
388:367
07/06/30 13:06:07
>>386
それも考えました。
無駄に考えるのがよくないのですかね。
この際、char**な配列の方が楽のような気がしてきた。
389:デフォルトの名無しさん
07/06/30 14:08:33
int型を指すポインタ int* p;
一次元ポインタ配列 int** p;
二次元ポインタ配列 int*** p;
三次元ポインタ配列 int**** p;
って風にスターを増やしていってもいいの?
390:デフォルトの名無しさん
07/06/30 14:09:42
#include <stdio.h>
int multiple(int, int);
main()
{
}
int multiple(int x, int y)
{
if(y%x == 0)
return 1;
else
return 0;
}
multiple関数を使って二つの整数を比較し
二つ目の整数が一つ目の整数なら1(真)、
それ以外なら2(偽)を返すというプログラムを作りたいのですが
main関数をどうすればいいのかわかりません
391:デフォルトの名無しさん
07/06/30 14:11:44
>>389
int** p; は int* 型を指すポインタだ。
それが必要になれば使う。普通に使う。
392:デフォルトの名無しさん
07/06/30 14:12:34
>>390
main 関数で何がしたいのか分からないので
こちらにもどうすればいいのか分かりません。
393:デフォルトの名無しさん
07/06/30 14:14:28
>>389
スターじゃなくてアスタリスクじゃね?
394:デフォルトの名無しさん
07/06/30 14:16:08
普通にどちらも使う。
フォントによっては実際に星型なってることもあるし。
395:デフォルトの名無しさん
07/06/30 14:16:22
>>391
ありがとう
>>390
if(y%x == 0)
ってyに0が入ってきたらy%xは必ず0になって比較にならないんじゃね?
396:デフォルトの名無しさん
07/06/30 14:20:45
>>395
0 はあらゆる数の倍数(0 倍)だから動作的に問題ない。
397:デフォルトの名無しさん
07/06/30 14:23:12
xが0の時のほうがまずいよな。
398:デフォルトの名無しさん
07/06/30 14:30:47
まあ、どこまでエラー処理するかは状況次第だな。
assert するだけにしておくか、
それともエラー時に何か特別な処理をしてエラー復帰するか。
399:390
07/06/30 15:24:33
main関数では、変数を二つスキャンして
それをmultiple関数に渡し、multipleでの結果を
main関数に返してプリント
というふうにしたいです
400:デフォルトの名無しさん
07/06/30 15:27:56
そう書けばいいんじゃないかな。
401:390
07/06/30 16:26:43
その書き方がわからなくて困ってます
402:デフォルトの名無しさん
07/06/30 16:30:21
そうですか。
403:デフォルトの名無しさん
07/06/30 16:30:50
エラー出てもいいからとりあえず書いてみれ。
それでも分からなければ、
自分でどうやってみたかをここにコピペしてみれ。
404:390
07/06/30 17:12:58
どうしてこんなにお願いしているのに教えてくれないんですか。
もったいぶらないで今すぐに教えてください。
405:デフォルトの名無しさん
07/06/30 17:20:13
#include <stdio.h>
int multiple(int, int);
int main(void)
{
int x, y;
scanf("%d %d",&x,&y);
if(x == 0) return 1;
printf("%d\n",multiple(x,y));
return 0;
}
int multiple(int x, int y)
{
return (y%x!=0)+1;
}
二つ目の整数が一つ目の倍数なら1 と解釈してやってみた
つかここ宿題スレだっけ?
406:デフォルトの名無しさん
07/06/30 17:20:22
うわ・・・
407:390
07/06/30 17:21:03
#include <stdio.h>
int multiple(int, int);
main()
{
int a,b;
scanf("%d%d\n", &a, &b);
printf("%d\n", multiple(a,b));
return 0;
}
int multiple(int x, int y)
{
if(y%x == 0)
return 1;
else
return 0;
}
このプログラムだと一応実行できるのですが
整数を二つ入力しても動かず、もう一つてきとうに整数を入れると
最初の二つの整数について判断します。
例えば
2
4←ここで4は2の倍数なので1が返ってくる
はずなのですがそこでは処理がされず
5←さらに適当に整数を入力する
1←すると結果が返ってくる
と、こんな感じです
整数を二つ入力した時点で処理結果を返したいのですが
いいでしょうか?
408:デフォルトの名無しさん
07/06/30 17:22:14
>>404
>main関数をどうすればいいのかわかりません
>というふうにしたいです
>その書き方がわからなくて困ってます
一度もお願いなんかされてないんだが。
409:デフォルトの名無しさん
07/06/30 17:25:25
>>408
行間も読めないんですか? とか言われそうだなw
>>407
scanf()とprintf()のフォーマット文字列は互換性がないと思ったほうがいい。
あんたのコードは明らかにscanf()のフォーマット文字列が間違っているぞ。
410:デフォルトの名無しさん
07/06/30 17:26:28
>>409
お前こそ行間が読めてないなw
411:409
07/06/30 17:30:06
>>410
大丈夫、初めから読もうとしてないから。
412:デフォルトの名無しさん
07/06/30 17:37:36
これはひどい
413:390
07/06/30 17:43:19
>>409
助言ありがとうございます
それと404は私ではないのであしからず
414:390
07/06/30 17:57:37
main()
{
int a,b;
printf("整数1:"); scanf("%d", &a);
printf("整数2:"); scanf("%d", &b);
printf("%d\n", multiple(a,b));
return 0;
}
407のmain部分を上のようにしたら理想通りに実行されたのですが
なぜ上手くいったのかがよくわかりません。
誰かその理由を説明してください。
415:デフォルトの名無しさん
07/06/30 17:59:15
>>414
>>409の最後の行
416:390
07/06/30 18:02:29
間違っていることはわかりましたが
407のscanf()はどういけないんですか?
417:デフォルトの名無しさん
07/06/30 18:02:51
\n
418:デフォルトの名無しさん
07/06/30 18:03:23
>>416
\n
419:デフォルトの名無しさん
07/06/30 21:07:21
もし A、B、C、Dのいずれかを満たしたら、、、と出力
それ以外なら。。。と出力
とするにはどうやればいいですかね?
420:デフォルトの名無しさん
07/06/30 21:20:02
>>419ですけど自己解決しますたー
421:デフォルトの名無しさん
07/06/30 23:23:30
#include<stdio.h>
#include<string.h>
main(){
char c[3];
char s1[]="abcdefghijklmnopqrstuvwxyz"
char s2 [100];
s2[0]='\0';
printf("s1 inital value:\"%s\"\n",s1)
printf("s2 inital value:\"%s\"\n",s2)
if cstrcmp(s1,s2)==0){
printf("s1==s2\n");}
else{printf("s!=s2\n");}
printf("Push ENTER to proceed.");
fgets(c,2,stdin);
strcpy(s2,s1);
printf("s1 current value:\"%s\"\n",s1);
printf("s2 current value:\"%s\"\n",s2);
if(strcmp(s1,s2)==0)
{
printf("s1==s2\n");}
else{prinf("s1!=s2\n");}
}
のプログラムのfgets(c,2,stdin); ってなんですか?なんの役割ですか?
422:デフォルトの名無しさん
07/06/30 23:29:26
>>421
どうでもいいけどそれ、そろそろtypo直そうな
× if cstrcmp(s1,s2)==0){
○ if (strcmp(s1,s2)==0){
423:デフォルトの名無しさん
07/06/30 23:29:57
スレリンク(tech板:607-644番)
解決したんじゃなかったのか
424:デフォルトの名無しさん
07/06/30 23:34:01
fgets(c,2,stdin); がわかないんですよ
タイプミスはすいません
425:デフォルトの名無しさん
07/06/30 23:37:27
>>421
stdinからcに1文字読み込む。
426:デフォルトの名無しさん
07/06/30 23:38:03
流れも他スレも読まずに回答。
>>421
>のプログラムのfgets(c,2,stdin); ってなんですか?なんの役割ですか?
入力処理。改行を入力させるために使っているわけだ。
427:デフォルトの名無しさん
07/06/30 23:41:15
>>424
Push ENTER to proceed を表示したところで止まるだろう
エンターキーを押すと次に進む
ようはポーズさせているんだろう
428:デフォルトの名無しさん
07/06/30 23:42:16
>>428
なんでENTERを押すと次が表示されるんでしょうか?
429:デフォルトの名無しさん
07/06/30 23:44:23
>>428
自己レスかよ
fgets(c,2,stdin);
で標準入力からの入力待ちで止まっている
エンターキーで入力されたので次に進むだけ
cのデータ自体はいらないもの
430:デフォルトの名無しさん
07/06/30 23:51:30
わかりました。ありがとうございます
431:デフォルトの名無しさん
07/07/01 00:54:39
プログラムとか全くなんにもやった事ないんですけど、最初になにを用意したらいいものなんでしょう?
ここのサイトをまず読めとか入門にいい本とかってありませんかね?
仕事では2D/3Dのデザイン系やってるんですけど、プログラムにもちょっと興味があるんで、
まずはCから勉強していこうと思っているんですが。
432:デフォルトの名無しさん
07/07/01 00:55:43
まず、コンパイラとリンカを用意します
433:デフォルトの名無しさん
07/07/01 00:57:21
最初に用意すべきものは、
何を用意すればいいかを自力で探せる能力だな
とマジレス
いや、マジでプログラマにとって最重要な能力は、情報収集力だよ
434:デフォルトの名無しさん
07/07/01 01:00:07
もうちょい広範囲に言うと「自己解決能力」
435:デフォルトの名無しさん
07/07/01 01:02:58
応用力。>>428なんかは将来心配
436:デフォルトの名無しさん
07/07/01 01:10:50
俺も>>431に何かレスしようと思ったが
>>433-434に全て持っていかれた
437:デフォルトの名無しさん
07/07/01 01:11:17
やる気。
438:デフォルトの名無しさん
07/07/01 01:12:20
やる気は大切だが、やる気だけの子も困ったり。
439:デフォルトの名無しさん
07/07/01 01:13:12
叩かれても泣かない。むしろ悦ぶ方向で。
440:デフォルトの名無しさん
07/07/01 01:15:15
四大欲求をフルに使いこなせる体力。
441:431
07/07/01 01:16:58
そうっすねぇまずは色々情報探してみます。
入門出来たらまた相手にしてください。
442:デフォルトの名無しさん
07/07/01 01:56:16
#include <stdio.h>
int main(void)
{
int min,max,x,y,i,j;
puts("長方形を作りましょう");
printf("一辺(その1)"); scanf("%d",x);
printf("一辺(その2)"); scanf("%d",y);
min = x;
if (y < x)
min = y;
max = y;
if (y < x)
max = x;
for (i=1; i<=max; i++) {
for (j=1; j<=min; j++)
putchar('*');
putchar('\n');
}
return 0;
}
何がおかしいスかねぇ
*が表示されないんですよねぇ
443:デフォルトの名無しさん
07/07/01 01:59:59
>>442
printf("一辺(その1)"); scanf("%d",&x); < & が抜けてるよ
printf("一辺(その2)"); scanf("%d",&y);
444:デフォルトの名無しさん
07/07/01 02:04:09
あ
なんということ…ありがとうございます
445:デフォルトの名無しさん
07/07/01 02:08:54
ちなみにこのプログラムは順番的には
for (i=1; i<=min; i++)→for (j=1; j<=max; j++)→putchar('*')
→for (j=1; j<=max; j++)→putchar('*')→for (j=1; j<=max; j++)→putchar('*')
…→putchar('\n')→for (i=1; i<=min; i++)→…
みたいな感じで実行されてるのですか?
446:デフォルトの名無しさん
07/07/01 02:20:10
>>445
それであってるよ。実行して確認してみればいい。
447:デフォルトの名無しさん
07/07/01 13:00:50
>>446
ありがとうございました
448:デフォルトの名無しさん
07/07/01 14:37:35
四大欲求とは三大欲求に知的探究心を加えたものか
449:デフォルトの名無しさん
07/07/01 14:45:08
ノッてくれ〜Ha〜Ha〜♪
450:449
07/07/01 14:45:40
素で誤爆しました
すみません
451:デフォルトの名無しさん
07/07/01 14:51:42
Gnuplotを扱うC言語用のライブラリとか無いでしょうか?
popen()関数を使って自分で作る事は出来るのですが
もし優れたライブラリがあるならそっちを使いたいです
C++では駄目でCでおながいします
452:デフォルトの名無しさん
07/07/01 19:06:59
例えば
foo(cahr*p)
{
char *my_ptr = MyGetInnerParameter("内部パラメータを文字列で返す関数");
strcpy(p,my_ptr);
}
var()
{
char *ptr;
foo(ptr);
}
こうすると、落ちるんだけど、どうして?
453:デフォルトの名無しさん
07/07/01 19:09:22
foo(char** p)
にしないと
454:デフォルトの名無しさん
07/07/01 19:15:07
いやそれ以前のはなしか
455:デフォルトの名無しさん
07/07/01 19:21:54
どこ指してるかわからないpにstrcpyしちゃだめだろ
456:デフォルトの名無しさん
07/07/01 19:23:24
char* a[8]をlongに直すにはどうしたらいいでしょうか?
>>で1つずつやっていくしかないですかね?
457:デフォルトの名無しさん
07/07/01 19:25:03
じゃあ
foo(cahr*p)
{
char *my_ptr = MyGetInnerParameter("内部パラメータを文字列で返す関数");
strcpy(p,my_ptr);
}
var()
{
char ptr[8];
foo(ptr);
}
こうしてみたんだけど、やっぱりダメだった。
どうして?
458:デフォルトの名無しさん
07/07/01 19:25:29
cahr
459:デフォルトの名無しさん
07/07/01 19:28:38
>>458
そういうケアレスミスは置いといて^^
460:デフォルトの名無しさん
07/07/01 19:30:00
コードを見る限り問題はなさそうな気がする。
MyGet(ryの戻り値がおかしいんじゃないのか。
戻り値になるバッファをスタックに取ってるとか。
461:デフォルトの名無しさん
07/07/01 19:31:06
コピーされる文字数が1024バイトだったとかってオチだろ。
462:デフォルトの名無しさん
07/07/01 19:37:26
デバッグとしてmy_ptr表示させてみたりとか、自分でしないの?
463:デフォルトの名無しさん
07/07/01 19:41:43
そもそも、呼ぶ側で領域確保が必要な関数の場合、
最初に用意する容量を問い合わせてから領域を確保して初めて呼び出せるんだろうに。
領域サイズの確認関数が無いなら、十分なサイズを用意してあげないとダメ。
そして、サイズに満たない領域にコピーしちゃダメ。
464:デフォルトの名無しさん
07/07/01 21:38:52
bregexp.dllのラッパーライブラリ内ですか?
465:デフォルトの名無しさん
07/07/01 22:45:56
サブ関数内でmalloc()でメモリ確保した領域ってメイン関数に帰るときに解放されないの?
466:デフォルトの名無しさん
07/07/01 22:46:46
>>465
free()かrealloc()で解放しない限り、されません。
467:デフォルトの名無しさん
07/07/01 22:50:23
>>465
解放されると困らないかい?
malloc() 〜 free() の作法としては、使う人が確保と解放の責任を持つって暗黙のルールなんだけど、サービス関数の中には、確保だけして解放は使う側でやってね。なんてローカルルールもあるしな。
解放されると思い込むくらいなら、仕様確認をした方がいいよ。
468:デフォルトの名無しさん
07/07/01 22:56:05
>>465
自動変数とごっちゃになってない?
469:デフォルトの名無しさん
07/07/01 23:14:22
alloca なら開放されるな。
環境依存だが。
470:465
07/07/01 23:22:00
あざーす
471:デフォルトの名無しさん
07/07/01 23:25:21
>>464
たいした手間じゃないから自分で書いたらいいよ
472:デフォルトの名無しさん
07/07/01 23:37:38
木構造の二分探索木において
ルートの下にノードがあるとします。
その2つのノードからそれぞれ2本ずつ枝がでていて、
1本は別々のノードにつながっている。もう一本は同じノードにつながっている。
これをあらわすには数字の割り当て方はどうすべきですかね?
0
1 2
3 4 5 6
とあれば、2のleftが4をさすようにする。
5は捨てるって感じですかね?
473:デフォルトの名無しさん
07/07/01 23:43:04
よく意味が分からない。
474:デフォルトの名無しさん
07/07/01 23:47:29
データ数400の二次元配列でかつ小数点
それと木構造と組み合わせて計算とか地獄だな。。。
475:デフォルトの名無しさん
07/07/01 23:58:36
0
/\
1 2
/\ /\
3 4 5
みたいな感じにしたいのか?
476:デフォルトの名無しさん
07/07/02 00:09:47
>>475
はい、そうです。
各枝に確率をつけて、0のところを1.0と設定して
0から1、2への枝の確率をかけて1と2のノードにおいての確率をだす。
その次に1と2の下の3、4、5への枝に確率をつけて
3、4、5のノードにおいての確率を出す感じにしたいんですけど。
1つのノードに3つの確率がはいるようにしないといけないなーとは思ってます。
この計算を木でやるか配列でやるか迷ってます。
477:デフォルトの名無しさん
07/07/02 00:58:38
0
/\
1 2
/\ /\
3 4 5
/\ /\ /\
6 7 8 9
となっていくんだったら、別に配列でもいい気がするな。
配列というか、三角行列?
478:デフォルトの名無しさん
07/07/02 01:14:04
#include <stdio.h>
int main(void)
{ /*左上*/
int a,b,c;
printf("何段ですか:");
scanf("%d",&a);
for (b = 1; b <= a; b++) {
for (c = a; c >= 1; c--)
putchar('*');
putchar('\n');
}
return 0;
}
左上が直角になる三角形を作りたいのですが・・・何か四角形になります
479:デフォルトの名無しさん
07/07/02 01:18:38
>>478
for (c = a; c >= 1; c--)
↓
for (c = a; c >= b; c--)
480:デフォルトの名無しさん
07/07/02 01:25:48
>>479
できました!ありがとうございました!
481:デフォルトの名無しさん
07/07/02 03:05:47
>>456
8つのchar*が指し示している内容が分からないと何とも。
482:デフォルトの名無しさん
07/07/02 11:56:07
数人でCでプログラム開発しているのだけれど、
ソースコード中の各関数の前に、
// 関数名:
// 作者:
// 機能:
//
みたいな説明を付けたいのだけれど、どこかにカッチョいいサンプルないですか?
483:デフォルトの名無しさん
07/07/02 12:07:11
>>482
つ[doxygen]
484:デフォルトの名無しさん
07/07/02 12:53:35
>483
ありがとうございます。でも、
そういう高度なのは使いこなせそいうにないので、
具体的なサンプルを探しています。よろしく。
485:デフォルトの名無しさん
07/07/02 12:58:04
#include <stdio.h>
int main(void)
{
int a,b,c;
printf("ピラミッドを作りましょう");
printf("何段ですか:"); scanf("%d",&a);
for (b = 1; b <= a; b++) {
for (c = a; c > 1; c--)
putchar(' ');
for (c = 1; c < 2b; c++)
putchar('*');
putchar('\n');
}
return 0;
}
何が変なんですかね
486:デフォルトの名無しさん
07/07/02 12:59:39
使いこなさなくてもいいから、Doxygenスタイルで書いて置いたらいいんでね?
もし>484がロートル、コボラの気に入りそうな「枠に填まった」コメントが好きならサンプル出してもいいけど。
#コメントを書くのに手間が掛かるのなんて論外だと思うんだがね。
487:デフォルトの名無しさん
07/07/02 13:00:23
>>485
エラーメッセージくらい読め
488:2b
07/07/02 13:00:50
>>485
あんたの頭。コンパイルエラーが出たのなら、その内容くらい書くのが当然だ。
489:デフォルトの名無しさん
07/07/02 13:01:36
2b
490:デフォルトの名無しさん
07/07/02 13:03:19
>>488
これは間違いなくツンデレ
491:デフォルトの名無しさん
07/07/02 13:04:29
ついでにピラミッドにするためには c > 1 じゃなくて c > b だと思われる
492:デフォルトの名無しさん
07/07/02 13:06:36
エラー E2378 4-18.cpp 10: For文に ; がない(関数 main() )
エラー E2379 4-18.cpp 10: ステートメントにセミコロン(;)がない(関数 main() )
493:デフォルトの名無しさん
07/07/02 13:11:00
>>489
できました。
ありがとうございました
494:デフォルトの名無しさん
07/07/02 13:22:53
488をスルーするとは酷い奴だ
495:488
07/07/02 13:34:56
べ、べつに気づいてもらいたくて名前に仕込んだわけじゃないからね。
「意味のないレスするな」って言われないための予防策なんだから。
496:デフォルトの名無しさん
07/07/02 17:03:31
死ねよ
497:デフォルトの名無しさん
07/07/02 17:13:50
山岡来た
498:デフォルトの名無しさん
07/07/02 19:37:41
2から5までとか指定するのってどう書けばよかったっけ?
499:デフォルトの名無しさん
07/07/02 19:39:44
日本語を正しく書いてください
500:デフォルトの名無しさん
07/07/02 19:40:37
さすがにこれはエスパーじゃないと解読不能だな
501:デフォルトの名無しさん
07/07/02 19:42:14
for(i=2; i<=5; i++) printf("%d")
switch(n)
{
case 2:
case 3:
case 4:
case 5:
printf("2..5");
}
if(2 <= n && n <= 5) printf("2..5");
502:デフォルトの名無しさん
07/07/02 19:42:33
変数iにおいて iが2から5という条件 文書くときに
if(???)
の中身はどう書けばよいですか?
503:デフォルトの名無しさん
07/07/02 19:43:47
if (i >= 2 && i <= 5) ...
504:デフォルトの名無しさん
07/07/02 19:56:35
>>482
こういうのってめっちゃ素人くさいな。
505:デフォルトの名無しさん
07/07/02 19:58:12
しかるべきところで職につけばお前も目にすることがあるかもしれないよ
506:デフォルトの名無しさん
07/07/02 20:00:14
関数ヘッダクラスヘッダはあったほうがソース見やすい。
どうせ引数説明とか入れるんだし。
もちろブロックコメントでな。ラインコメントをいくつも並べるのはカッコワル。
507:デフォルトの名無しさん
07/07/02 20:01:54
あと、関数ヘッダコメントに、その関数名をいちいち入れてるのってカコワルイ
おまえ、それ何の意味があるんだと。
508:デフォルトの名無しさん
07/07/02 20:23:01
質問があるので宜しくお願い致します。
どうして、128バイトは1,024ビットになるのかわかりません
どういう計算をすれば、そうなるのでしょうか?
509:デフォルトの名無しさん
07/07/02 20:31:06
>>508
ほとんどの環境で1バイト=8ビット
510:デフォルトの名無しさん
07/07/02 20:36:25
>>482
そういうのがある時点でかっこ悪いよ…
511:デフォルトの名無しさん
07/07/02 20:46:27
>>509
ん〜考えても、どうして128バイトは1,024ビットになるのかわかりません
何の何階乗をすれbいいのでしょうか?
512:デフォルトの名無しさん
07/07/02 20:47:49
128 * 8 = 1024
513:デフォルトの名無しさん
07/07/02 20:47:55
8 * 128 = 1024
514:デフォルトの名無しさん
07/07/02 20:56:34
>>511
みなさんからいっぱいのレスだけども
も〜ちょっと分かりやすく書くと
128バイト×8ビット/バイト=1024ビット
515:デフォルトの名無しさん
07/07/02 20:59:17
1バイト=8ビット
ってのを知らないだけなんじゃね
516:デフォルトの名無しさん
07/07/02 21:00:23
かけ算ができないだけだろ
517:デフォルトの名無しさん
07/07/02 21:07:17
容量換算の1(M)=2^10(K)=1024(K)とかとごっちゃになっているんじゃない?
518:デフォルトの名無しさん
07/07/02 21:08:26
いちいちゴミ撒かんと気が済まんのかこのスレは・・・
519:デフォルトの名無しさん
07/07/02 21:09:32
どっちがビットでどっちがバイトだっけ?
そんな時期が私にもありました(AA略
520:デフォルトの名無しさん
07/07/02 21:16:43
そもそも1バイト=8ビットと決まってるわけじゃねーし。
厳密に8ビットというなら1オクテットと表現すべき。
521:デフォルトの名無しさん
07/07/02 21:20:50
じゃ1バイト=9bitなんていういかれた環境があるのかよ!
と思っていた時期が私にもありました
本当にあったんだね
522:511
07/07/02 21:21:02
サンクスです
ですが、どうして128 * 8 して出すのかが
納得できません。。。
523:511
07/07/02 21:21:52
なんとなくわかりました
サンクスでした
524:デフォルトの名無しさん
07/07/02 22:30:20
なんとなくかよw
じゃあ君が大好きなタコを例にして分かりやすく解説しよう。
「タコには足が8本あります。ここにタコが128匹います。全部で足は何本でしょう?」
タコ→バイト、足→ビット、に置き換えるとあら不思議。
525:デフォルトの名無しさん
07/07/02 22:34:05
128匹のタコ全部が足8本だとは限らないだろ
526:390
07/07/02 22:45:49
#include <stdio.h>
main()
{
int a;
float b;
for(a=0; a<=100; a++)
printf("セ氏温度:%d カ氏温度:%.2f\n",a ,fahrenheit(a,b));
}
int fahrenheit(int x,int y)
{
y = (float)(9/5)*x+32;
return y;
}
セ氏温度0〜100℃に対してカ氏温度を出したいのですが
出力の際、カ氏温度が0.00になってしまします。
間違っているところの指摘をお願いします。
527:デフォルトの名無しさん
07/07/02 22:46:43
例の一匹の足の1本はすでに俺は食べた
528:デフォルトの名無しさん
07/07/02 22:50:20
>>526
fahrenheit()の第2引数はint型なのにfloat型のbを渡している
fahrenheit()の戻り値の型はint型なのに%.2fを指定している
529:デフォルトの名無しさん
07/07/02 22:53:38
もうひとつ。どっちにしろint型で返すことになってるが、
y = (float)(9/5)*x+32;
は意図したのと違くなっていると思う
530:526
07/07/02 23:04:50
>>fahrenheit()の戻り値の型はint型なのに
この部分はどう直せばいいのですか?
531:デフォルトの名無しさん
07/07/02 23:08:52
戻り値をfloatに変えるとか、%dに変えるとか
532:デフォルトの名無しさん
07/07/02 23:19:45
struct abc{
char a;
}
main()
{
char b, c;
c = ((struct abc)b).a;
c = ((struct abc *)b)->a;
}
c = ((struct abc)b).a;がダメで
c = ((struct abc *)b)->a;が良い理屈を教えて下さい。
533:デフォルトの名無しさん
07/07/02 23:22:10
>>532
それって良いのか?
コンパイルは通るだろうが、実行したら間違いなくSegmentFaultだぞ
534:デフォルトの名無しさん
07/07/02 23:22:17
((struct abc *)b)->a;
は偶然うまく動くかもしれないが、よくない。
535:526
07/07/02 23:23:06
エラーで「初期化されていないローカル変数"b"が使用されます」
と出るのですがこれが原因ですか?
536:デフォルトの名無しさん
07/07/02 23:24:31
>>533
aのoffsetが0ならうまく動くだろ。
537:デフォルトの名無しさん
07/07/02 23:25:19
>>532
(struct abc *)b はbで示される何らかの値をstruct abc のポインタに変換している
で b の値はポインタか?
どっちもよろしくない
538:536
07/07/02 23:29:11
てっきり、&bかと思ってたわ・・・
539:デフォルトの名無しさん
07/07/02 23:34:58
>>535
a はfor文で値が入るが b には初期かも代入もされていない
b に値を入れろ
540:デフォルトの名無しさん
07/07/02 23:38:15
>>536
c = ((struct abc *)&b)->a;
なら、aのoffsetが0ならうまく動くかも知れん。
が、>>532はそうはなっていないので間違いなく保護違反
541:532
07/07/02 23:58:38
ほんと、すいません。
c = ((struct abc *)&b)->a;
でした。
542:535
07/07/02 23:58:55
>>539
bに値を入れたら結果が変わりませんか?
543:532
07/07/03 00:04:41
素人目にはc = ((struct abc)b).a;でも
問題ないように思えるのですが、
なにがダメなのでしょうか。
544:デフォルトの名無しさん
07/07/03 00:09:44
そう思えるから素人なんです。
545:デフォルトの名無しさん
07/07/03 00:52:50
すげえ正論だが質問の答えにはなってないな
546:デフォルトの名無しさん
07/07/03 00:55:00
>>543
何でって言われても、言語仕様でそのようなキャストは認められていないから、としか。
547:511
07/07/03 00:56:08
>>524
8~128でしょうか?
548:デフォルトの名無しさん
07/07/03 00:57:13
タコ釣りか?
549:デフォルトの名無しさん
07/07/03 00:57:38
~ ってなんだよ
550:デフォルトの名無しさん
07/07/03 00:59:48
ティルデ
551:デフォルトの名無しさん
07/07/03 01:03:41
ニョロ
552:デフォルトの名無しさん
07/07/03 01:05:08
0 1ビット
01 2ビット
010 3ビット
0101 4ビット
01010 5ビット
010101 6ビット
0101010 7ビット
01010101 1バイト
553:デフォルトの名無しさん
07/07/03 01:08:27
>>547
例題がタコだからといって、演算子までタコにするのはやめような。
554:デフォルトの名無しさん
07/07/03 01:10:35
いつか 1byte != 1octet の時代は来るのだろうかー・・・
555:デフォルトの名無しさん
07/07/03 01:11:49
ヽ (゚o゚)∫
ノ川ル
556:デフォルトの名無しさん
07/07/03 01:12:40
>>554
1byte == 1octet の時代なんて一度も来た事がないんだが。
557:デフォルトの名無しさん
07/07/03 01:21:37
まだC言語とかやってたんだ。
懐かしいなー
558:デフォルトの名無しさん
07/07/03 02:01:19
今でも、36ビットワードマシンとかでは1バイト=9ビットだね
UTF−9とかもあるし
559:デフォルトの名無しさん
07/07/03 02:04:28
UTF-9 はエイプリルフールのネタじゃなかったっけ?
560:デフォルトの名無しさん
07/07/03 07:16:54
scanfやfgetsで文字を入れて
文字列を比較する場合、どうすればいいんでしょうか?
char* str;
fgets(str,100,stdin);
if(str=="start"){
なんとかかんとか;
}
これ、うまく動かないんですが
561:デフォルトの名無しさん
07/07/03 07:18:20
strcmp
562:デフォルトの名無しさん
07/07/03 07:33:18
>>560
1. str の指す領域を確保する
2. 文字列の比較には strcmp を使う
3. 比較する文字列を "start\n" にする
563:526
07/07/03 08:27:43
#include <stdio.h>
main()
{
int a;
int b=0;
for(a=0; a<=100; a++)
printf("セ氏温度:%d カ氏温度:%d\n",a ,fahrenheit(a,b));
}
int fahrenheit(int x, int y)
{
y = (9/5)*x+32;
return y;
}
誰かこのプログラムをカ氏温度が小数点まで
出力されるように改ざんしてください;
564:デフォルトの名無しさん
07/07/03 08:29:25
>>563
double型の変数でも使えばええやん・・・
565:デフォルトの名無しさん
07/07/03 08:48:21
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct list{
char *name;
struct list* next;
};
int main(void){
struct list *head,*ume;
char *str;
head=NULL;
str=(char*)malloc(100*sizeof(char));
printf("名前を入力(endで終了)>");
fgets(str,100,stdin);
while(strcmp(str,"end\n")!=0){
ume=(struct list*)malloc(sizeof(struct list));
ume->name=str;
ume->next=head;
head=ume;
printf("名前を入力(endで終了)>");
fgets(str,100,stdin);
}
printf("%s%p\n",head->name,head);
return 0;
}
リスト構造体のテストやってみたんですが
これ実行して、taro、hanako、endと入力したら
endが表示されるんだけどどこがおかしいんですかね?
endと入力した時点でwhileから抜け出し、head->nameがendになると思えないんですが・・・
566:デフォルトの名無しさん
07/07/03 08:54:24
>>565
> head->nameがend
ume->next=head;
head=ume;
↑そりゃなるだろw
567:デフォルトの名無しさん
07/07/03 09:05:44
>>565
おかしいっていうのは、期待した動作と違うって事だろうけど
何をしたいのか分からんのに、答えられるわけ無いだろ
568:デフォルトの名無しさん
07/07/03 09:16:49
>>565
エスパー回答
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct list{
char *name;
struct list *next;
};
int main(void){
struct list *head, *ume;
char *str;
head = NULL;
str = (char *) malloc(100 * sizeof(char));
for(;;){
printf("名前を入力(endで終了)>");
fgets(str, 100, stdin);
if(strcmp(str, "end\n") == 0) break;
ume = (struct list *) malloc(sizeof(struct list));
ume->name = strdup(str);
ume->next = head;
head = ume;
}
ume=head;
while(ume!=NULL){
printf("%s", ume->name);
ume=ume->next;
}
return 0;
}
569:デフォルトの名無しさん
07/07/03 09:21:00
>565
ume->nameは常にstrを指していて、最後にendになってんだから当たり前だろ。
570:デフォルトの名無しさん
07/07/03 09:45:41
>>565
まあ大体察しはつくが・・・
「おかしい」って言う以前に、どういう動作を期待しているのかちゃんと書こうな
571:デフォルトの名無しさん
07/07/03 09:54:45
どのくらいの変数が必要なのかよくわからないときは
とりあえず多めに変数宣言用意しておいてもいい?
int i,j,k,l;
double a,b,c,d,e;
char f[1000],g[1000],e[1000];
とか・・・
変数○○は使われていませんって警告がでるけど
多くしたら実行速度下がるとかエラーでるとかこまったことがおきるとかありますか?
572:デフォルトの名無しさん
07/07/03 09:54:56
struct list{
char *name; < いっ、いいんかい?
struct list *next;
};
573:デフォルトの名無しさん
07/07/03 09:59:25
571
困ったことが起こるよ
new だといい
574:デフォルトの名無しさん
07/07/03 10:02:14
571
使ったことないけど
std::vector, std::string
がいいみたいだよ
575:デフォルトの名無しさん
07/07/03 10:08:31
C++とSTLの世界へご招待〜
576:デフォルトの名無しさん
07/07/03 10:14:18
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
577:デフォルトの名無しさん
07/07/03 10:16:25
576
C言語専用の環境使っているやつがいるか?
578:デフォルトの名無しさん
07/07/03 10:21:31
そりゃいるでしょ
579:デフォルトの名無しさん
07/07/03 10:25:00
>>571
一応ありはありだが
・万一配列のサイズを超えたときにそれをはじくようなチェックを入れておく。
・スタックにあまり大きな配列を取らない(char *f, *g, *eにして領域をmallocする)。
あたりは注意しておいたほうがいい。
速度はメモリ浪費でスワップしない限りさほど落ちない。
580:デフォルトの名無しさん
07/07/03 10:30:04
今日はじめてSTLググってみたけど、これは使うべきだな
初心者こそ使うべきだな
コーディングが楽になるな
581:デフォルトの名無しさん
07/07/03 11:45:36
charの配列の[0]から[3]の4バイトにデータがあります。
これを一つのintの変数に入れたいのですが、どうやればいいですか?
582:デフォルトの名無しさん
07/07/03 11:48:29
>>581
過去ログを読む気がないのなら、やりたいことを具体的に書け。
どんなデータをどう入れたいのか判らんことには答えようがない。
583:デフォルトの名無しさん
07/07/03 11:48:39
*(int*)配列名
584:デフォルトの名無しさん
07/07/03 11:49:50
>>583
バスエラーの可能性ががが
585:デフォルトの名無しさん
07/07/03 11:55:18
c[0]+(c[1]<<8)+(c[2]<<16)+(c[3]<<24)
586:デフォルトの名無しさん
07/07/03 11:56:39
union使うとか
587:デフォルトの名無しさん
07/07/03 11:57:53
>584
配列の0から3でもバスエラーって発生するもんなの?
588:デフォルトの名無しさん
07/07/03 12:00:28
>>587
char配列がint安全な場所に作られる保証はない。
その点ではunionの方がまし。
しかし、unionには言語仕様的に実装依存の罠が。
そういう意味では>585でいいのだがエンディアンの問題が残る。
まぁ、最近のコンパイラならどれで書いても同じようなコードを吐くしね。
589:デフォルトの名無しさん
07/07/03 12:11:23
>>588
そういやこういう場合かもしれんしな。
#include <stdio.h>
#include <stddef.h>
int main() {
struct A {
char a;
char b[4];
};
printf("%ld\n", offsetof(struct A, b));
}
590:581
07/07/03 12:30:43
>>583
一番簡潔なのですがかなり難解です。これから考えます。
>>585
一番分かり易いです。
unionの使い方に悩みましたがcharの配列と一つのintのメンバ変数を用意して
charの配列にデータを入れてintのメンバ変数でアクセスすればいいのですね。面白い。
591:デフォルトの名無しさん
07/07/03 12:36:02
GCC で試した所、
-O (最適化レベル1か、それ以上)
-funroll-loops (ループ展開最適化)
フラグを立てると >>585 みたいなコードを吐いてくれるみたいだ。
int toInt(const char* ch) {
union {
char ch[sizeof (int)];
int i;
} endian;
int i;
int shift, dshift;
int n = 0;
endian.i = 0;
shift = *endian.ch ? 0 : (sizeof (int) - 1) * CHAR_BIT;
dshift = *endian.ch ? CHAR_BIT : -CHAR_BIT;
for(i = 0; i < sizeof (int); i++) {
n |= ch[i] << shift;
shift += dshift;
}
return n;
}
592:デフォルトの名無しさん
07/07/03 14:59:59
最近、関数のメモリの場所をポインタで取得できることを知ったのですが、
これを利用してデリゲートまがいなことってできませんかね?
593:デフォルトの名無しさん
07/07/03 15:00:37
qsort() とか使ったことない?
594:デフォルトの名無しさん
07/07/03 15:41:43
int a, b;
があって両者の絶対値の大きさを比較したいとき
自乗した値を比較するのとabs()を使うのではどちらが速いのでしょう?
自乗してもintの範囲を超えないことは保証されているという前提で。
またこういったベンチマークテストはどうやって行うのでしょう?
595:デフォルトの名無しさん
07/07/03 16:02:53
数百万回〜数億回くらい実行して、速度を比較する。
596:デフォルトの名無しさん
07/07/03 16:15:19
>>594
こんなコードを書いてみる。
#include <stdio.h>
#include <stdlib.h>
int main()
{
volatile int a;
volatile int b;
for (int ic = 0; ic < 100 * 1000 * 1000; ++ic) {
#if 1
volatile int c = abs(a) > abs(b);
#else
volatile int c = a * a > b * b;
#endif
}
return 0;
}
こいつをこんな感じで実行してみる。
$ gcc foo.c -std=c99 -O3 ; time ./a
foo.c: In function `main':
foo.c:11: warning: unused variable `c'
real 0m0.734s
user 0m0.687s
sys 0m0.047s
意外にも、abs()の方が遅かった。
597:デフォルトの名無しさん
07/07/03 16:18:21
abs は条件判定が必要だからな。
598:デフォルトの名無しさん
07/07/03 16:34:10
あー、volatile宣言のお蔭で、参照回数の影響も出ちゃった。
よって一部訂正。
#if 0
int aa = a; int bb = b;
volatile int c = abs(aa) > abs(bb);
#else
int aa = a; int bb = b;
volatile int c = aa * aa > bb * bb;
#endif
今回は大勢に影響はなかったけど。
で、ついでに-Sでアセンブリ出力を眺める。二乗版はこんだけ。
movl -4(%ebp), %eax
movl -8(%ebp), %edx
imull %eax, %eax
imull %edx, %edx
cmpl %edx, %eax
setg %dl
movb %dl, -9(%ebp)
abs()版はどうしても条件分岐しないためにビット操作であれこれ捻り過ぎ。
movl -8(%ebp), %edx
movl -12(%ebp), %eax
movl %edx, %ecx
sarl $31, %ecx
xorl %ecx, %edx
subl %ecx, %edx
movl %eax, %ecx
sarl $31, %ecx
xorl %ecx, %eax
subl %ecx, %eax
cmpl %eax, %edx
setg %dl
movb %dl, -13(%ebp)
599:デフォルトの名無しさん
07/07/03 16:50:59
バイナリーサーチというものをやる場合
データが小さい順もしくは大きい順に並んでなかったらできない?
つまりめちゃくちゃなデーターがあったら一旦それをバブルソートなどで整列させないとダメってことですか?
600:デフォルトの名無しさん
07/07/03 16:51:52
そう。
601:デフォルトの名無しさん
07/07/03 16:52:21
わざわざバブルソートを選択する理由も無いけどな
602:デフォルトの名無しさん
07/07/03 16:52:46
>>599
その通りです
バブルソートである必要はありませんが…
603:デフォルトの名無しさん
07/07/03 17:00:04
バブルソート突っ込まれ過ぎワロタ
604:デフォルトの名無しさん
07/07/03 17:19:51
>>599
揃っているからこそのバイナリサーチじゃないか。
って、仕組み見たら一目瞭然だと思うが・・・・・
で、バブルソートである意味はない。
でも、ふと思ったのは、必要なものをすべて見つける必要はなくて
一つ見つければいいというのであれば、動的に必要な部分だけ
ソートしながら利用するっていう使い方もあるのかな、と思った。
レイトバインディングのように、対象要素が大きくて
ソートの初期化コストが大きかったり頻繁に要素が追加されるという状況で使えないかな?
それともそういう場合はB-Treeとかを使っておくべき?(追加のコストによるのかな?)
605:デフォルトの名無しさん
07/07/03 19:08:21
#include いろいろ
struct list{
int data;
struct list *next;
};
void showlist();
int main(void){
int indata,i,j;
struct list *head,*test;
head=NULL;
while(1){
printf("数を入力(終了は0)>");scanf("%d",&indata);
if(indata==0)
break;
test=(struct list*)malloc(sizeof(struct list));
test->data=indata;
test->next=head;
head=test;
}
showlist();
return 0;
}
void showlist(){
struct list *now;
while (now!=NULL){
printf("%d ",now->data);
now=now->next;
}
};
構造ポインタで次々入力しshowlistで表示するというのを作ったんだけど
これ実行したら、mainのreturn 0の上のshowlistがプロトタイプ宣言が無いと警告でるんですがどうしたらいいですか?
606:デフォルトの名無しさん
07/07/03 19:25:05
void showlist(void);
↑型を入れる
607:デフォルトの名無しさん
07/07/03 20:14:24
#include <stdio.h>
void inputdata(int data[],int n);
int main(void){
int x[10];
inputdata(x,10);
return 0;
}
void inputdata(int data[],int n){//inputdata関数
int i;
for(i=0;i<n;i++){
printf("Input data>");
scanf("%d",&data[i]);
}
for(i=0;i<n;i++){
printf("data[%d]=%d",i,*data[i]);
}
}
C言語について質問です
配列x[0]〜x[9]のそれぞれに値を入れて表示するというinputdata関数を作ってみたいんですが
これ動きません。どのように関数を直せばよいのでしょうか?
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5375日前に更新/185 KB
担当:undef