C言語なら俺に聞け( ..
[2ch|▼Menu]
175:デフォルトの名無しさん
09/12/17 07:32:49
>>165
そういうときは、union使うといい

struct hoge {
 int data_type;  // 0:int 1:char 2:double ...
  union {
       char  c;
       int    i;
       double d;
    ...
  } u;
};


176:デフォルトの名無しさん
09/12/17 07:39:33
>>175
いやその解は有りえんから

177:デフォルトの名無しさん
09/12/17 11:26:16
void function(void *v1,char a)
{
  int i;
  for(i=0;i<10;i++)
  {
    //型に応じた数値計算
    switch(a)
    {
    case 1:
      //((int*)v1)[i];
      break;
    case 2:
      //((double*)v1)[i];
      break;
    case 3:
      //((char*)v1)[i];
      break;
    }
  }
}

こうはできないものかと妄想したが

178:デフォルトの名無しさん
09/12/17 12:59:18
目的がわからんのだよ。
そんなのが必要になる状況なんてありえないだろ。

179:デフォルトの名無しさん
09/12/17 13:20:43
型を別の引数で指定するくらいなら関数を分けるのが最善手。
そうでなけりゃ C++ で template 使え。

180:デフォルトの名無しさん
09/12/17 14:05:17
template利用する場合でも数値を扱うなら実数と整数では別けて特殊化するがね

181:デフォルトの名無しさん
09/12/17 14:48:26
漢字やひらがなでソートしたいのですが可能なのでしょうか
もしできるのなら詳しくソースコードを教えてください

182:デフォルトの名無しさん
09/12/17 14:49:25
文字コードそのままでソートしてるんじゃねえの

183:デフォルトの名無しさん
09/12/17 14:50:07
辞書データと比較してだな

184:デフォルトの名無しさん
09/12/17 15:04:33
並べたい順に並べるだけだな。


185:デフォルトの名無しさん
09/12/17 15:11:03
kwsk

186:デフォルトの名無しさん
09/12/17 15:14:02
住所録ソフトとか見たことないの?
漢字使ってる場合とかは読みを別に入力して、その読みの順でソートするんだよ?
読みはローマ字表記のものもあればかな表記のものあるけど
どちらにせよその後は普通のソートだよ


187:デフォルトの名無しさん
09/12/17 15:53:48
漢字に順番なんてものは無いんだから、
比較して自分が並べたい順に並べるしかないだろ。
「太郎」と「次郎」はどっちが先だ?


188:デフォルトの名無しさん
09/12/17 15:57:48
あいうえお順なら、次郎が先、逆順なら太郎
文字コード順なら太郎が咲き


189:デフォルトの名無しさん
09/12/17 16:02:37
DQNネームが流行ってる今、あいうえお順なんてふりがながふってないとムリ

190:デフォルトの名無しさん
09/12/17 16:07:14
太郎と書いて「ジャスティス」と読ませたり
次郎と書いて「つぐろう」と読ませたり
出生届けの読みが自由ってどうなんだろうな

191:デフォルトの名無しさん
09/12/17 16:14:43
>>190
読み仮名を登録しないだけかんだから「読ませ方」も自由なら「読み方」も自由
自分の好きな読み方で処理すれば良い

192:デフォルトの名無しさん
09/12/17 16:15:29
>>190
読みは登録しないだろ

193:デフォルトの名無しさん
09/12/17 16:16:26
それでも客は無茶を言う

194:デフォルトの名無しさん
09/12/17 16:18:22
OPをEDより先にしたいとか、前編より後編を先にしたい場合に
読み以外の何で整列させればいいんだろ


195:デフォルトの名無しさん
09/12/17 16:19:39
× 前編より後編を先にしたい場合に
○ 前編を後編より先にしたい場合に

196:デフォルトの名無しさん
09/12/17 16:21:05
>>194
正規表現
ハードコーディングで頑張れ

197:デフォルトの名無しさん
09/12/17 16:24:26
>>196
正規表現はCで使えたっけ?

198:デフォルトの名無しさん
09/12/17 16:29:36
>>193
「この顧客リストを強い順にソートしてくれ」

199:デフォルトの名無しさん
09/12/17 16:39:49
「グー・チョキ・パーを強い順番にソートしてくれ」

200:デフォルトの名無しさん
09/12/17 18:12:33
テキストファイルの中身を文字コードで出力する方法ないでしょうか?

201:デフォルトの名無しさん
09/12/17 18:14:30
16進ダンプ?

202:デフォルトの名無しさん
09/12/17 18:17:05
>>201
ん〜000000とかの付属情報なしに純粋に文字コードだけ抜き出したいです。

203:デフォルトの名無しさん
09/12/17 18:19:31
文字コードって言ってることがわからないんだけど

204:デフォルトの名無しさん
09/12/17 18:25:04
テキストファイルの中身がunicodeで”あいうえお”と書かれていたら
”3042304430463048304a”と書き出されるイメージです。

205:デフォルトの名無しさん
09/12/17 18:31:57


意外と難しいのがセンタリング
フィールドの大きさをまず測る

一文字だけなら、その中心部分、半分に割った位置にフォントの中心部分を置けばいいが
文字数が増えたときのオフセットの取り方が意外とパッと出てこないもの。

普通にやると
「堀 川 掘 ら れ た 町」
にならず、
「堀川掘      られた町」

みたいになってしまう

206:デフォルトの名無しさん
09/12/17 18:33:34
16進ダンプを基本にして目的のものを書けばいいだけじゃ

207:デフォルトの名無しさん
09/12/17 18:34:50
         ,. ‐''三ヾ´彡シ,=`丶、ヾ´彡シ,=`丶、シ,=`丶、,=`丶、丶、
      /'".:=≡ミ_≧_尨彡三:ヽ、≧_尨彡三:ヽ、彡三:ヽ、三:ヽ、:ヽ、
     //.:;:彡:f'"´‐------ ``'r=:l------ ``'r=:l-- ``'r=:l ``'r=:l 'r=:l
     /〃彡_彡′,.=、 ̄ ̄ ,.=、 |ミ:〉 ̄ ̄,.=、 |ミ:〉,.=、 |ミ:〉、 |ミ:〉|ミ:〉
    'y=、、:f´===tr==、.___,. ==、._ゞ{=、.___,. ==、._ゞ{,. ==、._ゞ{==、._ゞ{._ゞ{
    {´yヘl'′   |   /⌒l′  |`Y} /⌒l′  |`Y}′  |`Y}  |`Y}|`Y}   ああきあきらあきらめあきらめた
    ゙、ゝ)       `''''ツ_  _;`ー‐'゙:::::l{ノ_ _;`ー‐'゙:::::l{_;`ー‐'゙:::::l{‐'゙:::::l{゙:::::l{     そそこそこでそこで試そこで試合
.    ヽ.__     ,ィnmmm、   .:::|!mmm、   .::|!m、   .::|!   .::|! .::|!
   ,.ィ'´ト.´     ´`"`"`゙″ .::::;'`"`"`゙″ .:::;'`゙″ .:::;'″ .:::;' .:::;'
イ´::ノ|::::l \         "'   :::/   "'   :::/'    :::/   :::/ :::/
::::::::::::|:::::l   ヽ、      ..::  .:::/.、   ..:: .:::/.、 ..:: .:::/.、: .:::/.、::/.、
:::::: ::: |:::::ヽ    ヽ、.......::::/..:::/!\\:/..:::/!\\::/!\\ !\\ \
::::::::::: |::::::::ヽ    ``''‐--ァt''′ |!:::ヽ:::\t''′ |!:::ヽ:::\|!:::ヽ:::\:::ヽ:::\:\
:::::::::::::|::::::::::::ヽ、       /i|iト、  |l:::::::ヽ:::::\  |l:::::::ヽ:::::\::::ヽ:::::\:ヽ:::::\:\
:::::::::::::|::::::::::::::/:ヽ、   ∧|i|i|i|〉. ||::::::::::ヽ:::::::\||::::::::::ヽ:::::::\:::ヽ:::::::\ヽ::::::\:\

208:デフォルトの名無しさん
09/12/17 18:47:02
改行はどうするんだろ。


209:デフォルトの名無しさん
09/12/17 18:47:23
>>206
16進ダンプのことあまり理解してなかったみたいなので出直してきます

210:デフォルトの名無しさん
09/12/17 19:38:54
それでいい

211:デフォルトの名無しさん
09/12/17 19:40:49
>>199
      パ
     / | \
   チ  |  グ
  /    チ    \
グ     |     チ
| \    |    / |
|  チ  グ  グ  |
パ    \  /    グ
|  パ  パ  チ  |
| /    |    \ |
チ     |     パ
  \    チ    /
   パ  |  チ
     \ | /
      グ

212:デフォルトの名無しさん
09/12/17 19:56:20
これはひどい

213:デフォルトの名無しさん
09/12/17 21:01:16
>>211
天才現る!
と思ったら、ソートできてねぇ!w

214:デフォルトの名無しさん
09/12/17 21:21:28
あらら

215:デフォルトの名無しさん
09/12/17 23:56:41
>>211
まず配置のルールがわからない
発想はともかくもっと根本的な部分を調整しろよ

216:デフォルトの名無しさん
09/12/18 00:08:46
>>211
ふっ

217:デフォルトの名無しさん
09/12/18 00:39:29
ポインタって、バグがあるのに正常にうごくことがあるから厄介なのかね。

int *p;
{
int x;
p=&x;
}

p[1]=500;
こんなのでも正常にうごいてる(ようにみえる)かもしれないし。

218:デフォルトの名無しさん
09/12/18 00:46:00
>176

>175の方法は普通によくやる。
ていうか>165を見てはじめに思いつくのはこれ。

>178
共用体は、引数に汎用性を持たせたいフレームワーク、メッセージインターフェイス
とかでよく利用する。

後はジャンプテーブルを使うために、関数のプロトタイプ宣言をそろえたいけど、
引数はいろいろあり得るような場合は、引数をvoid*にしたり共用体で渡したりする。

>179
関数のプロトタイプ宣言をそろえるのがミソなので、templateは使えない。


219:デフォルトの名無しさん
09/12/18 00:48:53
>217

そうだね。不具合が発生するのが、全然別の場所、タイミングだったりするのが
やっかいだよね。

220:デフォルトの名無しさん
09/12/18 06:06:03
>>219
たしかにやっかいだよね。

221:デフォルトの名無しさん
09/12/18 09:22:03
>>218
これだけ勘違いカキコする奴もメヅラシイな
普段何やってんだろ??

222:デフォルトの名無しさん
09/12/18 09:25:04
>>218 は別におかしくないぞ

223:デフォルトの名無しさん
09/12/18 09:31:21
俺も>>218はフツーのことを言ってるだけに見える。
別におかしくは無い。

224:デフォルトの名無しさん
09/12/18 10:05:26
>>218
おかしくないと思う

225:デフォルトの名無しさん
09/12/18 10:40:09
>>222-224
最後の行は何か勘違いしているように思えてならないが、
まあスレ違いだしどうでもいいや。

226:デフォルトの名無しさん
09/12/18 10:50:42
可変で関数ってのがあったはず、、、と思って調べてみたら見つかった
va_start
自分は使ったことないけど、これじゃダメなの?
URLリンク(wisdom.sakura.ne.jp)
>printf()関数などは、フォーマット指定子によって引数リストの個数と型をチェックしていますね
と同じように型チェックしてから、、とか


227:デフォルトの名無しさん
09/12/18 11:42:01
ようは、VBでいうVariant型を作りたいのか?

228:デフォルトの名無しさん
09/12/18 11:42:44
かなりダメな気がしてきた、、、

229:デフォルトの名無しさん
09/12/18 11:44:38
C++ならboost::anyが使えるんだけどな

230:デフォルトの名無しさん
09/12/18 11:49:19
>>226
結局、何らかの形で型を示す引数を一緒に渡すわけで
>>165 から何も変わっていない。

231:デフォルトの名無しさん
09/12/18 11:53:27
変わっていないな。

232:デフォルトの名無しさん
09/12/18 12:51:39
なんだよこのグダグダ

233:デフォルトの名無しさん
09/12/18 12:54:29
え?ディグダグ?

234:デフォルトの名無しさん
09/12/18 17:06:34
判ってない奴が頑張りカキコ
判ってる奴は奴では一行レスのチャチャ入れるだけだからグダグダになるのは仕方がない

235:デフォルトの名無しさん
09/12/18 17:37:08
それじゃできない。だけど、なにがしたいか分からんので、茶々入れるしかない。

236:デフォルトの名無しさん
09/12/18 19:25:04
>>235
> なにがしたいか分からんので、茶々入れるしかない。
もう一度 冷静に自分の言っていることを検証したまえ。

237:デフォルトの名無しさん
09/12/18 19:43:03
お、おれは分かってるよ。

キャッチコピーは「戦略的穴掘りゲーム」だろ?

238:デフォルトの名無しさん
09/12/18 19:50:19
ほとんど全てのレスに対して間違い探しゲームが成立してしまうのがこのスレッドの凄いところ

239:デフォルトの名無しさん
09/12/18 20:02:52
ライアーゲームは情報弱者には辛かろうな

240:デフォルトの名無しさん
09/12/18 22:49:36
::

よくバイソンとかシーインクリメントとかで見るんだけど
なんこれ。

241:デフォルトの名無しさん
09/12/18 23:27:25
>>237
戦略的穴掘りゲームおもしろそう

242:デフォルトの名無しさん
09/12/18 23:29:49
アッー

243:デフォルトの名無しさん
09/12/19 00:05:15
int main(void)
{
int num = 567;

num = num / 10;
num = num % 10;
printf( "%d\n", num );

return 0;
}


これを剰余演算を使わずに書きたいんですが、できますか?

244:デフォルトの名無しさん
09/12/19 00:10:37
dividend = quotient * divisor + remainder
remainder = dividend - quotient * divisor


245:デフォルトの名無しさん
09/12/19 00:13:09
num % 10

num - (num / 10) * 10
にする。

246:デフォルトの名無しさん
09/12/19 00:19:58
>>243
int num = 6:

247:デフォルトの名無しさん
09/12/19 00:20:34
以上です。

248:デフォルトの名無しさん
09/12/19 00:24:55
>>247
itoaを使う方法考えてたのに〜

249:デフォルトの名無しさん
09/12/19 00:26:13
That's all.

250:デフォルトの名無しさん
09/12/19 00:30:20
>>248
すまんな…

251:デフォルトの名無しさん
09/12/19 07:11:41
>240

シーインクリメントとは斬新な呼び方だね。
けどなぜCスレで聞く?

もしかしてスルーが正解だったか?戦略的穴掘りに落ちちゃった?


252:デフォルトの名無しさん
09/12/19 08:42:08
fread()とfwrite()の意味を教えてください!

253:デフォルトの名無しさん
09/12/19 09:00:32
#include<stdio.h>

int main(void)
{
int data1 , data2, total, average;


printf("データ1? ");
  scanf("%d",&data1);
printf("データ2? ");
scanf("%d",&data2);

total = data1 + data2;
average = total / 2;


printf("合計 :  %d\n",total);
printf("平均  :  %d\n",average);


return 0 ;

}

何が間違っているか教えてくれないでしょうか?

254:デフォルトの名無しさん
09/12/19 09:11:20
最初のscanfの前の全角スペース?

255:デフォルトの名無しさん
09/12/19 09:12:04
>>253
何を聞きたいのか書いてないから
質問の仕方が間違ってるんじゃないの?

256:デフォルトの名無しさん
09/12/19 09:29:38
ディグダグ?

257:デフォルトの名無しさん
09/12/19 09:54:57
double average;
average=total/2.0;

もしかしてこれがしたいのでは無かろうか

258:デフォルトの名無しさん
09/12/19 10:00:03
>>257
言っておくがそれも間違いだからな
average = (double)total / 2.0;
じゃなきゃおかしなことになる

259:デフォルトの名無しさん
09/12/19 10:03:06
お前は何を言っているんだ

260:デフォルトの名無しさん
09/12/19 10:11:30
>>258
つられクマー。

261:デフォルトの名無しさん
09/12/19 10:59:48
また、scanfを連続させるときは

scanfが取ったバッファをクリアしてからでないとうまく取れない。

stdinから取ったら、stdinバッファをカラにしてから別のを取らないといけない

scanfは対象の変数のアドレスに値を入れるのではなく
stdinから取得バッファに入れてそこからアドレスに入れるのだ

262:デフォルトの名無しさん
09/12/19 11:10:03
>>258
何のための2.0だよ

263:デフォルトの名無しさん
09/12/19 11:26:31
malloc→freeと処理すると使っていたポインタはNULLポインタを指しますか?
それともmallocで確保したときのアドレスを保持したままですか?
まったく別でしょうか?

264:デフォルトの名無しさん
09/12/19 11:30:03
mallocで確保したときのアドレスを保持したままです
NULLを指すようにしたければ自分でNULLを代入してください

265:デフォルトの名無しさん
09/12/19 11:31:34
ありがとうございます

266:デフォルトの名無しさん
09/12/19 11:32:12
いえいえ

267:デフォルトの名無しさん
09/12/19 11:37:44
なんかいでもfreeしてやる

268:デフォルトの名無しさん
09/12/19 11:52:06
ポインタをfreeとかで開放するのって
メモリが有限だから?
仮にメモリ領域が無限だったらfreeしなくていいの?

269:デフォルトの名無しさん
09/12/19 11:54:24
駄目に決まってんだろカス

270:デフォルトの名無しさん
09/12/19 11:55:57
メモリが有限だからです
無限だったらしなくていいかもね

271:デフォルトの名無しさん
09/12/19 12:06:10
無限のメモリ領域なんて実現不可能なんだからその仮定は無意味

272:デフォルトの名無しさん
09/12/19 12:09:36
アドレスが足りなくなるからアウトだろ雑魚が

273:デフォルトの名無しさん
09/12/19 12:10:25
仮想メモリか。

274:デフォルトの名無しさん
09/12/19 12:50:23
俺が気に入らないもの
シミカァロン(英語は発音大事)抜き

ThisIsAPointerForMalloc = Mr_malloc(FUCKINGTOSHINGBUFFERSIZETHATFUCKINGOSINGXING)

if(ThisIsAPointerForMalloc == NULL)
  Fucking


なんかムカつく

普通は

if( (ThisIsAPointerForMalloc = Mr_malloc(FUCKINGTOSHINGBUFFERSIZETHATFUCKINGOSINGXING)) == NULL)


だろ


275:デフォルトの名無しさん
09/12/19 12:52:19
一生懸命長い綴り打ち込んでるのかと思うと目頭が熱くなる

276:デフォルトの名無しさん
09/12/19 12:53:28
また、defineは大文字で
っていう縛りもムカつく

ネイティブから見ると、大文字ってのは大声で叫んでるようにしか見えない。

つまり
FUCKINGOSINGXING
ってのは

FuckingOSingXing!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


って怒りながら叫んでいるように見えるのだ。


それと自分で書いておいてなんだが
is の i だけ大文字にするとすげえ不自然きわまる。


277:デフォルトの名無しさん
09/12/19 13:00:31
そうだねピカチュウだね

278:デフォルトの名無しさん
09/12/19 13:04:00
カビゴン♀って何かムラムラくるよね

279:デフォルトの名無しさん
09/12/19 13:42:47
例えばこんなものがあるとしよう

free(void*)

char *Memory_of_Love;

Memory_of_Love = (char *)malloc(MemorySize512);


ここで
free((void *)Memory_of_Love)


これも何だかなあと思う
void * は別の型にキャストできても
他の型からvoid* にはできないはずである。

またvoid*は「何の型でもいい」から、そのまま渡せば何が来てもウェルカムだから
キャストしても意味あらへん

280:デフォルトの名無しさん
09/12/19 13:45:21
誰も聞いてないから、チラシの裏にでも書いといてくれる?

281:デフォルトの名無しさん
09/12/19 14:19:13
ヤキソバうまかったわ
満足です

282:デフォルトの名無しさん
09/12/19 14:24:02
妄想上の相手とシャドーボクシングを始めたら、
林先生の出番だろw

283:デフォルトの名無しさん
09/12/19 14:26:50
亀田が勝ってしまったねえ

284:デフォルトの名無しさん
09/12/19 15:51:01
>>240
シーインクリメントインクリメントのことなら、
俺はシーイクイクって略してる

285:デフォルトの名無しさん
09/12/19 16:26:15
ちょっと心温まる豆知識
インクリメント・デクリメント・サクラメント・ハラスメント



Cだと++って書けば自動的に値が1増えるし
--って書けば自動的に値が1減るが

CPUの機能として、そのようなものを持っていないものが多い。
特にRISC。
これらのCPUではアセンブラになると逆にそういうことができない。
1命令で値を増減させることが出来ないだけで、ADDなどで増やしてやればいいだけだが。



残るサクラメントとハラスメントだが、CPUには何の関係もない。
単なる語呂合わせに過ぎん。

286:デフォルトの名無しさん
09/12/19 16:29:33
CISC はアセンブラで書くために命令が高級なんだよな。
今はもうアセンブラで書くやつはいないから CISC はレガシーだな。

287:デフォルトの名無しさん
09/12/19 16:31:20
>>285
いかにもわかったような口ぶりでウソ書いてるやつってちょくちょく
見るけど、どういうつもりなのかマジで疑問。

288:デフォルトの名無しさん
09/12/19 16:35:40
>>286
SSE3だのSSE4だのコンパイラが上手く扱えない妙な命令が次々に増えていく現状をどう見るかね

289:デフォルトの名無しさん
09/12/19 16:36:38
俺の大好きなSHや、PowerPC、ARMはアセンブリ命令としてインクリメント・デクリメント命令がある。
が、いろんなところでよく使われるMIPSはそんな便利な命令はない。

むしろ、インクリメントなどの命令があるSHとかがRISC陣営では異端中の異端


290:デフォルトの名無しさん
09/12/19 16:39:46
>>286
それ、認識が十数年くらい遅れてる。

291:デフォルトの名無しさん
09/12/19 16:40:54
SPARCのinc %regは add %reg, 1, %reg のマクロだけど
結局1命令なので実質あるのと同じ

292:デフォルトの名無しさん
09/12/19 17:05:40
また湧いてきたか

293:デフォルトの名無しさん
09/12/19 17:20:40
インクリメントするやつはちゃんとCPUさんありがとうコンパイラさんありがとうって
感謝しながら使えよ

あと風呂でションベンするときはお風呂の神様ごめんなさい


294:デフォルトの名無しさん
09/12/19 17:56:28
>>279
> void * は別の型にキャストできても
> 他の型からvoid* にはできないはずである。
逆だ。

295:デフォルトの名無しさん
09/12/19 18:48:15
>>294
いやあってる。
char *p;
if ((p = malloc(sizeof(struct hoge))) == NULL)
とかけるのは >>279 があっている証拠

296:デフォルトの名無しさん
09/12/19 19:14:04
できる/できない、で言えば間違いだろ

297:デフォルトの名無しさん
09/12/19 19:39:58
>>294-296
279は暗黙のキャストも知らないような
自称上級者なんだから触れんな。

298:デフォルトの名無しさん
09/12/19 20:11:55
>>297
あえて明示的にキャストすることでソースの可読性がうんたらかんたら



とかゴチャゴチャ言い出すぞきっと

299:デフォルトの名無しさん
09/12/19 20:23:48
>>279
>void * は別の型にキャストできても
>他の型からvoid* にはできないはずである。

>他の型からvoid* にはできないはずである。
が、まさしく「自分は初心者です」ってアピールしてるんだよな。

300:デフォルトの名無しさん
09/12/19 20:33:43
自分は初心者なはずである。

301:デフォルトの名無しさん
09/12/19 20:37:53
ポインタ変数なんてどんなものだろうが実態はただのINT型の整数なんだからキャストできないわけないじゃん。

12345678って書くか[12345678]って書くかの違いだけで。

302:デフォルトの名無しさん
09/12/19 20:49:04
>>301
ポインタが int という仮定は例外が多い。

303:デフォルトの名無しさん
09/12/19 20:54:54
>>301
ポインタは「整数型」への変換は保証されているが
「int」への変換は保証されていない。
(逆変換で戻したときに情報が失われる可能性がある)

304:デフォルトの名無しさん
09/12/19 21:17:28
倍数判定機を作ろうと思ったのですが、エラーが出てうまくコンパイルできません
どこが間違っているのでしょうか

#include<stdio.h>
void baisuu(int y)
{
int b;
for(b=2;b<=20;b++)
{
if(y%b)
printf("%dの倍数です",b);
}
int main(void)
{
int x;
printf("整数を入力してください\n小数点以下は切り捨てます\n");
scanf("%d",&x);
baisuu(x);
return 0;
}

305:デフォルトの名無しさん
09/12/19 21:24:07
>>304
!

306:デフォルトの名無しさん
09/12/19 21:30:07
(無保証な)ヒント:
論理式に単項式だけを書くやり方
そう if( y % 3)とかwhile( !p )とか
はかっこいい
ように見えて実は
古くダサい
し、下らないミスの温床

if( (y % 3) != 0)とか
while( p != 0 )とか
書く癖のほうが類似書式のプログラミング言語(Javaとか)
も使うようになった時を考えるといい

307:デフォルトの名無しさん
09/12/19 21:31:00
>>304
void baisuu(int y)にも}が足らん

308:デフォルトの名無しさん
09/12/19 21:37:54
とりあえず>>306 >>307の指摘部分を直したのですが
今度は「左辺値が必要」というエラーが出て
うまく倍数判定もできません

void baisuu(int y)
{
int b;
for(b=1;b<=20;b++)
{
if((y%b)=0)
printf("%dの倍数です\n",b);
}
}

309:デフォルトの名無しさん
09/12/19 21:42:51
int a,shidt;
ととして
((a-shift)?(a-shift):2)
の演算でおかしな挙動するので調べてみたら
a-shiftがマイナスでも真と判定されてた
(((a-shift)>0)?(a-shift):2)
としたらちゃんと動いた
真と偽の動作を勘違いしてました


310:デフォルトの名無しさん
09/12/19 21:43:31
>>308
それは代入だろ。

y % b == 0

311:デフォルトの名無しさん
09/12/19 21:45:36
>>310
おお、ちゃんと動きました
=と==の違いを忘れてました

312:デフォルトの名無しさん
09/12/19 21:54:24
意外と中級車も=と==を間違えるんだよなぁ
さすがに上級者はそんな間違いをする人はいなくなるが。

313:デフォルトの名無しさん
09/12/19 22:01:51
代入演算子 = が悪い。
どうしてこうなったのか。

おかげで等価演算子は == という悲しさ。。

314:デフォルトの名無しさん
09/12/19 22:07:20
比較式より代入式の方がソースコード中の出現確率が多いを思ったから代入を=にして比較を==にしたんだろ
面倒なことはできるだけしない、可能な限りシンプルにしたい、そう考えると納得がいく

315:デフォルトの名無しさん
09/12/19 22:22:54
五目並べの盤面評価関数ってどんなふうに作ったらいいと思う?

316:デフォルトの名無しさん
09/12/19 22:49:47
>>314
pascal のように代入を := にし、比較は == にすれば公平でいいかも。

317:デフォルトの名無しさん
09/12/19 23:02:43
pascal が嫌いな人が作った言語でか

318:デフォルトの名無しさん
09/12/19 23:08:46
=と==を間違えるなんて都市伝説だろ?
おれはめっちゃ初心者のときしか間違えてないよ。

319:デフォルトの名無しさん
09/12/19 23:19:27
確かに、ほとんど間違えないんだが、コーディング規則がちゃんとしていないと、いったん間違えると発見困難になることがある。
20年前は、
char *p, *q;
...
if (p = q) {...}
で、この = は間違ってないというような書き方が普通に行われていた。

320:デフォルトの名無しさん
09/12/19 23:29:35
ソースは可能な限り短いほうがいい。

…みたいな考え方のアフォとは一緒に仕事したくないな。

321:デフォルトの名無しさん
09/12/19 23:33:07
>>319
それは、今は警告でるし。

>>320
そういうのは状況によるとしかいいようがない。
「冗長に書けば書くほどわかりやすい」とか思ってるやつも勘弁して欲しいし。

322:デフォルトの名無しさん
09/12/19 23:35:15
変数は可能な限り少ない方が良い。
繰返し回数は可能な限り少ない方が良い。

323:デフォルトの名無しさん
09/12/19 23:40:12
>>319
30年前の間違いだろ。
20年前は既に警告出すコンパイラが主流だし
わかりやすさを優先することが当然になっていたよ。

まあ類は友を呼ぶというから
そういう人達の間ではそれが普通だったのかもしれんがね。

324:デフォルトの名無しさん
09/12/19 23:42:29
>>320そういうひとって
printfもpfとかに名前をかえて

int a;
void f(){
pf("asdf");
}

こんなことしたがるような人?

325:デフォルトの名無しさん
09/12/19 23:43:27
いや、それは論外すぎるだろ…

326:デフォルトの名無しさん
09/12/19 23:48:26
>>253です。
質問内容はコンパイルの出来ない理由を御聞きしました。
どうやら原因は全角スペースに問題があったみたいです。
回答してくれた方ありがとうございます。

327:デフォルトの名無しさん
09/12/19 23:49:58
>>322
そういう考えでできたのが構造体やクラスや配列なんだろうな

int Taro_age;
int Taro_ID;
char* Taro_Name;
char* Taro_EmailAddress;

int Hanako_age;
int Hanako_ID;




みたいに一個一個作ってたら大変だし。

328:デフォルトの名無しさん
09/12/20 00:13:15
int x;
int* p;
p=&x;
printf("%d",p);

この結果が毎回違うのはなぜ?
アドレス固定することはできないの?

329:デフォルトの名無しさん
09/12/20 00:17:15
>>328
pに格納しているxのアドレスを表示している

330:デフォルトの名無しさん
09/12/20 00:20:13
変数xが格納されているメモリの位置はOSが管理している

331:デフォルトの名無しさん
09/12/20 00:21:19
int x;
int* p;
p=&x;
printf("%d",p);

int x;
int* p;
p=&x;
printf("%d",&x);

int x;
int* p;
p=&x;
printf("%d",*p);

int x;
int* p;
p=&x;
printf("%d",x);

332:319
09/12/20 00:28:57
>>323
少々遅レスで悪いが、30年前だと、K&Rの出版年になっちゃいますね。
20年じゃなくてもう2,3年前かも知らんけど、warningがたくさん出るようになったのは ANSI-C普及と同時期だったような気がする。
前のは例が悪かったけど、少なくとも当時は、
while (!(p = p->next)) { ... }
といった書き方はごく普通だったと思うし、悪いともされてなかったと思う。

このスレでもキャストうざい派がいるように、いまだに警告無視する人はいるみたいですよ。

333:デフォルトの名無しさん
09/12/20 00:32:26
>>318
俺もそう思ってたが
先週 != を ! = と書いて
すっげー落ち込んだ

334:デフォルトの名無しさん
09/12/20 00:34:54
警告ってなんなん?問題があるならエラーにしろや

335:デフォルトの名無しさん
09/12/20 00:35:38
>>332
確かに、警告を出すのは比較的あたらしいコンパイラって印象がある。

そもそもこの警告って、C言語の文法に違反してるとかじゃなくて
よくある間違いだから、って理由だしね



336:デフォルトの名無しさん
09/12/20 00:37:21
int main()は値を返すべき

337:デフォルトの名無しさん
09/12/20 00:40:36
>>330
プゲラ
トーシロは黙ってろよwww

338:デフォルトの名無しさん
09/12/20 00:41:56
仮想メモリ。。

339:デフォルトの名無しさん
09/12/20 01:30:05
>309

それは可読性を考えたらこっちがよくないか?


(( a > shift) ? (a-shift) : 2)

340:デフォルトの名無しさん
09/12/20 01:34:36
>328

そのコードで&xの値が毎回同じになることを期待してはいけない。

自分でメモリ管理するのでなければ、変数やmallocの具体的な
値については、知らなくてイイし、依存するようなコードを書くべきではない。


341:デフォルトの名無しさん
09/12/20 01:45:17
関数外でxを宣言してみたら

342:デフォルトの名無しさん
09/12/20 01:53:36
せっかくCをやるんだからメモリのことは熟知したい

343:デフォルトの名無しさん
09/12/20 02:37:24
初心者です。文字列のコピーについてです。

char a[10];
strcpy_s(a, "こんにちわ"); ・・・・・・・ これは正常に動きます。
a = "こんにちわ" ・・・・・・・ これはエラーになります。なぜでしょう。

a は配列の先頭アドレスです。"こんにちわ"も配列の先頭アドレスです。
a = "こんにちわ"は、アドレスをコピーするだけなので正常に動く気がしてしまうのです。

エラーメッセージは、「const char [11]' から 'char [20]' に変換できません。」です。
変換?「=」は代入を行っているわけではないのでしょうか?

344:343
09/12/20 02:38:14
char a[10]; は char a[20]; にしてください。

345:デフォルトの名無しさん
09/12/20 02:45:40
配列の場合、変数なのは中身であって、配列を示す a 自体は変えられない。


346:デフォルトの名無しさん
09/12/20 02:49:45
"こんにちは"

347:343
09/12/20 02:58:26
>>345
ありがとうございます。ですが難しく、頭の中で理解ができていません。
もう少し優しく教えていただけると助かるのですが・・・。

348:デフォルトの名無しさん
09/12/20 03:04:01
char *a;
a = "こんにちわ";

349:デフォルトの名無しさん
09/12/20 03:17:27
エラーメッセージをよく読みませう

350:デフォルトの名無しさん
09/12/20 03:19:20
>>343
これを試してみ

char a[11];
a = "こんにちわ";

VBとかJavaに慣れてると、Cの配列や文字列は扱いづらいよね
最初のうちは参考書をちゃんと見た方がいいよ

351:デフォルトの名無しさん
09/12/20 03:26:34
a[10]が '\0' ってこと?

352:デフォルトの名無しさん
09/12/20 03:42:52
>>347
配列と文字列リテラルは一緒じゃないよ。

文字列リテラル"こんにちは"は、その時点でメモリのどこかに確保されてるわけじゃない。
確保されてない領域のアドレスを代入しても意味が無い。
配列がポインタに成り下がるのは"右辺"のみ。配列の内容はあくまで[20]の部分。
アドレスじゃなくて配列の内容を書き換えたいのだから、単純な代入ではできない。

353:デフォルトの名無しさん
09/12/20 04:06:47
char a[20] = "こんにちわ";

char *p = "こんにちわ";
は全くの別物。

354:デフォルトの名無しさん
09/12/20 04:12:26
将来的に
char a[20]="因習文法";
は禁止される予定

SJISとして
char a[20]={ 0["一貫文法"],1["一貫文法"],2["一貫文法"],3["一貫文法"],
4["一貫文法"],5["一貫文法"],};
てな感じしか許されなくなる可能性も示唆

355:デフォルトの名無しさん
09/12/20 04:13:32
>>350
バカ?

356:デフォルトの名無しさん
09/12/20 05:08:58
>>350>>355の1.1倍バカだね

357:デフォルトの名無しさん
09/12/20 06:20:56
>>343
配列とポインタ、アドレスの理解がごちゃごちゃになってるからそうなる。

358:デフォルトの名無しさん
09/12/20 06:40:45
だそうです!

359:デフォルトの名無しさん
09/12/20 07:41:09
モンスターが勝手に穴掘って落石連鎖に巻き込まれてる雰囲気
もちろん特点加算無し

360:デフォルトの名無しさん
09/12/20 07:59:15
残機も無し

361:デフォルトの名無しさん
09/12/20 08:02:19
あと数十年後
メモリが100GB、CPUの処理速度も今の数百倍とかになったら
C言語も変わるかなぁ

362:デフォルトの名無しさん
09/12/20 08:57:45
>>350の言うようにしても>>343と同じ結果になるだけ。
>>350は文字列と配列をなんにも分かってない。

363:デフォルトの名無しさん
09/12/20 09:29:34
>>361
そりゃスタイルは多少変化するだろうけど
コンピュータの仕様が根本的に変わらない限りCに望まれる働きも変わらないはず
新しい環境に合わせたプログラミングモデルを作るのはむしろ派生言語の役目だと思う

364:デフォルトの名無しさん
09/12/20 09:45:20
>>363
お前には言ってないからw

365:デフォルトの名無しさん
09/12/20 09:46:16
>343

とりあえず、「配列には代入できないから」と思ってください。

正確には、配列は式の中では、「その先頭要素を指すポインタ」
として評価されるが、それは「代入できない左辺値」であるから。

ついでに(初期化付き)宣言と式では文法が別物になっている。

char a[20] = "hello";
はOK

char a[20];
a = "hello";
はNG


366:デフォルトの名無しさん
09/12/20 09:52:41
>343

疑問の主旨とは変わるけど
strcpy_sだったら、そのコードコンパイル通らないんじゃないの?

CRT-Cだと思うから、こんなコードじゃね?
strcpy_s(a, sizeof(a), "hello");


367:デフォルトの名無しさん
09/12/20 09:55:14
初期化付き宣言でややこしくなってるのだなぁ
と思う

368:デフォルトの名無しさん
09/12/20 10:02:38
まあちょっと、誰もが一度は通る道だよな。
そして、だれもが曖昧な理解だけで通り過ぎていく箇所だわな。

369:デフォルトの名無しさん
09/12/20 10:05:55
>352

ちょっと説明が怪しいぞ。
Cの文法のイヤらしいところでわかりにくいのだけれどさ。

文字列リテラルの型はconst char[文字列長]で、普通は
書込不能な静的メモリ領域に置かれる。これは>343
でエラーになることとは直接関係ない。

「配列がポインタに成り下がるのは"右辺"のみ。」
はそんな感覚でよいと思うけど、正確には
「配列を評価すると代入できない左辺値となる」

char a[10];
a[0] = 1;

は左辺だけど、ポインタとして評価されている。

370:デフォルトの名無しさん
09/12/20 11:19:19
メモリ管理は、いっぺん自分でやってみたほうがいい。
最近は大学でさえ教えないからな
俺のときはやったのに



371:デフォルトの名無しさん
09/12/20 11:29:46
メモリ管理って?
Z80を使ったアセンブラ演習はした。
テンキーでマシン語入力して実行させるんだよな。
ステップ実行でメモリを観察しながら。

372:デフォルトの名無しさん
09/12/20 11:31:34
言ってみれば、自分でOSを構築するってことだな

メモリ管理に留まらず、スレッディングやマネジメントも含まれる。

聞いたら、そういうの今の大学じゃやってねえっちゅう話じゃねえか


なもんで、リバースエンジニアリングすらも満足に出来ないと。
それできないとウィルスのリバースエンジニアリングも出来ない=検知できない
だからセキュリティ業界は人材の確保が大変だとよ

373:デフォルトの名無しさん
09/12/20 11:39:35
アセンブラのみでBIOSを構築したり、OS作ったり
とにかくありとあらゆる既存のライブラリやミドルウェアなどを使わずに
自分で何もかも構成した。売り物には、かなわないにしろな
HDDの制御やファイルシステムなども自分で考えて構成したりした。

普通大学つったらそういうことやるだろ
が、今は何かねむたいことを言ってやらないと。

374:デフォルトの名無しさん
09/12/20 11:53:00
だから独り言なら他所でやれよ

375:デフォルトの名無しさん
09/12/20 12:20:43
やだやだー

376:デフォルトの名無しさん
09/12/20 12:31:25
char a[10]; の a の部分はラベルだとでも考えたら良い。


377:デフォルトの名無しさん
09/12/20 15:50:09
ツェーの仕様上、アドレスの受け渡しは

明白に誰が何に使っているか分かってないものは渡せません!

っていうお約束がある。


「こんにち波」っていうのは、あくまでも「まだどこにも属しておらず、アドレスともデータとも認められていない」
状態である。そのソースを呼んだ感じで言えば。


「文字列は連続したアドレスに入れられるよ」って言うのは人間だから分かっているだけで、
コンピュータ内部では「まだどこにもンなもんあらへんやん」という未知の物体なのである。


それと、アドレスだけでは「どこからどこまでか」が分からないので
これも単純にやりとりするわけには行かんのである。
配列は長さが明白に分かってるポインタのようなものだから、
それが分からないポインタには単純に代入できない。

378:デフォルトの名無しさん
09/12/20 15:52:46
          ___
         ξ _ ヽ
           ̄ ├-┤
    / ̄ ̄ ̄\)〆 |
    |       \ |
    ‐∩∩―┐   ||
     |・ ・   |   |│  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    ┗ ^ ┛ |    | | <  ツェー!!!
    /777^l |    ||   \
    ) ̄ ̄_ノ__|   lヽl|     ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  ,―  ̄ ̄_η_|/V^  |
  l   ̄ ̄|_Ξ)/   |
  `‐―┬┘\/   |
      |        | 
      |  〇     | 
      |        |
      |__∧___|
      |   |   |    ∩ 
      |   |__|_ __ ∫ )
      |       \ ̄ ノ 
      `―┬‐―┬‐┘ ̄  
        /  /
      /  /
     /  /
