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関数を作ってみたいんですが
これ動きません。どのように関数を直せばよいのでしょうか?
608:デフォルトの名無しさん
07/07/03 20:19:42
int *data[]
609:デフォルトの名無しさん
07/07/03 20:34:33
printf("data[%d]=%d",i,*data[i]);
↓
printf("data[%d]=%d",i,data[i]);
610:デフォルトの名無しさん
07/07/03 20:55:02
2^8は65,536でしょうか?
611:デフォルトの名無しさん
07/07/03 20:58:26
それくらいぐぐれよ
URLリンク(www.google.co.jp)
612:デフォルトの名無しさん
07/07/03 21:09:46
さんkyさう
613:デフォルトの名無しさん
07/07/03 21:15:15
つーかプログラミング勉強してる奴が電卓の使い方も(その存在も?)和歌ランとは・・・
614:デフォルトの名無しさん
07/07/03 21:19:11
小学生なんだろ。
615:デフォルトの名無しさん
07/07/03 21:47:58
2^8 = 16^2 = 0xFF
616:デフォルトの名無しさん
07/07/03 21:52:29
二次元配列で構造体を使って
その中身の計算に
違う二次元配列の中身を用いないといけないんだけど
すげーキレそう
617:デフォルトの名無しさん
07/07/03 21:57:59
ゆとりは相変わらずキレやすいな。
618:デフォルトの名無しさん
07/07/03 22:03:50
トイレに行くと血が・・・ orz
619:デフォルトの名無しさん
07/07/03 22:04:52
>>618
今日あの日だろ
620:デフォルトの名無しさん
07/07/03 22:14:14
>>618
肛門様を大事に
621:デフォルトの名無しさん
07/07/03 23:25:36
cdっていう配列があったとして
&cd[0]
と
cd
は全く同じ意味ですか?
622:デフォルトの名無しさん
07/07/03 23:27:05
ほぼ同じ意味
623:デフォルトの名無しさん
07/07/03 23:27:28
>>621
「2*2」と「1*4」は同じですか?
という質問と同じです。
値も型も同じですが、意図が違います
624:デフォルトの名無しさん
07/07/03 23:27:32
cdとブルーレイくらいしか変わらない
625:デフォルトの名無しさん
07/07/03 23:28:25
sizeofの引数にしてみそ
626:デフォルトの名無しさん
07/07/03 23:47:34
void型の関数でwhileやifの途中で関数を終わらせるにはどうしたらいいでしょうか?
int型とかなら
if(x==1)
return 0;
とかやれば関数から抜け出せるけど
void型はどうやるんですか?
627:デフォルトの名無しさん
07/07/03 23:48:33
return;
628:デフォルトの名無しさん
07/07/04 00:02:09
だが、ループの途中からリターンするのはあんまり気持ちのいいもんじゃないよ。
629:デフォルトの名無しさん
07/07/04 00:05:51
そして、じゃあbreakはどうなんだ?というような宗教論争に
630:デフォルトの名無しさん
07/07/04 00:12:35
ネストされたループとか考えるとループ中のreturnはやむを得ない気がする。
631:デフォルトの名無しさん
07/07/04 01:03:33
10GBぐらいある巨大なテキストデータの中のある1行を
書き換えたいんだけどどうやればできますか。
普通にやると,また10GB書き出さないと出来ないような。
632:デフォルトの名無しさん
07/07/04 01:10:57
双方向リストに関する質問です。
URLリンク(kansai2channeler.hp.infoseek.co.jp)
双方向リストの先頭と末尾へ要素を追加する関数と、
先頭と末尾の要素を削除する関数を書いてみたのですが、
末尾要素を削除する関数 DelTail() が思うように動いてくれません。
free()する対象が悪いのではないかと推測していますが、
検討もつかないというのが実際のところです。
他の関数についてもツッコミいただければと思います。
633:デフォルトの名無しさん
07/07/04 01:11:06
>>621
int cd[10]; として、
&cd[0] の型は int* で、
cd の型は int [10] だな。
全く同じではない。
634:デフォルトの名無しさん
07/07/04 01:18:05
632
URLリンク(www.geocities.jp)
●C++編(標準ライブラリ) 第3章 list
listは双方向リストを構築したテンプレートクラスです。
635:デフォルトの名無しさん
07/07/04 01:18:07
>>631
ファイルでもメモリーでもどっちでもいいが、書き換えサイズが同じなら、読んで書いて閉じればそれで終わり。
挿入や削除ならそこでちょん切ってリスト構造で繋ぎ直す。
636:デフォルトの名無しさん
07/07/04 01:43:20
>>634
そのページのC編のほうのも参考にしてみたのですが、
できればグローバル変数を使わずに、
かつ、リスト操作関数の引数も、リストへのポインタだけにしたいのです。
逆に、関数内で作業用の変数が増えるのはあまりこだわりません。
もちろん、良識のある範囲で少ないほうがいいのですが。
637:デフォルトの名無しさん
07/07/04 01:44:58
Add系の関数の引数はデータもあるので、
増やす方は2コ(リストと要素)、減らす方は1コ、というのが正しいですね。
638:デフォルトの名無しさん
07/07/04 01:45:03
>>631
ファイルをリスト構造にする。
ところどころにダミーデータをいれておいて、そこをバッファに使う。
書き換えたい所を含んだクラスタを別のクラスタに繋ぎなおす。
別のファイルにパッチ情報として~行目はこの内容に置き換わりました、のような情報を入れてセットで扱う。
直した所から後ろをそっくり書き直す
639:デフォルトの名無しさん
07/07/04 02:11:46
fgets(hoge, 64, stdin);
みたいにしたとき、入力が64文字以上あるとどうなりますか?
63文字目までがhogeに入って後は無視されるんでしょうか?
640:デフォルトの名無しさん
07/07/04 02:14:48
63文字だけ stdin から読み込む、だけ。
後は次の読み込みがあれば、その時に読み込まれる。
641:639
07/07/04 03:07:44
では、64文字目以降の改行までを無視することはできますか?
fflush(stdin);
してしまうと、リダイレクトされてきた時に
改行以降も全て捨てられてしまうのでは?
642:デフォルトの名無しさん
07/07/04 03:16:35
hoge[62] = 0;
hoge[63] = 1;
fgets(hoge, 64, stdin);
if(hoge[63] == 0 && hoge[62] != '\n') {
scanf("%*[^\n]s");
getchar();
}
643:デフォルトの名無しさん
07/07/04 08:40:22
int *p,a;
p=&a;
ってやったら
*pはaと同じ(*p=a)になるんでしょ
でも@=&aとやらず*p=aはなんでダメなの?
644:デフォルトの名無しさん
07/07/04 08:43:50
*p==a
p==&a
645:デフォルトの名無しさん
07/07/04 08:48:28
int *p,a;
p=&a;
*p = 10;
printf("%d\n",a);
a = 20;
printf("%d\n",*p);
646:デフォルトの名無しさん
07/07/04 08:50:31
pが未初期化だとどこさしてるかわからんのに
その先に値を書き込もうとするか
647:デフォルトの名無しさん
07/07/04 12:10:01
STL勉強してるんだけど
vector<string>とかできるの?
648:デフォルトの名無しさん
07/07/04 12:10:52
スレタイ読めないの?
649:デフォルトの名無しさん
07/07/04 12:42:43
試せば分かることをわざわざ聞きにくるやつに
スレタイを正しく読むのは難しいだろ
650:デフォルトの名無しさん
07/07/04 13:05:10
試して出来ないから聞いてんじゃないの?
少しは予測しろよw
651:デフォルトの名無しさん
07/07/04 13:16:20
それは有り得ない話だ。
652:デフォルトの名無しさん
07/07/04 13:20:44
STL勉強してるんだけど
vector<vector>とかできるの?
vector<vector<int>>とか
vector<vector<vector>>
とかできるの?
653:デフォルトの名無しさん
07/07/04 13:25:34
これはひどい
654:デフォルトの名無しさん
07/07/04 13:31:33
スレタイくらい読め
655:デフォルトの名無しさん
07/07/04 13:58:39
STLはC言語では使えん
vector<vector<int> >
vector<vector<vector<int> > >
で試せ
656:デフォルトの名無しさん
07/07/04 14:34:52
つ[名前空間]
まあスレタイも読めないおばかさんは一生悩んでろ。
657:デフォルトの名無しさん
07/07/04 17:09:49
switch( uMsg )
case WM_CREATE:
test1=1;
test2=2;
break;
case WM_CREATE:
{
test1=1;
test2=2;
}
break;
case WM_CREATE:
{
test1=1;
test2=2;
}
return;
case WM_CREATE:
{
test1=1;
test2=2;
return;
}
どれ使ってもOK?
658:デフォルトの名無しさん
07/07/04 17:11:06
OK
659:デフォルトの名無しさん
07/07/04 17:11:26
{}で囲むのは途中で変数宣言したいとき。
breakとreturnは意味が違う。
660:デフォルトの名無しさん
07/07/04 17:16:09
別に変数宣言しなくても囲ってもいい
661:デフォルトの名無しさん
07/07/04 18:09:43
switch、caseに関わらず、別にスコープは好きなところで使って構わない。
662:デフォルトの名無しさん
07/07/04 18:14:36
関数内ならね。
663:デフォルトの名無しさん
07/07/04 18:16:27
>>641
fflushは入力バッファに対してどう作用するか定められていない
(出力バッファを吐き出すことだけが規定されている)ので、
このスレとしては知らないという答えになる。
664:デフォルトの名無しさん
07/07/04 18:50:24
{ }は見やすくするためにつけたけど、どこでも使ってOKなのね。
breakとreturnはよく考えるとぜんぜん意味が違う事に気づいた
なぜreturnが入ってたんだろうw
665:デフォルトの名無しさん
07/07/04 19:07:30
関数と定義するとき、プロトタイプ宣言が必要って言われてますよね?
プロトタイプ宣言って必要なんですか?
なくても動くと思うのですが・・・
666:デフォルトの名無しさん
07/07/04 19:13:08
なくても動きますし、必須でもありません。
あなたがいらないと思うなら必要ではないでしょう・
667:デフォルトの名無しさん
07/07/04 19:16:40
なくても必ず正しく動くわけじゃないぞ。
668:デフォルトの名無しさん
07/07/04 19:20:45
自前の関数を関数内で使うときじょんじょが大事になる
669:デフォルトの名無しさん
07/07/04 19:35:19
例えばいつもおなじみのstdio.hという標準入出力ライブラリのヘッダファイルには
printf関数やらfopen関数やらのプロトタイプ宣言がずらずらと並んでる
stdio.hにはプロトタイプ宣言だけが書かれてて,printf関数やfopen関数の実装はstdio.cに記述されている
ライブラリってのはヘッダファイルとソースファイルが対になっていて
ヘッダファイルに「このライブラリはこんな機能を提供しますよ~」っと目次みたいなもんを書いてるわけだ
それがプロトタイプ宣言
なんでこんなことを分けるするかってのはソースを分割して機能別にライブラリ化するため
1個だけのソースファイルでプログラミングしてる時は必要無いけど普通はプロトタイプ宣言も書いておく
main関数の前にずらずら別の関数の実装が並んでいると,どこがmainの始まりか探すのが大変なのもある
670:デフォルトの名無しさん
07/07/04 20:18:02
年と月を入力して
2007 7
sun mon tue wed thu fri sat
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
みたいな万年カレンダーを作りたいんですけど、アルゴリズムを詳しく教えてほしいです。
よろしくおねがいします。
671:デフォルトの名無しさん
07/07/04 20:19:53
あ、数字がずれてる…。
sunのnの下に1がきてmonのnのしたに2がくる感じです
672:デフォルトの名無しさん
07/07/04 20:38:15
URLリンク(kansai2channeler.hp.infoseek.co.jp)
上のプログラムは、入力した文字を逆向きにプリントしちゃうはずの
自分でゆうのもなんですが、優れものなんです。が
実行すると、何故か変な文字列が入っちゃいます><
こんな感じ↓(testと入力した場合)
URLリンク(www.uploda.org)
どなたか、原因を教えてくださいな
教えてくれた方に、僕のケツ穴差し上げます><
673:デフォルトの名無しさん
07/07/04 20:42:44
ソース見た瞬間意識が朦朧としてきた
674:デフォルトの名無しさん
07/07/04 20:49:51
>672
文字列の終端は'\n'じゃない
てめえの汚えケツ穴なんぞ誰がいるかってんだ
675:デフォルトの名無しさん
07/07/04 21:05:09
>>673
朦朧としてると、こっちから押し倒しちゃうze(はぁと
>>674
ありがちんこ☆
\0か!
676:デフォルトの名無しさん
07/07/04 21:09:59
あえて断言しよう
>>674は絶好のチャンスを失った、と。
677:デフォルトの名無しさん
07/07/04 21:12:21
>>670
#include <unistd.h>
int main(int argc, char *argv[]){return execlp("cal", "cal", argv[2], argv[1], NULL);}
678:デフォルトの名無しさん
07/07/04 21:14:37
例えば、以下のような4つの要素からなる列が複数あるものに対して、
次のような処理:
(1)1番目の要素が同一の場合、後から出現したものを採用する
(2)3番目の要素でソートする
を行いたいのですが、どのようなアルゴリズムになりますか?
例)
0010 ABC 60 70
0022 BCD 56 76
0010 EFG 85 34
0003 HIJ 70 98
↓
0010 EFG 85 34
0003 HIJ 70 98
0022 BCD 56 76
679:デフォルトの名無しさん
07/07/04 21:15:51
普通に配列につめてソートします。
680:678
07/07/04 21:50:09
>>679
普通に配列からソートする場合、
どのように(1)の条件をクリアしますか?
そこで困っています。
681:デフォルトの名無しさん
07/07/04 21:59:03
同じものが出てきたら上書きする
682:デフォルトの名無しさん
07/07/04 22:25:35
1番目の要素が同一かどうか調べて、同一なら上書きすればいい(例だと、消去してる?)
683:デフォルトの名無しさん
07/07/04 22:29:19
>>680
0000番から9999番までの箱を用意してそれぞれの箱に入れていく。
で、既に入ってる場合は入ってるものを捨てて代わりを入れる。
全部入れ終わったらソート。
無駄だらけだけど分かりやすい考え方だとこんな感じ?
684:デフォルトの名無しさん
07/07/04 22:30:50
int i, j, k, n;
for(i=n-1; i> 0; i--) {
for(j=i-1; j>=0; j--) {
if(a[j]==a[i]) {
for(k=j; k<n-1; k++) a[k] = a[k+1];
n--;
i--;
}
}
}
こんな感じで同じものを消去すりゃいいんじゃね?
685:デフォルトの名無しさん
07/07/04 22:31:14
ソートしてからの方が効率いいだろ・・・
686:デフォルトの名無しさん
07/07/04 22:34:55
>>685
ソートしちゃうとどれが先にでてきたか分からなくならない?
いや、マージソートとかならいいけど
687:デフォルトの名無しさん
07/07/04 22:38:45
>>686
そのための安定ソートだろ
入門篇ならバブルソートだろう
688:デフォルトの名無しさん
07/07/04 22:44:16
>>685
ソートは3番目の要素でするんだぞ?
689:678
07/07/04 22:45:58
>>683
それ考えたんですけど、
実際は0000000000番から9999999999番まで(10桁)あり、
番号も全部あるわけじゃないからやっぱり効率悪いですよね。
はやさも求められているんで・・・
ハッシュとか2分探索とか使うんですかね?
690:デフォルトの名無しさん
07/07/04 22:50:51
>688
一番目の要素で安定ソート
一番目の要素でのかぶりを削除
三番目の要素でソート
ってことだろ。
691:デフォルトの名無しさん
07/07/04 22:53:29
インデックス情報を付加しといて qsort という手もある。
692:デフォルトの名無しさん
07/07/04 23:05:49
標準ライブラリに無いのが難点だけど
重複してるかどうか調べるのはハッシュ使うのがいいと思う
693:デフォルトの名無しさん
07/07/04 23:08:01
インデックス用の配列mallocしてqsortが一番楽だろ
694:デフォルトの名無しさん
07/07/05 09:38:27
>>672
それどっかの入門書に載ってたぞ
695:デフォルトの名無しさん
07/07/05 15:50:14
CからつかえるフリーのXMLライブラリないですか?
696:デフォルトの名無しさん
07/07/05 15:53:13
何方か標準関数のプログラムの作り方教えてください
697:デフォルトの名無しさん
07/07/05 15:54:07
日本語でもう一度
698:デフォルトの名無しさん
07/07/05 15:55:33
>>672見たらmain内で関数宣言してるけど、これはなに?
そういう手法があるの?関数の内容よりそっちに目がいった。
こんなことしたことないけど、どうなの?
699:デフォルトの名無しさん
07/07/05 15:58:24
そりゃキミが知らないだけだろ
700:デフォルトの名無しさん
07/07/05 16:06:00
プロトタイプ宣言くらい関数内でできる。
701:デフォルトの名無しさん
07/07/05 16:41:17
次のような関数を作りました。
Vertices isMaxNoVer(Vertices R[]){
Vertices max;
int i, count=0;
max.num = 0;
max.deg = 0;
max.no = 0;
count = countVer(R);
for(i=0; i<count-1; i++){
if(max.no < R[i].no){
max = R[i];
}
}
return max;
}
この関数を、次の再帰関数を使って二度目に呼び出した時、
動作がおかしくなり、以下のようなおかしな値が入ります。
test expand 1, 8 -1073747304 134516287
更にその後2度目のtest expand 3に入る前に
セグメントエラーを起こして止まってしまいます。
これだけの情報でわかって頂けるかわかりませんが、
誰か助けてください。
702:701
07/07/05 16:42:43
void expand(Vertices R[]){
Vertices p, buf[N], Rp[N];
while(countVer(R) != 0){
p = isMaxNoVer(R);
printf("test expand 1, %d %d %d\n", p.num, p.deg, p.no);
if((countVer(Q) + p.no) > countVer(Qmax)){
syokikaVer(buf);
mataha(Q, p);
printf("test expand 2\n");
syokikaVer(buf);
ganma(buf, p.no, G);
printf("test expand 3\n");
syokikaVer(Rp);
katu(Rp, buf, R);
printf("test expand 4\n");
703:701
07/07/05 16:44:38
if(countVer(Rp) != 0){
numberSort(Rp);
expand(Rp);
}
else if(countVer(Q) > countVer(Qmax)){
copyVer(Qmax, Q);
}
hiku(p, Q);
}
else return;
hiku(p, R);
}
return;
}
QやQmax、Gはグローバル変数です。
704:デフォルトの名無しさん
07/07/05 18:03:30
>>701
それだけだと分からんなぁ~
katu(Rp, buf, R);
numberSort(Rp);
このへんの関数に問題ありそうだけど
705:デフォルトの名無しさん
07/07/05 18:29:52
質問です。
今、以下のような関数と構造体を作ったのですが、
typedef struct
{
int Length, Maximam, ValueSize;
void* Array;
} ArrayList;
char* GetValue(ArrayList* list, int index)
{
char* data = (char*)list->Array, item = malloc(list->ValueSize);
int i = 0;
unsigned int p = index * list->ValueSize;
if(list->Length > index && item != NULL) {
for(; i < list->ValueSize; i++) {
item[i] = data[p + i];
}
return item;
} else {
return NULL;
}
}
以下続く
706:デフォルトの名無しさん
07/07/05 18:33:11
item
707:705
07/07/05 18:33:11
void AddRange(ArrayList* list, const void* values, int length)
{
char* data = (char*)list->Array, item = (char*)values;
unsigned int i = 0, itemlength = length * list->Maximam, index = list->Length * list->ValueSize;
if(list->Length + length >= list->Maximam) {
list->Maximam += length * 2;
list->Array = realloc(list->Array, list->ValueSize * list->Maximam);
} for(; i < itemlength; i++) { data[index + i] = item[i]; }
list->Length += length;
}
void main (void)
{
ArrayList list = { 0, 4, sizeof(int), malloc(sizeof(int) * 4) };
int i = 0;
int s[10] = { 0, 1, 2, 3, 4, 5, 6 ,7 ,8 ,9 };
AddRange(&list, s, 10); AddRange(&list, s, 10);
for(; i < list.Length; i++) { printf("%d\n", *((int*)GetValue(&list, i))); }
}
どうしてもGetValueのchar* itemの領域が確保できないんです。
他にも、listのArrayをいじってもヒープが壊れてますとか言われるのですが…
なにかやってはいけないことでもやってしまっているのでしょうか?
行数圧縮しているため読みにくいとは思いますが、よろしくお願いします。
708:705
07/07/05 18:34:36
ちなみに、元のソースではすべて
int i = 0;
int j = 0;
のように宣言しています。
709:デフォルトの名無しさん
07/07/05 18:38:04
itemはchar型変数として宣言されてる
*itemで宣言しなきゃダメだろ
710:デフォルトの名無しさん
07/07/05 18:41:16
>>709
元ソースでは
char*になってたんですが…
削りすぎた orz
711:705
07/07/05 19:07:04
いろいろ試してみたのですが、
AddRange(&list, s, 10);を
連続でなくとも2回使用するとGetValueのitemの中がNULLに、
3回目からはAddRange(&list, s, 10);で行われるreallocで
ヒープが壊れているというエラーが出てくるようです。
何が悪いんだろ orz
712:デフォルトの名無しさん
07/07/05 19:09:20
AddRangeの2回目でヒープ壊してる
itemlengthとreallocのサイズが乖離してる
713:デフォルトの名無しさん
07/07/05 19:17:30
つーかGetValue()って範囲チェック除けば
char *GetValue(ArrayList list, int index)
{
return (char*)list.Array + index * list.ValueSize;
}
これで十分じゃね?
714:デフォルトの名無しさん
07/07/05 19:24:04
itemlength = length * list->Maximam → itemlength = length * list->ValueSize
でいけるかな?
715:デフォルトの名無しさん
07/07/05 19:29:48
>>712
itemlength = length * list->Maximam
のMaximamが原因でした。ValueSizeにするはずだったのに…
1回の使用だけだとエラーが出なかったので問題ないと思い込んで
気づかなかった orz
>>713
そんなやり方もあったんですか…
void*だとサイズわかんねぇよって怒られるのでchar*にして
コピーする方法しか知りませんでした。
>>714
全くその通りです。
まともにコードかけるようになるのは時間がかかりそうだ orz
ありがとうございました!
716:デフォルトの名無しさん
07/07/05 19:34:00
素直に型を限定すればいいのに
717:デフォルトの名無しさん
07/07/05 21:55:47
int型の数字を文字列に変換するのってどうやるん?
具体的に言うと
int n = 34;
char* nStr = intToStr( n ); /* nStr = "34" */
という風にしたいのだけれど。
718:デフォルトの名無しさん
07/07/05 22:03:14
char *buf;
int n=34;
buf=メモリ確保
ssprintf(buf,"%d",n);
719:デフォルトの名無しさん
07/07/05 22:05:12
>>717
sが一個多かった
sprintf
720:デフォルトの名無しさん
07/07/05 22:35:49
>>718
サンキュ!
inline char* int2str( int n )
{
char *buffer;
buffer = malloc( sizeof( char ) );
sprintf( buffer, "%d", n );
return buffer != NULL ?
buffer:
"FAULT!!";
}
一応こういう感じで。
721:デフォルトの名無しさん
07/07/05 22:43:17
>>720
>buffer = malloc( sizeof( char ) );
1バイトしか確保できないよ
'\0'しか格納できない
もう少し多めに確保して
>return buffer != NULL ? buffer:"FAULT!!";
buffer の確保が失敗した場合 sprintf( buffer, "%d", n ); でエラーが出る
buffer = malloc( sizeof( char ) );
if(buffer){
sprintf( buffer, "%d", n );
return buffer;
}
else {
return "FAULT!!";
}
のほうがいい気がする
722:デフォルトの名無しさん
07/07/05 22:57:49
>>721
せっかくならmallocも直してやれよw
11桁くらい確保すれば十分の気がする
723:デフォルトの名無しさん
07/07/05 23:16:28
>>720
んじゃ buffer = malloc(sizeof( char ) *12);
または buffer = malloc(12);
>>722
符号付の場合、'\0'いれると12文字になる
724:デフォルトの名無しさん
07/07/05 23:40:25
最強の関数教えてください
725:デフォルトの名無しさん
07/07/05 23:42:07
VIPでやれ
726:デフォルトの名無しさん
07/07/05 23:42:25
どう考えても main だろ。
727:デフォルトの名無しさん
07/07/05 23:43:51
>>724
abort
728:デフォルトの名無しさん
07/07/05 23:49:33
exit
729:デフォルトの名無しさん
07/07/06 01:35:39
buffer = (char*)malloc(sizeof( char ) *12);
↑これは?
730:デフォルトの名無しさん
07/07/06 01:36:56
bufferの型にあわせてあるんだろ。
C++じゃ必須の書き方だがCじゃいらん。
731:デフォルトの名無しさん
07/07/06 01:47:14
CとかC++の問題じゃねーだろ・・・知ったかの初心者がレスしてんのか、ここは?
キャスト演算子とか知ってなさそうだな・・・平気で型の違う変数をキャスト演算子なしで
代入しちゃうようなヘボプログラマーかw
732:デフォルトの名無しさん
07/07/06 01:48:12
配列の添え字に変数を指定することは可能でしょうか?
733:デフォルトの名無しさん
07/07/06 01:54:01
コンパイラが自動的にやってくれるのを当てにして失敗するプログラマー(プ
734:デフォルトの名無しさん
07/07/06 01:56:50
>>730 (・∀・)ニヤニヤ
> bufferの型にあわせてあるんだろ。
> C++じゃ必須の書き方だがCじゃいらん。
735:732
07/07/06 01:57:25
自己解決しました
可能っぽいですね
736:デフォルトの名無しさん
07/07/06 02:01:26
>>730 (・∀・)y-~~~ ヤニヤニ
737:デフォルトの名無しさん
07/07/06 02:01:26
C だと void* から別のポインタ型への変換は暗黙にできるだろ・・・常識的に考えて。
738:デフォルトの名無しさん
07/07/06 02:04:22
void*が無かった頃のCならmallocはchar*を返したから
キャストしないと警告もんだとか言い出してみる。
739:デフォルトの名無しさん
07/07/06 02:04:47
>>730 (・∀・)ニヤニヤ ヘボプログラマー必死だな
740:デフォルトの名無しさん
07/07/06 02:08:16
>>738
malloc で気を使っても、
どっかで void* 使ってたらそれだけでアウツだけどな。
その環境なら。
741:732 ◆L/nntMgEC6
07/07/06 02:11:36
>>735
可能なんですか?
742:デフォルトの名無しさん
07/07/06 02:12:01
>>730 (・∀・)ニヤニヤ あるんだろ。Cじゃいらん。
743:デフォルトの名無しさん
07/07/06 02:24:21
>>738 (・∀・)ニヤニヤ
> void*が無かった頃のCなら
744:デフォルトの名無しさん
07/07/06 02:27:29
>>732
char a[10];
int i;
でa[i]ってことですか?
もちろん可能。
添え字は整数の値をとる式ならなんでもおkだぞ。
745:デフォルトの名無しさん
07/07/06 02:29:22
>>744 (・∀・)ニヤニヤ
> 添え字は整数の値をとる式ならなんでもおkだぞ。
(VIPPERのAA略)<常識的に考えて配列の要素番号の範囲内だろ
746:デフォルトの名無しさん
07/07/06 02:33:49
アホが常駐しとるな
747:744
07/07/06 02:34:12
>>745
おまい!大丈夫か!
>>732は文法的に許されるかと質問しているんだろ!
748:デフォルトの名無しさん
07/07/06 02:34:50
よい子がC言語の勉強実況してるからみてやろうぜ
WMPのファイル→URLを開く→URLリンク(matoinu.orz.hm:30000)<)
面白いぜwwwwww
749:デフォルトの名無しさん
07/07/06 02:38:25
範囲外まで指定できちゃうのがエラーの温床になってるしな。
750:デフォルトの名無しさん
07/07/06 02:40:29
とりあえず (・∀・)ニヤニヤ を NG にした。
751:732 ◆L/nntMgEC6
07/07/06 02:42:37
>>744さん
回答有難う御座います。
int i;
char a[]="abc";
i=strlen(a);
char b[i];
のような感じで使いたいのですが、可能でしょうか?
752:デフォルトの名無しさん
07/07/06 02:44:57
>>747 (・∀・)ニヤニヤ 適切と不適切がわからないプログラマーワロスw
キャストは不要でつか~~~?
753:デフォルトの名無しさん
07/07/06 02:46:39
746 名前:デフォルトの名無しさん 投稿日:2007/07/06(金) 02:33:49
アホが常駐しとるな
(VIPPERのAA略) < 常識的に考えて知ったかぶって初心者にありもしないことを言う方がおかしいだろ
どう考えて配列を適切に参照できる、要素番号の範囲内の値をとる式ならって話ならわかるけどw
754:デフォルトの名無しさん
07/07/06 02:48:03
とりあえず (VIPPERのAA略) を NG にした
755:デフォルトの名無しさん
07/07/06 02:49:35
>>744 (^∀^) ニタニタ
> 添え字は整数の値をとる式ならなんでもおkだぞ。
整数の値をとる式ならなんでも 整数の値をとる式ならなんでも
こやつは要素数と参照できる範囲外の値をとってもおkなんだぞぉーーー!
756:デフォルトの名無しさん
07/07/06 02:50:28
>>744 m9(^д^)9m プププ、(ダブル)プギャー
757:デフォルトの名無しさん
07/07/06 02:53:33
文体変えてAA使っても、いつものアホだってことはバレバレ
758:デフォルトの名無しさん
07/07/06 02:53:52
>>754
all right, I will use AA that's not for short.
759:デフォルトの名無しさん
07/07/06 02:54:34
>>757
> いつものアホ
アホとか言っちゃってるよぉ~~~、お前がアホのくせして初心者に大嘘教えているくせにw
お前みたいな奴にアホ言われたくね~~なぁ。俺は間違ってねーし。お前は不適切。
760:デフォルトの名無しさん
07/07/06 02:56:01
VIPPER の AA 略 < 常識的に考えて、文法的におkってことを持ち出して
不十分な(というか間違っている)説明の言い訳をするかぁ?
んじゃお前は a[10] の配列の10番目を参照するときは a[10] とでもやってろよ
761:デフォルトの名無しさん
07/07/06 02:56:21
>>751
それはダメ。
配列変数の宣言文には変数は使えない。
それをするなら
nt i;
char a[]="abc";
char *b;
i=strlen(a);
b=(char*)malloc(sizeof(char)*i);
762:デフォルトの名無しさん
07/07/06 02:56:51
>>751
int i;
char a[]="abc";
char *b;
i=strlen(a);
b = (char*)malloc(sizeof(char)*i);
free(b);
スレの流れからすればこんな感じ
bにaと同じ長さの文字列を入れるなら+1しないと駄目だけど。
763:732 ◆L/nntMgEC6
07/07/06 02:58:25
>>761さん
有難う御座います。おかげで疑問が解けました。
764:デフォルトの名無しさん
07/07/06 03:00:43
| ( ●)(●) いい加減な説明をしていることを指摘されて
. | (__人__) 指摘した相手をアホとか言う方がアホだろ
| ` ⌒´ノ 常識的に考えて・・・
765:デフォルトの名無しさん
07/07/06 03:01:22
>>761
C99ならできるというのは禁句かい?
766:デフォルトの名無しさん
07/07/06 03:03:23
回答者が書く補足としては、ありだとおもう。
突っ込みとしては、ちょっと弱い。
767:デフォルトの名無しさん
07/07/06 03:04:15
/ ノ ⌒ \ 文法的にも間違っていることを言う奴が
| (●)(●) | 間違っていない奴にアホって言うアホだろ
. | (__人__) | 常識的に考えて。ちゃんとキャストしろよ
768:デフォルトの名無しさん
07/07/06 03:05:15
常考常考うるせーよ
貶し合ってないで意味のある話をしろ
769:デフォルトの名無しさん
07/07/06 03:08:42
>>763
VBだとそれができるんだよね。
それはVBなどのインタープリター言語は実行時に変数宣言文も実行文もおなじように上から処理してゆくから。
Cのようなコンパイラ言語はコンパイル時に変数宣言文を処理してゆく。
だからコンパイル時に配列変数のサイズがわかっていないと処理ができない。
JavaもVBと同じだと思う。
770:デフォルトの名無しさん
07/07/06 03:09:22
ここは初心者が鼻息を荒くして入門書読みながらレスしてるのが多くて注意が必要
771:デフォルトの名無しさん
07/07/06 03:09:45
>>765
C99ならできるの?
772:デフォルトの名無しさん
07/07/06 03:10:54
| ( ●)(●) お前みたいな奴は、たとえドラマの役者として
. | (__人__) 起用されても、まともなキャスティングもされずに
| ` ⌒´ノ 脇役かエキストラに決まってんじゃん>アホ言うたアホ
773:デフォルトの名無しさん
07/07/06 03:12:15
AA厨も早く寝ろ
今日はお開きだ
774:デフォルトの名無しさん
07/07/06 03:15:42
>>773 (・∀・)キャスキャス
775:デフォルトの名無しさん
07/07/06 03:17:05
いまさらやらない夫のAA貼り付けて喜んでんのかよw
776:デフォルトの名無しさん
07/07/06 03:27:41
>>771
余裕
777:デフォルトの名無しさん
07/07/06 03:27:46
いまさら やらない か?っつか、いまさらキャストも適切に出来ない奴が
初心者相手にいい加減な説明、笑えねぇ~~~~~。お前、指導者に向いてねーよ。
778:デフォルトの名無しさん
07/07/06 04:13:51
キャストすると型によってアドレスが変わるプロセッサの話をすると、へんなのを召喚しちゃいますか?
779:デフォルトの名無しさん
07/07/06 04:41:39
それがどうかしたのか?
printf に渡すときの話とはわけが違うぞ?
780:デフォルトの名無しさん
07/07/06 06:14:06
1バイト文字と2バイト文字が混在してる文字列を
ループ使って1バイトずつputchar()で画面に表示しても
ちゃんとどちらも表示されるのは、シェルやプロンプトの方で
何バイト文字か確認して1バイト文字じゃない時は
一度バッファに溜める、とかしてるからですか?
781:デフォルトの名無しさん
07/07/06 06:21:01
ものによるとしか
782:780
07/07/06 06:49:14
>>781
例えばどうやって処理してるんですか?
783:デフォルトの名無しさん
07/07/06 07:35:00
>>780
いいえ、シェルプログラムはそんなことはしません。
784:780
07/07/06 07:52:43
>>783
あ、コンパイラがやってくれてるんですか?
785:デフォルトの名無しさん
07/07/06 08:09:19
>>784
いいえ、勿論コンパイラの知ったこっちゃありません。
もしかしたら、画面表示はシェルプログラムがやっていると思っているんですか?
例えば他のPCにリモートログインしたときには相手先のシェルプログラムが動くわけですが、
そのシェルプログラムが自分の使っているPCの画面を直接アクセスするなんて夢でも見ているんですか?
786:デフォルトの名無しさん
07/07/06 08:23:14
>>780
マルチバイト文字などに関係なく、標準入出力は
行単位バッファリングされていることが多い。
バッファリングなしにしても、まあ正しいマルチバイト文字列になった時点で
正しく表示されると仮定していいと思う。
787:780
07/07/06 08:24:22
>>785
ということはOSの画面表示を担当するプログラムが
putchar()で2バイト文字の一部を出力しようとした時に
2バイト文字の一部だと判断し表示を一時中断して
次に送られてくるputcharの引数と組み合わせて
それに対応する2バイト文字を出力していているんでしょうか?
788:デフォルトの名無しさん
07/07/06 08:26:31
2バイト文字で、1バイト目単体で文字としてなりたっているようなのってなんかあったっけ?
789:デフォルトの名無しさん
07/07/06 08:28:46
>>788
iso-2022-jpの1バイト目はASCII文字と同じコード。
790:780
07/07/06 08:30:47
>>786
行単位でバッファリングするんですね
それで予め2バイト文字があるかないか調べるわけですか、なるほど
791:デフォルトの名無しさん
07/07/06 08:39:37
>>789
Shift_JISしか考えてなかった。参考になった
ありがとう
792:デフォルトの名無しさん
07/07/06 08:41:44
文字コードの体系もしっかり管理しときゃ良い。
793:デフォルトの名無しさん
07/07/06 09:11:21
型で区別するんじゃない?
char型ならその分のデータを受け取るまで待つ
794:デフォルトの名無しさん
07/07/06 09:18:02
ASCIIコード体系でなければ左へ受け流すぅ~
795:デフォルトの名無しさん
07/07/06 11:50:43
1: 3.2 2.6 3.4 2.1 5.2 3.4 5.2
2.4 4.2 4.1 0.2 4.2 5.3
2: 3.2 2.4 3.4 2.2 5.2 3.4 5.2
2.4 4.2 4.3 0.2 4.2 5.3
3: 3.1 2.6 3.4 2.1 6.2 3.4 5.2
2.4 4.2 4.0 0.2 4.2 5.3
っていうデータがあるとして
10個目(つまり4.3 4.1 ,4.0)だけを抜き出すプログラムをつくれといわれると
float型でやりますか?char型でやりますか?
796:デフォルトの名無しさん
07/07/06 12:26:17
「作れ」っつった本人に仕様を確認する。
797:デフォルトの名無しさん
07/07/06 13:03:17
とりあえず float は使わない。
使うなら double 。
798:デフォルトの名無しさん
07/07/06 13:51:36
つーか、計算もしないし区切りもはっきりしてるなら
文字列のままで通しちゃったほうがいいべ
799:デフォルトの名無しさん
07/07/06 14:01:23
>>793
それはない。そんなことしたら、ファイルにリダイレクトできない。
>>791
iso-2022-jpの場合、KanjiInが来た後は2バイト文字、そうでなければAsciiという分け方。
だから2バイト文字の後にKanjiOutが来ないと文字化けする。
>>790
バッファリングはするかもしれないが、出力の判断とは直接的には無縁。
でなければエスケープシーケンスでの制御ができない。
800:デフォルトの名無しさん
07/07/06 15:41:47
>>799
>KanjiInが来た後は
>KanjiOutが来ないと
そんなコード/シーケンスはありません。
801:デフォルトの名無しさん
07/07/06 18:09:25
Windows2000で作られたソフトはWindowsXPではうまく動作しないことが
あるのですか。LSI C-86を使ってC言語を学ぶという趣旨の本を5年前に
買ったのを今になって勉強しようとしてインストールしたという次第です。
最初のコマンドプロンプトがC:\>になるはずのところ、C:Documents and
Settings□□>となりエラーと表示されました。□□は、再起動時に
アカウント指定を要求され、自分の名前を入れたものです。
別な場所へインストールすればよいのですか。よろしくお願いします。
802:デフォルトの名無しさん
07/07/06 18:15:05
>>801
LSI-C86は遺物なので、特殊性を理解できていないなら使ってはいけない。
MSのVisualStudioでもgccでも、無料で手に入るほかのコンパイラを使うことをお勧めする。
803:デフォルトの名無しさん
07/07/06 18:18:59
まあコマンドプロンプトをC:\>にしたいなら、cd \ でいいけどな。
本と同じになるだけで、役には立たないだろうけど。
804:デフォルトの名無しさん
07/07/06 18:26:59
>802 responseありがとうございます。早速入手しようと思います。
805:デフォルトの名無しさん
07/07/06 18:43:58
ソーカcd¥-enterで続けられるのか。
806:デフォルトの名無しさん
07/07/06 18:59:38
>>800 の意図が気になる。
807:デフォルトの名無しさん
07/07/06 19:03:18
>>804
たぶん電子メールのレスと2ちゃんのレスは同じ意味を持ってると思うんだが、
だとしたら君が使ってるresponseはレスという意味とは違うぞ
808:デフォルトの名無しさん
07/07/06 19:06:00
>>807
URLリンク(ja.wikipedia.org)
809:デフォルトの名無しさん
07/07/06 19:37:26
nullponceというのを提案しまnce
810:723
07/07/06 19:39:17
>>729
忘れてた
811:デフォルトの名無しさん
07/07/06 19:43:03
英語版ウィキペには
Reply. Its abbreviation followed by colon (Re:) is prepended to e-mail subject lines when answering a received message
って書いてるんだよな。
まあ、スレ違いだからどうでもいいが。
812:デフォルトの名無しさん
07/07/06 20:22:37
A)入力装置に関する記述のうち,適切なものはどれか。
1 ジョイスティックは,画面上に透明なセンサを取り付けたものであり,画面に指などを押し付けて座標を指示する。
2 タブレットは,ペンのような装置と板状の装置を組み合わせた入力機器であり,ペンのような装置を押し付けて座標を指示する。
3 ディジタイザは,人間のもつ静電気を利用して指の位置を検出するポインティングデバイスであり,操作面を指して座標を指示する。
4 トラックパッドは,球の一部分が装置の上面に出ているポインティングデバイスであり,球を指で直接回転させて,その変化量で座標を指示する。
すみません、質問なのですが今上の問題がハードウエアの組み込みの
参考書の問題がわかりませんので、教えてはいただけないでしょうか?
813:デフォルトの名無しさん
07/07/06 20:25:09
>>812
2
814:デフォルトの名無しさん
07/07/06 20:26:34
1はジョイスティックの説明ではない事は明らかだから×
2は正しいと思うから○
3は知らんから知らん
4はトラックパッドじゃなくてトラックボールの説明だから×
815:デフォルトの名無しさん
07/07/06 20:29:48
ありがとうございました。
これで先に行けます。
816:デフォルトの名無しさん
07/07/06 20:32:06
制御系といえば、C言語だけど
Cのすごい所って何?
817:デフォルトの名無しさん
07/07/06 20:38:01
体にぴったり張り付くスク水の用に、ハードウェアに貼り付ける所
818:デフォルトの名無しさん
07/07/06 20:38:40
>>816
おまえの方がすごいと思う。
819:デフォルトの名無しさん
07/07/06 20:38:58
3はタッチセンサとか、タッチスクリーンとか言われている物のうちの1種だね
820:デフォルトの名無しさん
07/07/06 20:41:36
>>812
3の説明がトラックパッドっぽいな
821:デフォルトの名無しさん
07/07/06 20:42:36
C言語にできることは、C++にもできるって聞いたんだけど、
C++も体にぴったり張り付くスク水のように、
ハードウェアに貼りつけるの??
822:デフォルトの名無しさん
07/07/06 20:43:22
Cと同じようにできる。
823:デフォルトの名無しさん
07/07/06 20:44:46
C++もC言語と同じように最強ならば、
C++も制御系によく使われるの?
それともC++はオープン系(WEB系も含む)?
824:デフォルトの名無しさん
07/07/06 20:47:10
質問です。年月日を入力してツェラーの公式を利用して曜日を表示するプログラム
をつくりたいんですけど、BCCでコンパイルしたら公式のところでエラー
「浮動小数点の不正な使用」ってでるんですけど、どうしてだかわかりますかね?
#include <stdio.h>
int main(void){
int year,month,day;
char youbi[7][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int i;
printf("Year?");
scanf("%d",&year);
printf("Month?");
scanf("%d",&month);
printf("Day?");
scanf("%d",&day);
i=(year + (year/4) - (year/100) + (year/400) + (2.6*month +1.6) + day)%7;
printf("It's %s.",youbi[i]);
return 0;
}
825:デフォルトの名無しさん
07/07/06 20:49:26
>>821
C++の場合スク水フェチのオジサンが自分で着る用に作ったものもあるので注意
826:デフォルトの名無しさん
07/07/06 20:56:27
>>824
(2.6*month +1.6)を(int)(2.6*month +1.6)にしろ。
ここが整数でないから、%の左側全体が整数型でなくなっている。
剰余演算子は浮動小数点数を演算対象にできないので、件のエラーになる。
827:デフォルトの名無しさん
07/07/06 20:57:13
>>823
Cが制御系で使われるのは「最強」だからではなく「高級アセンブラ」だから。
C++も制御系で使われるよ。C++として使われるかはともかく。
つか、最強ってなんだよ。
828:デフォルトの名無しさん
07/07/06 20:58:38
>>824
剰余演算子%というオペランドは整数同士でないとダメ
演算してる行の型がごっちゃになってるから明示的にキャストしたり読みやすくすべき
基本的にコメント文とかで説明もなしに実数を整数に叩き込んだりしちゃだめ
829:デフォルトの名無しさん
07/07/06 21:19:14
なるほど。できました、ありがとうございます。
830:デフォルトの名無しさん
07/07/06 21:30:26
スレ違いかもだけど、ここの人達他のスレより頼りになりそうなので。。。
基本情報の午後問をCで受かりたいのですが、なんの本を読めばいいですか?
当方、C言語はよくわかりません。COBOLは少しできます。
ただCで受けたいのです。
831:デフォルトの名無しさん
07/07/06 21:32:10
>>830
試験は慣れたものでやるべき
832:デフォルトの名無しさん
07/07/06 21:58:20
>>830
アセンブラがオススメ
例年一番簡単
833:デフォルトの名無しさん
07/07/06 21:59:06
C言語ってeclipceかbolandか、
それともvisual basic かどれでやればいいですか?
834:デフォルトの名無しさん
07/07/06 22:04:13
その質問おもしろい?
835:デフォルトの名無しさん
07/07/06 22:10:25
visual studioだっけ?
836:デフォルトの名無しさん
07/07/06 22:12:46
>>833
Linuxでもできるよ。
837:デフォルトの名無しさん
07/07/06 22:14:19
整数型配列は
int iarray[10];
memset(iarray, 0, sizeof(array));
ですべて0で初期化できると知ったのですが、
実数型配列を
double darray[10];
memset(darray, 0.0, sizeof(array));
のように初期化してもかまいませんか?
つまり実数型配列の全ての要素を0.0にしたいのです
838:デフォルトの名無しさん
07/07/06 22:16:31
>>837
いいんじゃね?
DirectXとか、そういう方法で、実数やらポインタやらバリバリクリアしてたな。
移植性は無くなる。
839:デフォルトの名無しさん
07/07/06 22:17:55
> memset(darray, 0.0, sizeof(array));
あ、これは、警告かエラーになるな。
sizeof のところはミスだよね?
840:デフォルトの名無しさん
07/07/06 22:19:54
>>837
ANSI/ISO Cへの移植性を望むなら避けるべき。
浮動小数点数がIEEE 754に則っていることを仮定してよいなら構わない。
841:デフォルトの名無しさん
07/07/06 22:21:17
>>833
ほとんどにアルゴリズムの問題
ポケコンのCインタプリタでおk
842:デフォルトの名無しさん
07/07/06 22:26:29
>>839
あと、0.0 は 0 だな。