C言語なら俺に聞け( ..
[2ch|▼Menu]
357:デフォルトの名無しさん
08/05/05 17:10:23
>>347
>CってVBにあったLEFTやMIDに当たる関数はないのでしょうか?
ない
>ポインタを使うような関数を自分で作る必要がありますか?
ある

文字列操作の概念自体が違うので、CでVBのようなことをやるという考え自体を捨てること
まずCのやりかたというものを覚えるのが先

358:側近中の側近 ◆0351148456
08/05/05 17:12:08
>>347
(っ´▽`)っ
b = LEFT(a, n)

strncpy(b, a, n);
b[n] = '\0';

b = MID(a, m, n)

strncpy(b, &a[m-1], n-m+1);
b[n-m+1] = '\0'
で。

359:側近中の側近 ◆0351148456
08/05/05 17:13:30
(っ´▽`)っ
最後セミコロンが抜けたが気にしない☆

360:デフォルトの名無しさん
08/05/05 17:14:05
>>347
>CってVBにあったLEFTやMIDに当たる関数はないのでしょうか?
どちらもsprintf()で代用可能。

361:336
08/05/05 17:14:14
>>351->>352
おかげさまでうまく答えも出ました。本当にありがとうございます。


362:344
08/05/05 17:14:54
>>361
俺と一緒に勉強しようぜ

363:347
08/05/05 17:17:36
>>357-360
ご回答ありがとうございました。
サンプルを参考にしながらC勉強をしていきます。

364:側近中の側近 ◆0351148456
08/05/05 17:23:39
(っ´▽`)っ
正確には
(っ´▽`)っ
b = LEFTB(a, n)

strncpy(b, a, n);
b[n] = '\0';

b = MIDB(a, m, n)

strncpy(b, &a[m-1], n-m+1);
b[n-m+1] = '\0';
だ。

strncpyの第3引数はバイト数。
LEFTとMIDを使いたければwcsncpyを使えばいいような気がする。

365:336
08/05/05 17:35:16
>>362
共にがんばりましょう。

366:デフォルトの名無しさん
08/05/05 17:44:26
 unsigned __int32 hentai, doutei;
 hentai = 293317826;
 doutei = 899523;

仮に上のように hentai と doutei に格納された数値において、
hentai += doutei;  // 293000000 + 899253
のように hentai の下6桁を0にして doutei を加算し、下6桁を doutei にしたい。

条件は
if ( hentai > doutei &&
  doutei >= 0 &&
  doutei < 1000000)

で、思いついたのが
hentai = ((hentai / 1000000) * 1000000) + doutei;

納得がいかないのでスマートなやり方教えてくれ。

367:デフォルトの名無しさん
08/05/05 17:50:49
>>366
十分スマートと思うが、どういう点で納得がいかないんだ。

hentai += doutei - hentai % 1000000;

368:デフォルトの名無しさん
08/05/05 17:58:57
>>367
おお、サンクス。
除算か乗算どちらかを一回でも削りたかったんだ。

369:デフォルトの名無しさん
08/05/05 21:57:45
>>363
Basic系から来た人だと right とかも使うんでしょw・・それは置いといて無いものは自作するってのも楽しみじゃないかいな?

>>360
参考までに書いてくれると周りも参考になるとおもう。
せいぜい数行だと思うから sprintf で書いてみてよ。


370:デフォルトの名無しさん
08/05/05 22:12:13
>>369
360じゃないが、こうじゃないかな。
char* left(char *dst, const char *src, int count)
{
sprintf(dst, "%.*s", count, src);
return dst;
}
char* mid(char *dst, const char *src, int pos, int count)
{
return left(dst, src+pos, count);
}


371:デフォルトの名無しさん
08/05/05 23:40:11
C言語用でお勧めのフリーコンパイラを教えてください

372:デフォルトの名無しさん
08/05/05 23:43:44
>>370
おお、%.*s ・・・しらなんだ。

373:デフォルトの名無しさん
08/05/05 23:47:34
>>371
・ GCC (MinGW)
・ Microsoft Visual C++ Express Edition 2008
好きなの選べ

374:デフォルトの名無しさん
08/05/06 00:05:01
>>373
その2つの違いがまったくわかりません…
それとMSの方はC++となってますがC言語にも対応してるんですか??

375:デフォルトの名無しさん
08/05/06 00:08:44
おまえは紹介されたコンパイラについてちゃんと調べたのか?

376:デフォルトの名無しさん
08/05/06 00:09:31
>>374
MSのコンパイラでもCのコンパイルはできます。但し、99年の規格にさえ準拠していないので注意が必要です。
gccは、Cコンパイラではなくコンパイラコレクションです。勿論、CもC++もコンパイルできます。
まぁ、MinGWにしろCygwinにしろ、環境に対する知識が必要にはなります。

377:デフォルトの名無しさん
08/05/06 00:24:49
fputc( )の使い方の説明で

int fputc(int 文字、FILE *ストリーム);

fputc( )関数は、「文字」の下位バイトを、「ストリーム」に結び付けられているファイルにunsigned char型の値として書き込みます。

とあるんですが、上位バイトはどうなるんですか?

378:デフォルトの名無しさん
08/05/06 00:25:59
捨てられる

379:デフォルトの名無しさん
08/05/06 00:26:49
URLリンク(www.bohyoh.com)

380:デフォルトの名無しさん
08/05/06 08:01:36
vistaで動くコンパイラだったら何がいい?
やっぱりbcc、gcc辺りかな

381:デフォルトの名無しさん
08/05/06 09:42:29
VC++ 2008 Express Edition

382:デフォルトの名無しさん
08/05/06 09:53:56
uint16 とか uint8 とかは int とどう違うのですか?

使い方を教えてください。

383:デフォルトの名無しさん
08/05/06 09:54:04
Express Editionとgccの好きな方

384:デフォルトの名無しさん
08/05/06 09:56:25
uint16_t や uint8_t なら標準(C99)で用意されているが
uint16 や uint8 は標準では用意されていない。

385:382
08/05/06 09:59:52
>>384
もう少し詳しくお願いします。

386:デフォルトの名無しさん
08/05/06 10:11:53
>>385
標準で用意されてない以上、
ヘッダファイル内にある定義を見てくださいとしか言いようが無い。

387:382
08/05/06 10:22:11
>>386
ということは・・・

uint16 uint8 はwindows.hとかでも定義されてる分ではなく、

自分の使っているライブラリかなにかで定義されているということですね。

わかりました。 調べてみます。

388:デフォルトの名無しさん
08/05/06 10:24:30
>>387
windows.hにあるかもしれませんが、そこにあったとしても標準とは言えません。
そもそも、あなたがWindowsを使っているのかどうか誰にもわかりませんから。

389:デフォルトの名無しさん
08/05/06 10:25:09
処理系独自に定義されてるかもしれないが、
どの処理系使ってるかも知らんし、
結局自分で調べてくれ、というこった。

390:デフォルトの名無しさん
08/05/06 13:51:05
struct histgram{
int x;
int y[100];
};
void one(struct histgram hist);
void two(struct histgram hist);

int main (void){
struct histgram hist;
int z;
hist.x = 0;
for(z=0;z<100;z++){
hist.y[z]=0;
}
printf("before***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]);
one(hist);
printf("after***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]);
for(z=0;z<9999999999;z++);
return 0;
}

void one(hist){
two(hist);

void two(hist){
int z;
hist.x = 1;
for(z=0;z<100;z++)hist.y[z]=1;
}
とするとtwo(hist)でエラーが起きます。なぜでしょうか?

391:デフォルトの名無しさん
08/05/06 13:57:38
すいません、解決しました。

392:デフォルトの名無しさん
08/05/06 14:00:16
INT_MAX 4bites = 2147483647 < 9999999999

393:デフォルトの名無しさん
08/05/06 14:02:26
やっぱうまくいきません。
struct histgram{
int x;
int y[100];
};
void one(struct histgram hist);
void two(struct histgram hist);

int main (void){
struct histgram hist;
int z;
hist.x = 0;
for(z=0;z<100;z++){
hist.y[z]=0;
}
printf("before***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]);
two(hist);
printf("after***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]);
for(z=0;z<9999999999;z++);
return 0;
}
void two(struct histgram *hist)
{
int z;
hist->x = 1;
for(z=0;z<100;z++){
hist->y[z]=1;
}
}
は何がいけないのでしょうか?

394:デフォルトの名無しさん
08/05/06 14:04:25
two()は構造体のポインタを受け取る関数
main()で呼んでるtwo()に渡されてるhistは構造体そのもの

あと>392

395:デフォルトの名無しさん
08/05/06 14:06:22
bites …くそorz

396:デフォルトの名無しさん
08/05/06 14:11:21
Winでコマンドプロンプトがすぐ終了するのを抑止したいなら、scanf("%*s"); がいい

397:393
08/05/06 14:11:59
URLリンク(www9.plala.or.jp)
ここに、393のようにかけと書いてありました…

393を書き直した正解はどうなるのでしょうか?

グローバル変数を使わずに、n個上の階層から任意の変数を↓に投げて、returnすることなく
処理された任意の変数をn個、n-1個上の階層で使用したいのですが


398:393
08/05/06 14:12:39
>396
ありがとうございます。使ってみます。

399:デフォルトの名無しさん
08/05/06 14:17:24
#define ZETTAI(x) (x < 0) ? -(x) : x

int x;

x = ZETTAI(-9 - 50) + 5;

これでxの中身が59になってしまうのですが、何故でしょうか?
-59をZETTAIで59にした後、5を加算しているはずなのですが

400:デフォルトの名無しさん
08/05/06 14:17:47
>>.397
そこの二つ目のの「seito2」は構造体の配列名。配列名は大抵の場合すぐポインタに成り下がるので、
ポインタを引数としてとるseidesp2()にそのまま渡すことができる。
>>393 の場合histは構造体の単体だから、two(&hist) として呼び出さなければならない。

>グローバル変数を使わずに、n個上の階層から任意の変数を↓に投げて、returnすることなく
>処理された任意の変数をn個、n-1個上の階層で使用したいのですが
言ってる意味がよくわからないが、1つの構造体のデータを再帰的に処理したいのなら構造体のポインタを渡す。

401:デフォルトの名無しさん
08/05/06 14:21:07
コンパイラのエラーメッセージをちゃんと読め。
プロトタイプ宣言と定義が噛み合っていないぞ。
void two(struct histgram hist);
void two(struct histgram *hist)...


402:デフォルトの名無しさん
08/05/06 14:23:09
>>399

x = ZETTAI(-9 - 50) + 5; 

↑は↓のように展開されるから。

x = (-9 - 50 < 0) ? -(-9 - 50) : -9 - 50 + 5;

これはもちろん

x = (-59 < 0) ? 59 : -54;

と解釈されて、xには59が代入される。

マクロZETTAIの正しい宣言は下のようになる。

#define ZETTAI(x) ((x < 0) ? -(x) : x)

もちろん自作などせずにライブラリ関数を使うことが望ましい。

403:デフォルトの名無しさん
08/05/06 14:23:31
>>399
#define ZETTAI(x) (x < 0) ? -(x) : x

#define ZETTAI(x) (((x) < 0) ? -(x) : (x))
にしておてきなさい。


404:デフォルトの名無しさん
08/05/06 14:30:39
>>402-403
上手くいきました
ありがとうございます

ですが、
>x = (-9 - 50 < 0) ? -(-9 - 50) : -9 - 50 + 5;
同じxなのに何故一番右のxだけに+5がくっつくのですか?

405:393
08/05/06 14:30:43
すいません、結構理解に手こずってます。
配列でなく、実体を受け渡しする場合は、
struct histgram{
int x;
int y[100];
};
void one(struct histgram hist);
void two(struct histgram *hist);
int main (void){
struct histgram hist;
int z;
hist.x = 0;
printf("before***%d***%d***%d***",hist.x);
one(&hist);
printf("before***%s***%s***%s***",hist.x,hist.y[0],hist.y[50]);
return 0;
}
void one(struct histgram hist){
two(&hist);
}
void two(struct histgram *hist){
int z;
hist->x = 1;
}

だと思ったのですが、error C2440: '関数' : 'histgram *__w64 ' から 'histgram' に変換できません。
というエラーが出てしまいました。

406:デフォルトの名無しさん
08/05/06 14:36:01
>>404
元のx=の式の一番右の+5がそのまま残っているだけ。

407:デフォルトの名無しさん
08/05/06 14:36:58
>>405
構造体をそのまま渡したいのであれば、アンパサンドをつけてはいけません。

408:デフォルトの名無しさん
08/05/06 14:40:42
>>406
つまり
#define ZETTAI(x) (x < 0) ? -(x) : x を
#define ZETTAI(x) ((x < 0) ? -(x) : x) に変えると

x = (-9 - 50 < 0) ? -(-9 - 50) : -9 - 50 + 5; が
x = ((-9 - 50 < 0) ? -(-9 - 50) : -9 - 50) + 5; になるということですね?

#define ZETTAI(x) (((x) < 0) ? -(x) : (x)) だと
x = (((-9 - 50) < 0) ? -(-9 - 50) : (-9 - 50)) + 5; ですね!

理解できました
丁寧にありがとうございました

409:デフォルトの名無しさん
08/05/06 14:40:56
まぁ、あんなサイトを見ているようじゃいつまでたっても理解できないわな。

410:デフォルトの名無しさん
08/05/06 16:29:22
いいから黙ってstdlib.h::abs()を使え

411:デフォルトの名無しさん
08/05/06 16:49:43
やっぱ自作するより、ライブラリ探したほうがいいのかな

412:デフォルトの名無しさん
08/05/06 16:56:26
absはintだから・・・

413:デフォルトの名無しさん
08/05/06 16:56:59
そりゃそうだが基本的なパーツの使い方を勉強してる初心者にそれは野暮な突込みだ。

414:デフォルトの名無しさん
08/05/06 22:00:03
>>399
悪いことはいわん。inline 使え。
#define は C言語ではない・・マクロは副作用があるからうっかり a++ なんて記述したら・・判るでしょ?


415:デフォルトの名無しさん
08/05/06 22:03:58
inline は C99 からだから

416:デフォルトの名無しさん
08/05/06 22:56:05
>>415

そ、そんなこといいだしたら・・・今から始めるなら新しいツール使おうよって Linux も *BSD も Darwin も普通にクリアしてるし。Windows は今一つ判らないけどまさかそうじゃないの?

417:デフォルトの名無しさん
08/05/06 23:00:59
VC++ は C89 だ

418:デフォルトの名無しさん
08/05/06 23:03:14
まぁ、最適化を当てにして関数にしておけってのはありだがな。

419:デフォルトの名無しさん
08/05/07 08:24:58
すみません質問させてください。
入門書見て書いてるんですが

#include <stdio.h>

int astoi(const char s[])
{
int i;
int number = 0;

for(i = 0; s[i] >= '0' && s[i] <= '9'; i++)
number = 10 * number + (s[i] - '0');
return(number);
}

int main(void)
{
char x[]= "1234";

printf("%d", astoi(x));
return(0);
}

という文字型を数値に変えるプログラムで、
number = 10 * number + (s[i] - '0');
のところで (s[i] - '0') とあるんですがこれはどういう意味なんでしょうか?
この部分を消してみると、変な結果になることは確認したのですが・・・すみません教えてください。

420:デフォルトの名無しさん
08/05/07 09:07:44
>>419
文字を数値へ変換してる
asciiコードとかがポイント

421:デフォルトの名無しさん
08/05/07 11:06:21
誰か>>414
>#define は C言語ではない
の意味を説明してくれないか?

422:デフォルトの名無しさん
08/05/07 11:12:54
>>421
プリプロセッサの範疇だと言うことだろ。

423:デフォルトの名無しさん
08/05/07 12:12:00
>>419
s[i]というのは文字コードが格納されている
'0'というのも、数値の0ではなくて文字0の文字コードが格納されている
'1'は'0'より文字コードが一つ大きいんだ
つまり'1'から'0'を引けば数値の1が返るという仕組み

424:デフォルトの名無しさん
08/05/07 13:12:40
>>419

ASCIIコード表をみると423さんの言ってることがよりわかりやすい思うよ!
ASCIIのコード表はググってもあるだろうし、参考書にも載ってると思う。

425:デフォルトの名無しさん
08/05/07 13:49:07
コンパイラが扱う範疇ではないがC言語の範疇には入るんじゃまいか?

426:419
08/05/07 14:49:58
asciiコード!そういう仕組みなんですか・・・僕友達いないんで、ここで聞かなければ絶対わかりませんでした。
レスしてくれたみなさん、ありがとうございました!

427:デフォルトの名無しさん
08/05/07 15:49:27
プリプロセッサも、C標準に規定されている訳だし、
C言語の一部と考えてもいいんじゃないかな。

プリプロセッサがなきゃコメントすら書けん


428:デフォルトの名無しさん
08/05/07 15:50:27
>>426
せめてGoogleくらいは味方にしておこう。

429:デフォルトの名無しさん
08/05/07 16:00:13
プリプロセッサの問題点はC言語の一部かどうかじゃなくて
コンパイラと完全に独立しているところ


430:デフォルトの名無しさん
08/05/07 16:11:51
問題点ではないだろ

431:デフォルトの名無しさん
08/05/07 16:13:36
問題でしょ。デバッグしにくくなるし、型チェックなども甘くなるし。

432:デフォルトの名無しさん
08/05/07 19:53:41
プリプロセッサ部がCと強く結びついてるからなんだけどマクロの多用はどうかという一意見だす。
#include に変わるものは Cコンパイラに用意されてないし #ifdef のような部分も(あまり好きでないけど)うまく使うといろんな環境に対応したソースをまとめることができる・・

ただ #define で色々マクロ組むのはどうかな。
美しく無いばかりか副作用とバグを引き起こす危険な匂いすらある。置換されて結果コンパイラに渡るけど置換元がどうだったかをコンパイラは知らない・・いろんな落とし穴になる。普通に関数に書くのがいいと思う。

#define CONSTANT_VAL 50
ではな
const int CONSTANT_VAL = 50;

こう書けば char a = CONSTANT_VAL; とした時に警告があるし(アホなことした)と直ぐに気付くわけです。

433:デフォルトの名無しさん
08/05/07 20:00:28
それは別に警告出ないと思う。
マクロは使わなくていいなら使わない方がいいってのは賛成だが、
C++ に比べて C はマクロを使わざるを得ない状況が多いのは確かだな。

434:デフォルトの名無しさん
08/05/07 20:01:59
プリプロセッサディレクティブを勉強して間もない俺とするとすごい便利だと思うんだけど・・・
引数の型気にしなくてもいいマクロとか素敵じゃない?

435:デフォルトの名無しさん
08/05/07 20:03:47
マクロはどう展開されてどう実行されるのかを理解して無いと
バグを生むことがあるってのがアレなんだろうね

436:デフォルトの名無しさん
08/05/07 20:10:13
そんなとうにされつくしてる議論してんなよ・・・・・・・・

437:デフォルトの名無しさん
08/05/07 20:14:03
>>436
入門篇って書いてあるし、議論すればえ〜ねん

438:デフォルトの名無しさん
08/05/07 20:16:43
>>433
私はこのレベルの警告を出すようにしてる。

>>434
そう、ただ型を気にしなくて言いというのは有る意味危険な感覚だと。
#defin abs(x) (x) < 0 ? -(x) : (x) とすれば int, long, double いずれも行けるけど

a = -3;
k = abs(a++);

結果は悲惨になるけど気付きにくいでしょ?
これは関数でなくマクロなんだと意識しなければいけない。何かスマートでないよね。


439:デフォルトの名無しさん
08/05/07 20:19:39
C++ だとそれを何とかするために関数テンプレートが導入されたが、
C だとやっぱどうしてもマクロになっちゃうんだよなあ。

440:434
08/05/07 20:24:50
>>438
マクロの怖さを頭ではなく心で理解したわ

441:デフォルトの名無しさん
08/05/07 20:26:02
ABSにすれば解決

442:デフォルトの名無しさん
08/05/07 20:52:15
馬鹿が使えば包丁も自動車も凶器になる。

443:デフォルトの名無しさん
08/05/07 21:45:43
>>435
それを言ったら無知と無理解はなんだってバグのもとだろ

444:デフォルトの名無しさん
08/05/07 21:51:07
所詮人間一人なんてちっぽけな存在さ。自分一人なんて
この世の60億分の1に過ぎない存在。万能、全知全能、
絶対権力者の人間なんて存在しない。
人間なんて脆い生き物だ。打ち所が悪ければすぐに死んでしまう。
そんなもん。だから、気ぃ張るなや、適当に生きろ。
どうせお前が強がっても、地球の運命までは変えられないから。
せいぜい、政府与党に不満を持って、反対票を民主党に入れるくらいしかぁ
出来んやろ?なっ?俺はずっと共産党に投票してたけどな。

445:デフォルトの名無しさん
08/05/07 22:09:35
マクロを使うと一見上級者のようでかっこいいんだけどね
地道に関数でということかな

446:デフォルトの名無しさん
08/05/07 22:12:57
ふっ、例えポルシェやBMWを運転していようが、軽自動車を運転していようが
同じ道路交通法が適用されている道で守るべきルールは同じさ。
それよりも、ドライバーの運転技術はいかがなものか?他に、
アクセルペダルを思いっきり踏み込めば、エンジンの性能が良い車の方が
加速性は良いが、燃費はかなり悪い。見た目じゃないぜ、人間は。

447:デフォルトの名無しさん
08/05/07 22:15:20
ええいお前のたとえは分かりにくい

448:デフォルトの名無しさん
08/05/07 22:35:14
linuxのコンソール上でカーソルの処理を行いたいのですが、
カーソルの処理には何を使ったらいいのでしょうか?
ncursesはできれば使いたくないです。
URLリンク(oshiete1.goo.ne.jp)
の方法だとカーソルキー押す度に"[b"などと出力されてしまいます。
よろしくお願いします。

449:デフォルトの名無しさん
08/05/07 23:12:49
>434
型を気にしないプログラムがどうなるのか?コンパイラが事前に警告してくれるのはありがたいと思わないと。

450:デフォルトの名無しさん
08/05/07 23:21:56
>>434
昔な、変数を宣言しなくても使えるBASICてのがあってな、綴りのミスを目で探したよ。・
昔な、プロトタイプ宣言のないCコンパイラがあってな、引数の間違いを目で探したよ。

451:デフォルトの名無しさん
08/05/07 23:23:27
FORTRANなら普通の事です

452:デフォルトの名無しさん
08/05/07 23:25:14
>>445
マクロ使っても全然上級者には見えないから安心して関数を使おう


453:デフォルトの名無しさん
08/05/07 23:28:26
可読性、保守性の高いソースを書く人のほうが上級者に見える。
まあマクロはその手段の一つなんだけれども。

454:デフォルトの名無しさん
08/05/07 23:31:13
浮動小数点の定数って定義できるんだっけ?
C++でも未だにマクロ使ってるんだけど

455:デフォルトの名無しさん
08/05/07 23:35:27
別に定数を定義することくらいはできるけど。
ただ、初期化順でハマることはあるかもしれないね。

456:デフォルトの名無しさん
08/05/07 23:37:42
voidポインタの参照先はビットシフトできないのかな?

457:デフォルトの名無しさん
08/05/07 23:40:54
>>456
void*をint*にキャストしてシフトすれば?

458:デフォルトの名無しさん
08/05/07 23:43:20
>>456
何ビット幅でシフトしたいかをコンパイラが判断できない。必要な幅の型のポインタにキャストする必要がある。


459:デフォルトの名無しさん
08/05/07 23:57:36
キャストしたらできた!

これって任意のバイト数を指定することはできないのかな?
mallocで指定しても駄目だったし無理か・・・

460:デフォルトの名無しさん
08/05/07 23:59:21
>>459
> これって任意のバイト数を指定することはできないのかな?
意味不明

461:デフォルトの名無しさん
08/05/08 00:16:42
void*の参照先を任意のビット幅としてビットシフトしたいんです

462:デフォルトの名無しさん
08/05/08 00:18:04
自分でそういうプログラム書け。

463:デフォルトの名無しさん
08/05/08 00:26:54
>>461
それ、何のデータ?

464:デフォルトの名無しさん
08/05/08 00:28:38
ビットシフトすりゃいいじゃん。

465:デフォルトの名無しさん
08/05/08 00:35:13
>>463
void*の参照先ですか?
intとかcharとか不定です
void*とsize_tを仮引数にして、型に関係なくビット表示するような関数を作りたいんですが・・・

466:デフォルトの名無しさん
08/05/08 00:38:59
とりあえずバイトオーダをはっきりしておかないとな。
リトルエンディアン環境の場合、数十バイトだろうが
その全体でリトルエンディアンになることを仮定していいのか、
それとも4バイト単位でリトルエンディアンになることを仮定するのか。

467:デフォルトの名無しさん
08/05/08 00:44:48
>>465
char*にキャストして一バイトごと表示しろよ

468:デフォルトの名無しさん
08/05/08 00:51:12
>>466
リトルエンディアンだとおもう
よくわからないから続きはwebで勉強してくるわ

>>467
おk試してみる

469:デフォルトの名無しさん
08/05/08 01:05:04
>>461
できない
ビットシフトは組み込み整数型(のビット長)に対してしか保証されていない
どうしてもやりたいなら自力でそのような関数を作るしかない

470:デフォルトの名無しさん
08/05/08 01:11:23
キャストすればいくらでもできるだろ・・・。

471:デフォルトの名無しさん
08/05/08 01:16:35
>>470
んなアホな
charに分割したとしても、左右両端からあふれたビットは結局手動で詰めざるを得ないだろ

472:デフォルトの名無しさん
08/05/08 01:20:12
もしかしてデータ圧縮なんかで使うビットごと入出力でも作ってんのかな
それだったらlhaの解説書見れば早いと思う

473:デフォルトの名無しさん
08/05/08 01:27:33
>>471
結局できるんじゃないか

474:デフォルトの名無しさん
08/05/08 01:39:36
>>473
「ビットシフト」の言葉の食い違いだったようだ
俺が考えてたのは組み込みのビットシフトのことね
そっちは概念としてのビットシフトだよな

475:デフォルトの名無しさん
08/05/08 01:41:10
> 組み込みのビットシフ
なんじゃこれは?ト

476:デフォルトの名無しさん
08/05/08 02:38:42
プロトタイプ
static void mera(const char *);
このとき
 1) void mera(const char *merami)
 2) void mera(const char* merazooma)
1だけのはずが
2のようなものも通ってしまうのはどうして?
どちらでも良いという意味ならば、どちらが推奨なの?

また、
static void bagi(const char ****);
このとき
 1) void bagi(const char ****bagima)
 2) void bagi(const char**** begiragon)
どちらも警告W8075程度で通してしまうのはどうなの?
BCC5.5.1

477:デフォルトの名無しさん
08/05/08 02:57:27
>>476
> 1) void mera(const char *merami)
> 2) void mera(const char* merazooma)
1) は C に多く、2) は C++ でみます。
どっちでも大差ないと思います。