,〜^⌒\__/

379:デフォルトの名無しさん
09/12/20 16:47:46
byte* p=malloc(10000);
free(p);

これを行うと何がおこる?
mallocで確保した10000個の領域が全部開放されるの?

380:デフォルトの名無しさん
09/12/20 16:54:26
連続したbyte10000個分の領域1つが解放される

381:デフォルトの名無しさん
09/12/20 16:59:09
だよね。
じゃあbyte* p=malloc(10000);
ってのは悪いやりかた?

382:デフォルトの名無しさん
09/12/20 17:11:59
何でそう思うの?
byteのサイズがいくつになるかわからんから、 sizeof (byte) * 10000 で

383:デフォルトの名無しさん
09/12/20 17:12:43
つ「メモリリーク」
一般的なOS上で動く寿命の短いソフトなら起こっても大した問題は起きない
デーモンとかサービスみたいな起動しっぱなしのソフトや低レベルなソフトとかだと死亡

384:デフォルトの名無しさん
09/12/20 17:12:46
って可変にしたけりゃrealloc使えばいい

385:デフォルトの名無しさん
09/12/20 17:15:48
>>379-384
これこそ、なにがしたいのかわからん質問。

386:デフォルトの名無しさん
09/12/20 17:51:20
>>371
Z80 にステップ実行させる機能(内部割込み)はない。それはZ80 ではないのでは?

