C言語なら俺に聞け! Part 118

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2005/12/20(火) 02:32:11
大丈夫も何も、32ビットアプリとしてコンパイルすればよいだけじゃね?
64ビットアプリにしたいのなら、それなりに修正は必要かと。
953デフォルトの名無しさん:2005/12/20(火) 05:26:45
>>951
それは K & R の時代から普通
954デフォルトの名無しさん:2005/12/20(火) 05:49:49
64 ビット環境で int が 32 ビットってところが
今までと違う所なんだよな。
今まではレジスタサイズ変わろうが、
int がレジスタサイズと同じだったから何とかなった。

まあ、ちゃんとやってる人なら
C99 になる前から intptr_t みたいなのを定義して
使ってるんだろうけど、
別の制約で使えない可能性もなきにしもあらず、か。
955デフォルトの名無しさん:2005/12/20(火) 10:07:22
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1296.txt
このプログラムに、関数を使ってノードを削除する機能を付け加えたいのですが、
どのようなプログラムを書けばいいのかわかりません。どなたか教えてください。
956デフォルトの名無しさん:2005/12/20(火) 10:39:05
ソース丸投げ乙
957デフォルトの名無しさん:2005/12/20(火) 10:44:30
面白いソースだな
勉強中の俺には参考になる
struct[0]を消すときはそこにstruct[1]を代入
struct[1]にstruct[2]を代入

for(i=0;i<入力済み構造体数li++){
構造体[i]=構造体[i+1];
}
をやればいいんじゃね?
958955:2005/12/20(火) 11:12:26
ちょっとスレ違いっぽかったですね。
学校の課題なので、宿題スレで質問することにします。
959デフォルトの名無しさん:2005/12/20(火) 14:57:53
質問です。
gmtime(3)のような関数は内部でtm構造体を作って、
その構造体へのポインタを渡していると考えてもいいんでしょうか?
960デフォルトの名無しさん:2005/12/20(火) 15:23:58
>>959
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/gmtime.3.html
>返り値は静的に確保された構造体を指しており
961デフォルトの名無しさん:2005/12/20(火) 15:27:29
>>960
ありがとうございます。見逃していました。
962デフォルトの名無しさん:2005/12/20(火) 18:20:17
volatile int a,b;
void test0(void)
{
a = b = 0;
}

をコンパイルした時、

b = 0;
a = b;

になるコンパイラって正しいんでしょうか?

b = 0;
a = 0;

になることを期待してて、bは実際には書き込んだ値と違う値が読み出される
ハードウェアで、aに0でないヘンな値が入ってるらしいとハマりました。
実装依存ってやつでしょうか…?
963デフォルトの名無しさん:2005/12/20(火) 18:24:34
>>962
=は右結合なので
b = 0;
a = b;
が正しい
964デフォルトの名無しさん:2005/12/20(火) 18:26:00
>>962
> a = b = 0;

は「a = ( b = 0 );」と言うこと。
つまり、式「b=0」の結果が代入されるのであって、

> b = 0;
> a = 0;

とは等価ではない。
a、b共に0を代入したいのなら、

> b = 0;
> a = 0;

と書くのが正解。
965デフォルトの名無しさん:2005/12/20(火) 18:46:08
ダブルポインタってどういうときに使うのですか?
966デフォルトの名無しさん:2005/12/20(火) 18:49:20
>>962
何のハード?
キモ杉
967デフォルトの名無しさん:2005/12/20(火) 18:50:01
というと
普通に使ってるじゃん

int main(int argc; char **argv)
{
}

とか

int *a[];

とか
968デフォルトの名無しさん:2005/12/20(火) 18:51:18
たぶん実際のアルゴリズムの中で使われてるところを見たいんでしょう
969デフォルトの名無しさん:2005/12/20(火) 19:08:16
多次元配列扱うときとか
970デフォルトの名無しさん:2005/12/20(火) 19:08:41
ダブルポインタなんてものはない。
ポインタを理解できていない香具師のいいわけだ。
その証拠に、「トリプルポインタは自信ないですけどダブルポインタならばっちりです」などと言い出す。
971デフォルトの名無しさん:2005/12/20(火) 19:10:06
多次元配列なんてものはない。
あるのは配列の配列だけだ。
972デフォルトの名無しさん:2005/12/20(火) 19:11:22
ポインタのポインタ?
973デフォルトの名無しさん:2005/12/20(火) 19:11:55
ダブルポインタって変数aのアドレスを指すポインタのアドレスを指すポインタのことか?
974デフォルトの名無しさん:2005/12/20(火) 19:14:12
そうらしい
975962:2005/12/20(火) 19:24:09
>>966
ハードウェアは LPC2214 という ARM7 CPU で、問題のレジスタは
Timer0 の Interrupt Register というものです。

http://www.semiconductors.philips.com/acrobat/usermanauls/UM_LPC2114_2124_2212_2214_2.pdf

この CPU に関して言えば、読み出しと書き込みで値が異なるのは
当り前にある様です。

>>964
>は「a = ( b = 0 );」と言うこと。
>つまり、式「b=0」の結果が代入されるのであって、

その通りだと思うのですが、件のコンパイラ(arm-elf-gcc 4.0.0) は
b=0 をやったあと、0 はレジスタに残ってるのに、わざわざ b を
読み出してきてその値を a に代入するということをやっていました。
volatile だとこうなる方が普通なんでしょうか。