478:デフォルトの名無しさん
08/05/08 02:59:49
スペースがあるかないかだけじゃん。何で違うものだと思うの?

479:デフォルトの名無しさん
08/05/08 03:00:44
>>477
おお、ありがとう。

480:デフォルトの名無しさん
08/05/08 03:20:48
>>476
char *p も char* p も意味は同じ

スタイルについては、変数の宣言時にたとえば

char* p, * q;

などとするのが不自然という理由で

char *p, *q;

を推奨する人は多い


481:デフォルトの名無しさん
08/05/08 03:31:59
追記

一方で char* p; を推奨する人は、変数名はあくまでpであるから
それがchar*であることを示すためにそうすると主張することが多い

ただし*はcharやint、あるいはstaticやconstのようにデータ型を修飾するものではなく
あくまで変数を修飾するものである(Cの変数宣言構文は [データ型] [変数名];
だから int const n, m; とは書けても char* p, q; とは書けない)ので、
構文的には変数名側に寄せることが正しい扱いであると言える

482:デフォルトの名無しさん
08/05/08 03:37:26
×ただし*はcharやint、あるいは
○ただし*はcharやintのようなデータ型、あるいは

483:デフォルトの名無しさん
08/05/08 04:08:15
もちろんスタイルの話だから、君はchar* pと書いてもいいし、char *pと書いてもいいし、さらにはchar * pと書いてもいいし、
また関数の仮引数リストにおいては与えられるものがおそらく配列である場合には、それを明示したいならchar str[]と書いてもいい

