1 :
デフォルトの名無しさん:
3 :
3様:2005/05/17(火) 23:52:52
4ゲト。」いきなりですが
リスト構造を用いて,挿入整列のプログラムを作成せよ
・リスト構造は,ポインタによるリンクリストを用いること
・整列前のリスト内の各要素,整列後のリスト内の各要素を
表示するようにすること
って課題が出て、配列を使ったリスト表現を作りたいんですが
さっぱりわかりません。ヒントでいいので教えていただけませ
んか?
えっと、、配列を使ったリスト、とは?
間違えました、リスト構造の変わりに複数の配列を用いて
表現したいんです。すみませんでした。
>>4 >>1 に宿題は別スレって書いてあるだろうが。
7 にリンクが貼ってあるが、回答はもう出てる。
>>4 リスト構造と配列構造は同時に構築できないんだが。
>配列を使った
だから
リストへの挿入時にメモリを配列からアロケートするとかじゃないの
typedef type Data ;
typedef struct node {
Data data ;
struct node *pre ;
struct node *next ;
} Node ;
本来リストで処理するところを↓のような配列で処理したいのでは?
まぁ、何にしても俺は答えるつもりはないけど
#define MAX 10
Data data[MAX] ;
標準ライブラリのatoi()関数について質問です。
int atoi(char s[])
{
int i, n;
n=0;
for(i=0; s[i]>='0' && s[i]<='9'; ++i) n = 10*n+(s[i]-'0');
return n;
}
の記述で、s[i]>='0' && s[i]<='9' となっていますが、
s[i]が数字か判定するならば'0'<=s[i]<='9'でも、
配列sはchar型であるので良いと思うのですが、
なぜこのような記述をしているのでしょうか。
>>12 それ、ちゃんと動くか検証してみたか。
('0'<=s[i])<='9'
こういうことだぞ
質問の意味がよくわからん…
15 :
12:2005/05/18(水) 11:56:47
>13
数学的に考えすぎてたみたいです。
演算子の優先度をもう少しよく調べてみます。
ありがとうございました。
>14
数学のように、n,a,bが整数だからa<=n<=bでも動作するか(例)、
という事を聞きたかったんです。
>>15 13で書いたように、a<=n<=b は
a<=nの結果(0(FALSE)か0以外(TRUE))とbを
比較することになるので意味がない。
!0と書くべき、なのか
typdedef struct node;
struct node {
void *data;
node *next;
} array[10];
ほいよ、配列を使ったリスト構造
一応、メリットとしては途中の要素の削除にmemmoveを使う必要がない
それだったら素直に削除フラグでも持たせた方がいいなぁ。
削除なんざmemcpyとfreeでいい
21 :
デフォルトの名無しさん:2005/05/18(水) 23:58:52
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
>>21 除算や乗算よりはやい、と言われている
アンタがその差が生きるプログラムを書いているかどうかは別だ
23 :
デフォルトの名無しさん:2005/05/19(木) 00:16:07
マスキングで意味あるね
またビットシフトかよ
ビットシフト飽きた
そろそろ次のやつたのむ
26 :
マルチプロセス初心者:2005/05/19(木) 00:48:33
UNIX系OSにてマルチプロセスプログラミング作っております。
それで、少し問題が・・・・・
fork()を利用して複数のプロセスを同時に起動させて
pipe()を利用して子プロセスから親プロセスへ演算結果を
返すようなプログラムを組んでおります。
それをfor文で一定以上繰り返すと、fork()自体が失敗
するようになってしまいます・・・
これの原因はどこにあるのでしょう?
ex
for( i = 1 ; i <= 100 ; i++ )
{
pid[i] = fork();
if( pid[i] == -1 ) printf("error!\n");
if( pid[i] == 0 )
{
何か色々と処理させる
exit(0);
}
}
wait();
子プロセスが1個起動して終了するまで待つのは効率が悪いので
一気に複数のプロセスを起動させて全てが終わるまで待つようにしてます。
色々と調べてみたんですが、どうしても原因がわからなかったので
どなたかご存知でしたら教えてください。
最近のはフォークボム対策がされてるから、フォークできる数に制限がある。
どうしてもやりたいならカーネルを再コンパイルしたらよい。
28 :
マルチプロセス初心者:2005/05/19(木) 08:35:08
>>27 アドバイスありがとうございます。
/etc/security/limits.conf で設定されている nproc を変更してもだめなんですかね?
カーネルリビルドは全然OKなんですが、どこの項目を変更すればよいのやら・・・・
30 :
デフォルトの名無しさん:2005/05/19(木) 19:01:40
以下の2つのマクロに意味的に何か違いはありますか?
ただ好みの問題でしょうか?
do { ... } while(0) か { ... } だけかってことなんですが。
#define MACRO1() {\
var1 = foo; \
var2 = bar; \
}
#define MACRO2() \
do { \
var1 = foo; \
var2 = bar; \
} while (0)
do while() で途中からbreakで一気に抜けるコードを見たことあるなあ
gotoとかわらん気がスルガ・・・
32 :
デフォルトの名無しさん:2005/05/19(木) 19:50:05
チャットを作っています。
・リストボックスに文字列を書き込む関数
・リストボックスに書いてある文字列を取得する関数
を教えてください!!お願いします!
>>30 MACRO1 のほうは、
if (...)
MACRO1();
else
...;
と書けない。
36 :
デフォルトの名無しさん:2005/05/19(木) 20:31:47
マクロをそれ以外の何かのつもりで使おうって思想がそもそも狂ってる
return が関数だとかポインタは配列だとか言い出す痛いトーシロ
アフォの一言で斬るのみ
longjmp最高!!
38 :
デフォルトの名無しさん:2005/05/19(木) 23:53:41
double a[8];
a[0] = 0.0;
として、a[0]に0が入らないってどういうこと?
>>38 入らなかったことはどうやって確認したのですか?
42 :
デフォルトの名無しさん:2005/05/20(金) 00:55:13
int型の変数を宣言しても32bit、16bitがあると聞きました。
これを意図的にシステムに依存させずに使い分けるにはどうやって
宣言すればいいでしょうか?
if ( sizeof(int)==4 )
{}
>>44 sizeof(int)==4 だからといって 32bit とは限らない。
typedefすればいいだけの話じゃなくて?
stdint.h の
int_leastXX_t
とか
int_fastXX_t
とか
は、
C99、らしい
sizeof int が 4 なのに32ビットじゃない環境なんてあるの?
1バイトが8ビットじゃない環境のこと?
#include <limits.h>
50 :
デフォルトの名無しさん:2005/05/20(金) 08:36:04
教えてください。
C言語でBMI計算式を書きたいのです。計算式は体重÷(身長×身長)です。
ほとんど初心者なので、一番簡単な計算式でお願いします。
51 :
50:2005/05/20(金) 08:45:55
待ってみましたが回答が得られません。
この板の人間は酷すぎます。
詐欺です。
私の接続料金を返してください。
返却なき場合は警察と顧問弁護士に相談します。
>>50-51 は割り算掛け算が分からないらしい
bmi = weight / (height * height);
54 :
50:2005/05/20(金) 10:29:53
騙りではありません。
失礼な事言わないでください。
割り算掛け算ぐらいわかります。
名誉毀損です。
所轄裁判所に訴えます。
急速にスレの質が低下してまいりました
('A`)ハァ、面白いと思ってんのかね
57 :
東大宮:2005/05/20(金) 11:42:12
教えていただきたい問題があります。
下のプログラムを実行すると以下の出力が得られた。
値(1)、(2)、(3)を求めよ。
プログラム
---------------------------------------------------------------
#include<stdio.h>
int main(void){
int ai[3]={(1), (2), (3)};
int n;
for(n=0;n<5;n++)
printf("%d,%d\n", n, *(int *)(((char *)(ai+1))-n));
for(n=0;n<2;n++)
printf("%d, %d\n", n, *((short *)(&ai[sizeof(ai)/sizeof(int)-1]+n)));
}
---------------------------------------------------------------
出力結果
--------------------------------------------------------------
0, 1
1, 256
2, 65536
3, 16777216
4, 0
0, -9
1, 9
です。よろしくお願いします!
int main(int argc,char** argv)
{
float weight,height;
if(argc != 3) return 0;
weight = atof(argv[1]);
height = atof(argv[2]);
printf("BMI=%f\n", weight / (height*height) );
return 0;
}
お前ら釣られるなよ
>>50 はコピペだぞ
>>57 スレ違い
宿題スレでも逝け
習い始めの教えたがりが釣られてるだけ
62 :
デフォルトの名無しさん:2005/05/20(金) 12:26:49
>>40 書き換えてる箇所なんてないのに勝手に
変わるんです。
a[0]=0.0;とした直後は0.0が入っていて
ある行でいきなり変な値が入って・・・。
わけわからん
>>62 double a[8];
の前後に一行ずつ追加して、
int dummy1[100];
double a[8];
int dummy2[100];
で、やってみそ。
>>62 どこかで領域を破壊している。
配列・ポインタ関連の処理が怪しいとみた。
65 :
62:2005/05/20(金) 12:45:41
for(i =0; i<8; i++){
a[i] = 0.0;
}
u_int XX, YY, U_bar, V_bar;
u_int *X, *Y, *u_bar, *v_bar;
X = &XX; Y = &YY; u_bar = &U_bar; v_bar = &V_bar;
X[0] = 355; Y[0] = 435;
X[1] = 747; Y[1] = 429;
X[2] = 747; Y[2] = 453;
X[3] = 355; Y[3] = 458;
X[4] = 97; Y[4] = 281;
X[5] = 889; Y[5] = 256;
X[6] = 882; Y[6] = 326;
X[7] = 10; Y[7] = 347;
というコードにしてて、
X = &XX; Y = &YY; u_bar = &U_bar; v_bar = &V_bar;
をなくすとa[]が書き換えられなくなりました。
どういうことなんでしょうか?
> u_int XX, YY, U_bar, V_bar;
> X = &XX; Y = &YY; u_bar = &U_bar; v_bar = &V_bar;
> X[1] = 747; Y[1] = 429;
> X[2] = 747; Y[2] = 453;
> X[3] = 355; Y[3] = 458;
> X[4] = 97; Y[4] = 281;
> X[5] = 889; Y[5] = 256;
> X[6] = 882; Y[6] = 326;
> X[7] = 10; Y[7] = 347;
どこにアクセスしてるんだ?
>>64 的中の様です。
>>65 > u_int XX, YY, U_bar, V_bar;
u_int XX[256], YY[256], U_bar[256], V_bar[256];
> X = &XX; Y = &YY; u_bar = &U_bar; v_bar = &V_bar;
X = XX; Y = YY; u_bar = U_bar; v_bar = V_bar;
に直してやってみそ。
69 :
デフォルトの名無しさん:2005/05/20(金) 13:04:40
構造体struct a{int you;}A;を定義。
A *A1,*A3;
A **A2;
A2 = A1;(参照渡し)
*A3 = A2;(値を渡したい)
で,
A3->youとかやるとエラってしまいます。
DOしたらいいんでしょうか?お願いします。
>>69 warning と error 出ないか?
>>69 A *A1, *A2, *A3;
A2 = A1; //(参照渡し)
*A3 = *A2; //(値を渡したい)
>>65 typedef struct a{int you;}A;
A a;
A *a1, *a3;
A **a2;
a1 = &a;
a2 = &a1;
a3 = *a2;
/* a3->you を使う */
74 :
69:2005/05/20(金) 13:40:34
70-73ありがとうございます。
もうしばらく参考にしてがんばってみます。
半角カタカナ一文の文字数を全角と
同じように2で返すような関数
など無いですかね?
DBが半角カタカナはニバイトに変換して
しまいましてstrlenだとうまく
文字数チェックできなくて…
携帯からでスマソン
@
int i, j;
i = j = 0;
A
int i, j;
i = 0;
j = 0;
B
int i = 0, j = 0;
@ABは全部同じ実行速度でしょうか?
int main(){
char a[10] = "0x96";
char b = 0x00;
b = ((char)(a[2] - '0') << 4) ;
printf("b=%x\n",b );
b = b | (a[3] - '0');
printf("b=%x\n",b );
}
・実行結果
b=0xffffff96
文字列”0x96”から16進数の0x96に変換したいんですけど、なんかないでしょうか?
aの値は0x00〜0xffを予定しています。
いまの 「- '0'」の処理がだめなのはわかってますが、なんで実行結果に「ffffff」入るのかさっぱりわからないです。
コンパイラによります
80 :
79:2005/05/20(金) 15:57:18
>>78 bはcharじゃなくてunsigned charにしないと負になってしまいますよ
>>82 これで基礎部分ができました、ありがとうございます。
>>78 符号拡張している
strtoul を使うのが一番手っ取り早い、
isdigit と isxdigit とtoupper 等を
組み合わせて自分でやるのもそんなに手間じゃない
85 :
84:2005/05/20(金) 16:11:11
printf("%#lx\n", strtoul(a, NULL, 16)); // => 0x96
>>85 おおおおお、1関数じゃないですか。
なるほどstrtoul()ってこういう使いときに使えるのですね。
ありがとうございます。
関数の引数に const char *hoge のように const を付けているのを良く見るのですが、
この意図は何なのでしょうか?
>>87 ポインタが指してる先の内容を変えないという宣言
>>88 なるほど。
念の為に付けておくと安心ですね。
有難う御座いましたm(_ _)m
90 :
デフォルトの名無しさん:2005/05/20(金) 18:25:23
windowsXPでC言語のプログラムを作って実行する環境を作りたいのですが、
どうすればいいでしょうか?テンプレは英語のサイトばっかりで頭こんがらがってます。
ネット上の英語すら読めない頭なら諦めれ
93 :
デフォルトの名無しさん:2005/05/20(金) 18:34:09
>>86 printf("0x%lx\n", strtoul(a, NULL, 16));
としないと、値が0の際0xが表示されなかったりするので注意。
簡単な質問ですいません。
環境変数を列挙する方法を教えてください。
mainの仮引数を利用する方法と関数を利用する
方法があった気がするのですが、思い出せません。
>>93 幅4を指定したほうがスマートな気がします。
(といっても、今コンパイラも入ってない状態で値0の時の
確認もできんのですけど、、)
int main(int c, char **v, char **envp);
>>96 依存でしたか・・・。
>>97 ありがとうございます。mainの方ですね。
(これも標準ではないからあんまり載ってないのでしょうか)
ただいまいち使い方がわかりません。
for(; ; ) if (*envp) puts(*envp++);
でいいのでしょうか。インストールしたら確認してみます。
有り難うございました。
99 :
93:2005/05/20(金) 20:11:40
>>99 BCBインストールしました。
>>98は駄目ですね。なんで終了しないのか5分も悩みました・・・
for(; ; ) if (*envp) puts(*envp++); else break;
無限ループでした、、、アホだ>俺
0x00の表示は、
int i=0;long j;
char a[][5]={"0x00","0x99","0xff",NULL};
for (;i<=0xFF;i+=0x01) printf("%#04lx ", i);
for(i=0;*a[i];i++){
sscanf(a[i],"%lx",&j);
printf("strtoul:%#04lx sscanf:%#04lx \n", strtoul(a[i], NULL, 16) ,j);
}
BCBだとこれでいいみたいですけど、他の環境では駄目なんですか?
>>100 NULLは無効なポインタをあらわすために使うものだからchar配列にNULLは入れられない。
その直後のforはなぜインクリメント演算子を使わないんだ。
あと、envpのループはこうでいいだろ。
while (!*envp)
puts(*envp++);
NULL=0
>>102 たしかにそう定義されている場合もあるが、意味論としてはchar配列にNULLを入れるのはやはりおかしい。
104 :
デフォルトの名無しさん:2005/05/20(金) 22:33:48
>>100 NULL と '\0' と "" の区別ができてない奴のコードは見ればわかる
例え動いても単位は出せない
>>101 部分部分書き直して色々試した残骸が残っていたようです、、。
NULLは""に直したつもりだったのですが、・・・NULLでも動作
してて気づきませんでした。
char* a[]={"0x00","0x99","0xff",NULL};
for(i=0;a[i];i++)
こういう形から書き換えてて、混乱した結果です。
急いで投稿しようとしてミスりました(うぅ・・)
107 :
デフォルトの名無しさん:2005/05/20(金) 22:55:56
ケアレスで済むことと済まないことがある
たとえ二軍でも腐ってもプロ野球選手が打って左へ走ったりはしない
それほどのことだ
sizeof演算子って、コンパイル時に大きさが決まってないもののの
大きさも求められるの?
いやコンパイル時に決まってなきゃ無理だろ
ああ、そういう意味か。
それは可能か
112 :
93:
>>100 当方VC++6.0だが、ダメ。0x0でも0x00でもなく0000と表示される。