別の言い方をすると、「「b=0」の結果」とは、右辺の 0 とは限らず、
代入後に左辺の変数を読み出すという実装も有り得るということでしょうね。
結果を使わない場合はもちろん読み出さないので、私には不自然に思えますが、
言語として仕様を満たしてない訳ではないということでしょうか。

別の CPU 用の別のコンパイラ(YCSH 4.07)で試してみると、普通に

b=0;
a=0;

というコードが出ていました。

とにかく実装依存と思うことにし、今後気をつけます。
976デフォルトの名無しさん:2005/12/20(火) 19:27:41
>>980とった方、次スレ立ててください
977デフォルトの名無しさん:2005/12/20(火) 19:35:55
質問です。
配列[5]を宣言又はnewで作成。

  中身
[0] a
[1] b
[2] c ←削除
[3] d
[4] e



[0] a
[1] b
[2] d
[3] e
[4]



[0] a
[1] b
[2] d
[3] e
[4] f ←追加
<5> g ←追加


こういう配列操作をしたいのですが、
追加時は別配列で作り直さないと駄目でしょうか?
978デフォルトの名無しさん:2005/12/20(火) 19:48:10
newで作成ってどういうこと?
979デフォルトの名無しさん:2005/12/20(火) 20:00:47
なんで、5よりも大きい配列が必要だって最初からわかっているのに、配列の大きさを5にするんだ?
配列のMAXが最初からわかっているなら、その大きさで配列を確保すればイイじゃん。
可変配列でないとダメならvectorだろ。
980デフォルトの名無しさん:2005/12/20(火) 20:02:27
>>977
もしかして:C++の話題?
981デフォルトの名無しさん:2005/12/20(火) 20:16:02
>>604 GJ!
982デフォルトの名無しさん:2005/12/20(火) 20:17:36
>>979
可変配列を作りたかったのです。
vectorって言葉は知らなかったのですが、
検索したところCStringArrayってのを使えば出来そうですね。
ありがとうございました。
983デフォルトの名無しさん:2005/12/20(火) 20:17:37
あ、>980踏んでたけどこれから帰るから誰か宜しく。
984デフォルトの名無しさん:2005/12/20(火) 20:18:56
>>979
>>982
おまえらスレタイ108回くらい読んでから出直せ。
985デフォルトの名無しさん:2005/12/20(火) 20:25:02
次です
C言語なら俺に聞け! Part 119
http://pc8.2ch.net/test/read.cgi/tech/1135077848/
986デフォルトの名無しさん:2005/12/20(火) 20:25:24
次スレ乙
C言語なら俺に聞け! Part 119
http://pc8.2ch.net/test/read.cgi/tech/1135077848/
987デフォルトの名無しさん:2005/12/20(火) 20:26:13
>>984
108回とは信心深いな。
988デフォルトの名無しさん:2005/12/20(火) 22:35:53
>>975

b = 0;
a = b;

なら aに0が入ってないとおかしい。

>「「b=0」の結果」とは、右辺の 0 とは限らず

この場合は仕様を満たしたコンパイラなら必ず0になる。
b+=0とかならともかく
989デフォルトの名無しさん:2005/12/20(火) 22:38:52
>>965
木構造への挿入・削除はポインタのポインタを使わないとやたら面倒
再帰で書いていいなら話は別だが
990デフォルトの名無しさん:2005/12/20(火) 22:54:19
>>977
realloc
991デフォルトの名無しさん:2005/12/20(火) 23:04:03
どうも馬鹿共の言うダブルポインタには (*a)[] は含まれないようですね
992デフォルトの名無しさん:2005/12/20(火) 23:05:51
>>988
『「b=0」の結果』は、bに0を代入した結果。
つまり、bの値を読み出してaに入れるのは当然だろう。

この時、bを読むと0になるかならないかは環境依存。
993デフォルトの名無しさん:2005/12/20(火) 23:08:07
>>991
っつーか、ポインタのこと理解出来てれば
「ダブルポインタ」の様な変な用語は使わんだろう。
994デフォルトの名無しさん:2005/12/20(火) 23:09:15
995デフォルトの名無しさん:2005/12/20(火) 23:10:18
次スレ乙
C言語なら俺に聞け! Part 119
http://pc8.2ch.net/test/read.cgi/tech/1135077848/
996デフォルトの名無しさん:2005/12/20(火) 23:31:31
不毛すぎる厨房どもw
997デフォルトの名無しさん:2005/12/20(火) 23:41:13
C言語のエキスパートの方はWindowsプログラミングにも強いと思って質問します。

UnicodeのウィンドウにIMEを使って文字を入力する時、
入力された文字をWM_IME_COMPOSITIONやWM_IME_CHARを使わずにWM_CHARで正確に
文字が取得できますでしょうか??
ちなみにOSはWindows2000です。XPだと取れるっぽいのですが、Windows2000だと
私の環境はだと、とれないっぽいのですが、みなさんいかがでしょうか??

スレ違いなら、他で質問します。
998デフォルトの名無しさん:2005/12/20(火) 23:42:31
すっかりスレ違いです
999デフォルトの名無しさん:2005/12/20(火) 23:43:03
1000デフォルトの名無しさん:2005/12/20(火) 23:43:35
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。