C言語なら俺に聞け( ..
[2ch|▼Menu]
136:デフォルトの名無しさん
08/09/20 16:43:07
>>134
お前も煽ってばかりいないで>>133のアドバイスのように
ちゃんと答えてやれ

答えられないと証拠も無いのに、と言われるだけだぞ

137:デフォルトの名無しさん
08/09/20 16:52:58
>>136==125

俺だって、ちゃんと「式文」と教えただろうが無礼者め

138:デフォルトの名無しさん
08/09/20 16:55:05
>>137
それは証拠にならない
規格書のどこに書いてあるか言ってみろ

139:デフォルトの名無しさん
08/09/20 16:56:52
その答えがわかったら、バグが減るの?

140:デフォルトの名無しさん
08/09/20 16:57:54
話を逸らすな馬鹿者

141:デフォルトの名無しさん
08/09/20 16:58:45
(・∀・)クスクス

142:デフォルトの名無しさん
08/09/20 16:59:30
a = 10, b = 10 , c++;
ってあったら文はa = 10, b = 10 , c++でおk?

143:デフォルトの名無しさん
08/09/20 17:00:46
式≠文

式文って式+セミコロンのこと?

144:デフォルトの名無しさん
08/09/20 17:06:44
>>142
厳密には「;」まで含む。

145:デフォルトの名無しさん
08/09/20 17:08:15
規格書にも書いてない造語を勝手に作って人を欺いている
バカがいると聞いて来ますた

146:デフォルトの名無しさん
08/09/20 17:09:50
↑ずっと見てたくせに(プ

147:デフォルトの名無しさん
08/09/20 17:12:07
メモリリークって自プログラムの範囲外まで影響が及ぶことはありますか?
メモリリークとは、各プログラムが確保した領域が開放されないままプログラムが終了したときに、
確保されたまま他のプログラムが使えない領域が残ることだと思い込んでいたのですが違うのでしょうか?

例えば、以下のようにしても勝手に開放されているように思えるのですが、
これはOSが面倒みてくれている、という解釈で正しいですか?

char *c;
c = (char *)malloc(1000000);
return 0; //開放せずに終了

char *c;
c = (char *)malloc(1000000);
c[1000000] = 'a'; //ここで異常終了

148:デフォルトの名無しさん
08/09/20 17:14:55
>>147
OSによる
これこそ環境依存

149:デフォルトの名無しさん
08/09/20 17:15:32
>>147
大丈夫OSが何とかしてくれる
と思ってて問題ないよ

150:デフォルトの名無しさん
08/09/20 17:17:37
>メモリリークって自プログラムの範囲外まで影響が及ぶことはありますか?
はい
>メモリリークとは、各プログラムが確保した領域が開放されないままプログラムが終了したときに、
>確保されたまま他のプログラムが使えない領域が残ることだと思い込んでいたのですが違うのでしょうか?
いいえ
>これはOSが面倒みてくれている、という解釈で正しいですか?
OSによる

151:デフォルトの名無しさん
08/09/20 17:18:00
おいおいmutex持ったまま強制終了したらOSは面倒見てくれないぞ

152:デフォルトの名無しさん
08/09/20 17:20:34
>メモリリークとは、各プログラムが確保した領域が開放されないままプログラムが終了したときに、
>確保されたまま他のプログラムが使えない領域が残ることだと思い込んでいたのですが違うのでしょうか?
はい

153:デフォルトの名無しさん
08/09/20 17:37:53
このスレは池沼の集まりか

154:デフォルトの名無しさん
08/09/20 17:38:58
そう、お前がその筆頭。

155:デフォルトの名無しさん
08/09/20 17:39:48
winとかunix系とかDOSとか、そのあたりのOSはfree()し忘れても、プロセスが終了するとメモリは開放される。

156:デフォルトの名無しさん
08/09/20 17:45:07
INT 21H, AH=31H


157:デフォルトの名無しさん
08/09/20 18:00:35
まとめると
>>147
にある状況はwindows、unix系ではOSが何とかしてくれる
でもプログラムのやりようによっては解放されないこともある(mutexとかなんとかで)
ってことで大丈夫でしょうか

158:デフォルトの名無しさん
08/09/20 18:00:56
>>148-152,155
ありがとうございます。
常駐するようなもの以外は、それほど過敏になることはないんですかね。

159:デフォルトの名無しさん
08/09/20 18:01:13
>>151
そいつはメモリリークというより、リソースリークじゃね?


閑話休題

mallocだと大体のPC環境だと後始末してくれる処理系になってるけど、
共有メモリとかでリークすると、プロセスが終了しても残ったりすることもある。

160:デフォルトの名無しさん
08/09/20 18:32:09
>>138
Cに規格書はない
もしかして規格票って言いたかったのか?

161:デフォルトの名無しさん
08/09/20 18:34:53
↑馬鹿

162:デフォルトの名無しさん
08/09/20 18:44:55
JISでは規格票が正式名称だが、ISOやANSIのものは規格書と呼んでなんら問題ない。

163:デフォルトの名無しさん
08/09/20 19:04:02
ISO や ANSI のどこに「規格書」って書いてあるんだよ? 確か英語だったはずだが・・・

164:デフォルトの名無しさん
08/09/20 19:08:24
>>121
某エディタのソースコードにあって、
文字列か文字の幅を返す関数にそのfor文が使われていました。

165:デフォルトの名無しさん
08/09/20 19:11:06
>>163
単なる和訳だろ。

166:デフォルトの名無しさん
08/09/20 19:20:07
>>164
それはない

167:デフォルトの名無しさん
08/09/20 19:20:40
>>163
英語のものを日本語で呼んではいけないのか。

168:デフォルトの名無しさん
08/09/20 19:26:05
>>167
非標準の邦訳が通じなければ説明責任はそれを言った者にある
ただし別にわかってやれたからって、こちらに利益はないので説明がしたければどうぞご勝手に

169:デフォルトの名無しさん
08/09/20 19:27:28
>>166
ちなみに
DWORD CMyEdit::GetTextWidth(LPCWSTR pstr)
{
DWORD i,n;
for(i=n=0;i<pstr[i];i++){
if(IsMB(pstr + i))n+=2;
else n++;
}
return n;
}

170:デフォルトの名無しさん
08/09/20 19:28:14
以上、馬鹿の負け惜しみでした。

171:デフォルトの名無しさん
08/09/20 19:31:09
「単」純バカのな

172:デフォルトの名無しさん
08/09/20 19:32:22
>>169
「文字列か文字の幅を返す関数」ではないな

173:デフォルトの名無しさん
08/09/20 19:37:49
>>169
i<pstr[i] じゃなくて pstr[i] になってない?

174:デフォルトの名無しさん
08/09/20 19:40:40
>>169
誰がそんな糞コード撒き散らしてんだよ

175:デフォルトの名無しさん
08/09/20 19:42:26
>>173
なってないです。
MyEditというソフトウェアのソースコードMyEditUtil.cppの493行目を見ればわかります。

176:デフォルトの名無しさん
08/09/20 19:45:03
URLリンク(sky_dreamer.at.infoseek.co.jp)

177:デフォルトの名無しさん
08/09/20 19:52:37
>>169
バグだろ。

178:デフォルトの名無しさん
08/09/20 19:54:48
ライセンスがとてつもない矛盾を呈してる件

179:デフォルトの名無しさん
08/09/20 20:06:01
エディタをダウソしてreadmeを見たら、MyEdit.chm の『使用許諾契約書』を読めって書いてあったけど、MyEdit.chmが入ってないな。
フルパッケージのほうもダウソしてみたら、やっぱりMyEdit.chm の『使用許諾契約書』を読めって書いてあるけど、使用許諾のページが開けないじゃん。

180:デフォルトの名無しさん
08/09/20 20:10:37


181:デフォルトの名無しさん
08/09/20 20:14:56
>>179
アーカイブ壊れてるんじゃね?

myedit_v116_full.zip md5 c514e4e1d2680235ab7c61bfd8aed4c0
MyEdit.chm md5 1b63a35be248d1921acd47eb06d50ef1

182:デフォルトの名無しさん
08/09/20 20:20:24
>>181
MyEdit.chmを入れ忘れてるだけじゃね?

183:デフォルトの名無しさん
08/09/20 20:21:25
>>169
grepしたら、そのメソッド、どこからも呼ばれてないみたいだから、やっぱバグだろな。

184:デフォルトの名無しさん
08/09/20 20:28:32
そろそろスレ違いな気もしてきたが。

>>183
エディタのexeの方のソースってどっかにあった?
dllの方だけだと、多分クラスライブラリのインターフェースな関数だと思うから、
grepしても引っかからないのは当たり前っぽいんだけど。

あのエディタでGetTextWidth()が使われてないかはどうにも。

が、まぁ、バグっぽいってのは同意だがねー。

185:デフォルトの名無しさん
08/09/20 20:31:52
MyMemo.exeが本体みたい。

186:デフォルトの名無しさん
08/09/20 20:34:00
>>184
本体のソースは入ってなかったのか。
そんなまじめに見てなかったよ。

187:デフォルトの名無しさん
08/09/20 23:06:15
Cでtemplate的なものをなんとか実装できませんかね?


188:デフォルトの名無しさん
08/09/20 23:07:11
>>187
マクロ

CSTL あたりを参考にどうぞ

189:デフォルトの名無しさん
08/09/21 00:30:45
すいません、初歩的な質問なのですが・・・

割り算で

7÷32 の余りは 0 なんですか?

てっきり、余りは7だと思ってたんですが・・・

190:デフォルトの名無しさん
08/09/21 00:32:32
7 / 32
7 % 32

191:デフォルトの名無しさん
08/09/21 00:33:37
商が0で余りが7

192:デフォルトの名無しさん
08/09/21 00:33:41
>>189
数学の質問(算数か?)は専門スレへ

C言語の話なら割り算とあまりの計算のそれぞれで使う記号は何を使ってます?

193:デフォルトの名無しさん
08/09/21 00:50:01
C言語です。
商なら7/32、余りなら7%32 でプログラム組んでみたのですが…

プログラム
printf("i=%dのとき i/32=%d…%d 余り/8=%d \n",i,i/32,i%32,(i%32)/8);

これを出力すると
i=0のとき i/32=0…0 余り/8=0
i=1のとき i/32=0…1 余り/8=0
i=2のとき i/32=0…2 余り/8=0
i=3のとき i/32=0…3 余り/8=0
i=4のとき i/32=0…4 余り/8=0
i=5のとき i/32=0…5 余り/8=0
i=6のとき i/32=0…6 余り/8=0
i=7のとき i/32=0…7 余り/8=0
i=8のとき i/32=0…8 余り/8=1
i=9のとき i/32=0…9 余り/8=1
i=10のとき i/32=0…10 余り/8=1
i=11のとき i/32=0…11 余り/8=1
i=12のとき i/32=0…12 余り/8=1
i=13のとき i/32=0…13 余り/8=1
i=14のとき i/32=0…14 余り/8=1
i=15のとき i/32=0…15 余り/8=1
i=16のとき i/32=0…16 余り/8=2


となってしまいまして…(@@;

194:デフォルトの名無しさん
08/09/21 00:54:51
>>193
算数はできますか?

195:デフォルトの名無しさん
08/09/21 00:59:20
>>193
それでいいと思うけど、どうなるはずだと思ってるの?

196:デフォルトの名無しさん
08/09/21 01:00:10
算数についての認識が間違ってるなw

その処理はなんらおかしくないw

197:デフォルトの名無しさん
08/09/21 01:06:25
余りを8で割って何がしたいんだ?

198:193
08/09/21 01:08:43
ごめんなさい!あほでした
普通に合っていますね…。

商/ と 余% をごっちゃにしていました…。
しょうもない質問してすいませんでした!(*_*)

199:デフォルトの名無しさん
08/09/21 01:15:51
夜は冷えるね。

200:デフォルトの名無しさん
08/09/21 01:30:36
>>198
配列までしか知らない俺も心配になる。大丈夫か?

201:デフォルトの名無しさん
08/09/21 01:35:20
あんまり馬鹿にするなよ
勘違いなんて誰にでもあるだろう

202:デフォルトの名無しさん
08/09/21 01:38:04
>>201
まーな

|| と && と != を使った条件判断ってあまりくまないから
時々テストの段階で思ったように動かなくて後で気がつくってことはある。

203:デフォルトの名無しさん
08/09/21 01:43:56
条件分岐で&&はかなり使うな
&と混ぜて使うと少し紛らわしい

204:デフォルトの名無しさん
08/09/21 03:06:33
C++!C++!C++!C++ぅぅうううわぁああああああああああああああああああああああん!!!
あぁああああ…ああ…あっあっー!あぁああああああ!!!C++C++C++ぅううぁわぁああああ!!!
あぁクンカクンカ!クンカクンカ!スーハースーハー!スーハースーハー!いい匂いだなぁ…くんくん
んはぁっ!C++様の桃色ブロンドの髪をクンカクンカしたいお!クンカクンカ!あぁあ!!
間違えた!モフモフしたいお!モフモフ!モフモフ!髪髪モフモフ!カリカリモフモフ…きゅんきゅんきゅい!!
小説12巻のC++様かわいかったよぅ!!あぁぁああ…あああ…あっあぁああああ!!ふぁぁあああんんっ!!
アニメ2期放送されて良かったねC++様!あぁあああああ!かわいい!C++様!かわいい!あっああぁああ!
コミック2巻も発売されて嬉し…いやぁああああああ!!!にゃああああああああん!!ぎゃああああああああ!!
ぐあああああああああああ!!!コミックなんて現実じゃない!!!!あ…小説もアニメもよく考えたら…
C + + 様 は 現実 じ ゃ な い?にゃあああああああああああああん!!うぁああああああああああ!!
そんなぁああああああ!!いやぁぁぁあああああああああ!!はぁああああああん!!ベル研究所ぉおおおお!!
この!ちきしょー!やめてやる!!現実なんかやめ…て…え!?見…てる?表紙絵のC++様が僕を見てる?
表紙絵のC++様が僕を見てるぞ!C++様が僕を見てるぞ!挿絵のC++様が僕を見てるぞ!!
アニメのC++様が僕に話しかけてるぞ!!!よかった…世の中まだまだ捨てたモンじゃないんだねっ!
いやっほぉおおおおおおお!!!僕にはC++様がいる!!やったよケティ!!ひとりでできるもん!!!
あ、コミックのC++様ああああああああああああああん!!いやぁあああああああああああああああ!!!!
あっあんああっああんあAda様ぁあ!!シ、Cー!!C#ぅうううううう!!!C++0xぅううう!!
ううっうぅうう!!俺の想いよC++へ届け!!ベル研究所のC++へ届け!

205:デフォルトの名無しさん
08/09/21 10:44:56
C++のアニメ2期って興味あるなwww

206:デフォルトの名無しさん
08/09/21 12:28:44
↓これは、何をする関数ですか?

#include <string.h>
void manko( unsigned long la ,char* str )
{
unsigned long msk = 0x80000000;

for( int i = 31; i >= 0; --i )
{
*(str + 31 - i) = ( msk & la ) ? '1' : '0';
msk >>= 1;
}
*(str + 32) = '\0';
}

207:デフォルトの名無しさん
08/09/21 12:40:30
>>206
関数の名前を見た瞬間に読む気をなくした

208:デフォルトの名無しさん
08/09/21 13:02:47
la に 1, 2, 3, …って入れていって実行してみればいいんじゃないかな

209:デフォルトの名無しさん
08/09/21 13:19:14
#include <stdio.h>
#include <string.h>
void main( void )
{
unsigned long msk = 0x80000000;
unsigned long la = 0x84218421;
unsigned char strings[33];
unsigned char* str;
int i,j;

str = &strings;
j = 0;
for( i = 31; i >= 0; --i )
{
*(str + 31 - i) = ( msk & la ) ? '1' : '0';
printf("%c", *(str + 31 - i) );
msk >>= 1;
if( j >= 3 )
{
printf(" ");
j = 0;
} else {
j++;
}
}
*(str + 32) = '\0';
}

210:209
08/09/21 13:19:57
受け取るデータを関数内でダミー定義するとかして実行すべし。
メモリ見れる環境なら直接見る、見れないならprintfで出してみる。
ま、結論いっちゃうと、"la"で貰った値をビット毎に評価して、真なら"1"を、偽なら"0"を
"str" に書き込んでる。
実行してみるとわかるが、"la" のどのビットが立ってるかがわかる、ということ。

211:デフォルトの名無しさん
08/09/21 15:28:03
実行してみなきゃわからんのか

212:デフォルトの名無しさん
08/09/21 15:56:26
int x;
のようなローカル変数があったとして
そのような変数の宣言は定義を兼ねますので、
口頭で説明する場合はどちらの用語を使用するのが適切でしょうか?
あと上記のような宣言(定義)は初期値が不明ですので、このような宣言(定義)の
特別な呼び方などありましたら教えてください。

213:デフォルトの名無しさん
08/09/21 16:14:56
ローカル変数の宣言と定義が分離することはありえないのでどう呼んでも誤解はないはずだが
強いて言えば宣言だと思う

あとは単に「初期化されていない」で十分

214:デフォルトの名無しさん
08/09/21 16:54:19
>>212
C言語なら、定義の場合は定義と言っとけば大体問題ない。
あと、宣言が定義を兼ねてるのではなく、
ある種の宣言を特別に定義と呼ぶだけなので、
宣言と言ったところで別に問題ないと思う。

ていうか、どっちが適切かなんか文脈次第だろがよ。
漠然と聞かれても「どっちでも良い」としか言いようない。

215:デフォルトの名無しさん
08/09/21 17:42:40
つまり、宣言と定義は混同してよいのだな?

216:デフォルトの名無しさん
08/09/21 17:57:46
>>215
帰れよ

217:デフォルトの名無しさん
08/09/21 18:05:17
答えられない低脳はすっこんでろ

218:デフォルトの名無しさん
08/09/21 18:08:15
sageずに煽るのはいつもの俺言語な変な子
みんな知ってるね

219:デフォルトの名無しさん
08/09/21 18:08:58
>>217
C言語どころか日本語の通じないかたはお帰りください

220:デフォルトの名無しさん
08/09/21 18:14:23
>>219
どの日本語が通じなかったんだ?

221:デフォルトの名無しさん
08/09/21 18:22:32
>220
日本語を理解できることは、このスレで議論する論客として最低限の資格だ
質問する気にしても、人にものを尋ねるときの態度がまるでなっておらず、質問者として最低限の資格もおまえは備えていない

繰り返すがチンパンジーには無理な問題だ
あきらめて帰れ


222:デフォルトの名無しさん
08/09/21 18:23:02
>>221
自己分析がよくできてるね

223:デフォルトの名無しさん
08/09/21 18:24:21
>>221
そんなに悔しかったのか、よかったな

224:デフォルトの名無しさん
08/09/21 18:32:47
結構熱いな、ここw

225:デフォルトの名無しさん
08/09/21 18:45:10
>>215>>220
>どの日本語が通じなかったんだ?
どの、というより全体的に意味の取り方がおかしいと思われる。

どこをどう取ったら「宣言と定義は混同してよい」という結論になるんだ?
日本語が理解出来て無いとしか思えない。

226:デフォルトの名無しさん
08/09/21 19:21:16
すみません。C言語の文法書2冊とWinAPIの本を2冊読みました。そこで
以前から私が作りたかった、ショートカット作成プログラムをぜひとも作りたいのです。

でも、やり方とかMSDNを調べてもわかりません。具体的に手順を書かせていただきますと。

1.コンソールアプリから2つフォルダのフルパスを入力する。
2.WindowsAPIで書いたショートカット作成関数を呼び出してお互いのフォルダにお互いのフォルダの
ショートカットを作成する。

そこで、ショートカット作成のWindows32APIのMSDNの調べ方もしくは
関数そのものを教えて欲しいのです。すみませんが、教えてください。よろしくお願いします。

227:デフォルトの名無しさん
08/09/21 19:23:11
win32APIはここで聞けば?
スレリンク(tech板)

228:226
08/09/21 19:27:27
>>227
どうもありがとうございます。そちらに移動させていただきます。

229:デフォルトの名無しさん
08/09/21 21:28:19
>>225
で、定義と宣言は混同しても文脈次第でどっちでも良いのか、悪いのか?

230:デフォルトの名無しさん
08/09/21 21:29:07
>>226
せっかくだからジャンクションを作ってみてはどうだ?

231:デフォルトの名無しさん
08/09/21 23:14:08
>>229
混同はしてはいけないけど、定義も宣言であるから、
文脈によってはどちらを使っても正しい表現になる場合もある。

どちらを使っても良い場合があるという事から、すなわち混同してよいと解釈したわけ?
やっぱり日本語が理解出来て無いようだね。

232:デフォルトの名無しさん
08/09/21 23:26:46
/*
* A function is only defined if its body is given
* so this is a declaration but not a definition
*/

int func_dec(void);

/*
* Because this function has a body, it is also
* a definition.
* Any variables declared inside will be definitions,
* unless the keyword 'extern' is used.
* Don't use 'extern' until you understand it!
*/

int def_func(void){
float f_var; /* a definition */
int counter; /* another definition */
int rand_num(void); /* declare (but not define) another function */

return(0);
}


233:232
08/09/21 23:42:20
宣言(declaration)は使用を宣言(declare)すること
定義(definition)は変数やマクロや関数のボディを定義(define)すること

ではあるまいか?

234:デフォルトの名無しさん
08/09/21 23:43:45
だから場合によってはひとつで両方兼ねてたりするだろ?

235:デフォルトの名無しさん
08/09/22 00:13:30
Cの用語としては、もうちょっとちゃんと記述されていて、
JISより抜粋。

>識別子の定義(definition)とは、宣言のうち次のものをいう。
>・オブジェクトに対しては、そのオブジェクトの領域を確保する宣言
>・関数に対しては、関数本体を含む宣言
>・列挙定数または型定義名に対しては、その識別子の(唯一の)宣言

余談だけど、C++だとまたもうちょっと違う。

236:デフォルトの名無しさん
08/09/22 08:50:57
(func1) register キーワードのついた別々の変数を用いる
(func2) a, b を array[0], array[1] に置き換えた以外は func1 と同じ
このような時,func1 と func2 の振る舞いは変わりますか?

int func1(void)
{
 register int a, b;

 何か a, b をたくさん使う処理
}
int func2(void)
{
 register int array[2];

 何か array[0], array[1] をたくさん使う処理
}

237:デフォルトの名無しさん
08/09/22 10:37:59
>>236
振舞いは変わらない。それで変わったら困るでしょ。
func2の方は最適化が阻害されて遅くなるコンパイラとかあるかもね。


238:デフォルトの名無しさん
08/09/22 16:16:39
>>231
やっと少しお勉強してきたようだな
たったそれだけのために何時間かかってるんだよ ぼけ

文脈によってはなんて逃げてないで、どういう場合かはっきりしろ
現状、その逃げによって意味をなしていない

>ある種の宣言を特別に定義と呼ぶだけなので、
>宣言と言ったところで別に問題ないと思う。

239:デフォルトの名無しさん
08/09/22 16:38:50 BE:417694526-2BP(0)
× はっきりしろ
○ 教えてくださいお願いします

240:デフォルトの名無しさん
08/09/22 16:52:09
>238
お帰りください

241:デフォルトの名無しさん
08/09/22 16:53:00
>>240
お前が帰れカス

242:デフォルトの名無しさん
08/09/22 16:56:21
>たったそれだけのために何時間かかってるんだよ
これはひどい

>>238
お前さんこそそんな支離滅裂なレスを考えるのに17時間もかけたのかい

てなことになるな

243:デフォルトの名無しさん
08/09/22 17:09:28
>>236
registerストレージクラスをどう解釈するかは処理系依存なのでなんともいえません。

244:デフォルトの名無しさん
08/09/22 17:45:22
>>243
くわしく

245:デフォルトの名無しさん
08/09/22 17:58:35
疑問に思ったら、自分の使ってるコンパイラでアセンブラ出力してみるのがいいよ。

246:デフォルトの名無しさん
08/09/22 18:20:18
foo bar[row][col];
bar[r][c] = hoge;

↑これって

foo bar[row * col];
bar[r * col + c] = hoge;

に等しいのか、それとも

foo (bar[col])[row];
(bar[row])[col] = hoge;

なのか、どっちなんでしょう?

あと下のbarにsizeofするとsizeof(foo) * row * colに等しくなります
下のやつはbar[col]へのポインタの配列だから sizeof(foo*) * rowになると思うのですがなぜこうならないんでしょうか?

247:デフォルトの名無しさん
08/09/22 18:22:03
>>244
詳しくも何も、規格票には「アクセスを可能な限り高速にすることを示唆する」とかなんかしか書いてなくて、
レジスタに割り当てろとも、アクセスを高速にしろとも要求されていない。

248:デフォルトの名無しさん
08/09/22 18:26:58
>>242
即レスがトレードマークな常駐野郎にしては遅かったから変だと思ったんだよ

249:デフォルトの名無しさん
08/09/22 18:28:54
>>246
配列はポインタではない。キミは何かを勘違いしてる。

次の3つは等しい:
foo bar[row][col];

int (bar[row])[col];

typedef foo foos[col];
foos bar[row];

これは縦と横が反対になっている:
foo (bar[col])[row];

これは明らかに違う:
foo bar[row * col];

250:249
08/09/22 18:30:23
>>249
書き間違えた

× int (bar[row])[col];
○ foo (bar[row])[col];

251:デフォルトの名無しさん
08/09/22 18:35:30
>>246
>下のやつはbar[col]へのポインタの配列だから

違うよ
foo (bar[col])[row] は foo[row] が col 個の配列
つまり foo bar[col][row] と同じ

foo[col] へのポインタ row 個の配列が欲しければ
foo (*bar[row])[col]
と書くけど、普通使わないと思うよ

foo へのポインタを row 個持つ配列
foo *bar[row]
の方がよく使う

252:デフォルトの名無しさん
08/09/22 18:40:17
>>247
今はregister付けても大体無視されるよな

253:デフォルトの名無しさん
08/09/22 20:02:14
>>247
いやそうじゃなくて、それで函数の振る舞いまで変わるの?

254:デフォルトの名無しさん
08/09/22 20:06:25
>>252
「無視されます」とかドキュメントに明記してあったりな。

それでも C ではまだ & 付けれないという差があるが、
C++ では & 付けれるようになったんだよな。

255:デフォルトの名無しさん
08/09/22 20:12:51
>>253
変わるわけない
>>243が質問の内容を勘違いしてるだけ

256:デフォルトの名無しさん
08/09/22 20:25:01
そもそも「振る舞い」って何なの?

関数の結果ことなのか、CPUが演算する内容なのか。

257:デフォルトの名無しさん
08/09/22 20:55:38
>>253
未定義動作だから何が起こっても不思議じゃないだろ。


258:デフォルトの名無しさん
08/09/22 21:00:28
>>257
処理系定義と未定義動作は別です。
register変数がどう解釈されるかは処理系定義です。

259:デフォルトの名無しさん
08/09/22 21:06:07
>>257
register付けたら未定義動作ってどんな罠だよww

260:デフォルトの名無しさん
08/09/22 21:13:54
>>258
register付きの配列にsizeof以外の演算子が使えることは保証されていない。


261:デフォルトの名無しさん
08/09/22 21:34:53
C99なら(ry

262:デフォルトの名無しさん
08/09/22 22:00:47
>>260
なるほどね
でもそれだったら「処理系依存なのでなんともいえない」じゃなくて
「未定義だから結果は予想できない」が正しい答えだね

263:デフォルトの名無しさん
08/09/22 22:02:12
何がなんでもケチつけたいんだね

264:デフォルトの名無しさん
08/09/22 22:05:31
要するにコンパイラの解釈うんぬんは関係なくて「配列にregisterつけんなボケェ」でFA?

265:デフォルトの名無しさん
08/09/22 22:07:08
こまかいことにこだわるのがプログラマー

266:デフォルトの名無しさん
08/09/22 22:08:51
>>264
「入門篇で聞くなボケェ」だと思われ

267:デフォルトの名無しさん
08/09/22 22:13:08
入門じゃ無い方のCスレ、どっか行っちゃったからなぁ

268:デフォルトの名無しさん
08/09/22 22:22:07
【初心者お断り】ガチ規格準拠C専用スレ Part133
スレリンク(tech板)

269:デフォルトの名無しさん
08/09/22 22:22:24
>>260
そうなんですか!知りませんでした
どうもありがとうぐございます

270:デフォルトの名無しさん
08/09/22 22:37:22
コンパイラで最適化してくれるから、registerは使わなくてもいい

271:デフォルトの名無しさん
08/09/22 22:51:15
>>270
馬鹿は黙ってろ

272:デフォルトの名無しさん
08/09/22 23:02:44
registerは最適化が進んでいなかった大昔のコンパイラの名残だよ
人間の体でいったら盲腸のようなもの

組み込み系用のマイナーなコンパイラを使っているんなら別だが

273:デフォルトの名無しさん
08/09/22 23:14:46

( ・∀・)  (´・ω・ ≡ ・ω・`)  (・∀・ )

274:デフォルトの名無しさん
08/09/22 23:33:46
いざ、それを使う期に及んではマイナーかメジャーかって問題じゃあんめえ

275:デフォルトの名無しさん
08/09/23 01:31:14
入門者が使う必要は無い
でいいでしょ

276:デフォルトの名無しさん
08/09/23 05:59:28
知識が昭和世代の古い人がいるみたいだね。

277:デフォルトの名無しさん
08/09/23 06:49:20
入門者が使う必要のない機能はない
そいつが入門者を卒業するためにはできることからやってみるのみ

278:デフォルトの名無しさん
08/09/23 07:17:40
C99における可変引数マクロの、##の文字列連結についてお伺いします。
環境はGCCです。

#define a(fmt, ...) fprintf(stderr, "%s():: " fmt, __func__, __VA_ARGS__)
#define b(fmt, ...) fprintf(stderr, "%s():: " fmt, __func__, ## __VA_ARGS__)

a("x=%d", x);と書いたときは、「fmt」が「"x=%d"」、「...」と「__VA_ARGS__」が「x」に対応するので、
fprintf(stderr, "%s()::" "x=%d", __func__, x); と置換されますが、
a("x")と、引数を1つだけしか書かなかった場合には、
fprintf(stderr, "%s()::" "x", __func__, );
とfprintfの引数リストがカンマで終わってしまいコンパイルエラーになります。

そこで、b(fmt, ...)のように##演算子を使うと、問題のカンマが取り除かれるらしいのです。
##は「パラメータ置換後に、両側の空白文字とともに各##も削除されて、
隣接するトークンが連結され、新しいトークンが形成される」、と
K&R第2版で書いてあるのですが、カンマも取り除かれるようになったのでしょうか?
それとも、これはGCCで通じる特別なものなのでしょうか?

長くなりましたが、よろしくおねがいします。

279:デフォルトの名無しさん
08/09/23 13:30:25
__VA_ARGS__でぐぐれ

280:デフォルトの名無しさん
08/09/23 15:41:46
intなどの値をcharのような1byte区切りの配列として扱うには
キャストを使うことができるでしょうか?
実際にやりたいのは
色々なデータのサイズをネットワークバイトオーダーに変えてから
0のバイトを省略して送りたいのです
例えば

00 ab 00 cd

ならば

ab 00 cd

としたいのです
宜しくお願いします

281:デフォルトの名無しさん
08/09/23 15:45:03
int a
に対して
((char *)&a)[1]
とかやればいい

282:デフォルトの名無しさん
08/09/23 15:56:09
char a = (char)(x >> 24)
char b = (char)(x >> 16)
char c = (char)(x >> 8)
char d = (char)x

283:デフォルトの名無しさん
08/09/23 15:57:39
シフトするならシフト幅はCHAR_BITから計算したほうがいい。

284:デフォルトの名無しさん
08/09/23 15:59:04
つhtonl

285:デフォルトの名無しさん
08/09/23 16:15:15
>>278
GCCの拡張です。
URLリンク(gcc.gnu.org)

286:デフォルトの名無しさん
08/09/23 16:35:06
>>280
>>281のようにポインタ使うのでもいいし何度も宣言するようなら共用体使うとか

287:デフォルトの名無しさん
08/09/23 17:08:55
宿題臭がする

288:デフォルトの名無しさん
08/09/23 17:13:39
00を取ったら可変長になるわけだけど、プロトコルとかどうなってるんだろう。
1バイトに縮めば、長さを別に持っていても節約にはなるか。

289:デフォルトの名無しさん
08/09/23 18:14:15
>>280
それだとデータの内容が変わってるけど問題は無いの?
送信時に 03 ab 00 cd みたいに長さ情報を付加するの?
かなり高い確率で、受信側で次に送る送信データと連結されてしまうよ

290:デフォルトの名無しさん
08/09/23 18:45:30
>>281>>282>>283>>286
みなさんありがとうございます
共用体も初めて聞くので調べてみます

>>284
htonlの後出力する段階でどうしたらいいのかわからなくて

>>287
宿題ではありません
個人的にサーバープログラムを書いています
Cで本格的なプログラムを書くのが初めてなので

>>288>>289
00 00 ff ab 00 cd
みたいな感じで特定のバイト列でサイズのサイズを表し
可変長にしようと考えてます

291:デフォルトの名無しさん
08/09/23 20:25:25
他の既存のプロトコルがどうやってるのか勉強したほうがいい

292:デフォルトの名無しさん
08/09/23 20:45:45
>>291
具体的な例を教えて頂けるとありがたいです
RFCの有名どころくらいしか知らないので

293:デフォルトの名無しさん
08/09/23 21:26:07
>>290
頼むから、そのサーバソフトはLAN内でのみ使ってくれよ。

294:デフォルトの名無しさん
08/09/23 21:26:11
UTF-8形式っていう手もあるよ可変長
負の値が送れないけど

295:デフォルトの名無しさん
08/09/23 21:28:40
バイナリのプロトコルでしょ?

296:デフォルトの名無しさん
08/09/23 21:33:14
可変長で任意のビット数送るのにも使えるということを言ってるのでは

297:デフォルトの名無しさん
08/09/23 21:36:59
>>296
ああ、なるほど。

298:デフォルトの名無しさん
08/09/23 21:40:58
>>290
元データ
00 ab 00 cd
ゼロサプレスしたデータ
00 00 ff ab 00 cd

長くなってるよ

299:デフォルトの名無しさん
08/09/23 21:49:01
まぁ別にその辺はプロトコルの話で、
C言語とは関係無いじゃん

300:デフォルトの名無しさん
08/09/23 22:43:23
見た目の圧縮が目的ではないので長くなって構いません
理論的に大きさに制限の無いデータを全部受け取らなくても
サイズを知ることができるデータ構造が欲しいのです
そのような実例があったら是非教えて頂けると嬉しいです
例えばSMTPなんかは改行などが現れるまでデータの大きさが判りません
拡張でSIZEがありますけどサイズ自体が文字列だから
結局その大きさが判りません
無駄になるかもしれないデータを健気に受け取るより
最小のデータ受信で受け取るか判断できるようにして
トータルで無駄を無くす仕組みにしたいのです

>>294>>296
ありがとうございます
UTF-8調べてみます

>>293
初めてのプログラムですしいきなり誰かに使ってもらうつもりは
毛頭ありませんが他の人に見てもらいたいと思って
真面目に取り組んでいるので
宜しければどの辺が駄目か御教授頂ければ幸いです

301:デフォルトの名無しさん
08/09/23 22:45:07
>>299
すみません
話し逸れてました
他で相談します

302:デフォルトの名無しさん
08/09/24 04:35:53
ヘッダにある構造体を定義して、何個かint型の変数を定義しました
でも一番上に定義した変数だけ思ったとおりになってくれません
最初にその変数を使うときはおもいどおりの数なんですが
二度目以降からなぜか中身が変わってしまいます
変数名を変えてみたりしてもダメでした
なぜか一番上に定義した変数だけなんです
どういう可能性がありますか?

303:デフォルトの名無しさん
08/09/24 04:39:32
>>302
その構造体を晒してみて
あと、環境とかも

304:デフォルトの名無しさん
08/09/24 04:54:50
BCC DeveloperでDXライブラリ使ってます

構造体は
struct STATUS_D{

int w_x;
int w_y;
int pc_x;
int pc_y;
int pc_sx;
int pc_sy;
int menu_x;
int menu_y;
int data_x;
int data_y;
int time_x;
int time_y;
int m_x;
int m_y;
int c_size_x;
int c_size_y;
char menustr[5][STR_MAX];
int menu_num;
int w_handle;
int wb_handle;
int c_handle[5];
int c_handle_num;
};
です
この一番上のint w_x;の値が変わってしまいます

305:デフォルトの名無しさん
08/09/24 05:13:31
>>304
構造体自体には問題ないね。きっとどこかでメモリ破壊をしているんだろう。


306:デフォルトの名無しさん
08/09/24 05:45:18
メモリ破壊してる所見つけるコツみたいなのあります?
全然わかんないです・・・

307:デフォルトの名無しさん
08/09/24 05:48:35
>>306
前後に文字配列を定義してないですか?

308:デフォルトの名無しさん
08/09/24 05:51:55
>>307
それよりこの構造体をどういう風にメモリに確保するか
でも変わるしなあ。

たとえば構造体を配列にしてるとなると構造体内部の配列の
最大値をちゃんと管理してなくてメモリ破壊してるとか。
ただ構造体に情報をセットするのは構造体の先頭の領域から
なら見かけ上正常に動いてるようにも見える。

309:デフォルトの名無しさん
08/09/24 05:55:22
目視デバッグ

310:デフォルトの名無しさん
08/09/24 06:08:33
デバッガーでトレース
構造体のint w_x;の値を表示しておき、ステップ実行で値が変わったところを調べる

311:デフォルトの名無しさん
08/09/24 10:38:33
その構造体すでにfreeしてしまっているとか

312:マジレスチュウ ◆MaJi/01g.w
08/09/24 12:54:50 BE:1465733467-2BP(0)
char型の配列周りが基本的に怪しいよね。
ちゃんとヌルターミネートされてるか、
配列のサイズよりも大きいものを入れる可能性がある場所はないか。
デバッガあるなら>>310の方法で探すのが早いかな

313:デフォルトの名無しさん
08/09/24 19:34:37
#ifdef _DEBUG
#include <stdio.h> //for sprintf
#endif

_DEBUGってなんですか?

314:デフォルトの名無しさん
08/09/24 19:39:57
URLリンク(www.wakhok.ac.jp)

315:デフォルトの名無しさん
08/09/24 20:47:47
>>313
VCではデバッグモードでコンパイルすると
_DEBUGが暗黙のうちにdefineされる。

316:デフォルトの名無しさん
08/09/25 00:48:54
fgets(str, BUFSIZE, stdin);
len = strlen(str);
if(str[len - 1] != '\n') {
printf("input line may be imcomplete\n");
while(str[len - 1] != '\n') {
fgets(str, BUFSIZE, stdin);
len = strlen(str);
}
}

whileでstrの未処理の値を読み捨てているらしいけど、そこがしっくりこないんだが。
fgetsで読み捨てるって、具体的にどういう処理だ?><

317:デフォルトの名無しさん
08/09/25 00:53:57
>>316
モードが何かは知らんけど、読み捨てるって一定条件に達したら
その後データが存在してても読まないだけじゃないの?

318:デフォルトの名無しさん
08/09/25 00:54:24
サイズをオーバーしたとき

でもその処理そもそもエンターで入力終了と決め込んでるという点がダメな気もする

319:デフォルトの名無しさん
08/09/25 00:55:02
316のはよくない例だな

320:デフォルトの名無しさん
08/09/25 01:01:28
すまん、学校の宿題というかプリントに乗ってるプログラムなんだ><w
実際は
char str[BUFSIZE];
char dummy[4];
int a = 0, b, len;

while(a >= 0) {
printf("a, b = ? ");
fgets(str, BUFSIZE, stdin);
len = strlen(str);
if(str[len - 1] != '\n') {
printf("input line may be imcomplete\n");
while(str[len - 1] != '\n') {
fgets(str, BUFSIZE, stdin);
len = strlen(str);
}
continue;
}
if(sscanf(str, "%d %d %3s", &a, &b, dummy) != 2) {
printf("input format may be imcomplete\n");
continue;
}
printf("a = %d, b = %d\n", a, b);

}
こんななってる。安全な入力方法の一つだそうで。
オーバー時のwhileの処理は、未処理のまだ残っている値のクリアが目的らしいんだけど、
fgetsでどうクリアするのかがよくわからん><

321:デフォルトの名無しさん
08/09/25 01:04:18
BUFSIZE以上の文字数が入力された場合にBUFSIZE-1で割った最後のあまりのみを有効にする、
かなり頭の悪いやり方。

322:デフォルトの名無しさん
08/09/25 01:11:01
continueがあるから違うだろ。

while(getchar()!='\n')で十分な気はするが。

323:デフォルトの名無しさん
08/09/25 01:17:36
>>322
そうそう、それでもいいって書いてあった。
あれか、未処理だった部分がstrに入ってくるんかね?
んで、未処理だった値も処理されてクリアってこと?><

324:デフォルトの名無しさん
08/09/25 01:21:37
もし想定してるよりも長い文字列が入力されてれば
読み込みきれなかった分までstrに上書きしながら
順次読み込んでいって、以降するはずだった処理は
全部ぶっ飛ばしてまた最初からと言う方法を取ってる

325:デフォルトの名無しさん
08/09/25 01:26:05
ifの直後に同じ判定をwhileでするのは無駄だと思うけどな。
こういうときこそdo{}while使ってやれよw

326:デフォルトの名無しさん
08/09/25 01:28:40
>>324
ありがとうございます、なんとなく解りました。

327:デフォルトの名無しさん
08/09/25 01:32:44
>>325
ちゃんとみろ、それは的外れだ

328:デフォルトの名無しさん
08/09/25 01:35:20
>>327
if内に進んだ最初のwhileの判定はifでしたのとまったく同じだけど?

329:デフォルトの名無しさん
08/09/25 01:42:13
>>328
お前continueが見えてないの?

330:デフォルトの名無しさん
08/09/25 01:43:26
>>329
この話にcontinue関係ないw

331:デフォルトの名無しさん
08/09/25 01:48:29
>if(str[len - 1] != '\n') {
これと
>while(str[len - 1] != '\n') {
これの条件判定が同じで、whileの一回目の判定が無駄だって言ってるんだが理解できてる?

332:デフォルトの名無しさん
08/09/25 01:52:17
まあ、こう言うときはこう直せば良いんじゃね?
とソースを書けば一番手っ取り早いよねと横レス

if(str[len - 1] != '\n') {
printf("input line may be imcomplete\n");
do {
fgets(str, BUFSIZE, stdin);
len = strlen(str);
} while(str[len - 1] != '\n');
continue;
}

333:デフォルトの名無しさん
08/09/25 02:30:55
自分の関数を周りに使わせたがる同僚にはどう対処したらいいですか?

334:デフォルトの名無しさん
08/09/25 02:33:02
上司になっていいように使う。

335:デフォルトの名無しさん
08/09/25 04:16:05
すまそ。。度忘れしてしまって、googleってもでてこないので、おしえて。

超簡単なことなんだけど、C言語の配列って宣言時にしか初期化できないんだっけか?
しばらくC言語やってないもんで。。

よろしく。

336:デフォルトの名無しさん
08/09/25 07:39:47
別に好きなとこで代入とかして初期化すればいいだろう

それとも初期化子の使用のことか?それなら、宣言時にしか使えないな

337:デフォルトの名無しさん
08/09/25 08:34:04
strcpyとかstrcatとかsprintfとか使いまくってるんですけど
やっぱバグおきますかね?
参考にしてるソースではstrcpy_sとかstrcat_s、sprintf_s使ってるんですが
私BCC使ってるので使えないんです(たぶん)

338:デフォルトの名無しさん
08/09/25 08:36:50
>>337
sprintf()でも%sや%fを生で使わなければ随分違うと思うよ。
例えば、%.20sとするとか%10fにするとかいっそ%gを使うとか。

339:デフォルトの名無しさん
08/09/25 10:27:10
>>337
_sの方を使ってても同じぐらいバグを出しやすいと思うよ。バグっても
セキュリティホールになりにくいだけで。
C++のstringやらCStringを使うほうがいいです。



340:デフォルトの名無しさん
08/09/25 11:48:17
CのスレでC++の話をする奴って何なの?

341:335
08/09/25 13:37:47
>>336
そうです。初期化子のことです><; やっぱ宣言時にしかつかえないんですね><;

宣言時以降で、array[] = {1, 2, 3, 4, 5}; とかいう文をCでそういえばみないなあとおもって。

Javaとかの高級言語ばっかつかってたから、脳みそパープリンになってました。本当にありがとうございました><;

342:デフォルトの名無しさん
08/09/25 13:42:52
Cも一応高級言語なんですけぉ

343:マジレスチュウ ◆MaJi/01g.w
08/09/25 22:29:03 BE:488578627-2BP(100)
>>337
バグ起きるかどうかは自分のコーディング次第じゃない?
strcpy_sはBCCじゃ使えないけど、自分で作ればおk

344:デフォルトの名無しさん
08/09/26 07:51:18
CPU 使用率を下げたいのなら、Sleep(0) ではなく Sleep(10) などと待ち時間が必要

345:デフォルトの名無しさん
08/09/26 08:08:07
おれ=くさかべ先生

346:デフォルトの名無しさん
08/09/26 08:11:17
BUGなのに、偶然としてそれが表にでてこない。
そんなのがバグ。

人は間違えるもの、間違えた時の危機管理が問題であって、
完璧に間違えないように作るという方向では、危機を避けることができない

君がやっているのは問題の先送り。トラブルがでてから対処すればいいじゃん。
それが致命傷になる。


347:デフォルトの名無しさん
08/09/26 12:39:51
保険に入ってれば事故ってから対処すればいいじゃん、てのと同じだな
事故んねえように日頃から心がけることこそ管理しきれない危機への危機管理

どんなにセキュアなシステムでも使う奴がアフォでは結局危ない、という意味で
> 自分のコーディング次第
に賛成

348:デフォルトの名無しさん
08/09/26 13:17:35
サイバーノーガード戦法?

349:デフォルトの名無しさん
08/09/27 13:38:21
大学の授業をサボりぎみで、いつの間にかついていけなくなっていた俺に良い参考書はないですか?
基本まではちゃんとやっていたが、本格的に関数使い出したり二分木のあたりから\(^o^)/

350:デフォルトの名無しさん
08/09/27 13:38:57
if ( 条件1 ) {
  処理1;
  if ( 条件2 ) {
    処理2;
  } else {
    処理3;
  }
} else {
  処理3;
}
処理4;


処理3を1箇所にする書き方を教えてください。

351:デフォルトの名無しさん
08/09/27 14:01:43
if ( 条件1 ) {
  処理1;
  if ( 条件2 ) {
    処理2;
  } else {
    goto label;
  }
} else {
label:
  処理3;
}
処理4;

352:デフォルトの名無しさん
08/09/27 14:02:33
if (条件1 && (処理1, 条件2)) {
処理2;
} else {
処理3;
}
処理4;

353:デフォルトの名無しさん
08/09/27 14:04:29
>>351
それはアウトだろボケ

354:デフォルトの名無しさん
08/09/27 14:10:57
switch (条件1) {
default:
処理1;
if (条件2) {
処理2;
break;
}
case 0:
処理3;
}
処理4;

355:デフォルトの名無しさん
08/09/27 14:12:03
>>351
goto使うならこうだな。
if ( 条件1 ) {
  処理1;
  if ( 条件2 ) {
    処理2;
    goto label;
  }
}
処理3;
label:
処理4;



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

4221日前に更新/128 KB
担当:undef