387:デフォルトの名無しさん
09/12/20 17:57:18
>>384
過去にmalloc()/realloc() したときに取得したサイズを、現在 get できればいいのですが。
やっぱりどこかに覚えとくしかないか。

388:デフォルトの名無しさん
09/12/20 17:57:58
Z80 のエミュレータかもしれない

389:デフォルトの名無しさん
09/12/20 18:01:12
疑問の全てに実用性を求めることの意味を問いたい

390:デフォルトの名無しさん
09/12/20 18:10:15
>>389
答えられない質問には、その質問自体が無意味であることを主張した方が
自分の優位性を保てるから

391:デフォルトの名無しさん
09/12/20 18:25:15
すいません。流れをぶった切って質問します。

今、10日くらいでhelloから始まり今if文とかの入門書に書いてある
関数の基礎を一回ずつコンパイルしました。
それから配列についてちょこっとやってます。
それで今 実行の引数やポインタに進んでいます。

そこで、勉強法としてそのまま先に進めていっていいのでしょうか?
それとも変数や配列を極めたほうがいいでしょうか?

ちなみに自分はあんまり関係ない機械関係の運用の仕事をしていてすぐに実務に使用するわけではありません。
目的は、プログラミングの勉強をしてゲームプログラムを自分で作れるようになりたいです。