484:デフォルトの名無しさん
08/05/08 04:16:42
たくさんのレスありがとう、勉強になりなす。

485:デフォルトの名無しさん
08/05/08 07:37:37
>>476
×begiragon
○bagicross
なんで誰も指摘しないんだよー

486:デフォルトの名無しさん
08/05/08 13:10:17
>>448
エスケープシーケンスを正しく読めばいいんじゃないかな
確か0x1bだったっけ? この次の文字は制御文字だから、それに応じた処理をすればいい。

カーソル位なら入力されたコードをじっくり眺めればすぐに分かると思うよ


487:448
08/05/08 19:42:21
>>486
そうだったのかー!!
あれはエスケープシーケンスと制御文字が組み合わさってたん
ですね。だからあのプログラムで[Aとかが表示された訳だ。
どうもです。

488:デフォルトの名無しさん
08/05/08 19:43:21
XPでコンソールのカーソルを移動させるにはどうすればいいの?


489:デフォルトの名無しさん
08/05/08 19:46:04
スレ違い

490:デフォルトの名無しさん
08/05/08 19:46:11
>>488
URLリンク(msdn.microsoft.com)

491:デフォルトの名無しさん
08/05/08 21:34:04
mallocして帰ってきたポインタをfreeするとメモリを開放するらしいのですが、
freeにサイズを書かなくてなんでサイズがわかるんでしょうか。
#include <stdio.h>
void main()
{
char *c;
c = malloc( 10 );
if( c == NULL )return;
strcpy( c , "aiue" );
c--;//ひとつ前のポインタ(サイズは書いていないようだ)
c--;//ここにもサイズはない
c++;c++;//元に戻す
free( c );
c = NULL;
return;
}

492:デフォルトの名無しさん
08/05/08 21:38:08
>>491
管理テーブルが別にあるから

493:491
08/05/08 21:52:55
>>492
ポインタの前ではなくほかのところにあったんですね。
どうもありがとうございました。

494:デフォルトの名無しさん
08/05/08 22:04:26
どうでもいいけど、ポインタを戻すのはよろしくないんじゃね?

495:デフォルトの名無しさん
08/05/08 22:13:52
実際に確保されていることが確実な範囲(+1)を超えた演算の結果は保証されてなかった気がする

496:デフォルトの名無しさん
08/05/08 22:40:41
>>492
ちなみに確保した前の番地に文字数があるのでは?と仮定してそれを確認するなら
int* ip = (int*)c;
long* lp = (long*)c;

こうしておいて
printf("%d : ", *(ip - 1));  // c 先頭から int 分戻った場所から数値として表示
printf("%ld : ", *(lp - 1));  // c 先頭から long 分戻った場所から数値として表示

こんな風に確認するというのもあるよ(どちらにしても結果は外してるけど)


497:デフォルトの名無しさん
08/05/08 22:50:03
>>493

> ポインタの前ではなくほかのところにあったんですね。

それは処理系依存。
ポインタの前にある場合もあるだらう。


498:デフォルトの名無しさん
08/05/08 23:11:55
じゃああんま頻繁にmallocすると、逆に管理テーブルのぶんムダ使いになるんですかね??

499:デフォルトの名無しさん
08/05/08 23:13:38
管理テーブルを保持することよりも、
空きメモリを探す処理とfreeの分、
CPU時間の無駄遣いになることを気にしたほうがいい気がする。

500:デフォルトの名無しさん
08/05/08 23:22:31
ということはlinked listとかすごい効率悪いんだな・・・


ところでポインタのサイズ管理テーブルへのアクセスってどうやるの?

501:デフォルトの名無しさん
08/05/08 23:23:16
実装によるとしか
mallocのソースでも眺めてみれ

502:デフォルトの名無しさん
08/05/08 23:25:09
入門書クリアしたら次は何がいいかな?
アルゴリズム辞典とか眺めるの?

503:デフォルトの名無しさん
08/05/08 23:29:09
linked list はスタック上にメモリをプールしておけばいいぜ。

504:デフォルトの名無しさん
08/05/08 23:29:32
×スタック上
○スタック状

505:デフォルトの名無しさん
08/05/09 01:50:05
>>502
良いソースを読むことだと思う
どの言語でも同じだと思うが

506:デフォルトの名無しさん
08/05/09 01:55:07
何か作りたいものがあるから学んでいるのでは?
それを作るのにまだ足りないものがあるならそれを学べばOK
足りてるなら作ろう

507:デフォルトの名無しさん
08/05/09 13:06:55
実際に自分の目的とするものを作ること
その過程で、どのようにすれば目的を達成できるのかを考える能力を身に着けること

言語仕様がわかってても要求を実現できない新人多すぎ
コーダーじゃねぇんだからさ

508:デフォルトの名無しさん
08/05/09 17:58:14
0か1を要素にもつN次元のベクトルv(Nビットの情報ベクトルv)を入力した時
N個の要素はそれぞれ、確率pで0は1に、1は0に変わってしまい、また確率eで情報が消失する。
(消失した情報は2を代入すればよい)
上記の手続きを行い、画面にベクトルv'を出力(消失した要素はXを出力)
というプログラムを整数の配列と擬似乱数で作りたいんですが、↓では数字がおかしくなってしまいます。
環境はunixのgcc 4.0.2です、初心者ですがご指導よろしくお願いします。

なお、ここではN=5、e=0.05、p=0.1としています。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 5 ;

int main(void)
{
int v[N], u[N] ;
int i ;
float e, p, x ;

for (i = 0; i <= N-1 ; i++ )
{
printf("v[%d]=",i) ; scanf("%d",&v[i]) ;
while (v[i] && v[i]!=1)
{ printf("v[%d]=",i) ; scanf("%d",&v[i]) ; }
}

509:508続き
08/05/09 17:58:40

p = 0.1 ; e =0.05 ;

for(i = 0 ; i <= N-1 ; i++)
{
srand(time(NULL));
x = (float)rand()/ 32768.0 ;
/* xは0以上1未満の乱数 */
if( x < p )
{ u[i] = (v[i]+1) % 2 ;}
/* xが0以上p未満の時、受信に誤りが生じる */
else if( x >= p && x < p+e )
{ u[i] = 2 ;}
/* xがp以上p+e未満の時、情報は消失(2を代入) */
}

printf("(") ;
for(i = 1 ; i <= 7 ; i++)
{
if (u[i] == 2)
printf("X ") ;
else
printf("%d ",u[i]) ;
}
printf(")\n") ;

return 0 ;
}

510:509訂正。失礼しました
08/05/09 18:01:25
p = 0.1 ; e =0.05 ;

for(i = 0 ; i <= N-1 ; i++)
{
srand(time(NULL));
x = (float)rand()/ 32768.0 ;
/* xは0以上1未満の乱数 */
if( x < p )
{ u[i] = (v[i]+1) % 2 ;}
/* xが0以上p未満の時、受信に誤りが生じる */
else if( x >= p && x < p+e )
{ u[i] = 2 ;}
/* xがp以上p+e未満の時、情報は消失(2を代入) */
}

printf("(") ;
for(i = 0 ; i <= N-1 ; i++)
{
if (u[i] == 2)
printf("X ") ;
else
printf("%d ",u[i]) ;
}
printf(")\n") ;

return 0 ;
}

