C言語なら俺に聞け( ..
[2ch|▼Menu]
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なら


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

5378日前に更新/185 KB
担当:undef