392:デフォルトの名無しさん
09/12/20 18:27:43
>>387
内部的には持ってるだろうけど、通常の方法では無いね。
まあ最後のメンバーが可変長の構造体作って管理する手もある。

393:デフォルトの名無しさん
09/12/20 18:28:19
>>391
訳分からなくてもとりあえず最後までやる
同じ本を何度かやってりゃ分かるようになる

クズ本じゃなければの話だけど

394:デフォルトの名無しさん
09/12/20 18:29:52
まあ先に進んでも、いずれどこが理解してないのかが分かってくるんじゃね?
途中の部分を極めるって考えはどうなのかね

395:デフォルトの名無しさん
09/12/20 18:37:39
いいんじゃないかな。どうでも

396:デフォルトの名無しさん
09/12/20 18:38:16
一回だけしかコンパイルしないんじゃ、理解しないまま先に進んでないか?

397:デフォルトの名無しさん
09/12/20 20:09:23
>>386
ICEとかエミュとか上位互換のカスタムチップとかクロックそのものを止めるとか、
いくらでもステップ実行させる方法はある。
今は学習用だとWin上でエミュが主流だから、テンキー入力するのはちょっと前の世代か
ハンダ付けの実習も兼ねてるか。

398:デフォルトの名無しさん
09/12/20 20:14:16
じゃあここをこう変えたらどうなるんだ?という疑問が沸く。
  ↓ ↑