511:デフォルトの名無しさん
08/05/09 18:31:39
>>508
srand をループで毎回実行しない。最初の1回だけで良い。
32768.0 などという数字を直に書かず、(RAND_MAX+1.0) と書く方が良い。コンパイラによって rand() の最大値は異なる。
x<p でもなく x>=p && x<p+e でもない場合、u[i] の値は?

512:508
08/05/09 18:36:04
>>511
その場合u[i]は変化しません。
擬似乱数間の扱いが違ってましたか、勉強になります

513:508
08/05/09 18:38:06
あ、変化しないんだから
u[i] = v [i] ;
ですね。なんという初歩的なミス、ありがとうございました。

514:デフォルトの名無しさん
08/05/09 18:47:04
久々に突っ込みどころ満載なコードを見た気がする

515:デフォルトの名無しさん
08/05/09 19:57:02
>>502
スレリンク(tech板)
で手伝っていただけるとありがたいのですが、いかが?

516:デフォルトの名無しさん
08/05/09 21:39:27
皆さんに伺いたいのですけど、

URLリンク(www.amazon.co.jp)

C言語の決定版と言われるこの本、どうお考えでしょうか。

あと、これのC++版ありますが、ページ数が思いっきり増えてますよね。
こちらもできたら評価をお願いできればと思います。

