C言語なら俺に聞け( ..
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
Wikipedia項目リンク
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;
}
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5386日前に更新/185 KB
担当:undef