コンパイル&検証orエラー

このプロセスを経ずして理解できたなどと、おこがましいとは思わんかね?

399:デフォルトの名無しさん
09/12/20 20:34:15
⊂⌒~⊃。Д。)⊃ ピクピク

400:デフォルトの名無しさん
09/12/20 20:39:28
>380
まちがい。なぜわざわざ嘘を教えるの?それともマジ?
C++のnew、deleteと勘違いしていないか?

>379, >381

>380は間違い。

>379自体は問題ない。
ただし1000がsizeof(byte)の倍数になっていないと、
pを使うときに問題が起こるかも。>382はそのことを言っている。





401:デフォルトの名無しさん
09/12/20 20:43:49
setupファイルが簡単に作れるC++の統合開発環境を教えてください.net以外で

402:デフォルトの名無しさん
09/12/20 20:47:26
教えてくれるといいですね

403:デフォルトの名無しさん
09/12/20 21:02:37
質問です。コマンドラインで-Dと指定したときに条件付けしようとしています。
次のように書くと動作するのですが
while(--argc > 0 && (*++argv)[0] == '-')
if((*argv)[1] == 'D') debug = 1;

while(--argc > 0 && (*++argv)[0] == '-' && (*argv)[1] == 'D')
と書くと動作しません。
2個目の条件(*++argv)[0]でargvが1進み、3個目の条件では+1されたargvが参照されると期待しているのですが、
こうはいかないのでしょうか。
ちなみに、
while(--argc > 0 && (*++argv)[0] == '-' && (*++argv)[1] == 'D')
とした場合segmentation errorとなります。
また3番目の条件をargv[0][1]=='D'などと指定してもうまくいきません。
whileの条件中だけで全て条件付けることはできないのでしょうか。