517:デフォルトの名無しさん
08/05/09 22:54:01
本はいらないよ ネットのほうがいい それに基礎いくらやってもWindows(UNIX)アプリは作れない。
標準Cの数倍以上の分量はこなさないと無理。標準は共通部分だけの勉強だけ

518:デフォルトの名無しさん
08/05/09 23:06:49
>>516
それ買っておきなさい。
ネットのは怪しいのが多い。
しかし洋書はたけえな。

519:デフォルトの名無しさん
08/05/09 23:09:36
>>516
お前がどうしたいのかによる、まぁその本は教養というか理解が深まるとかそういうのだ

520:デフォルトの名無しさん
08/05/09 23:43:44
>>516
スレチだけど、洋書は輸出費を考慮しても.comの方が安い場合があるぜ。
時間と多少の手間を気にしないんならこっちもチェックしておくといい。
URLリンク(www.amazon.com)

521:デフォルトの名無しさん
08/05/10 00:04:24
C言語そのものはとてもシンプルだと言うこと
#include によってもたらされる先輩方の資産と情報に振り回されない
目的をもってプログラムに取り組む
・・・
例えて、辞書を丸暗記するのか、あるいは目的を持って辞書を引くのか・・というのに通じると。
ライブラリ群の知識や使い方に重点を置くより「こうしたい関数は無いか?」とする切り口の方がいいのではないかなと。
どちらにしても有る程度は知識得ないといけない訳だけど。

