C言語なら俺に聞け(入門篇) Part 10at TECH
C言語なら俺に聞け(入門篇) Part 10 - 暇つぶし2ch175:デフォルトの名無しさん
07/03/30 18:17:42
>>173
釣りうぜえ

さっさとソース&エラーうpしろやクズが

176:デフォルトの名無しさん
07/03/30 18:19:13
構造体作ってポインタ渡せばいいじゃん。馬鹿?

177:デフォルトの名無しさん
07/03/30 18:20:56
あっ、すいません、変数名がかぶってたのが原因みたいです><
お騒がせいたしました

178:デフォルトの名無しさん
07/03/30 18:25:53
同じ名前で大きさが違う配列に無理やり値を詰め込んだのが原因でした><
皆さん、本当にありがとうございました

179:デフォルトの名無しさん
07/03/30 18:32:16
>>175
キレすぎだろw

180:デフォルトの名無しさん
07/03/30 18:43:32
>>178
結果的に「釣りだった」という見解が・・・

181:デフォルトの名無しさん
07/03/30 18:45:46
作り方が下手糞だと、ちょっとした間違いにも
気づきにくいという典型例だな。

182:デフォルトの名無しさん
07/03/30 19:06:36
><ほんとうにすいませんでした

183:デフォルトの名無しさん
07/03/30 19:13:30
特定の関数を特定の関数からしか呼び出せないようにすることって可能ですか?

184:デフォルトの名無しさん
07/03/30 19:21:42
>>176
次からはよくつかう変数を
構造体に詰め込むことにします><
苦手意識のせいで気付かなかったです
アドバイスありがとうございました


185:デフォルトの名無しさん
07/03/30 19:28:48
>>182
もしマジレスだったなら、謝る必要はないよ

186:デフォルトの名無しさん
07/03/30 19:29:58
>>184
続けることが大事だから頑張って!^_^;マジレスならね・・・

187:デフォルトの名無しさん
07/03/30 19:33:40
ところで>>170のいうように3000行を越えてるのに、
>>173でいうように関数が30個って少なすぎね?
もうすこし論理的意味単位で分割した方がいいと思うよ。

188:デフォルトの名無しさん
07/03/30 19:38:02
>>183
呼ぶ側と呼ばれる側の関数だけからなるファイルを作って、
呼ばれる方はstaticにする。


189:デフォルトの名無しさん
07/03/30 19:38:30
もう一つ質問しても良いでしょうか?
lccで行数の多い関数が入ったファイルをコンパイルすると
out of memory
とエラーが出るのですが
関数を短くしないといけないのでしょうか?><

190:デフォルトの名無しさん
07/03/30 19:41:50
つーか、データの依存関係が強すぎだろ。

191:デフォルトの名無しさん
07/03/30 19:43:11
>>189
LSICを使っているのなら、窓から投げ捨てろ。
あれは、関数を評価する為のコンパイラが使用するメモリ空間をたった32KBだか64KBだかに抑えている。

192:183
07/03/30 19:46:08
>>188
関数に付けるstaticってこういう時に使うんですね、ありがとうございました

193:デフォルトの名無しさん
07/03/30 19:54:31
URLリンク(s03.2log.net)

194:183
07/03/30 20:02:13
ついでで申し訳ないんですが、関数は何も指定しないと自動的にextern指定されるということでいいんでしょうか?

195:デフォルトの名無しさん
07/03/30 20:03:36
そうでs

196:デフォルトの名無しさん
07/03/30 20:04:24
>>194
いえす。
関数はファイルの外部から見える(extern)か見えない(static)かの2通りで
省略時はextern扱いされる。
外部に見せる必要がない関数は積極的にstaticを付けておくのはよい習慣。


197:デフォルトの名無しさん
07/03/30 20:05:10
>>194
staticをつけない限り、そうなる。
従って、ソースファイル外から使いたい関数以外は無条件にstaticをつけた方がいい。
#最近のコンパイラはstaticな関数は積極的にインライン展開しようとすることだし。

198:183
07/03/30 20:08:08
>>195-197
ありがとうございます、これからは習慣付けるようにします

199:デフォルトの名無しさん
07/03/30 20:11:46
windowsから消しておきました><

200:デフォルトの名無しさん
07/03/30 21:16:58
質問です