404:デフォルトの名無しさん
09/12/20 21:05:18
>>403
目的を達するために getopt を使うとか strcmp で比較するのはどう?

405:デフォルトの名無しさん
09/12/20 21:06:48
3つ並べた時の短絡評価って保障されてんの?

406:デフォルトの名無しさん
09/12/20 21:10:58
>377
ネタにマジレスするのは、どうかと思うが、つっこんでみる。
怪しい知識をたとえ話にするから、よくわからんぞ。
知らない人は理解できないだろうから、誤解しようも無いが・・・・・・。

>明白に誰が何に使っているか分かってないものは渡せません!っていうお約束がある。
そんな約束はない。Cのポリシーは、明示的にせよ、暗黙にせよソースにかかれたものは
その通り実行する、である。だからポインタにどんな値がセットされていようが、その通り動作しようとする。

>「こんにち波」っていうのは、あくまでも「まだどこにも属しておらず、アドレスともデータとも認められていない」
状態である。
リテラルはコードの中に埋め込まれている。メモリ上に置かれているからポインタも取れる。

>配列は長さが明白に分かってるポインタのようなものだから
配列とポインタは別物。




407:デフォルトの名無しさん
09/12/20 21:12:54
クラックするのにC言語使ってる人っているの?

408:デフォルトの名無しさん
09/12/20 21:13:57
>>403
debug=1 はどこにあるの?

409:デフォルトの名無しさん
09/12/20 21:15:57
>>403
最初の引数が -D じゃなかったらwhileループから抜けてしまって2個め以降の引数を見ないのでは?

410:デフォルトの名無しさん
09/12/20 21:28:53
>403

とりあえず
while(--argc > 0 && (*++argv)[0] == '-' && (*argv)[1] == 'D')
でも問題なさそうだけど。どういう動作を期待しているの?

ちなみに次のように、[]演算子を使って書く方がわかりやすいと思う。
while(--argc > 0 && argv[argc][0] == '-' && argv[argc][1] == 'D')

411:デフォルトの名無しさん
09/12/20 21:33:09
値が0のint型変数2つどうしで引算をすると
すごくでかいint型限界値の値が出ますけど
これって値が0同士の変数で計算はするなということでしょうか?

int table[UCHAR_MAX+1];
char *text = "nanntokakanntoka";
int shift;
int i;

問題の演算: (BMWCT[(UINT)text[i]]-shift)
演算時のそれぞれの値
BMWCT[(UINT)text[i]] ==0;
shift==0;
iは任意


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

5400日前に更新/137 KB
担当:undef