522:デフォルトの名無しさん
08/05/10 00:05:42
自分見やすい(辞書)サイトを保存しておいて、AND OR NEARなどで全文検索しようぜ

523:デフォルトの名無しさん
08/05/10 00:06:11
>>516
それは初心者向けでも玄人向けでもない微妙な本なんであんまりすすめない
推薦図書スレ>スレリンク(tech板)l50
感想スレ>スレリンク(tech板)l50

524:デフォルトの名無しさん
08/05/10 00:10:00
たとえば、空き実メモリの容量を知りたければ、 メモリ 容量 などで検索する。

525:デフォルトの名無しさん
08/05/10 00:14:21
シンプルに見えて実はぐちゃぐちゃ それがC

526:デフォルトの名無しさん
08/05/10 00:16:21
Cをちゃんと理解したかったら、コンパイルした先のアセンブラと対比させるのが一番だと思う。
それが可能なのがCの最大の利点であり最大の欠点だから。

527:デフォルトの名無しさん
08/05/10 00:20:16
まず独習かダイテルあたりのしっかりした入門書で基礎仕様の理解を押さえる
その上でひたすら「目的意識を持って」コードを書きつつCFAQを流し読めば十分

528:516
08/05/10 08:23:53
レス色々ありがとう。

自分はプログラミングはちょっとやったことありますが、C言語に
ついてはさっぱりです。プログラミング言語Cがあれば何もいらない、
って話を聞いたんですけど、ちょっと古い本だしどうなんだろうなぁと。