if( a[7] != 0 )
{
  cnt = 16 ;
  while( (a[0] & 0x0f) == 0 && cnt != 0 )
  {
    for( ct = 0 ; ct != 8 ; ct++ )
    {
      ((struct ST4bit *)&a[0+ct]->4bit_0
        = ((struct ST4bit *)&a[0+ct])->4bit_1 ;
      ((struct ST4bit *)&a[0+ct]->4bit_1
        = ((struct ST4bit *)&a[1+ct])->4bit_0 ;
    }
    ((struct ST4bit *)&a[7])->4bit_1 = 0 ;
    cont-- ;
  }
}

struct ST4bitはunsigned型で{4bit_0 ; 4bit_1}がメンバ(各4bit)

この時、このプログラムの意味することは、
a[0]~a[7]で後ろ詰めに格納されているものを
前詰めにしている、というのでいいでしょうか?

またこうすればもっと簡単にできるというのがありましたら、ご教授お願いします。

201:デフォルトの名無しさん
07/03/30 21:29:41
printfってプリントフって読むの?それともプリントエフって読むの?

202:デフォルトの名無しさん
07/03/30 21:42:20
プリントエフがデフォ

203:デフォルトの名無しさん
07/03/30 22:36:15
>200
forループの中でa[8]にアクセスしてるみたいだけど、いいの?

204:デフォルトの名無しさん
07/03/30 22:43:08
>202
THX

205:デフォルトの名無しさん
07/03/30 22:48:21
>>200
C言語じゃないよね?

206:デフォルトの名無しさん
07/03/30 22:48:25
正式には プリント ウィズ フォーマット だっけ?

207:デフォルトの名無しさん
07/03/30 22:56:32
はあ?

208:デフォルトの名無しさん
07/03/30 22:57:10
>>200
鼻からなんか出る前に消してしまえ

209:デフォルトの名無しさん
07/03/30 22:58:29
識別子の先頭に数字はないだろ・・・
常識的に考えて・・・

210:デフォルトの名無しさん
07/03/30 23:18:47
常識というか、それが通るコンパイラがあったら是非私に知らせて欲しい。
頼んだぞ。

211:デフォルトの名無しさん
07/03/30 23:38:47
識別子をプレゼントつ「unko_program」

212:デフォルトの名無しさん
07/03/30 23:41:37
>>200
データサイズが膨大 or 組み込み用途 or 学習目的
のいずれでも無いならビットフィールド使うのをやめるのが吉

long long に対応しているコンパイラならシフト演算一回で終わる
※但し、データの並び順が変わるのに注意

213:212
07/03/30 23:47:05
データの並び順が変わる

コンピュータのバイトオーダによってはデータの並び順が変わる

214:デフォルトの名無しさん
07/03/30 23:49:18
標準入力のフラッシュは非標準らしいですが、
これをサポートしてない環境の例ってあります?
たとえば組み込み用の一部ではサポートしてないとかそういうのでしょうか?

215:デフォルトの名無しさん
07/03/30 23:52:04
>>214
バッファリングしない環境では実装されてないってことは普通にあるかもね。

216:デフォルトの名無しさん
07/03/31 00:00:20
ファイルをリダイレクトされた標準入力をフラッシュされたらどうなるんだって話があるしな。

217:212
07/03/31 00:02:43
>>214
linux のターミナルだと使えなかったよ

218:デフォルトの名無しさん
07/03/31 13:00:19
>>214
fflush(stdin)のことを言ってるならWINXPでできなかった記憶がある

219:デフォルトの名無しさん
07/03/31 16:29:09
>>191
LSI-C の用途があなたの想定する用途と違うだけ

220:デフォルトの名無しさん
07/03/31 16:39:06
>>219
MS-DOS用コンパイラをWindowsで動かす積極的な理由は何かある?
まさか、製品版のLSI-C80の話をしているわけじゃないよね?

221:デフォルトの名無しさん
07/03/31 16:56:08
>>220
そんな理由はあるかどうか分からない
ただ DOS で動くプログラムがごく稀に必要になることはある

元になったレスは lcc って書いてあるから lsic86 とは関係ないっぽい

222:デフォルトの名無しさん
07/03/31 16:59:36
制御系なら DOS の方が楽
リアルタイムOS として DOS を使う場合もある
再起動も早いし

223:デフォルトの名無しさん
07/03/31 18:50:53
int ascii_to_integer(char *ascii) {
int i;
int integer;
for (i = 0; *(ascii+i) >= '0' && *(ascii+i) <= '9'; ++i)
integer = 10 * integer + (*(ascii+i) - '0');
return integer;
}

これってasciiをポインタと配列のどっちで書いたほうがいい? それともどっちでもいい?

224:デフォルトの名無しさん
07/03/31 18:51:40
>>223
atoi 使うのがイイ

225:デフォルトの名無しさん
07/03/31 18:53:53
>>223
ついでに変数 integer の初期化が必要

226:デフォルトの名無しさん
07/03/31 19:00:45
>>223
そのasciiは、「『関数の仮引数』だから」
char *asciiと書いてもchar ascii[]と書いても、同じ。
char *asciiと書いたかのようにcharへのポインタ型として扱われる。

URLリンク(kmaebashi.com)
URLリンク(www.kouno.jp)

あと、'0'から'9'までの文字かどうかの判定にはisdigitが使える、というより使え。

そして勉強ならいいが、実用なら>>224

227:デフォルトの名無しさん
07/03/31 19:04:34
>>221>>222
で、元質が制御系だとかDOSプログラムを作ってるだとか言う根拠は?
ちなみに、LSI-C86ならコンパイラの実行モジュール名がlccだな。
他にもlccはあるが、ちょっとした関数で音を上げることから察すればLSI-Cだろう。

228:デフォルトの名無しさん
07/03/31 19:20:05
>>227
根拠も何も無い
DOS が好きなだけなんだ
だから DOS で使えるコンパイラが貶められるのが嫌だった
それだけ
好きなものは好きなんだ、理屈じゃないんだ!
そういうもんだろ?

229:デフォルトの名無しさん
07/03/31 19:21:00
だったら、窓(Windows)だけ投げ捨てろ?w

230:デフォルトの名無しさん
07/03/31 19:43:33
ここといい宿題スレといい争いが絶えませんね

231:デフォルトの名無しさん
07/03/31 19:56:23
テキトーなことを言う奴が後を絶たないせい

232:デフォルトの名無しさん
07/03/31 20:11:57
/* 期待する出力は ababababab */
#include<stdio.h>
/* こんな時 func_t はどんな型で typedef すればいいのしょうか? */
typedef void *(*func_t)(void);

func_t a(void);
func_t b(void);

func_t a(void){putchar('a');return b;}
func_t b(void){putchar('b');return a;}

int main(void){
func_t func=a;
int i;

for(i=0;i<10;i++) func=func();

return 0;
}

233:デフォルトの名無しさん
07/03/31 20:20:15
どう見ても入門者の質問じゃありません。適切なスレへどうぞ。

234:デフォルトの名無しさん
07/03/31 20:24:41
期待する出力はあばばばばぶ

>>232
typedef func_tA;
typedef func_tA (*func_t)(void);

func_tA a(void);
func_tA b(void);

func_tA a(void){putchar('a');return (func_tA)b;}
func_tA b(void){putchar('b');return (func_tA)a;}

int main(void){
func_t func=a;
int i;

for(i=0;i<10;i++) func=(func_t)func();

return 0;
}

これでうまくいったけど
たぶん改善の余地ありだろうな


235:デフォルトの名無しさん
07/03/31 20:29:44
再帰みたいになるのか。

236:デフォルトの名無しさん
07/03/31 20:31:36
いや戻りとして相手の関数ポインタを返してるだけだから再帰とは違うでしょ
自分が相手を呼び出してるわけじゃないし

237:デフォルトの名無しさん
07/03/31 20:34:55
ポインタpに対して
p[2]が使えたんだけど
これは文法的にok?

238:デフォルトの名無しさん
07/03/31 20:38:42
>>237
文法的にはok
論理的(規格の用件に合致する、正常に実行できるなど)な観点からは
okかどうかそれだけではわからない。

239:デフォルトの名無しさん
07/03/31 20:40:55
func_t a(void);
void b(void);
func_t a(void) { putchar('a'); return b; }
これで、ここまで、ならば通る。

func_t b(void);
に変えると
typedef func_t (*func2_t)(void);
func2_t a(void);
にしなければならなくなる。

すると今度は・・・
難しいね。

240:デフォルトの名無しさん
07/03/31 20:41:08
>>237
p[2] の領域が確保されていればおk

例.
int a[10]={0}, *p;
p=&a[3];
p[2]=0x1234; // p[2] == a[5] なので O.K.
p=&a[9];
p[2]=0x5678; // p[2] == a[11] なので N.G.

241:デフォルトの名無しさん
07/03/31 20:43:24
大学でC言語を習った人がプログラマになってからよくやってしまう間違いや
効率の悪いプログラムの書き方とかあれば教えて下さい(-_-;)

242:デフォルトの名無しさん
07/03/31 20:45:58
>>232 下でキャスト無しでいけるけど、関数の型が変わったらダメ?
typedef void *(*func_t)(void);
void *a(void){putchar('a');return b;}
void *b(void){putchar('b');return a;}

243:デフォルトの名無しさん
07/03/31 20:50:53
しかし質問者が無反応なのが恐ろしい

244:デフォルトの名無しさん
07/03/31 20:50:57
>>241
よくある失敗はバッファオーバーラン
効率の悪いプログラムの書き方は標準関数を自作してしまう

245:デフォルトの名無しさん
07/03/31 20:51:13
strcpyの代わりにsprintfをよく使っちゃうけど問題ない?

246:デフォルトの名無しさん
07/03/31 20:52:55
>>245
無いよ。

247:デフォルトの名無しさん
07/03/31 20:55:22
>>244
よく自作しようとしてしまう関数って
どんなものがあるんでしょうか(-_-;)

248:デフォルトの名無しさん
07/03/31 20:59:44
>>241
局所変数のポインタを返すとか。
値を受け取るための引数に未初期化ポインタを渡すとか。
てか、大学関係ない単なるC言語初心者か。

249:デフォルトの名無しさん
07/03/31 20:59:50
>>245
sprintfはstrcpy並に問題ある。
バッファオーバーラン防止のため、snprintf使え。

250:デフォルトの名無しさん
07/03/31 21:00:51
>>232 です

>>234
すみません。
キャストしなくても警告の出ない方法があればと思い質問しました。

>>239
そうなんです。ループしてしまうので宣言の仕方がわからないんです。

>>242
void * にすると代入する時の型チェックが無くなってしまうので
できれば関数の型を残したいです

251:デフォルトの名無しさん
07/03/31 21:05:28
char a[]="1,2,3";
int i;
のとき
sscanf(a,"%d,%s",&i,a);
とか
sscanf(a,"%s,%d",a,&i);
って大丈夫?

252:デフォルトの名無しさん
07/03/31 21:11:24
>>241
エラーチェックをしてないのも多い気がする
fopen が失敗したかどうかチェックしてないとか

253:デフォルトの名無しさん
07/03/31 21:15:17
>>252
あぁ…確かにソケット通信のプログラムで
関数のエラーの戻り値を知らずに大変なことがありました(-_-;)

254:デフォルトの名無しさん
07/03/31 21:19:29
>>247
文字列操作する時に多いと思う
str??? 関係 (strrchr strcat とか)
is??? 関係 (isdigit isalpha とか)
あと scanf 系の書式指定で対応できるところを自作するとか
printf の %*d 書式相当のものとか

255:251
07/03/31 21:23:45
あと
sprintf(a,"%d,%s",i,a);
とか
sprintf(a,"%s,%d",a,i);
みたいに上書きしても大丈夫ですか?

256:デフォルトの名無しさん
07/03/31 21:26:15
>>255
大丈夫じゃないです

257:デフォルトの名無しさん
07/03/31 21:32:25
>>250
ん~
無理じゃないかなぁそれは
typedef func_t (*func_t)(void);
こういう宣言が許されない以上キャストするかvoid *使うかしかないと思う
それ以前に関数ポインタを戻りとして返さないとダメかな?
つまりこういうのじゃダメ?

typedef void (*func_t)(void);
void a(void);
void b(void);
void a(void){printf("a");}
void b(void){printf("b");}
int main(void){
func_t func[]={a,b};
int i;
for(i=0;i<10;i++) func[i%2]();
return 0;
}

258:デフォルトの名無しさん
07/03/31 21:38:07
>>257
無理なようですね。
書き方を変えることにします。

>>回答を下さった皆さん
どうもありがとうございました。

259:255
07/03/31 22:51:37
>>256
sscanf(a,"%d,%s",&i,b);
sscanf(b,"%s",a);
とか
sscanf(a,"%s,%d",b,&i);
sscanf(b,"%s", a);
とか
sprintf(b,"%d,%s",i,a);
sprintf(a,"%s",b);
とか
sprintf(b,"%s,%d",a,i);
sprintf(a,"%s",b);
でやればいいんですかね?

260:デフォルトの名無しさん
07/03/31 22:58:07
>>259
まあそうだが、
信頼できない入力に対して%sを使うのはバッファオーバーランの
危険があるから、やめといたほうがいいとはおもう

261:デフォルトの名無しさん
07/03/31 23:21:16
>>260
%100.100sとか書けばええだけちゃうの?


262:デフォルトの名無しさん
07/03/31 23:28:14
%as

263:デフォルトの名無しさん
07/03/31 23:37:43
じゃこうだね
まあ練習用のプログラムだから

int ascii_to_integer(char *ascii) {
int i;
int integer;
integer = 0;
for (i = 0; *(ascii+i) >= '0' && *(ascii+i) <= '9'; ++i)
integer = 10 * integer + (*(ascii+i) - '0');
return integer;
}

*(ascii+i)とascii[i]ってどっちが普通? 括弧が少ない分, ascii[i]がよく使われるのかな?

264:デフォルトの名無しさん
07/04/01 00:48:55
ascii[i];
の方が俺としては読みやすい

265:デフォルトの名無しさん
07/04/01 01:09:46
C FAQを読んで
配列 = ポインタ + 書き換え可能なメモリー
じゃないことが分かった
さっきまでの自分が恥ずかしい

266:デフォルトの名無しさん
07/04/01 01:30:58
行列の積を解くプログラム教えてください

267:デフォルトの名無しさん
07/04/01 01:37:56
URLリンク(www.google.co.jp)
別に煽ったりとかではないが
こんくらい、そのまんま検索ひっかかるよ。。。

268:デフォルトの名無しさん
07/04/01 01:41:10
ヘッダの中にヘッダをインクルードするのは、
通常どういう見解ですか?Cソースだけにしたほうが良いですか?

269:デフォルトの名無しさん
07/04/01 01:47:31
どういう見解も何も、必要だからインクルードしているんだろう。
インクルードガードはちゃんと付けとけよ。

270:デフォルトの名無しさん
07/04/01 01:53:27
#ifndef _INCLUDE_ADD_
#define _INCLUDE_ADD_

//内容

#endif
>>269 おそらく、こうゆガードですね。有り難うございました。

271:デフォルトの名無しさん
07/04/01 02:26:34
>>270
_INCLUDE_ADD_は予約済み識別子なので使わないほうがいい
使用すると未定義動作になる

272:デフォルトの名無しさん
07/04/01 02:57:15
>>271
忠告どうもです。予約語意外にします。

273:デフォルトの名無しさん
07/04/01 03:00:38
_で始まって大文字や_が続く識別子は全部予約されているので念の為

274:デフォルトの名無しさん
07/04/01 03:28:59
>>257
i%2 -> i&1
のほうが速いかも

275:デフォルトの名無しさん
07/04/01 03:35:29
>>272
最近は"予想外"が流行りらしいぞ。

276:デフォルトの名無しさん
07/04/01 07:17:25
srand()の存在意義が分かりません。rand()にseedを渡す設計にすれば
済みそうなのに、何故わざわざ別の関数にしたのでしょう?

277:デフォルトの名無しさん
07/04/01 07:25:53
アフォ
rand()呼ぶたびにいちいちseed渡さにゃならんかったらめんどくさいだろうが

278:276
07/04/01 08:16:45
仮に rand(seed); とするすると、()の中を毎回書くのが面倒ってこと
ですかね? そんなに面倒かなぁ

279:デフォルトの名無しさん
07/04/01 08:25:51
じゃなくて毎回同じseedを渡していたら、
randから返ってくる値がおなじになるじゃないか。

280:デフォルトの名無しさん
07/04/01 08:28:23
rand(&seed) とすれば seed は変わる。

ただ、こういう実装にすると、
rand のアルゴリズムに制限がかかる。
あるいは、結局 srand みたいなものが必要になる。

281:デフォルトの名無しさん
07/04/01 08:37:30
int my_rand(int seed)
{
 srand(seed);
 return rand();
}

で別れていれば自分で実装できるじゃん。なのでやりたければどうぞ。

おれはsrandとrandに別れている方がいいので、
my_randしかなければ困ったことになる。

282:276
07/04/01 08:52:16
>>280の回答が親切で比較的納得しやすいと思った。
>>281の回答は疑問に対する答えになっていないのでは……
rand(time(NULL)); とでもすればseedは毎回変わるし、これで良いので
は? と思ったのが疑問の出発です。レス見て分かったような分からな
いような気分だけど、そのうち実感できるときが来るかもしれない。回
答ありがとうございました。

283:デフォルトの名無しさん
07/04/01 09:09:18
>>282
それだと、時間が立たない限り
何度読んでも同じ値しか返ってこないよ

284:デフォルトの名無しさん
07/04/01 09:23:58
同じ種で始めれば同じ乱数列が得られるというのも疑似乱数列の
性質としては重要(再現性)なので、基本となるライブラリにある
関数が毎回勝手に裏で種を変えるような造りだと不便な気がする。
必要なら自分でそこにある素材から作れるわけだし。


285:デフォルトの名無しさん
07/04/01 09:25:57
>>282
ん。そうか? 別れていれば
・別れている方がいいよ派
・毎回seedを渡したいよ派
の両方の要求を満たせるということをかいたつもりなんだが、
わかりづらかったかな…

286:デフォルトの名無しさん
07/04/01 10:31:11
配列でできることってすべてポインタでできるなら配列はいらないと思うんだけど
そこんとこどうよエロイ人

287:デフォルトの名無しさん
07/04/01 10:31:54
だから、毎回seedを設定してたら乱数にならないんだってば。

288:デフォルトの名無しさん
07/04/01 10:49:49
>>286
配列で出来ることでポインタで出来ないことがあります。
なので配列は必要です。同様にポインタも必要です。

289:デフォルトの名無しさん
07/04/01 11:32:58
>>287
「一連の乱数を得る」という単位での「毎回」と読むのであろう。


290:デフォルトの名無しさん
07/04/01 11:52:23
毎回seed渡すrandって単なるハッシュ関数だな

291:デフォルトの名無しさん
07/04/01 11:53:25
>>289
一連の乱数を、どうやって一回の関数呼び出しで実現するんだ?
一連の乱数を必要な回数の関数呼び出しで実現するのなら、どうやって連の先頭でのみseedを渡すんだ?
それに対する真っ当な回答が、連の先頭でのみsrand()を呼び、以降rand()のみを呼ぶことなんだが。

292:デフォルトの名無しさん
07/04/01 11:56:01
>>291
君、読解力ないね。


293:デフォルトの名無しさん
07/04/01 12:04:14
>>288
具体的にはどんなことがあるの?

294:デフォルトの名無しさん
07/04/01 12:33:58
int a[10];

これをポインタで実現できる?

295:デフォルトの名無しさん
07/04/01 12:37:10
>>294
ポインタだけじゃないけど
struct linked_list {
struct linked_list *next;
...
};
を定義してmallocで動的にメモリーを割り当てればおkじゃない?


296:デフォルトの名無しさん
07/04/01 12:40:16
>>295
せめて a = malloc(sizeof(int) * 10) を使おうよ。
# より配列らしく使うならallocaにしたいが。


297:デフォルトの名無しさん
07/04/01 13:51:19
>>296
alloca?
int a[10];がどういう文脈で使われてるか分からんし、
スタックに割り付けることが配列らしく使うことになるとは思えんのだが。
callocなら分からんでもないけど。

298:デフォルトの名無しさん
07/04/01 14:08:51
どういう文脈で使われるかわからんのにcalloc()ならなんで「わからんでもない」なんだろ。

299:デフォルトの名無しさん
07/04/01 14:20:04
allocaのほうがfreeせずに済む分配列っぽいということか。
ただし、ローカル変数なら。



300:デフォルトの名無しさん
07/04/01 14:28:18
callocなら要素サイズと要素個数を別個に指定して割り付けるから配列宣言っぽい、という意味で分からんでもない。
使いどころが限られているallocaよりも、int a[10];がどういう文脈で使われていても、とりあえずcallocはヒープに取れるし。

301:デフォルトの名無しさん
07/04/01 14:32:14
>>299
ああ、納得。確かにfreeが不要っていう点ではallocaは配列と共通点を持ってるね。

302:デフォルトの名無しさん
07/04/01 15:43:45
>>281
これは seed が更新できないから使い物にならない

303:デフォルトの名無しさん
07/04/01 15:46:04
>>294 の意図しているところがワカランのが困る。
どこまで再現して欲しいのか。

304:デフォルトの名無しさん
07/04/01 15:56:33
[ ]のオーバーr(ry

305:デフォルトの名無しさん
07/04/01 16:02:24
int b[10],*a=b;

306:デフォルトの名無しさん
07/04/01 16:03:08
[]もオーバーライドできるのか…

307:デフォルトの名無しさん
07/04/01 16:49:53
int (*a)[10] = malloc(sizeof (int) * 10);

こういう事がやりたいのか?

308:デフォルトの名無しさん
07/04/01 17:09:33
calloc()は0クリアされるという仕様である時点で、ローカル配列とは似ても似つかないのだが。

309:デフォルトの名無しさん
07/04/01 17:26:43
それ以前に「要素のサイズと、数を別々に指定できるから、alloca()より配列に近い」ってのも、あれじゃね?

310:デフォルトの名無しさん
07/04/02 02:59:18
エイプリルフールも終ったね
ネタは乱数の種と配列をポインタで実現だけか
つまらん

311:デフォルトの名無しさん
07/04/02 03:14:05
ネタスレじゃないし

312:デフォルトの名無しさん
07/04/02 11:43:43
今年は偽RFC来なかったの?

313:デフォルトの名無しさん
07/04/02 13:13:23
4824

314:デフォルトの名無しさん
07/04/02 14:15:30
手旗信号かワロタ。アブストしか読んでないけど。

315:デフォルトの名無しさん
07/04/02 16:10:23
VCExpressでCW_USEDEFAULTが定数として呼び出せないのはなぜなんだぜ?
: error C2664: 'CreateWindowExA' : 4 番目の引数を 'LPCSTR' から 'DWORD' に変換できません。(新しい機能 ; ヘルプを参照)
教えてください。お願いします。

316:デフォルトの名無しさん
07/04/02 16:17:00
HWND CreateWindowExA(
DWORD dwExStyle,
PCTSTR pszClassName,
PCTSTR pszWindowName,
DWORD dwStyle,
int x,
(ry

317:デフォルトの名無しさん
07/04/02 17:00:15
>>316
ズレてたわけですか。
hWnd = CreateWindow(szClassName,
"猫でもわかるWindowsプログラミング", //タイトルバーにこの名前が表示されます
(LPCSTR)WS_OVERLAPPEDWINDOW, //ウィンドウの種類
CW_USEDEFAULT, //X座標
CW_USEDEFAULT, //Y座標
CW_USEDEFAULT, //幅
CW_USEDEFAULT, //高さ
NULL, //親ウィンドウのハンドル、親を作るときはNULL
NULL, //メニューハンドル、クラスメニューを使うときはNULL
hInst, //インスタンスハンドル
NULL);
引用スマソ。EXAではないのですが、EXにして第一引数を加えると
: warning C4002: マクロ 'CreateWindowA' に指定された実引数の数が多すぎます。
: error C2664: 'CreateWindowExA' : 2 番目の引数を 'long' から 'LPCSTR' に変換できません。(新しい機能 ; ヘルプを参照)
と出ます。ウィンドウクラスはEXなんですが、なぜでしょうか?
お願いします。

318:デフォルトの名無しさん
07/04/02 17:03:01
CreateWindowEX': 識別子が見つかりませんでした
違った。こっちがエラーだ

319:デフォルトの名無しさん
07/04/02 17:22:31
解決しました。誤字があったようで
ありがとうございました。

320:デフォルトの名無しさん
07/04/02 17:39:03
質問文を作るだけで疑問が解決する事も結構あるのね…

321:デフォルトの名無しさん
07/04/02 17:40:40
質問しようとして疑問点を整理していくと何が問題なのかわかっちゃうことって結構あるよね

322:デフォルトの名無しさん
07/04/02 17:42:39
それがデバッグじゃね?

323:デフォルトの名無しさん
07/04/02 17:54:59
デバッグというより洗い出しというか整理というか

324:デフォルトの名無しさん
07/04/02 21:40:54
何か格言ぽいのなかったっけ

「人に聞く前に目の前のクマさん人形に説明してみろ」

とかなんとか

325:デフォルトの名無しさん
07/04/02 21:48:39
うんk

326:デフォルトの名無しさん
07/04/02 21:55:25
コンピュータ系の演習室か何かにゴムのアヒルちゃんがおいてあって、
常駐してる相談員に質問する前にはそのアヒルちゃんに質問してから、
というルールがあるという話をどっかで読んだ。



327:デフォルトの名無しさん
07/04/02 21:59:54
「ゴムのアヒルに質問する」という設定だけなら
「達人プログラマー(The Pragmatic Programmer)」
にあった。

なんでアヒル?


328:デフォルトの名無しさん
07/04/02 22:04:39
「ゴムのアヒル」ってのが小さな子供が遊ぶおもちゃの象徴だからじゃないか?
幼児に馴染みのある人形って日本だと何だろう?
アンパンマンとか?

329:デフォルトの名無しさん
07/04/02 22:05:32
その辺に置いてあったからじゃね?

別にダースベイダーのボトルキャップでもいいわけで

330:デフォルトの名無しさん
07/04/02 22:43:13
ビット列の上位から下位までを逆順にしたい。
例えば、
01100111 -> 11100110
というように。
(0bit目が7bit目に、1bit目が6bit目に…)
何かスマートなやり方はありますか?

331:デフォルトの名無しさん
07/04/02 23:02:34
>>330
LUT

332:デフォルトの名無しさん
07/04/02 23:32:00
これでよくね?
int y = 0;
if(x & 1) y |= 128;
if(x & 2) y |= 64;
if(x & 4) y |= 32;
if(x & 8) y |= 16;
if(x & 16) y |= 8;
if(x & 32) y |= 4;
if(x & 64) y |= 2;
if(x & 128) y |= 1;

333:デフォルトの名無しさん
07/04/02 23:41:31
全然スマートじゃないけどな

334:デフォルトの名無しさん
07/04/02 23:48:09
10 進法で考えたら分かりやすくね?

int a = 1365;
int b = 0;

while (a>0) {
 b *= 10;
 b += a % 10;
 a /= 10;
}

これを応用して

int a = 1365;
int b = 0;

while (a>0) {
 b << 1;
 b |= a & 1;
 a >> 1;
}


335:デフォルトの名無しさん
07/04/02 23:50:36
スマートって結局主観だろ。
他人のことなんてわからん。
余計なことして気分的にスマートって思いたいだけだろ。

336:デフォルトの名無しさん
07/04/02 23:56:24
それに加え「速いのが良ければ実測しろ」だしな。

337:デフォルトの名無しさん
07/04/02 23:56:28
int test8bit(int x)
{
    static BYTE table[16] = {0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15};
    int y = table[x>>4] | (table[x&15]<<4);
    return y;
}

int test16bit(int x)
{
    int y = test8bit(x>>8) | (test8bit(x&255)<<8);
    return y;
}

intは32ビット以上前提で

338:デフォルトの名無しさん
07/04/02 23:57:12
そんな言い訳ばかり並べて逃げるやつからは何も生まれてこないと思うんだ。

339:330
07/04/02 23:57:19
LUT作りました。
皆さん、ありがとう。

340:デフォルトの名無しさん
07/04/03 00:01:40
まあ>>332をスマートだと思う奴なんていないだろうけどな

341:デフォルトの名無しさん
07/04/03 00:06:38
そんなことに時間かけるくらいなら
可読性も速度も無難なのがいい。

342:330
07/04/03 00:12:13
可読性と速度を考えてLUT。
実測はしてないですが。

343:デフォルトの名無しさん
07/04/03 00:13:58
まあ、速すぎて調べても誤差程度にしかならんけどね。

344:デフォルトの名無しさん
07/04/03 23:57:14
文字列を戻り値に指定するときに

char ch[] = " ";
return ch;

だとエラーが出て

char ch[] = " ";
return &ch[0];

だと通ったんですが、戻り値に配列を指定するときは

return ch;

のように省略して書いてはいけないのでしょうか?

345:デフォルトの名無しさん
07/04/04 00:01:54
関数内で宣言した変数は静的変数(static付けた奴)以外、
関数を抜けると同時に破棄される。
呼出元に戻ったらもうそんな変数を指すポインタは無意味と化している。

だから前者ではそのことを警告されただけだと思う。
無論後者の書き方をしたところで問題の解決にはなっていない。

346:デフォルトの名無しさん
07/04/04 00:20:51
>>344
エラーがでるでないはともかく関数内で宣言したローカル変数を戻り値にしちゃだめだよぉ
return で戻ったときにはchar ch[] はもう亡くなっているだろうから

347:デフォルトの名無しさん
07/04/04 00:32:46
結論、Cでは文字列を単純には戻り値にはできない。

348:デフォルトの名無しさん
07/04/04 00:34:15
なんでそういう結論になるのか

349:デフォルトの名無しさん
07/04/04 00:43:41
>>348
他の結論になるとでも?

350:デフォルトの名無しさん
07/04/04 00:45:26
後者は&リテラル返してるじゃん

351:デフォルトの名無しさん
07/04/04 00:50:12
呼び出し元で確保しておけと。

352:デフォルトの名無しさん
07/04/04 00:51:02
>>344
C言語で関数から文字列を返却したいときは、戻り値にしないで引数で返す
つまり、呼び側関数内で配列の領域を確保し、呼ばれる関数に渡す

353:デフォルトの名無しさん
07/04/04 00:51:35
被ったorz

354:デフォルトの名無しさん
07/04/04 01:30:59
超初心者で申し訳ないんですけど、
コンパイルしようとしたときに、cant open: stdio.hっていうエラーが出るんです。
解説お願いします。

355:デフォルトの名無しさん
07/04/04 02:15:58
すいません、自己解決しました。

356:デフォルトの名無しさん
07/04/04 03:58:31
>>347は要するにC言語では配列そのものをreturn文で返すことはできない、
ってことだろ。
自動的にポインタに変換されてしまうから。

357:デフォルトの名無しさん
07/04/04 04:33:37
BinarySearchTreeの勉強をしてるんですが
階層の数はどんな感じで出せばいいですか?


358:デフォルトの名無しさん
07/04/04 12:04:32
350 デフォルトの名無しさん sage 2007/04/04(水) 00:45:26

 後者は&リテラル返してるじゃん

359:デフォルトの名無しさん
07/04/04 12:05:34
356 デフォルトの名無しさん sage 2007/04/04(水) 03:58:31

 自動的にポインタに変換されてしまうから。

360:デフォルトの名無しさん
07/04/04 12:07:33
358 名前:デフォルトの名無しさん[sage] 投稿日:2007/04/04(水) 12:04:32
350 デフォルトの名無しさん sage 2007/04/04(水) 00:45:26

 後者は&リテラル返してるじゃん

359 名前:デフォルトの名無しさん[sage] 投稿日:2007/04/04(水) 12:05:34
356 デフォルトの名無しさん sage 2007/04/04(水) 03:58:31

 自動的にポインタに変換されてしまうから。

361:デフォルトの名無しさん
07/04/04 12:16:40
自分で考えろ

362:デフォルトの名無しさん
07/04/04 12:36:27
ソケット通信ってchar型以外のデータを送信できるのでしょうか?
構造体でデータをまとめて通信したいんですけど…

363:デフォルトの名無しさん
07/04/04 12:40:33
送信する関数のポインタの型を良く見ろ

364:デフォルトの名無しさん
07/04/04 13:28:03
>>362
「ネットワークバイトオーダー」でググるよろし。

365:344
07/04/04 16:54:10
ローカル変数だってことすっかり忘れてました…
staticにするか引数に渡すかしないといけなかったんですね。。
皆さん分かりやすい説明ありがとうございました。


366:デフォルトの名無しさん
07/04/04 17:19:44
前者がリテラルへの参照、後者がリテラルの先頭アドレスを返してる。

char* moji(){
 char ch[] = "a";
return ch;//もしくはreturn &ch[0];
}

int main(){
 char* b=moji();
 return 0;
}
これで、各所にブレークポイント置いて、メモリとレジスタを見てみりゃわかる。
ローカル変数はベースポインタ(EBPレジスタ)からのオフセットで決まるから、
moji()からmain()に戻ってくりゃ、ベースポインタが変わるから、リテラルへの参照chは意味を成さなくなる。
ただし、戻り値(EAPレジスタ)の残骸が残っている場合、一見何事もなく済んでしまう場合もある。
ch[0]というのは、リテラルそのもの、文字がメモリにセメダインで張り付いてるようなもので、値を変えようとすると
AccessViolationでOSから怒られる。&ch[0]は参照じゃなく直接リテラルのアドレスを返している。

367:デフォルトの名無しさん
07/04/04 17:31:18
>>366
>リテラル
何か混乱しているようですが、そのコード中の文字列リテラルは "a" のみです。
ch はリテラルではなく、単なる char[2] のローカル変数です。

368:デフォルトの名無しさん
07/04/04 17:31:47
真っ赤な間違い乙

369:デフォルトの名無しさん
07/04/04 17:32:18
真っ赤な間違いは>366ね。

370:デフォルトの名無しさん
07/04/04 17:43:37
>>367
だから、chは文字リテラル"a"への参照だよ。
chは、単なるch[2]のローカル変数?
だから違うよ、ch[2]の先頭を参照するローカル変数。
参照ってなに?

371:デフォルトの名無しさん
07/04/04 17:51:02
>>367
左辺値と右辺値の区別くらいつけろや

372:デフォルトの名無しさん
07/04/04 17:56:47
>>366
Cならいついかなる場合でも配列chに対して、chと&ch[0]は同じ。
どちらも配列の先頭要素を指すポインタが式の結果として得られる。

373:デフォルトの名無しさん
07/04/04 17:57:01
安価間違ってない?

374:デフォルトの名無しさん
07/04/04 17:58:42
vipperはカエレ

375:デフォルトの名無しさん
07/04/04 18:00:17
安価とか言うのは高確率で



おっさん

376:デフォルトの名無しさん
07/04/04 18:06:40
>配列ch
だからchはアドレス参照だと
それと、結果は同じでも過程は違うとはよくいったもんで

377:デフォルトの名無しさん
07/04/04 18:06:57
なんか恥ずかしいやつが混じっているなぁ。
char ch[2] = "a";
char foo[2] = {'a', '\0'};
printf("%p, %p\n", ch, foo);
を実際にコンパイルして(アセンブル出力を見るか)実行してみれば直ぐに判ることだろうに。

378:デフォルトの名無しさん
07/04/04 18:08:43
行火

379:デフォルトの名無しさん
07/04/04 18:16:00
>>377
そのプログラムを実行して結果を見たところで何がわかるのやら

380:デフォルトの名無しさん
07/04/04 18:19:42
何も判らないならプログラミングは止めたほうがいい。

381:デフォルトの名無しさん
07/04/04 18:25:49
>>366
ちなみに文字列リテラルそのもの(の先頭要素)を指すポインタを返したければこうする
どちらも結果的には同じこと
char* moji() {
  return "a";
}

char* moji() {
  char* ch = "a"
  return ch;
}

382:デフォルトの名無しさん
07/04/04 18:27:26
>>380
当然過ぎる結果が返ってきたということだw
上の方のレスはカオス過ぎて読んでいない。

383:デフォルトの名無しさん
07/04/04 18:27:45
どうせなら
char *p = "a";

も付け足しとけ。

384:デフォルトの名無しさん
07/04/04 18:30:53
「配列とポインタは同じ」
って罪な言葉だな…

385:344
07/04/04 18:31:09
つまり

ch → "a"の先頭アドレスを参照
ch[0] → 'a'を参照
&ch[0] → 'a'のアドレスを指す

と言うことで、これらは全部

'a' '\0'

を参照しているからアドレスは同じってことですか?

386:デフォルトの名無しさん
07/04/04 18:32:37
>>366のアホさに久々にワロタ

387:デフォルトの名無しさん
07/04/04 18:33:17
>>385
違う。

388:デフォルトの名無しさん
07/04/04 18:34:01
なんつーか、参照って言葉をむやみに使わないほうがいいと思うんだ。

389:デフォルトの名無しさん
07/04/04 18:35:43
配列の初期化子に使う場合でも文字列リテラルって言うの?

390:デフォルトの名無しさん
07/04/04 18:39:39
>>389
URLリンク(e-words.jp)

391:デフォルトの名無しさん
07/04/04 18:40:44
>>389
そう言う。
規格上、charの配列を文字列リテラルで初期化できるという規則になっているから。


392:デフォルトの名無しさん
07/04/04 18:42:09
ch → 配列の先頭を指すポインタとして見なされる
ch[0] → char型の値
&ch[0] → ch[0]のアドレス

393:デフォルトの名無しさん
07/04/04 18:44:38
>>390
いやリテラルであることに疑問の余地はないんだけど、文字列リテラルってなんか微妙に違和感あったもんで…
>>391
規格じゃあしょうがないね

394:344
07/04/04 18:56:51
>>388
少し調べたんですが、
参照ってC++だと特別な意味があったんですね。。
これから気をつけます。

>>392
ありがとうございます。
自分が考えていたことと全然違いますね…

395:デフォルトの名無しさん
07/04/04 19:00:32
URLリンク(kmaebashi.com)
より引用

" で囲まれた文字列を、文字列リテラルと呼ぶ。

通常は、文字列リテラルは、「char の配列」を意味する。 よって、式の中では「charへのポインタ」に読み換えられる。

しかし、char の配列を初期化する場合は例外である。 (こちらを参照のこと) この場合の文字列リテラルは、中括弧内に文字を区切って書く初期化子の 省略形として、コンパイラに特別に解釈される。

char str[] = "abc"; /* この宣言は、下の宣言と同義 */
char str[] = {'a', 'b', 'c', '\0'}; /* 配列の最外周なので、要素数は省略できる */

…だそうだ

396:デフォルトの名無しさん
07/04/04 19:12:16
コード上で"で囲まれてれば全部文字列リテラルなのねー
感覚としてはあたかも文字列リテラルのように書くことが許されてるって感じだった

397:デフォルトの名無しさん
07/04/04 19:15:40
でも現実的には初めそう教えておくほうがいいと俺は思う。

398:デフォルトの名無しさん
07/04/04 19:31:04
>>366
がアホなのは解った。

399:デフォルトの名無しさん
07/04/04 19:39:27
オレはC言語はきちんと理解できていないが
ゲームなんかのクラックをして変な知識だけはある

しかもアセンブラの意味も分かっているわけではなく
シンボルを見て分かった気になっているだけの
スクリプトキディみたいなもんだ

言っとくがオレは >>366 でも代弁者でもないぞ

400:デフォルトの名無しさん
07/04/04 19:44:49
>>399
どういう流れでその書き込みなのか頭の悪い俺に教えてください。

401:デフォルトの名無しさん
07/04/04 19:47:48
>>399
いったい、誰に対して何の主張をしてるんだ?

402:デフォルトの名無しさん
07/04/04 20:02:08
それをこれから書くところなんじゃないか

403:デフォルトの名無しさん
07/04/04 20:02:45
スレ違いはスルー汁

404:デフォルトの名無しさん
07/04/04 20:28:28
とりあえず>>370
char ch[] = "a"; は文字リテラル"a"への参照だよ。
ってのはおかしいよね・・・?

405:デフォルトの名無しさん
07/04/04 20:37:08
argv[1][2]って*(p+2)みたいに表現できないの? > エロイ人(愛を込めて)

406:デフォルトの名無しさん
07/04/04 20:43:08
>>405
*(argv[1] + 2)

407:デフォルトの名無しさん
07/04/04 20:50:32
>>405
もしくは
*(*(argv+1)+2)

408:デフォルトの名無しさん
07/04/04 20:52:20
argv[ i ][ k ] = *(*(argv+i)+k)
と等価って意味ね

409:デフォルトの名無しさん
07/04/04 21:05:21
2[1[argv]]

410:デフォルトの名無しさん
07/04/04 21:13:52
argv[i][k] == *(*(argv+i)+k) == k[i[argv]]

411:デフォルトの名無しさん
07/04/04 21:22:45
>>406-410
サンクス
なるほど *を2回使うのね

412:デフォルトの名無しさん
07/04/04 21:53:54
a[b]におけるaとbの可換則だけは釈然としない
こんなの使って可読性が上がる場合なんてあんの?

413:デフォルトの名無しさん
07/04/04 21:57:04
>>412
その仕様は初期のコンパイラの都合によるものと思われる
でも、できるからといって使う必要はないじゃないか


414:デフォルトの名無しさん
07/04/04 23:35:53
char *argv[]に対して
*(argv+i)って言うのはargv[i]
*(*(argv+i))って言うのはargv[i][]
と同じと考えておk?

415:デフォルトの名無しさん
07/04/04 23:37:44
下は *(*(argv+i)) == *(*(argv+i)+0) == argv[i][0] ?


416:デフォルトの名無しさん
07/04/04 23:45:43
うん。
*p == p[0]

417:デフォルトの名無しさん
07/04/04 23:48:02
構造体ってのは最初に宣言しないといけないの?
#include <stdio.h>
int main(void){
struct person{
char *sei;
int age;
}taro;
taro.age=13;
taro.sei="山田";
struct person hanako;
printf("太郎の姓は%s、年齢は%dです\n",taro.sei,taro.age);
return 0;
}

これコンパイルできないんだけど

418:デフォルトの名無しさん
07/04/04 23:50:09
struct person hanako;
を削ってみ。

419:デフォルトの名無しさん
07/04/04 23:51:59
>>417
Cの場合宣言(struct person hanako; )は関数スコープの最初に
taro.age=13; taro.sei="山田"; の後で宣言はダメ


420:デフォルトの名無しさん
07/04/04 23:52:17
>>417
コンパイルできるよ。

421:デフォルトの名無しさん
07/04/04 23:57:13
あれがコンパイルできるC99は残念ながら普及していないのさ

422:デフォルトの名無しさん
07/04/04 23:59:18
gccが普及してないとでも?

423:デフォルトの名無しさん
07/04/05 00:10:03
GCCは普及しているものの、社会がC99を使う風潮になっていない。
見たことあるか?C99で書かれたプログラム。

424:デフォルトの名無しさん
07/04/05 00:17:24
FreeBSDのソースがC99でかかれてたなー。

425:デフォルトの名無しさん
07/04/05 00:23:08
拡張子をcppにすればいい

426:デフォルトの名無しさん
07/04/05 00:44:47
>>423
コメントが//のCのソースコードをよく見るんだが

427:デフォルトの名無しさん
07/04/05 03:02:41
C99で書かれたものは、C89でも書ける。
極端な事言えば、C++でusing namespace std;
をグローバルで宣言して、あとはCの様に書けば
事足りる。
なんだよ、_BOOLって (w

428:デフォルトの名無しさん
07/04/05 03:09:55
極端な事言えば、   で書かれたものは機械語でも書ける。

429:デフォルトの名無しさん
07/04/05 07:05:03
ふつうにboolにしてくれた方が使いやすい

430:デフォルトの名無しさん
07/04/05 07:51:37
>>423
毎日飽きるほど見てますが、何か。

431:デフォルトの名無しさん
07/04/05 08:04:55
>>427>>429
<stdbool.h>


432:デフォルトの名無しさん
07/04/05 12:49:55
int *a;
ってやったら
aにはたとえば0x123456ff
みたいなアドレスが入ってるんだよね?
だから、a=12みたいなことはできないってことはわかったんだけど

char *c
c="abcdef";
みたいなことができるのはなんで?

char *cって指定した時点で
cには0x12345678みたいなアドレスが入ってんじゃないの?

433:デフォルトの名無しさん
07/04/05 12:54:00
"abcdef"は、文字列abcdefのアドレスの意味

434:デフォルトの名無しさん
07/04/05 12:54:04
int *aもchar *cも宣言した時点では(有効な)アドレスは入ってない。

435:デフォルトの名無しさん
07/04/05 12:59:11
あれ?
アドレス表示しても6桁なんだけど…
なんで?

436:デフォルトの名無しさん
07/04/05 12:59:55
a=12だってできる。

437:デフォルトの名無しさん
07/04/05 13:00:32
>>435
上が0なんだろ・・・

438:435
07/04/05 13:02:00
#include <stdio.h>

int main()
{
int a = 1 ;

printf ( "%x" , &a ) ;

return 0 ;
}

で実行すると

12fed4

どういうこと?

439:デフォルトの名無しさん
07/04/05 13:02:42
>>437
なるほど^^
お騒がせしました

440:デフォルトの名無しさん
07/04/05 13:04:32
>>432
そういうC言語の仕様。
「char型の配列はダブルクォーテーションで囲む文字列(これを文字列リテラルと言う)で初期化できる」
っていうルールがあるの。ただおまいはその書き込みから色々誤解してそうなフシがあるから注記しとくと

・初期化が無い宣言の時点ではその変数の値は決まってない。
 その変数を格納するためのメモリ領域に元々入ってるデータがそのまま値になる。
・文字列リテラルで出来るのはあくまで初期化であり、代入は出来ない。
 つまり、char c[] = "unko";はできるけどchar c[20]; c = "unko";はダメ。
・ポインタに対しても同じ事が出来るけどそれはchar *cのに対して静的なリテラルのアドレスが代入されたのであって
 ↑のルールとは無関係。だから厳密に言えば↑のレスは的外れになる。



441:デフォルトの名無しさん
07/04/05 13:14:58
>>438
0x12fed4
16進表記だよ

442:デフォルトの名無しさん
07/04/05 13:22:39
%p ならなんとかしてくれるかもしんない。
あ。 ゼロサプレスしてたっけか?

443:デフォルトの名無しさん
07/04/05 13:45:42
なるほどー。
char c[20];
ってやって、初期化しなかった場合に代入したいときは
scanfとかstrcpy使わないとだめなのかな?
c="asdf"はできなくてstrcpy(c,"asdf")はできるんだよね。。。

なんでc="asdf"はだめでstrcpyは良いのかよくわからないけども、まぁいっか

444:デフォルトの名無しさん
07/04/05 13:54:28
>>443
char c[20];
char *p=c; cのアドレスをpにコピー
コピーしたのは「アドレス」であってデータそのもの("ABCDE")ではない
このときpには c のアドレスが入っている
次に p="ABCDE";
を実行すると p は"ABCDE"というリテラルの「アドレス」が代入され
cに"ABCDE"がコピーされるわけではない
c(=p)にコピーしたいのなら strcpy(p,"ABCDE"); としなければいけない


445:デフォルトの名無しさん
07/04/05 13:54:41
>>443
> なんでc="asdf"はだめでstrcpyは良いのかよくわからないけども、まぁいっか

c="asdf"は、char型の20個の領域にアドレス(="asdf")を代入しているからだめ
strcpyは、char型の20個の領域に文字列asdfをコピーしているから良い

446:デフォルトの名無しさん
07/04/05 13:56:06
>>443
Cでは配列間での代入はできない。また、"asdf"は'a'を指すポインタと解釈される。
従って、c = "asdf"は配列へのポインタの代入と言うことになり、当然できない。
どうしても代入したければ、要素を一つずつ代入すればよい。
#そしてそれを、ナル終端文字列専用にしたのがstrcpy()だ。

447:デフォルトの名無しさん
07/04/05 13:58:01
c="asdf" ← というか、そもそも、c = で使えない。(cは配列の先頭を表してるってだけ)
strcpy(c,"asdf") ← c(配列の先頭のアドレス)とリテラルのアドレスを渡して、
                  'a','s'・・・を順次入れているだけ。

448:デフォルトの名無しさん
07/04/05 14:06:51
>>443
"asdf" は文字列が格納されている先頭メモリ番地
c="asdf" はアドレス値をコピーしようとしている
strcpy(c,"asdf") はアドレスが指すデータをコピーしようとしている

449:デフォルトの名無しさん
07/04/05 15:45:32
for (i = 0; i < THREAD_COUNT; i++) {
 /* スレッド生成 */
 if (pthread_create(&thread_id, NULL, threadFunc, (void *)thread_arg) == 0) {
   thread_count++;
 }
}
とやって、THREAD_COUNTの数をいろいろ変えているのですが
ある一定の数以上は、必ず失敗するようになります。
自分の環境では303個めまでのスレッドは作成できますが
それ以上は作成できません。
どこかでスレッドの上限というのは決められているのでしょうか?

450:デフォルトの名無しさん
07/04/05 16:32:12
/*
1000以下の素数を求める(第1版)
*/

#include <stdio.h>

int main(void)
{
int i, no;
unsigned long counter = 0;

for (no = 2; no <= 1000; no++) {
for (i = 2; i < no; i++) {
counter++;
if (no % i == 0) /* 割り切れると素数ではない */
break; /* それ以上の繰返しは不要 */
}
if (no == i) /* 最後まで割り切れなかった */
printf("%d\n", no);
}

printf("乗除を行った回数:%lu\n", counter);

return (0);
}
これでnoが3の時二個目のfor分のところのiが<演算子なのに3になるんですか?
3にならなければ3素数なのにprintfで表示されないですよね

451:デフォルトの名無しさん
07/04/05 16:42:23
no = 3, i = 2 → 割り切れない
no = 3, i = 3 → i < noを満たさないのでループ終了

no == i なので3は素数

452:デフォルトの名無しさん
07/04/05 16:44:38
<これでも
3<3までいくんだ?
<=じゃなくても

453:デフォルトの名無しさん
07/04/05 16:45:38
3になったからループを抜けるわけで

454:デフォルトの名無しさん
07/04/05 16:47:32
ループの流れ
i = 2
i < no の判定
処理
i++
i < no の判定
処理
i++
i < no の判定
処理
i++




455:デフォルトの名無しさん
07/04/05 16:48:36
>>450=452 ...か?
妥当なインデント付けて、最初のforループの中を一行ずつ追っていけば
何となく分かるかもね。

456:デフォルトの名無しさん
07/04/05 17:04:32
>>452
そうじゃなくて
no=3 のとき iのループは3になったら抜けるわけでループ内では2までしか処理されない
ループを抜けているのはiが3だからループのあとiは3になっている


457:デフォルトの名無しさん
07/04/05 17:46:40
printf()が負値を返すのはエラーが発生した場合とのことですが
具体的にエラーが発生するのってどんな状況のときなんですかね?

458:デフォルトの名無しさん
07/04/05 17:59:47
>>457
厳密には、printf()は出力に失敗するとEOFを返す。
リダイレクト先の出力がなんらかの制限のあるデバイスにでも振り向けられていなければ、
一般的には出力は必ず成功する。

459:デフォルトの名無しさん
07/04/05 18:44:50
てか画面以外は失敗する可能性あるよね。

460:デフォルトの名無しさん
07/04/05 18:58:02
>>459
画面って何?
/dev/consoleのこと? 必ずしも画面とは限らないのだけど……

461:デフォルトの名無しさん
07/04/05 19:03:19
要は、下位のwriteが失敗するかどうかが大体のキモだね。
printf(NULL)みたいなどうしようもないようなものをのぞけば。

462:デフォルトの名無しさん
07/04/05 19:32:07
>>457
普通にファイルに書いてたって空き領域がなくなることはあるだろうし
リムーバブルなメディアなら途中で引っこ抜かれるかも試練。

463:デフォルトの名無しさん
07/04/05 19:40:07
実は、バッファリングされているから必ずしもエラーにならない罠。

464:デフォルトの名無しさん
07/04/05 19:46:53
必ずしもの使い方が間違っている希ガス

465:デフォルトの名無しさん
07/04/05 19:47:44
463ではないが、必ずしもエラーになるとは限らない、かな?

466:デフォルトの名無しさん
07/04/05 19:50:25
容量オーバーした瞬間にエラーにならない可能性はあるが、
失敗する可能性は十分あり得るということでFA?

467:デフォルトの名無しさん
07/04/05 21:26:44
すみません。前回はありがとうございます。
また質問させていただきます。
URLリンク(www.uploda.org)
スパゲティですみません。
game3.hの構造体sceneDataなんですが変数dFFがメンバじゃないと出るんですが、
何ででしょうか?
要素が多すぎるんでしょうか?
pはsageです。

468:デフォルトの名無しさん
07/04/05 21:31:37
>>467
grep で検索しても dFF はどこにも宣言されて無いようだ

469:デフォルトの名無しさん
07/04/05 21:38:51
整数mからnまでの和を、公式n(n+1)/2を使わずに求めるプログラム作ったんですけど

#include <stdio.h>

int main(void){
int m,n,i,ans=0;
printf("数値入力>");scanf("%d",&m);
printf("数値入力>");scanf("%d",&n);

if(m<=n){
for(i=m;i<=n;i++){
ans=ans+i;
}
printf("%d",ans);
}

else {
for(i=n;i<=m;i++){
ans=ans+i;
}
printf("%d",ans);
}
return 0;
}

このプログラムって、答えをansという変数に代入してるんですが
ansを使わずに求めるにはどうしたらいいんですかね

470:デフォルトの名無しさん
07/04/05 21:42:29
mかnに加算していけば?

471:デフォルトの名無しさん
07/04/05 22:01:58
>>469
再帰処理で

#include <stdio.h>
int mysum(int a,int max)
{
if(max<=a) return a;
return mysum(a+1,max)+a;
}

int main(void){
int m;
printf("数値入力>");scanf("%d",&m);
printf("数値入力>");scanf("%d",&n);

if(m<=n){
printf("m=%d\n",mysum(m,n));
}

else {
printf("n=%d\n",mysum(n,m));
}
return 0;
}



472:471
07/04/05 22:03:22
あっ
printf("m=%d\n",mysum(m,n));
printf("n=%d\n",mysum(n,m));

m= と n= 消しといて

473:デフォルトの名無しさん
07/04/05 22:17:13
>>469
ansを思いっきり使ってるので無視してくれて構わないが簡略した
int MtoN_Add(int m, int n)
{
int i = (m>n)?n:m, ans = 0;
while( (m>n)?m:n >= i ) ans += i++;
return ans;
}


474:デフォルトの名無しさん
07/04/05 22:38:02
#include <stdio.h>

int main(void){
int m,n,i;
printf("数値入力>");scanf("%d",&m);
printf("数値入力>");scanf("%d",&n);

if(m>n) m^=n,n^=m,m^=n;
for(i=m+1;i<=n;i++) m+=i;
printf("%d",m);

return 0;
}

475:デフォルトの名無しさん
07/04/05 23:07:24
ハッカーの楽しみに載ってるやつかww

476:デフォルトの名無しさん
07/04/05 23:15:05
m^=n,n^=m,m^=n
これでスワップが出来るとは知らなんだ。勉強になったぜ

477:デフォルトの名無しさん
07/04/05 23:20:22
勉強するのはいいが、実用性はないに等しいから使わないようにね。

478:デフォルトの名無しさん
07/04/05 23:21:15
URLリンク(www.dd.iij4u.or.jp)
URLリンク(ja.wikipedia.org)

479:デフォルトの名無しさん
07/04/05 23:42:01
do while文ってつかわないほうがいいの?

480:デフォルトの名無しさん
07/04/05 23:49:01
while文よりは利用機会は少ないと思うけど、
使わないほうがいいってことはない。

ただし、do while文の最後を
}
while (条件);
のようにwhileが先頭に来るように改行するのは好ましくない。
こう書いてしまうと、一軒、新たに while文が始まったように見
えてしまう。
} while (条件);
とするのがよい。



481:デフォルトの名無しさん
07/04/06 00:20:44
サイズの指定たとえば#define BUF 256とかを
複数のファイルで共有するにはどうすればいいの?
ヘッダに書いちゃっていいものなの?
優しく教えてくれる東ちづる似のお姉さん回答お願いします。

482:デフォルトの名無しさん
07/04/06 00:49:06
共用するヘッダに書いて#includeする。


483:481
07/04/06 09:21:17
>>482
すみません
それは新しくヘッダのみのファイルを作っておくって事でしょうか?

484:デフォルトの名無しさん
07/04/06 10:15:23
common.hみたいな名前のヘッダファイル作って、そこに#define全部書いて
定数使うソースに#include "common.h"書けばおkって話。

485:481
07/04/06 10:50:30
>>484
そうしたいと思います。
回答ありがとおおおおおおおおおおおおおおおおおおお。

486:デフォルトの名無しさん
07/04/06 11:33:21
>common.hみたいな名前のヘッダファイル作って、そこに#define全部書いて
勘弁してくれ。

487:デフォルトの名無しさん
07/04/06 11:38:40
今の時代、ヘッダ直しただけで毎回フルビルドになってもOKダヨー

488:デフォルトの名無しさん
07/04/06 11:51:49
本当に時代は進化したなぁ

489:デフォルトの名無しさん
07/04/06 11:53:22
>>486
へ?何が勘弁してなの?煽りじゃなくてマジで・・

490:デフォルトの名無しさん
07/04/06 11:54:08
>>487
それが理由じゃない。俺様マクロが氾濫する原因になるから
利用したいソース群ごとにインクルードファイルは分けて欲しいだけだ。

491:デフォルトの名無しさん
07/04/06 11:55:15
つーか、>484の方針だとプロトタイプ宣言も全ソース共通のインクルードファイルでやってそうだな…

492:デフォルトの名無しさん
07/04/06 11:56:40
プロトタイプ宣言は普通全ソース共通のインクルードファイルに書くだろ
prototype.hとか作って

493:デフォルトの名無しさん
07/04/06 12:02:45
普通にモジュール化してたらそうはならないだろ

494:デフォルトの名無しさん
07/04/06 12:05:38
なるだろ

495:デフォルトの名無しさん
07/04/06 12:25:58
で結局どうやるのが正解なわけ?

496:デフォルトの名無しさん
07/04/06 12:27:57
>>492
勘弁してくれ。
その方針じゃ、必要のないインクルードファイルまで全部インクルードする羽目になる。
標準インクルードも片端からインクルードすることになるジャマイカ。

例えば20本くらいのソースのうち、時間(time_t)を取り扱う関数がソースAにあるとする。
それを利用するのは、ソースBとソースCだけだとする。
ソースD以下はtime_tなど全く頓着する必要はないのだが、プロトタイプが全部共通だと
全てのソースでtime.hをインクルードすることになるということだ。
time_tならそんな心配はないだろうが、環境によっては他とぶつかる可能性のある
マクロを定義しているインクルードファイルもあるだろう。
#たとえばBoolという定数マクロと関数マクロがぶつかることがあるOSの標準インクルードで実際にあった。

>493が言うように、きちんとモジュール化していたらそんなことになるはずないんだがな。
#つーか、C++でクラス設計していたら有り得ないだろ。

497:デフォルトの名無しさん
07/04/06 12:38:37
>>496
なんとなく共通のヘッダファイルは、さけてきたけど・・・
では、そうゆう方向で >_<;

498:デフォルトの名無しさん
07/04/06 13:00:14
>>496
>>492はプロトタイプ宣言だけの話じゃないの?

499:デフォルトの名無しさん
07/04/06 13:02:09
>>498
プロトタイプ宣言を纏めるためには、引き数や戻り値で使う型の情報が必要になる。
それらをインクルードすれば同じこと。

500:デフォルトの名無しさん
07/04/06 14:00:47
ポインタ型はすべてchar*に変換すればいい
というか業務だとそうしてるよな?普通
そうしないとくだらない依存関係で悩むことになる

501:デフォルトの名無しさん
07/04/06 14:20:45
>>500
勘弁してくれ。

502:デフォルトの名無しさん
07/04/06 14:24:21
16進を2進に変えるのって
ただ単に桁ごとの数字を二進法にかえればいいだけですか?
たとえば0x65なら6を二進にした0110と5を二進にした0101を並べて
01100101ってやりゃいいの?
どんな数でもこの法則成り立ちますか?

503:デフォルトの名無しさん
07/04/06 14:30:52
4進数なら 00 00
8進数なら 000 000
16進数なら 0000 0000

504:デフォルトの名無しさん
07/04/06 14:31:02
>>500
何の為に型が存在してるんだ

505:デフォルトの名無しさん
07/04/06 14:40:24
>500は釣りだろ。いくらなんでも業務で型無しプログラミングなんて有り得ない。

506:デフォルトの名無しさん
07/04/06 15:27:40
インターフェイスをchar *で統一するとデータ型に依存しないから、
仕様変更があった場合、修正個所少なくなる。というのはあるかもね。
作業が進んでから「データ型変更されますた」とかあるしw

507:デフォルトの名無しさん
07/04/06 15:32:15
そして、仕様変更でデータ型が変わってもその事実が伝達されずにそのままビルドされて納品される罠。

508:デフォルトの名無しさん
07/04/06 16:33:40
>>506
なんと愚かな・・・。


509:デフォルトの名無しさん
07/04/06 16:35:25
>>508
どこが愚かが具体的に言わないと反論になってない
さらに自分の改善案も出さないとただの愚痴

510:デフォルトの名無しさん
07/04/06 16:42:29
>>509
>507
>504
>496
>493

511:デフォルトの名無しさん
07/04/06 16:43:06
>>502
2進数を3桁で区切ってその3桁を1桁づつにすると8進数、4桁で区切って1桁づつに
すると16進数。というのは、2進数3桁だと8種類の重みを表現可能だからで、これを
一桁で表せば8進数ということになる。2進数4桁で16進数というのも同じこと。


512:デフォルトの名無しさん
07/04/06 16:48:26
>>509
反論ではありません。あまりの愚かさに衝撃を受けて出た一言です。
外人がよく言う "Oh My GOD!" に近いものです。
ああ。あなたに神の許しがありますように。


513: ̄ ̄V ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
07/04/06 16:49:42
       _____
      /::::::::::::::::::::::::::\                  _
     /::::::::::::::::::::::::::::::::::::::\             /  ̄   ̄ \
     |:::::::::::::::::|_|_|_|_|           /、          ヽ
     |;;;;;;;;;;ノ   \,, ,,/ ヽ          |・ |―-、       |  きみ頭だいじょうぶ?
     |::( 6  ー─◎─◎ )          q -´ 二 ヽ     |
     |ノ  (∵∴ ( o o)∴)         ノ_ ー  |     |
   /|   <  ∵   3 ∵>          \. ̄`  |      /
   ::::::\  ヽ        ノ\           O===== |
   :::::::::::::\_____ノ:::::::::::\        /          |

514:デフォルトの名無しさん
07/04/06 16:50:32
>>500
何社か渡り歩いたけど、そうやってる会社もあった
大手電機メーカーでした

515:デフォルトの名無しさん
07/04/06 16:55:28
>>514
恐ろしいな。


516:デフォルトの名無しさん
07/04/06 18:08:42
>>506
せめてvoid*
何も事態は改善しないけど

517:デフォルトの名無しさん
07/04/06 18:30:31
>>516
うん。まーーーったく変わらない。

518:デフォルトの名無しさん
07/04/06 18:45:30
え?悪化してるような気がする。
char*ってことは、一旦シリアライザ・デシリアライザを挟もう、って意図じゃないの?
いまどきのIPCがみんなXML使ってるみたいに、関数の引数もXMLにしよう、みたいな話ではないの?

519: ̄ ̄V ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
07/04/06 19:39:54
       _____
      /::::::::::::::::::::::::::\                  _
     /::::::::::::::::::::::::::::::::::::::\             /  ̄   ̄ \
     |:::::::::::::::::|_|_|_|_|           /、          ヽ
     |;;;;;;;;;;ノ   \,, ,,/ ヽ          |・ |―-、       |  きみ頭だいじょうぶ?
     |::( 6  ー─◎─◎ )          q -´ 二 ヽ     |
     |ノ  (∵∴ ( o o)∴)         ノ_ ー  |     |
   /|   <  ∵   3 ∵>          \. ̄`  |      /
   ::::::\  ヽ        ノ\           O===== |
   :::::::::::::\_____ノ:::::::::::\        /          |

520:デフォルトの名無しさん
07/04/06 19:49:00
>>468
ありがとう。どうやらIDEが別の似たファイルを参照していたらしいです。
解決しました。

521:デフォルトの名無しさん
07/04/06 20:05:31
>>476
XOR使ったスワップは、同一だとちゃんと機能せんから
せめて
a +=b, b = a - b, a -= b
とか使うようにしましょう。

522:デフォルトの名無しさん
07/04/06 20:08:53
一方俺はバッファを使った…

523:デフォルトの名無しさん
07/04/06 20:12:42
>>521
おいおいw

524:デフォルトの名無しさん
07/04/06 20:28:42
叔母風呂

525:デフォルトの名無しさん
07/04/06 20:30:47
同一( &a==&b )の場合は >>521 の方法でも 0 になってしまうよ

526:デフォルトの名無しさん
07/04/06 21:24:42
for文の途中に
return 0などがあると
関数に0を返したあとに、関数の処理は終わってしまいますか?

527:デフォルトの名無しさん
07/04/06 21:26:28
もちろん

528:デフォルトの名無しさん
07/04/06 21:54:44
#include <stdio.h>
#include <math.h>
int sosu(int);
int main(void){
int i,m;
printf("数値入力>");scanf("%d",&m);
if(m<=0) return 0;
printf("2 ");
for(i=3;i<=m;i+=2){
if (sosu(i)==1) printf("%d ",i);
}
return 0;
}
int sosu(int n){
int i;
if(n==2)return 1;
if(n%2==0) return 0;
else{
for(i=3;i*i<=n;i=i+2){
if(n%i==0){
return 0;
}
}
}
return 1;
}
入力した数までの全ての素数を表示するプログラム作ってみたんだけど
これだと横一列に表示されて見づらいので、5個ずつ表示して改行\nつけたいんだけどどうしたらいいですかね
2 3 5 7 11
13 17 19 23 29
31 37・・・といった感じです

529:デフォルトの名無しさん
07/04/06 21:59:24
>>528 これでどう?

if (sosu(i)==1) printf("%d ",i);

if (sosu(i)==1){
static int sosu_count=1;
sosu_count++;
printf("%d ",i);
if(sosu_count%5==0) printf("\n");
}

530:デフォルトの名無しさん
07/04/06 22:00:27
void MyPrint(int i)
{
static cnt;
printf("%d ", i);
cnt++;
if(cnt == 5) {printf("\n");cnt=0;}
return;
}
こんな関数をprintfの代わりに使うのはどう?

531:デフォルトの名無しさん
07/04/06 22:03:25
できたー ありがとうございます

532:デフォルトの名無しさん
07/04/06 23:02:53
int main(void) って int main() と
C言語は略しちゃいけないんだよね?

533:デフォルトの名無しさん
07/04/06 23:07:14
>>532
int main();はお勧めできませんが、
int main()ならどうでもいいと思います。

534:デフォルトの名無しさん
07/04/06 23:08:47
規格をあたってみたところ、関数の定義なら問題ないと読めた。
参照したのがはJIS X3010:2003 (C99翻訳)なんで、C89とかだとどうなのかは知らんが。

535:デフォルトの名無しさん
07/04/06 23:12:11
C89でも同じ事です。

536:デフォルトの名無しさん
07/04/07 03:51:54
素数そっすうそっすうーーー
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void sieve(char *p,int d);
int main()
{
int d = 0,i,k;
char buff[256] = {'\0'};
char *p = NULL;
fgets(buff,sizeof(buff),stdin);
sscanf(buff,"%d",&d);
if (d <= 0) {fprintf(stderr,"input positive number and less than INT_MAX number.\n");exit(1);}
if ((p = malloc(d))==NULL) {fprintf(stderr,"failed to allocate %d bytes of memory.\n", d);exit(1);}
memset(p, '\0', d);
sieve(p,d);
printf("primes up to %d\n", d);
for (i = 0, k = 1; i < d; i++){
if(p[i] == 2){i++;}
if (p[i]==0){printf("%-4d ", i+1); k++;}
if(!(k%5)){ putchar('\n');k++;}
}
return 0;
}
void sieve(char *p,int d)
{
int i, j;
p[0] = 2;
for (i=2; i <= d/2; i++)
for (j=2; j <= d/i; j++)
p[i*j-1]=1;
}

537:デフォルトの名無しさん
07/04/07 04:10:22
インデント無いとこれほどまでに読みにくくなるんだな…

538:デフォルトの名無しさん
07/04/07 12:46:42
C言語で駄目文字ってどういう時に発生するの?

539:デフォルトの名無しさん
07/04/07 12:50:03
駄目文字って何?

540:デフォルトの名無しさん
07/04/07 12:53:25
Shift_JISで表したときに2バイトめに 0x5c が来る文字を俗に
駄目文字と呼ぶらしい。


541:デフォルトの名無しさん
07/04/07 13:21:08
表とか?

542:デフォルトの名無しさん
07/04/07 15:21:56
カタカナの「ソ」とかな。

>>538への答えとしては、扱うエンコーディングにShift_JIS(CP932など
類似品も含む)があるときは常にその必要があると思え、くらいか。



543:デフォルトの名無しさん
07/04/07 15:33:49
sizeof演算子 の意味がわかりません。教えてください。

544:デフォルトの名無しさん
07/04/07 15:54:25
意味ってw

変数の使用バイトを調べる為にあるんだよ
マロックとかで変数渡すときに、4って書くよりsizeof(int)って書いた方が分かりやすいからだよw

545:デフォルトの名無しさん
07/04/07 15:55:06
sizeof(int) : int型のサイズ(4バイトとかそんな感じ)
sizeof(hoge) : 変数hogeのサイズ(char hoge[260]なら260)

前者は型のサイズが違っても対応できるように、後者はmalloc(sizeof(hoge))みたいな感じに使う

546:デフォルトの名無しさん
07/04/07 16:52:02
典型的な応用例:

int array[10];
for (int ic = 0; ic < sizeof(array) / sizeof(* array); ++ic) array[ic] = 0;

547:デフォルトの名無しさん
07/04/07 16:59:42
質問者のレベルだと
*arrayのところは、array[0]と書いた方が分かりやすいだろう。


548:デフォルトの名無しさん
07/04/07 17:30:20
構造体でもパッキングの値に対応した本当のサイズが出るので
sizeof は不可欠

549:デフォルトの名無しさん
07/04/07 17:54:23
sizeofはエロイ

550:デフォルトの名無しさん
07/04/07 18:36:20
inlineよかまし

551:デフォルトの名無しさん
07/04/07 18:59:45
>>548
いや、詰め物なくてもsizeofは使うだろ。
メンバ変数のサイズを個別に求めて、合計するわけ?

552:デフォルトの名無しさん
07/04/07 19:55:09
4って書くよりsizeof(int)って書いた方が分かりやすいからだよw

?intは2バイトじゃないのですか???



553:デフォルトの名無しさん
07/04/07 19:59:47
>>552
なんで2バイトだと思ってるの?

554:デフォルトの名無しさん
07/04/07 20:00:36
釣りだろうけどマジレスするとintサイズは環境依存、一般的には
8bit, 16bit cpu では2の
32bit cpuでは4
64bit cpuでは4, 8 に分かれる。


555:デフォルトの名無しさん
07/04/07 20:03:30
コンパイラが決めてるってことですか?
どーやって決めてるんですかね?

556:デフォルトの名無しさん
07/04/07 20:06:58
釣りじゃないです。
勉強し始めて、一ヶ月。
わからないことばかりです。
本には、intは2バイトって書かれてるから。

環境依存?

むつかしい。前途多難です。

557:デフォルトの名無しさん
07/04/07 20:08:58
>>556
すごい古い本つかってないか?

558:デフォルトの名無しさん
07/04/07 20:12:22
Javaだと身動き取れないくらいカッチリとサイズが決められてるけど、
Cのintは最低2バイトでshort以上long以下のCPUに都合の良い(が扱いや
すい)幅。以上/以下とあるから、どちらかと同じであってもよい。


559:デフォルトの名無しさん
07/04/07 20:15:49
C99だと「最低でも32bit以上で、一番速い型」とか指定できるからいいな。

560:デフォルトの名無しさん
07/04/07 20:16:10
intが最低2バイトと書いてしまったが、ちゃんと書くと、
1. short: 最低2バイト、longよりは小
2. long: 最低4バイト、shortよりは大
3. short <= int <= long

1.2.からshortとlongの幅が同じになることはないので、3.の等号は
成り立つとしても片方しか成り立たない。


561:デフォルトの名無しさん
07/04/07 20:16:22
longとintでサイズ同じなら二つも作って紛らわしくさせんじゃねーよ!
とか憤ってた学びたての頃の俺をDQNといわないで下さい

562:デフォルトの名無しさん
07/04/07 20:17:20
>>555
実行環境のCPUその他アーキテクチャにとって都合の良い大きさに決まる

563:デフォルトの名無しさん
07/04/07 20:19:24
CPUが64ビットだとややこしいな。
int=64ビット long=64ビット
int=32ビット long=64ビット
int=32ビット long=32ビット long long=64ビット


564:デフォルトの名無しさん
07/04/07 20:19:31
>>558のカッコのなかの「が」は
CPUに都合がよい、しかし扱いやすい
じゃなくて(逆接になる意味がない)、
CPUに都合がよい(CPUが扱いやすい)
の意です……


565:デフォルトの名無しさん
07/04/07 20:20:39
>>560
それ間違ってないか?
手元の本にはそんなことは書いてないが。


566:デフォルトの名無しさん
07/04/07 20:27:01
shortはshort int、longはlong intの略記であり、
無印intはshort intかlong intのどちらか処理系に都合がよいほうと同じ、
だっけ?


567:デフォルトの名無しさん
07/04/07 20:30:01
手元の本って何だよ。JISのプリントアウトか?

まぁ、もちろん規格にも>>560のような最低hogeバイトとは書いていないけどな。

568:デフォルトの名無しさん
07/04/07 20:38:20
>>560
> 1.2.からshortとlongの幅が同じになることはないので、3.の等号は
> 成り立つとしても片方しか成り立たない。

実際に sizeof(short) == sizeof(int) == siezeof(long) == 4 な処理系は実在する。


569:デフォルトの名無しさん
07/04/07 20:39:54
>>566
intがshort intとlong intのどちらかと
同じ大きさである必要があると定められてはいなかったと思う。

>>567
しかし<limits.h>の定数は少なくともxxx以上・以下でないといけないという規定があり、
そこから必然的にshortとintが16ビット、longが32ビットなければならないということが導かれる。
1バイトが8ビットである環境なら当然2バイトと4バイトになる。
「3.の等号は成り立つとしても片方しか成り立たない」は違うような気がするけど。


570:デフォルトの名無しさん
07/04/07 20:42:07
知っているつもりのことでも、きちんと知らないことってあるんだなあ。


571:デフォルトの名無しさん
07/04/07 20:42:24
>>567
新ANSI C言語辞典って本だけど。

572:デフォルトの名無しさん
07/04/07 20:52:41
すごい細かいんですね。
大丈夫かな??
無理かな??不安になってきた。

573:デフォルトの名無しさん
07/04/07 20:54:37
「どこでも同じとは限らない」ということだけ知ってればOK。


574:デフォルトの名無しさん
07/04/07 21:07:34
つまり
sizeof(short)=2
sizeof(int)=3
sizeof(long)=4
な処理系があればいいんだ、過去の俺を納得させるだけの為に

575:デフォルトの名無しさん
07/04/07 21:13:02
だからどーやってCPUがバイト割り当ててんだよ
その仕組みを教えればいいだろ

576:デフォルトの名無しさん
07/04/07 21:14:09
説明しきれないんだろ?
少なくとも俺はわからん

577:デフォルトの名無しさん
07/04/07 21:16:23
CPU < short形が2バイトだの、charが8ビットだのってのは、俺が決めてるわけじゃねーよ。

578:デフォルトの名無しさん
07/04/07 21:17:21
誰がきめてんだよ

579:デフォルトの名無しさん
07/04/07 21:19:28
設計者じゃねーの?

580:デフォルトの名無しさん
07/04/07 21:20:05
何になるの??

こんな質問方法では、だめか・・。


581:デフォルトの名無しさん
07/04/07 21:21:16
設計者なわけないだろ
あたらしいCPUがでたら
また設計者があたらしく定義しなおすのか?

582:デフォルトの名無しさん
07/04/07 21:21:50
>>575
CPUを設計する人が「これは32ビットCPUだ(1バイト=8ビット)」と言えば、
コンパイラを設計する人はそのCPUで動くコードを出力するコンパイラはintを4バイトにするという具合。

583:デフォルトの名無しさん
07/04/07 21:24:49
コンパイラを設計するひとは
CPUが新しくできるたびに設計しなおさないといけないってこと?

584:デフォルトの名無しさん
07/04/07 21:25:31
CPUのレジスタサイズと、コンパイラの整数型は必ずしも一致してないんだな。
32bitCPUでも、int8のコンパイラがあったり、int64のコンパイラがあったり。

585:デフォルトの名無しさん
07/04/07 21:25:33
すんげぇめんどくさいんですね
出来たばっかりのCPUだとプログラミングできないんじゃん

586:デフォルトの名無しさん
07/04/07 21:26:58
毎度新しく決める必要はない。
たとえば80386から続くIntelの32ビットCPUシリーズはIA-32と一括りにされるという具合。

587:デフォルトの名無しさん
07/04/07 21:27:27
なるほど

588:デフォルトの名無しさん
07/04/07 21:33:17
もちろんCPUが全てではない。

x86-64では、WindowsはMSがWindows APIをLLP64にすると言い、
VC++もLLP64(long longとポインタが64ビット、intとlongは32ビット)になった。
しかしUnix系では一般的にLP64(longとポインタが64ビット)が採用されていると言う具合。

589:デフォルトの名無しさん
07/04/07 22:14:09
入門者には難しい >_<;

590:デフォルトの名無しさん
07/04/07 22:18:22
>>574
そんな環境はないだろうけど、
short = 2
int = 4
long = 8
なら、普通にあるだろ。

591:デフォルトの名無しさん
07/04/07 23:12:07
char K1[]="abcde";

は、

sizeof は、何になるのですか?? 6??なぜ??



592:デフォルトの名無しさん
07/04/07 23:14:31
>>591
配列はその全体のサイズになるから。

文字列の場合は最後に0がつくから、みかけのサイズより+1の大きさになる。

593:デフォルトの名無しさん
07/04/07 23:14:32
規格でそう決まっているから

594:デフォルトの名無しさん
07/04/07 23:21:50
591
\0 じゃなくてですか?


595:デフォルトの名無しさん
07/04/07 23:23:54
NULLぽ

596:デフォルトの名無しさん
07/04/07 23:30:20
>>595

ガッ

597:デフォルトの名無しさん
07/04/07 23:51:36
>>591
暇だったんで俺が決めといたんだ

598:デフォルトの名無しさん
07/04/08 00:09:58
>>594
'¥0'なら

599:デフォルトの名無しさん
07/04/08 00:32:27
配列の平均値を求める関数aveを作ってみたんですが
これで表示が1としか表示されないんだけどなんでですかね・・・

#include <stdio.h>
void ave(int array[]);
int main(void){
int a[5]={1,2,3,4,5},i;
ave(a);
return 0;
}
void ave(int array[]){
int sum=0,i,m;
m=sizeof(array)/sizeof(int);
for(i=0;i<m;i++){
sum+=array[i];
}
printf("平均=%d\n",sum/m);
}

調べてみたら、ave関数のm=sizeof(array)/sizeof(int)
がおかしくて、mに1が入ってみるみたいなんです。
配列aの要素数は5だから、mに5を入れたいんだけどどうすりゃいいんですかね?

600:デフォルトの名無しさん
07/04/08 00:39:08
>>599
Cでは配列を関数に渡すことはできない。素直に個数も渡すしかない。
cf.
void ave(int * array, int nOfArray) {
...;
}

601:デフォルトの名無しさん
07/04/08 00:42:02
>>599
void ave(int array[]){
これはダメだな
int *array と同じでポインタのサイズしか渡さない
int *array のポインタサイズ(4バイト) / int のサイズ(4バイト)=1

void ave(int array[],int size)
{
int sum=0,i,m;
m=size/sizeof(int);
・・・・・
}
int main()
{
・・・・
ave(a,sizeof(a));
とするとか

602:デフォルトの名無しさん
07/04/08 01:13:19
you! c++でいっChinaよ

603:デフォルトの名無しさん
07/04/08 01:21:58
C言語では、関数に配列を渡して、渡された配列の要素数を調べる関数ってのは作れないのか。。。
main関数で要素数を入れなきゃダメなんですねどうもありがとうでした

604:デフォルトの名無しさん
07/04/08 01:38:01
出来ん事も無いけど
STLとか使ったら一瞬で出来ることをなんで悩まないといけないのか
って鬱になるから普通はしない

605:デフォルトの名無しさん
07/04/08 01:39:41
課題でeggx(C言語)てので正五角形を作って来いって言われたのですが途方にくれてます。
多角形を描く関数(fillpoly)もあるようですが、頂点の座標がわからないと描けないようで困っています。

606:デフォルトの名無しさん
07/04/08 01:54:27
頂点の座標なら
円の式と、直線の式の交点を求めるとか
sin、cosを使うとか

607:デフォルトの名無しさん
07/04/08 01:57:04
プログラムと何の関係があるのか分からんが、
正五角形の頂点なら、 k=0, 1, 2, 3, 4 として

x = cos(2π/5 * k)
y = sin(2π/5 * k)

で求まるだろう



608:デフォルトの名無しさん
07/04/08 08:32:47
Cのライブラリ全てが説明されている本って無いですか?
言われて分かる人なら X680x0 libc みたいな本を探している、と言えば早いですかね。

使用する関数名が分かっていれば、man して使い方を知る事は出来るものの、
どんな関数があるのかが分からずで困ってます。

対象は Linux / FreeBSD で、ソツ無く使える本を。

609:デフォルトの名無しさん
07/04/08 09:10:47
man2とかman3のディレクトリをlsしちゃだめなのか?

610:デフォルトの名無しさん
07/04/08 09:41:14
標準Cの範囲なら規格書で充分だろ。

611:デフォルトの名無しさん
07/04/08 09:46:47
セクション2はCの規格じゃないけどな。


612:デフォルトの名無しさん
07/04/08 10:13:48
>>604
興味本位でやってみたいからヒント頼む

613:デフォルトの名無しさん
07/04/08 11:32:32
>>612
C++をやれ

614:デフォルトの名無しさん
07/04/08 12:02:01
以後、配列を扱う場合はかならず構造体の単一メンバにすること。

615:デフォルトの名無しさん
07/04/08 12:02:46
オーライリーのC Pocket Referenceに種類ごとに標準関数の説明が載ってるよ

616:デフォルトの名無しさん
07/04/08 12:46:15
>>608 は、Unixのシステムコールも含んで、載ってるやつがほしいんじゃないか?

617:デフォルトの名無しさん
07/04/08 12:58:11
>>608
あんまりない無い。
URLリンク(www.linux.or.jp) 結局これが一番いいんじゃないかと思う。

入門書としては、UNIX-Cプログラミングを唱っているもので、プロセス・スレッド、
mmap、socletなんかを扱っているものもあるが、中途半端なものばかり。
最終的にはmanみろってことなのかもしれない。

UNIX共通に通用するベース技術・仕様の本といったら、POSIXの規格書とか
解説書あたりがお望みのものに近いか?

BSD系はソースが公開されているんだからそれを読んでコミニュティで
解決しろというスタンスが濃い。
Linuxはアプリケーションソフトばかりがとりだたされる傾向にあって、
コアなライブラリ解説なんて皆無に等しい。
オライリーのカーネル本とか、デバドラ本くらいか。

618:デフォルトの名無しさん
07/04/08 13:11:02
「ふつうのLinuxプログラミング」あたりでファイルシステムとかストリーム
とかシグナルとか、考え方から理解しておいて、あとはmanなんだろうなぁ。


619:デフォルトの名無しさん
07/04/08 14:09:16
>>613
Cではできないのですか?

620:デフォルトの名無しさん
07/04/08 14:15:22
>>619
STL は C++ 標準ライブラリ

621:デフォルトの名無しさん
07/04/08 14:55:09
スティーヴンス本も知らんのか君達は

622:デフォルトの名無しさん
07/04/08 15:17:13
(´・ω・`)知らんがな

623:デフォルトの名無しさん
07/04/08 15:26:18
C言語500の極意(うろおぼえ)みたいな本で十分だろ。

624:デフォルトの名無しさん
07/04/08 18:35:41
608です。
皆様からのレスは本屋で携帯から読めて大変参考になりました。

>>615
>オーライリーのC Pocket Referenceに種類ごとに標準関数の説明が載ってるよ

C Desktop Reference なる本は見掛けたのですが、これの事?
内容は本の厚さに比例してそこそこと言う感じでした。
初めてCを使う人には良いかも。

>>623
>C言語500の極意(うろおぼえ)みたいな本で十分だろ。

これを見掛けた時は「これか!?」と思ったのですが、内容が・・・
参考になる点も多かったのですが、今求めている物とは大きくずれてました。


いざ探してみると満足の行く物は確かに無いですね。
みんなどうやってプログラミングしているんだろう?と不思議になってきました。
今にして思うと X680x0 libc は偉業と感じます。
これには標準的な関数ならバッチリ載っているので、残りは
>>617 を参考にするのがベターの様です。

本屋で探した感じでは C言語大辞典 がわりとイイ線行ってたので
今度は神保町あたりでじっくり探してみたいと思います。

レスしてくれた方々、有難う御座いました。

625:デフォルトの名無しさん
07/04/08 21:36:11
配列って、絶対アドレス順にしかできないの?
a[0]とa[1]はメモリ上となりあわせで
a[0]アドレスが100ならa[1]は99といった感じで使いづらい・・・
malloc関数を使ったら、a[0]~a[それまで]のものが全部初期化されちゃって使いづらい。
今までの配列の要素を変化させずに動的に配列の要素数を変化させることはできないですか?

scanf関数を使うたびに配列の要素をひとつずつ増加させるのを作りたいんだけど。
int ct=0,m,*data;
data=(int*)malloc(100*sizeof(int));

while(1){
scanf("%d",&m);
if(m==0)break;
data[ct]=m;
ct++;
}

たとえばこれだと100個以上の入力されるとエラー起こすし、
5個しか入力しないと残りの95個もったいない
どうすりゃいいですかね?

626:デフォルトの名無しさん
07/04/08 21:39:05
そのための線形リストだ。

627:デフォルトの名無しさん
07/04/08 21:42:26
>>625
・realloc
・std::vector (C++ 限定)

628:デフォルトの名無しさん
07/04/08 22:09:43
ビット演算の意味がわからない。

629:デフォルトの名無しさん
07/04/08 22:11:34
#include<stdio.h>
void main(void){
int x,y;
scanf("%d,%d",&x,&y);
printf("%d",x/y);
}

5行目:0で割っています と出るんですが、何故なんでしょうか?
x,yには0以外の数字を入力しています

630:デフォルトの名無しさん
07/04/08 22:15:11
"%d,%d"のフォーマット通りに入力してる?

631:デフォルトの名無しさん
07/04/08 22:15:15
>>620
>>603
>C言語では、関数に配列を渡して、渡された配列の要素数を調べる関数ってのは作れないのか。。。
に対して
>>604
>出来ん事も無いけど
って答えているので、STLってかテンプレート使わずにC言語の機能だけでできるのかなぁと思って聞いてみたわけです。

なんか粘着みたいですいません。

632:デフォルトの名無しさん
07/04/08 22:19:44
>>624
いや"C Pocket Reference"
もれは英語版を使ってるけど一応ISBNは
0-596-00436-2

633:629
07/04/08 22:22:42
>>630
すいません、フォーマット通りとはどういうことでしょうか?

634:デフォルトの名無しさん
07/04/08 22:26:52
>>630じゃないが
たとえば
$ 4,2
にように入力してるかってこと

635:デフォルトの名無しさん
07/04/08 22:27:11
10,2
とか

636:デフォルトの名無しさん
07/04/08 22:29:00
123,456もだな

637:629
07/04/08 22:29:46
>>634-635
やってませんでした。今やったらできました。ありがとうございます!

638:デフォルトの名無しさん
07/04/08 22:36:36
>>636
いやwwwそれいったらintの範囲のその範囲乗までレスがつくぞ

639:デフォルトの名無しさん
07/04/09 07:17:09
scanfの戻り値みろよ…

640:デフォルトの名無しさん
07/04/09 10:18:00
すいません、どなたかわかる方がいれば回答お願いします
C言語のコマンドラインから引数を渡すプログラムで
ちゃんと動いてくれませんorz
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]){

FILE*fin,*fout;
char ss[256];
if(argc!=3){
printf("引数の数が違います\n");
exit(1);
}
if((fin=fopen(argv[1],"r"))==NULL)
{
printf("入力ファイルをオープンできません\n");
exit(1);
}
if((fout=fopen(argv[2],"w"))==NULL){
printf("入力ファイルをオープンできません\n");
exit(1);
}
while (fgets(ss,256,fin) !=NULL){
fputs(ss,fout);
}
fclose(fin);
fclose(fout);
return 0;


}

641:デフォルトの名無しさん
07/04/09 10:21:03
これをコマンドプロンプトやbcpadなどで実行しても最初の引数の数が違います、
としか表示されなくて・・・
色々調べて試行錯誤したのですが結局一晩かけてもわかりませんっでした
こんな自分は問題解決能力がないからPGむいてないのでしょうか(´Д`;)

642:デフォルトの名無しさん
07/04/09 10:24:50
>>641
俺の環境ではちゃんと動いたけど?


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