だけど、薄い本なんで、これでC言語が概観できるというなら欲しいと
思ってます。

>>523
こういうスレがあったんですね。ありがとうございます。

529:デフォルトの名無しさん
08/05/10 11:02:19
ただの趣味だからって、効率悪くてもなるべく自作するようにしてる俺エドモンド本田

530:デフォルトの名無しさん
08/05/10 16:04:28
複数行文字列(100行以上)を標準出力に書き出す際、
\ で複数行まとめて書くとインデントが使えず見辛い。
別の方法を考えたところ

1) printfで一行ずつ
 printf("黒い0服\n");
 printf("お茶を1杯\n");

2) fputsで一行ずつ
 fputs("赤い2んじん\n", stdout);
 fputs("橙色の3かん\n", stdout);

3) 配列に格納してwhile puts
 char *memo[] = {
  "黄色い4んごう",
  "五月みどり",
  ""
 };
 char **memop = memo;
 while(**memop)
 puts(*memop++);


(1) や (2) は解かりやすいが、(3) の方が見やすい。
ただ (3) のままだと宣言初期化時しか格納できない。
 ・分岐後に文字列を格納したい。
 ・strcpy は使用を控えたい。

悔しいのでスマートな書き方教えてくれ。

531:デフォルトの名無しさん
08/05/10 16:07:53
 printf("黒い0服\n"
     "お茶を1杯\n");
でいいよ

532:デフォルトの名無しさん
08/05/10 16:08:31
別のテキストファイルにして読み込む
マジおすすめ

533:デフォルトの名無しさん
08/05/10 16:09:19
あぁでもprintfに直接文字列は推奨されないよ
%入ってるとまずいからだけど

534:デフォルトの名無しさん
08/05/10 16:12:28
putsでいいだろ

535:デフォルトの名無しさん
08/05/10 16:26:36
そこでfputsですよ

536:デフォルトの名無しさん
08/05/10 16:37:01
ABC &
上記の様にバックグラウンドプロセスABC に、パラメータを与えて実行させるのは
どの様にすればいいのですか?

537:デフォルトの名無しさん
08/05/10 16:43:21
それはシェルの役目

538:デフォルトの名無しさん
08/05/10 16:45:35
>>531
あぁ , 無しで繋げられるのだっけか。
でも , をつけてしまいやすいので使い方だけ覚えとく。
>>532,533
メモっとく。
>>534
 puts("青6し");
 puts("むらさき7ぶ");

 puts(
  "むらさき7ぶ\n"
  "灰ヤー"
 );
のような感じか。

もう少し考えてみるわ、サンクス。

539:デフォルトの名無しさん
08/05/10 16:50:35
本題より例文が気になって仕方がない。むらさきしちぶ?

540:デフォルトの名無しさん
08/05/10 16:54:17
抵抗のカラーコードの語呂合わせだろ。
俺は「青二才のろくでなし」って覚えているんだけど。

541:デフォルトの名無しさん
08/05/10 18:44:45
失礼しms。

URLリンク(www.uploda.org)

上記のようなコードを書いたのですが、
bの領域を解放するときに
”Windows によって aaaaa.exe でブレークポイントが発生しました。ヒープが壊れていることが原因として考えられます。aaaaa.exe または読み込まれた DLL にバグがあります。”
のようなエラーが出てしまいます・・・。。。

確保していない領域にアクセスし、それをフリーしようとしたときにおこるエラーみたいなことがググったら書いてあったのですが、
double** b; が確保されている領域と、callocで追加確保された領域が連続でないということでしょうか?
またそのせいでこのエラーがおこっているのでしょうか?

ご教授願います。よろしくお願いします。。。

542:デフォルトの名無しさん
08/05/10 18:50:19
>>541
> memmove(b, a, sizeof(a[0])*sizeof(a[0][0]));
これのせいで同じ領域を二回 free している

543:541
08/05/10 20:38:45
>>542
memmoveだとだめなのでしょうか?

544:デフォルトの名無しさん
08/05/10 20:42:06
>>543
何がやりたいかによる
a[y][x] に格納されている double の値をコピーしたいのであれば

for(y=0;y<N;y++) memmove(b[y], a[y], N*sizeof(a[0][0]));

545:541
08/05/10 20:45:19
やりたいことはその通りなのですが、今の状態だとポインタをコピーしてる状態ということでしょうか?

546:デフォルトの名無しさん
08/05/10 20:47:01
>>545
  V /  / _,, ァ=ニニ:}       _
   .V  /,.ィ"f= <r'ニ三{        |_    ┐   _l_ l
    'vf^<''"  弋z.ミ'テtフ       |_ Х □_ 匚 L | У
    〉!ト _ i{ ´ ̄r' =|'
   ./ェ゙‐ェi.    、__`_ヤ     ( その通りでございます )
   ./iュ.Hヽ.、   ゙,ニ/
  -^ ー'-.、,i._`ヽ,.仁リ
  ー - .、     /、

547:デフォルトの名無しさん
08/05/10 20:50:49
>>542,544,546
なるほどです。つながりました。ありがとうございました><


548:デフォルトの名無しさん
08/05/11 01:50:19
初心者です。すみませんがアドバイスお願いします。

char (*pacX)[3];

とした場合、pacXは3要素のchar配列へのポインタになると思いますが、
このような変数「の配列」を以下のように動的に確保するとします。

int iNum = 2;
char (*pacX)[3] = new (char)[iNum][3];

この場合、ポインタ変数が2つ(iNum分)確保されるのでしょうか。それとも、それらが指す3要素のchar配列2つ分のメモリまで確保されるのでしょうか?


549:デフォルトの名無しさん
08/05/11 01:52:50
typedef して考えてみよう。

typedef char CharArray3[3];
CharArray3* pacX = new CharArray3[iNum];

550:デフォルトの名無しさん
08/05/11 01:56:23
newてC++やん

551:デフォルトの名無しさん
08/05/11 02:13:33
>newてC++やん
すみません、確かにそうですね。

>>549
なるほど。。。元の質問で言えば後者の「それらが指す3要素のchar配列2つ分のメモリまで確保される」ということなのですね?
イメージ的には 「char aacX[2][3]」と同じ分のメモリが確保されて、さらにいえば
delete [] pacX;
とすることで開放されるということよろしいでしょうか?


552:デフォルトの名無しさん
08/05/11 02:24:13
>>551
そういうこと。

553:デフォルトの名無しさん
08/05/11 02:28:42
>>552
ありがとうございました。

554:デフォルトの名無しさん
08/05/11 04:05:19
>>548
その記述ちょっと気色悪い。一歩間違うと関数へのポインターと見間違えちゃうし。

int (*func)(int k); // 関数へのポインター

int a1(int k) { printf("%d¥n", k * 5); return k; }

int a2(int k) { printf("%d¥n", k / 5); return k; }

int main()
{
 func = &a1;
 func(k);

 func = &a2;
 func(k);
}

みたいな・・・

普通に char *a[3];  でいいと思うけど。

555:デフォルトの名無しさん
08/05/11 04:06:45
>>554
内容が理解できない人は黙っておいた方がいいよ。

556:デフォルトの名無しさん
08/05/11 06:00:32
char *a[3] ポインタの配列
char (*a)[3] 配列のポインタ

557:デフォルトの名無しさん
08/05/11 10:22:40
CGIにC使ってる人ってあまり見かけないんだけど、CでCGIってダメダメなの?

558:デフォルトの名無しさん
08/05/11 10:33:06
実行速度的には悪くないけど、LLに比べるとテキスト処理が面倒なのと、非セキュアになりやすい(バッファオーバーフローとか)からじゃないかねぇ。

559:デフォルトの名無しさん
08/05/11 10:40:20
単にcコンパイラ使わせてくれる鯖が少ないからじゃないの?

560:デフォルトの名無しさん
08/05/11 10:43:33
>>559
どの言語が用意されているかというのは、Web制作板的な視点じゃないか
プログラム板的には、どの言語で実装するのが適切かという話題だと思ってたが。

561:デフォルトの名無しさん
08/05/11 10:47:22
>あまり見かけないんだけど
とあったからそれに沿うように答えただけなのだが。
性能的には何ら問題ないと思う、とつけたほうがよかったかな?

562:デフォルトの名無しさん
08/05/11 11:06:01
なぜCコンパイラ使わせてくれる鯖が少ないか、
というところまで考え出すと、
結局 >>558 に行き着くんじゃないかと思う。

563:デフォルトの名無しさん
08/05/11 11:41:06
数列の最大値を計算するアルゴリズム 数列:0、3、1、4、7、2、8

お願いします。

564:デフォルトの名無しさん
08/05/11 11:45:28
>>563
わかりました
消えてください


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

5373日前に更新/213 KB
担当:undef