5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

C言語なら俺に聞け(入門篇) Part 55

1 :デフォルトの名無しさん:2009/10/29(木) 21:10:18 ?DIA(352353)
C言語の*入門者*向け解説スレッドです。
初心者、初級者の方は他の質問スレのほうが良いかもしれません。

教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 131代目
http://pc12.2ch.net/test/read.cgi/tech/1255709298/

・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 54
http://pc12.2ch.net/test/read.cgi/tech/1254829314/

過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000

2 :デフォルトの名無しさん:2009/10/29(木) 21:25:05
ぬるぽ

3 :デフォルトの名無しさん:2009/10/29(木) 21:51:20
NULL pointer exeption

4 :デフォルトの名無しさん:2009/10/29(木) 22:41:25
C++がスレ違いというのは言い過ぎ

5 :デフォルトの名無しさん:2009/10/29(木) 23:04:44
いいえスレ違いです


6 :デフォルトの名無しさん:2009/10/29(木) 23:05:22
気に入らないならC/C++室スレにでも行ってください

7 :>1乙:2009/10/29(木) 23:26:00
C言語の*入門者*向け解説スレッドです。
初心者、初級者の方は他の質問スレのほうが良いかもしれません。

・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること、サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
【初心者歓迎】C/C++室 Ver.69【環境依存OK】http://pc12.2ch.net/test/read.cgi/tech/1256022655/
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 131代目 http://pc12.2ch.net/test/read.cgi/tech/1255709298/

[ 前スレ ]
C言語なら俺に聞け(入門篇) Part 54 http://pc12.2ch.net/test/read.cgi/tech/1254829314/

[ 過去スレ ]
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000

[ 関連スレ ]
【初心者お断り】ガチ規格準拠C専用スレ Part134 http://pc12.2ch.net/test/read.cgi/tech/1246115922/
C/C++小心者スレッドPart1 http://pc12.2ch.net/test/read.cgi/tech/1186262298/
[ 雑談スレは雑談スレで ]
malloc http://pc12.2ch.net/test/read.cgi/tech/1228462009/
break文の是非について http://pc12.2ch.net/test/read.cgi/tech/1245658400/
ポインタ死ねよ。 http://pc12.2ch.net/test/read.cgi/tech/1171172537/
Cでプログラム言語は完成した http://pc12.2ch.net/test/read.cgi/tech/1218012085/
C言語を始めるのに良いサイトってありますか? http://pc12.2ch.net/test/read.cgi/tech/1169824084/
C/C++ Coding Style Thread http://pc12.2ch.net/test/read.cgi/tech/1096687703/
C言語は関数ができなくても、理解可能か? http://pc12.2ch.net/test/read.cgi/tech/1090089115/
cとc++どっちがいいの? http://pc12.2ch.net/test/read.cgi/tech/1245506307/
Vim vs Emacs Part2 http://pc12.2ch.net/test/read.cgi/tech/1200654758/

8 :デフォルトの名無しさん:2009/10/29(木) 23:45:35
テンプレ追加キボンヌ

ここではC++言語は別言語と考えますので、スレ違いになります。
ただしC++言語のコード(拡張子=.cpp)をリネームしてC言語の
コードとしてコンパイルできる場合はC言語のコードとみなします。

9 :デフォルトの名無しさん:2009/10/30(金) 00:19:07
.cpp
.C
.cc


10 :デフォルトの名無しさん:2009/10/30(金) 01:09:53
Linuxで作成した拡張子.cのファイルをウィンドウズで開くと
文字化けして見れないんですがウィンドウズ上で見る方法ないですか?

11 :デフォルトの名無しさん:2009/10/30(金) 01:12:32
>>10
ブラウザにドロップしてみる

12 :デフォルトの名無しさん:2009/10/30(金) 01:18:52
>>11
できました!こんな簡単な方法があったとは・・・

13 :デフォルトの名無しさん:2009/10/30(金) 01:20:08
偽の条件式ってのは整数の0と同等に扱っていいんでしょうか?
それと、真の場合は1とは限らないんでしょうか

int x = ( 1+2 == 2 ); これはint x = 0と同じでいいのか、
int x = ( 1+2 == 3 ); これだと常にx = 1になるのか、教えてください

14 :デフォルトの名無しさん:2009/10/30(金) 01:21:28
>int x = ( 1+2 == 2 ); これはint x = 0と同じでいいのか、
いい
>int x = ( 1+2 == 3 ); これだと常にx = 1になるのか、教えてください
なる

15 :13:2009/10/30(金) 01:25:30
どうもありがとうございました
だとすると、今まで簡単に書ける式をわざわざif文とか必要ない変数とか宣言して書いてました

16 :デフォルトの名無しさん:2009/10/30(金) 09:53:57
自信がない場合は条件演算子を使うのも一つの手です。
曰く、
int x = (1 + 2 == 2) ? 1 : 0;
int y = (1 + 2 == 3) ? 1 : 0;
尤も、boolean型を作ってしまう手もありますが。
そもそもc99では標準で使えることですし。
stdbool.hが見つからないならこんな感じで作れます。
typedef enum {false, true} bool;
bool x = 1 + 2 == 2;
bool y = 1 + 2 == 3;

17 :デフォルトの名無しさん:2009/10/30(金) 12:18:21
>>16
下のほうはものすごく気持ち悪い

18 :デフォルトの名無しさん:2009/10/30(金) 13:00:11
そもそもそんなの使う場面が無い。


19 :デフォルトの名無しさん:2009/10/30(金) 21:21:24
double **dSData = NULL;

dSData = new double*[100];
for(int i=0; i<100; i++){
dSData[i] = new double[100];
}

という感じで動的な二次元配列を作ったのですが、

sizeof(dSmokeData[0]);

とやるのと

double dTest[100];
sizeof(dTest);

とやるのとでは、sizeofの結果が違うのですが、なぜでしょうか?

20 :デフォルトの名無しさん:2009/10/30(金) 21:23:41
括弧つけんなボケ

21 :19:2009/10/30(金) 21:27:03
訂正

sizeof(dSmokeData[0]);

sizeof(dSData[0]);


22 :デフォルトの名無しさん:2009/10/30(金) 21:31:25
>>19
dSData の型をみるよろし

23 :19:2009/10/30(金) 21:36:18
>>22
確かに型は違っています。

dSDataを使って

double dTest[100];
sizeof(dTest);
とした状態と同じ結果を表すにはどうしたらよいでしょうか?

24 :デフォルトの名無しさん:2009/10/30(金) 21:39:29
>>23
double (*dSData)[100] = NULL;

25 :19:2009/10/30(金) 21:43:34
>>24
double **dSData = NULL;
ではできないんでしょうか?

dSDataはグローバル変数で、要素の数はソースの途中で決まるため、宣言時には指定できないのです。。

26 :デフォルトの名無しさん:2009/10/30(金) 21:48:19
>>25
new とか使うってことは C++ でしょ?
STL の vector 使えばいいよ

27 :19:2009/10/30(金) 21:57:04
>>26
vector<int> v(100);
sizeof(v);

double dTest[100];
sizeof(dTest);

sizeof(v);とsizeof(dTest);の結果がやはり違います。

28 :19:2009/10/30(金) 21:58:28
訂正

vector<int> v(100);

vector<double> v(100);

29 :デフォルトの名無しさん:2009/10/30(金) 21:59:54
括弧つけるなアホ

30 :デフォルトの名無しさん:2009/10/30(金) 22:01:57
int i;
i = sizeof (int);
i = sizeof i;

だっけか?

31 :デフォルトの名無しさん:2009/10/30(金) 22:03:51
>>27
なんで sizeof に拘るのさ?

32 :19:2009/10/30(金) 22:06:10
>>31
memcpyを使っているので、、、

33 :デフォルトの名無しさん:2009/10/30(金) 22:12:35
>>32
.size() で大きさは分かる
が、古いコンパイラだと vector の中身が連続領域じゃない可能性もある

34 :デフォルトの名無しさん:2009/10/30(金) 22:16:09
え?ベクターって実装上連続であること保障されてないの?

35 :デフォルトの名無しさん:2009/10/30(金) 22:18:31
プゲラ

36 :デフォルトの名無しさん:2009/10/30(金) 22:20:59
>>34
古い仕様書には明記されていなかったから
実装がどうなっているかはコンパイラ次第とかなんとか

37 :デフォルトの名無しさん:2009/10/30(金) 22:36:28
C++厨は巣に帰れ

38 :デフォルトの名無しさん:2009/10/30(金) 22:51:59
自己参照構造体使って自作するのがC使い

39 :19:2009/10/30(金) 23:05:41
double dTest1[100][100];
sizeof(dTest1[0]);



double dTest2[100];
sizeof(dTest2);

とやっても
sizeofの結果が異なります。。

40 :19:2009/10/30(金) 23:30:45

誤爆です。間違ってました。合ってます。

41 :デフォルトの名無しさん:2009/10/31(土) 03:42:45
それは誤爆といわない

42 :デフォルトの名無しさん:2009/10/31(土) 07:06:03
要素数はわかってるんだから変数に保存しておけばいいだけだろ
sizeofにこだわる必要はない

43 :デフォルトの名無しさん:2009/10/31(土) 07:10:58
sizeofの値はコンパイル時に決まってないとだめだから実行時にしか決まらない値を得られるはずがない
関数じゃないんだからね


44 :デフォルトの名無しさん:2009/10/31(土) 11:32:35
strcpy(a, (char)crypt("hogehoge", "EV"));
これって何かおかしい?

45 :デフォルトの名無しさん:2009/10/31(土) 11:36:43
なんでcharにキャストしてるの?

46 :デフォルトの名無しさん:2009/10/31(土) 11:47:54
>>45
キャストされてないってコンパイラに怒られたから

test.c:11: warning: passing arg 2 of `strcpy' makes pointer from integer without a cast

47 :デフォルトの名無しさん:2009/10/31(土) 12:14:27
>>46
crypt.hをインクルードしてないだろ。

48 :デフォルトの名無しさん:2009/10/31(土) 12:23:03
>>47
#define _XOPEN_SOURCE

#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main()
{
char a[100];

strcpy(a, (char)crypt("hogehoge", "EV"));

printf("%s", a);

return 0;
}
これで問題ないはずなんだけど一応全文を

49 :デフォルトの名無しさん:2009/10/31(土) 13:20:14
キャストは(const char *)でしょ

50 :デフォルトの名無しさん:2009/10/31(土) 13:53:01
>>49
ありがとうございます

とりあえず生成できるようになったのはいいけど結果が2chと食い違ってて泣いた
でもhttp://age.s22.xrea.com/talk2ch/trip_new.txtの例どうりにやったらあってたんだよなぁ

51 :デフォルトの名無しさん:2009/10/31(土) 14:01:18
tripkeyの文字コードが違うんじゃないの?

52 :デフォルトの名無しさん:2009/10/31(土) 14:12:58
abcdではあってなくてkamiではあってるってのもどうなのかなぁ・・・

53 : ◆jG/Re6aTC. :2009/10/31(土) 14:22:50
test

54 :デフォルトの名無しさん:2009/10/31(土) 14:52:17
>>46 見てなんでcharにキャストしたんだろうな

55 :デフォルトの名無しさん:2009/10/31(土) 15:07:23
馬○だから

56 :デフォルトの名無しさん:2009/10/31(土) 15:10:42
泣いて馬○を斬る。

57 :デフォルトの名無しさん:2009/11/01(日) 01:33:45
eclipseみたいにコードの誤りが表示されて、'{'に対応する'}'が
自動で生成されるシンプルなテキストエディタって何かないですか?

IDEじゃなくて、コマンドプロンプトから実行できる、あと軽いやつで
なにかおすすめはないですか?自分よくコードを打ち間違えるんすよ。

58 :デフォルトの名無しさん:2009/11/01(日) 01:49:34
間違えるな

59 :デフォルトの名無しさん:2009/11/01(日) 01:55:57
emacs

60 :デフォルトの名無しさん:2009/11/01(日) 02:11:05
IDE だってコマンドプロンプトから実行できるだろ。

61 :デフォルトの名無しさん:2009/11/01(日) 02:46:48
vim

62 :デフォルトの名無しさん:2009/11/01(日) 03:21:28
vim以外使ってる奴は糞。特に日本人しか使ってない秀丸とかいう糞エディタ使ってる奴はking of 糞。

63 :デフォルトの名無しさん:2009/11/01(日) 03:46:14
vim(笑)

64 :デフォルトの名無しさん:2009/11/01(日) 03:54:47
さすがにVi(中身はViMだろう)で開発はきつい
makeしたときのコンパイルエラーをちょろっと直す程度ならいいんだけどね
ctagsですね、わかります

65 :デフォルトの名無しさん:2009/11/01(日) 08:15:22
gedit最強

66 :デフォルトの名無しさん:2009/11/01(日) 09:12:45
個人的な好き嫌いだけで糞とか決めつけてる奴って協調性低そう
客先から縛りをつけられたことがなくコードは常に1人で書いてるんだろうな

67 :デフォルトの名無しさん:2009/11/01(日) 09:36:58
>>65
なかなか高機能だよな。

68 :デフォルトの名無しさん:2009/11/01(日) 13:18:33
EDLIN 使えボケ

69 :デフォルトの名無しさん:2009/11/01(日) 13:22:57
Cならvimが最強。

70 :デフォルトの名無しさん:2009/11/01(日) 13:27:18
vimを使ってない奴は人生の貴重な時間を無駄に浪費している

71 :デフォルトの名無しさん:2009/11/01(日) 13:28:24
1バイト言語圏の人ならな。


72 :デフォルトの名無しさん:2009/11/01(日) 13:28:41
Emacs じゃダメなの?

73 :デフォルトの名無しさん:2009/11/01(日) 13:29:16
うわあ、かなり頭の悪いレスが続いてるなあ
いくら道具にこだわっても、そんな脳ミソじゃその人生自体無駄だろうね

74 :デフォルトの名無しさん:2009/11/01(日) 13:51:32
あらゆるエディタを使い倒してきたエディタ神の俺だが、攻守最強形態vimだと悟りを得た。異論は認めないからそのつもりで。

75 :デフォルトの名無しさん:2009/11/01(日) 14:07:04
これだから信者は。頭のネジが数えきれないくい抜けてるんだもん
こんなキチガイが回答者の質問スレとか始まる前から終わってるわ

76 :デフォルトの名無しさん:2009/11/01(日) 14:16:43
自分の頭の悪さを棚にあげて、人をキチガイとか煽ってるやつも消えてほしい。

77 :デフォルトの名無しさん:2009/11/01(日) 14:18:44
そして、誰もいなくなった……

78 :デフォルトの名無しさん:2009/11/01(日) 14:21:31
棚上げって、俺の頭の良し悪しは今問題じゃないし。信者がうざいってだけ。
俺はどのエディタ以外は屑とか思ってないから。

79 :デフォルトの名無しさん:2009/11/01(日) 14:34:05
日本語でおk。

80 :デフォルトの名無しさん:2009/11/01(日) 14:37:54
読解力0なら2ちゃん見るなよ

81 :デフォルトの名無しさん:2009/11/01(日) 14:42:11
emacsはctrl-N, ctrl-P, ctrl-F, ctrl-Bの時点で糞。カスタマイズ前提の思想は受け入れられない。矢印キー移動のエディタも糞。ホームポジションから矢印キーに移動した時点で負け組みの証明をしている。

82 :デフォルトの名無しさん:2009/11/01(日) 14:44:38
>>81
お前がそう思うんならそうなんだろう、お前ん中ではな

83 :デフォルトの名無しさん:2009/11/01(日) 15:16:35
統合環境でそれなりに満足してるおいらにはわかんねぇべぇ

84 :デフォルトの名無しさん:2009/11/01(日) 15:31:25
統合環境ってemacsのことだよね

85 :デフォルトの名無しさん:2009/11/01(日) 16:21:18
テキストエディタ使ってコマンドプロンプトからプログラム実行しようと
思ったけど、やっぱり果てしなく面倒くさい。

テキストエディタってどれも安っぽくて、萎えるし。
シンプルで高級感があるソフトないんですかー><1日で挫折しましたよー。

誰かIDEのおすすめを教えてください。ちなみにC言語を勉強してます。
無駄な機能を省いた使いやすいやつないですか?

86 :デフォルトの名無しさん:2009/11/01(日) 16:24:44
IDEとテキストエディタは別物なんだけどな。そして大抵IDE付属のエディタは糞。

87 :デフォルトの名無しさん:2009/11/01(日) 16:34:11
>>85
Turbo C++ 1.01

88 :デフォルトの名無しさん:2009/11/01(日) 16:37:02
>>85
VisualStudio2008ExpressEdition

89 :デフォルトの名無しさん:2009/11/01(日) 16:45:37
すいません他のスレにも質問したのですがブックマークしわすれてて、探したんですけど見つからないのでこのスレで質問させていただきます。

「14歳からはじめるC++」という本で勉強しているんですが、エラーでコンパイルできなくてこまっています。
BCC DeveloperでDXライブラリをインクルードする設定をしました。

#include"DXLib.h"

int WINAPI WhnMain(HINSTANCE hi, HHNSTANCE hp, LPSTR lpC, int nC)
{
ChangeWindowMode(TRUE);
if (DXLib_lnit() == -1)return(-1);
WaitKey();
DXLib_End();
return(0);
}

以上のソースをコンパイルすると
エラー E2268 〜 6:未定議の関数'DXLIb_lnit' 〜
エラー E2268 〜 8:未定議の関数'DXLIb_End' 〜
とエラーになります。かなりググッたんですがまったくわからず...
どなたかアドバイスいただけませんか。
よろしくお願いします。

90 :デフォルトの名無しさん:2009/11/01(日) 16:54:21
>>85
シンプルで高級感があるソフトを作れるようになるまでがんばれ!
いい目標ができたじゃないか

91 :デフォルトの名無しさん:2009/11/01(日) 16:55:22
>>89
あいとえるの区別をつけよう

92 :デフォルトの名無しさん:2009/11/01(日) 16:59:44
本当にエラーがその二つだけなら、
大文字と小文字間違えてるんだろ。
そも、誤字がひどいから明言は出来ない。

93 :デフォルトの名無しさん:2009/11/01(日) 17:23:48
>>89
ソースとコンパイラの出力を全部そのままコピペして

94 :デフォルトの名無しさん:2009/11/01(日) 17:31:15
>>89
コピペで聞きなおせつったの俺だ。どこだっけか。
ttp://homepage2.nifty.com/natupaji/DxLib/dxfunc.html
ここみると、DXLib_Init → DxLib_Init だなXとxの違い。

95 :デフォルトの名無しさん:2009/11/01(日) 17:32:53
って l と I もか、、、

96 :デフォルトの名無しさん:2009/11/01(日) 17:33:54
i と I もだな

97 :デフォルトの名無しさん:2009/11/01(日) 17:43:10
>>89
みなさんのおかげで解決できました。誤字でエラーだったんですね。xも小文字で。
丁重にみなさん教えていただき本当に本当にありがとうございました。
助かりました。

98 :デフォルトの名無しさん:2009/11/01(日) 20:51:02
じゃんけんプログラムの次て、何作ったらいいんでしょうか?
初めてなので、なんていうか度合いがわかりません。簡単な計算プログラムしか作れない。。

99 :デフォルトの名無しさん:2009/11/01(日) 20:58:24
>>98
ヒットアンドブロー(マスターマインド)とか呼ばれる数当てゲーム

100 :デフォルトの名無しさん:2009/11/01(日) 21:25:29
頭こんがらがってきたのですが

例えば
int i = 8;で
char型のポインタにint型のiを代入したいんですが
上手くいきません
どうすればいいでしょうか?



101 :デフォルトの名無しさん:2009/11/01(日) 21:29:16
やりたいことは
int i = 8;
char* p = (char*)i;
でいいの?

102 :デフォルトの名無しさん:2009/11/01(日) 21:33:11
なぜそのようなことをしたいと思ったのか不思議だ

103 :デフォルトの名無しさん:2009/11/01(日) 21:42:54
struct{
unsigned char AAA[10]:
unsigend shor int aa;
}BB
unsgined char buf[500];

こういった変数があったとして、
struct BBの全12バイト、配列buf[300]-[500]の値を2バイトずつ加算して足して行き
最終的に足したものの2の補数を計算したいとおもうのですが

引数を一つとしてうまく渡す方法はないでしょうか?
struct BBを足したあと、配列[300]からまた順次足していくみたいな
structBBの終わりのアドレスの次が、配列buf[300]の先頭になるとかどうすればよいのでしょうか?

104 :デフォルトの名無しさん:2009/11/01(日) 21:48:38
まず日本語の勉強をすると良いよ。

105 :デフォルトの名無しさん:2009/11/01(日) 21:52:34
> structBBの終わりのアドレスの次が、配列buf[300]の先頭になるとかどうすればよいのでしょうか?
多分、期待してるようなのは無理。

106 :100:2009/11/01(日) 22:00:44
ありがとうございます
>>101
たぶんそうなんですが、うまくいきません
>>102
学校の宿題で自分なりに書いてみたんですが、うまくいきません
16行目です
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10038.txt
何か根本的なところを間違えているかもしれません

実行結果
http://codepad.org/0xazNy9b


107 :デフォルトの名無しさん:2009/11/01(日) 22:04:11
>>105
ではstructBBあるいは配列[300]以降のデータを書き換えると、それらのコピーが書き換えられるというのは
どうすればよいのでしょうか?
コピーstructBBの次が、コピーの配列[300]以降で、コピー元をかえると、自動的にコピー先も書き換えられるという

108 :デフォルトの名無しさん:2009/11/01(日) 22:06:52
>106
制御文字

109 :デフォルトの名無しさん:2009/11/01(日) 22:07:31
>>107
C言語の範疇では無理。

110 :デフォルトの名無しさん:2009/11/01(日) 22:09:30
>>111
>>110

111 :110:2009/11/01(日) 22:20:10
間違えた
>>103
>>102

112 :デフォルトの名無しさん:2009/11/01(日) 22:35:28
コピー先と元を間違えてるんじゃね。
とりあえず、日本語の勉強をすると良いよ。


113 :デフォルトの名無しさん:2009/11/01(日) 22:37:42
これは冗談でも煽りでも何でもない。
コードの目的を明確に言葉で表せないなら
それをロジックで組むのも不可能だよ。


114 :デフォルトの名無しさん:2009/11/01(日) 22:47:07
なんで引数ふたつにしたらまずいの?

115 :デフォルトの名無しさん:2009/11/01(日) 23:07:58
>>98
じゃんけんが作れたなら次は格ゲーでもどうかな?
ほとんど同じ論理でグーチョキパーの数を増やしていくだけだぞ

116 :デフォルトの名無しさん:2009/11/01(日) 23:08:45
>>106
こういうこと?
違ったらごめん
http://0x72.net/upload/src/0001.c.txt

117 :デフォルトの名無しさん:2009/11/01(日) 23:09:16
>103

もしかしてこうゆうことがしたい?

struct {
struct{
unsigned char AAA[10]:
unsigend shor int aa;
}BB;
unsgined char buf[500];
} wholeParam;

こうやって関数の仮引数としてwholeParamを渡す。

118 :デフォルトの名無しさん:2009/11/01(日) 23:26:13
struct{
unsigned char AAA[10]:
unsigend shor int aa;
}BB;
unsgined char buf[500];
short int f(int x)
{
return x>=0 && x<6 ? ((short *)&BB)[x]:((short *)(buf+300))[x];
}

buf[300]〜[500] だと突き抜けるから、
多分 [299]〜[499]のつもりなんだろうけど、
一応、書いてある通りに。

119 :デフォルトの名無しさん:2009/11/01(日) 23:30:09
加算の仕方が判らんよ。
数字としてなのか値としてなのか。
関数通せば整数一つから擬似的に不連続を繋げられるけど、
その後どうしたいのか不明確すぎる。

120 :デフォルトの名無しさん:2009/11/01(日) 23:33:42
>>118
sizeof(struct BB)が12byteである保証は無いんで、運が悪ければハマるかもね。

121 :デフォルトの名無しさん:2009/11/01(日) 23:34:54
それ以前に shor 型とやらが何バイトかなんて知らないんで。

122 :100:2009/11/01(日) 23:41:06
>>108
>>116
ありがとうございます!
そういうことです!
自分のレス見返したら問題文書いてなくて
すいませんでした。

もう一度勉強してきます



123 :デフォルトの名無しさん:2009/11/01(日) 23:41:39
#define shor short
#define unsigend unsigned
#define unsgined ;unsigned
struct{
unsigned char AAA[10]:
unsigend shor int aa;
}BB
unsgined char buf[500];
unsigned short int f(int x)
{
return x>=0 && x<5 ? ((short *)BB.AAA)[x]:x==6?(BB.aa:(short *)(buf+300))[x];
}


124 :デフォルトの名無しさん:2009/11/02(月) 07:44:03
_beginthreadexってBCCだと使えないの?

125 :デフォルトの名無しさん:2009/11/02(月) 08:34:00
>>124
BCCでも使えるよ

126 :デフォルトの名無しさん:2009/11/02(月) 10:04:53
どうやって

127 :デフォルトの名無しさん:2009/11/02(月) 11:22:04
_ではじまるのはMS独自。

128 :デフォルトの名無しさん:2009/11/02(月) 11:27:20
>>127
Wintelの場合、ライブラリファイルフォーマットは事実上共通
だろ?だからリンカで繋げられれば動く筈だが...ダメなのか?

129 :デフォルトの名無しさん:2009/11/02(月) 12:20:53
つーか、そもそも_beginthreadex()がWinAPIのそれかどうか疑いもしない辺りが間抜け。

130 :デフォルトの名無しさん:2009/11/02(月) 13:28:09
_ で始まってたり、すべて小文字だったりする関数名からして
明らかに API ではなく CRT なわけだが、それが何の関係が?

131 :質問!:2009/11/02(月) 13:30:23
CRTって何ですか?

132 :デフォルトの名無しさん:2009/11/02(月) 13:41:12
CathodRayTube:陰極管

133 :デフォルトの名無しさん:2009/11/02(月) 13:54:31
Cランタイム(ライブラリ)
C実行時ライブラリ

134 :デフォルトの名無しさん:2009/11/02(月) 14:03:14
>>128
条件付でYES。 VCのランタイムのソース見ればわかる。

_beginthread(ex) は、
VCで提供している標準関数をスレッドセーフにするために、 TLSを作ったり
浮動小数点関連や 構造化例外(API)→C++例外配送機構 の初期化を行った後
CreateThread を呼び出してる。 (callback 関数も内部のものを利用)
thread が死んだ時、上記の後始末もやってる。

つまり、標準関数周辺のランタイムも VC のを使うなら動くわけだが…

なお、BCC は同じ名前で似たような機能の _beginthread(ex) を自前で用意しているんじゃなかったかな

135 :デフォルトの名無しさん:2009/11/02(月) 15:29:56
プログラム実習の授業に ついていけないんですが、素人にお勧めの入門書はないですか? 大学一年です

136 :デフォルトの名無しさん:2009/11/02(月) 15:34:41
新版 明解C言語 入門編

137 :デフォルトの名無しさん:2009/11/02(月) 15:55:20
関数内で定義した変数は削除しないとスタックオーバーフローとかいうのになるって聞いたんだけど
本当なの?

138 :デフォルトの名無しさん:2009/11/02(月) 16:06:36
>>137
うそだよ

・・・って一気に切り捨てるのもなんだから問おう。
> 関数内で定義した変数
ってなんだ?



139 :デフォルトの名無しさん:2009/11/02(月) 16:14:27
ローカル自動変数のことだろ。
スタック上に確保される実装が多いから、
ネスト深くしすぎるとスタック溢れするからってことだろ。
まあ、普通に使う分には気にしなくていいよ。
ただし、ローカル自動変数にあまり巨大な領域を使うなってことは言える。

void func(){
int a[1000][1000][1000]; // こういうのは止めろってこと。
return;
}


140 :デフォルトの名無しさん:2009/11/02(月) 16:17:23
>>139
ヒープでもありえねーよw

141 :138:2009/11/02(月) 16:17:39
あー、そういいたいわけか。
まあ入門編スレだしな。

>>137
しかしローカル自動変数を削除っていったい何をどうしたいんだ?
そういう間違ったことを教えてきたクソに
聞くべきじゃないか?

142 :デフォルトの名無しさん:2009/11/02(月) 16:19:10
便乗質問で申し訳ございませんが、
int a[1000][1000][1000]
が欲しい場合どうすればいいんでしょうか?
newでヒープに確保しようにも無茶ですよね。



143 :デフォルトの名無しさん:2009/11/02(月) 16:20:54
>>142
mmap 使うべし

144 :デフォルトの名無しさん:2009/11/02(月) 16:27:27
>>143
UNIX系OS独自のものですか?
クロスプラットフォームに使える
mmapみたいなものはありませんでしょうか?

C++ライブラリでもいいんで。

145 :デフォルトの名無しさん:2009/11/02(月) 16:36:32
>>135
K&R とコンパイラのマニュアル、& スペシャルボーナスで Google
これでダメなら、せっかく頑張っても先はないから、他の科目で優をとるために力を回すべき

ちなみに C++ の禿本は K&R の3倍くらい難しい

146 :デフォルトの名無しさん:2009/11/02(月) 16:46:51
>>144
ヒープに取れない→2次記憶としてファイルを使う→ファイル操作に縛りがでるかも?
で、汎用性の高いものは作りにくいんでないかな?

147 :デフォルトの名無しさん:2009/11/02(月) 16:55:03
>>142
CでなくなってしまうがC++でプロキシクラスでoperator[]を
オーバーロードすればディスク上に巨大な配列が取れる

ただし激遅なのはもちろん

148 :デフォルトの名無しさん:2009/11/02(月) 16:56:28
>>142
32bit 空間に 1GB なら基本的に無理はない
そういうオーダーでいくつも取る気なら 64bit を選択しれ

149 :デフォルトの名無しさん:2009/11/02(月) 16:56:53
>>146
なるほど、確かに。

>>147
あー擬似的にクラスで実現するってことですか。


150 :デフォルトの名無しさん:2009/11/02(月) 16:56:56
たった4GiB弱くらい、ヒープに確保しちゃえばいいじゃん。

151 :デフォルトの名無しさん:2009/11/02(月) 16:58:25
>>148
型が int なんで… 微妙にアウト? (べき指数のベースが 1000 vs 1024 で違うけど)

152 :デフォルトの名無しさん:2009/11/02(月) 16:58:52
>>149
Windows と Linux で関数名が違うから
自分でラッパー書けばいいよ

153 :デフォルトの名無しさん:2009/11/02(月) 17:06:24
>>142
あとその巨大な配列の全部に要素を入れるのではなく
ガラガラな使い方をするのなら、疎行列(sparse matrix)という技法がある

154 :142:2009/11/02(月) 17:09:20
みなさんありがとうございます。
なんか私の知識をずっと超えたレベルになって来たようで、
勉強不足を痛感する限りです。


155 :デフォルトの名無しさん:2009/11/02(月) 17:13:36
>>141
ローカルスコープでも使わせたいのかしらん

void func () {
int foo; /* 関数全域で使う変数 */
{ int a; /* a を使うコード */ }
}

C++ なら コンストラクタ/デストラクタの都合があるので意味ありそうだけど(それでも PODはあやしいが…)
C でローカルスコープ脱出後に戻されるという保証はないよね?

156 :デフォルトの名無しさん:2009/11/02(月) 17:21:52
>>155
というか
int a[1000][1000][1000][1000][1000][1000][1000][1000][1000][1000][1000][1000];
でもC/C++の仕様上は問題はないんだよね。
単に現実を見ろよって話なだけで。

157 :デフォルトの名無しさん:2009/11/02(月) 17:25:49
int *************************i; とかでもいいよ

コンパイルされたコードを見ると笑えてくるけど

158 :デフォルトの名無しさん:2009/11/02(月) 17:27:36
>>155
賢いコンパイラなら、以下のiとjは同じ領域を使いまわすかもしレナ。
void func(int para)
{
{
int i = para;
}
{
int j = para;
}
}

159 :デフォルトの名無しさん:2009/11/02(月) 17:32:32
>>158
言えてる。
とくにそれが配列だったりしたらそうするかもしれないね。


160 :デフォルトの名無しさん:2009/11/02(月) 17:39:12
>>158-159
領域の使いまわしが発生しているとすると、削除には該当しないんだよねー
(スコープ脱出後もメモリ上は存在している という意で)

なおさら
「関数内で定義した変数は削除しないとスタックオーバーフローとかいうのになる」
の意図が見えないな

161 :デフォルトの名無しさん:2009/11/02(月) 18:00:11
そんな意味不明なフレーズには、本人に聞けとしか言えんだろう

162 :デフォルトの名無しさん:2009/11/02(月) 18:01:39
前にもそんなこと言って人の言うこと聞かなかった奴がいたな。

163 :デフォルトの名無しさん:2009/11/02(月) 20:51:28
陰極管だと Cathod Tube だよなぁ
CRT なら陰極線管と翻訳すべきだった

164 :デフォルトの名無しさん:2009/11/02(月) 21:03:19
エロい話かと思った

165 :デフォルトの名無しさん:2009/11/03(火) 07:10:51
関数内でmallocした領域はfreeしないとメモリリークする
ってことでは


166 :デフォルトの名無しさん:2009/11/03(火) 11:29:36
>>165
スタックオーバーフローにはならんのでは

167 :デフォルトの名無しさん:2009/11/03(火) 12:29:47
ランレングス符号化のプログラムです
このプログラムだと最初の文字が評価されなくて困っています。
アドバイスをお願いします。
#include <stdio.h>
int runlength(int length, char *str_org, char* str_enc){

int i,j = 0;
char *RLE = str_enc;

while(length--){
if(str_org[i] == str_org[i + 1]){
i++;
j++;
}
else{
*str_enc++ = str_org[i];
*str_enc++ = '1' + j;
i++;
j = 0;
}
if(str_org[i] == 0)
break;
}
str_enc = 0;
return(*RLE);
}

168 :続きです。:2009/11/03(火) 12:30:32
int main(void){
char buf_r[1024] = {0};
char buf_w[1024] = {0};
int length;

printf("文字列の入力\n");
scanf("%s",buf_r);
runlength(1024,buf_r,buf_w);
printf("[ランレングス符号化]\n%s\n",buf_w);
return(0);
}


169 :デフォルトの名無しさん:2009/11/03(火) 12:37:24
ワロタ

170 :デフォルトの名無しさん:2009/11/03(火) 12:37:57
int i = 0,j = 0;
とか?

171 :デフォルトの名無しさん:2009/11/03(火) 12:44:55
C言語でポインタというのがありますが、
ゲームではどういうところで使われてるんですか?
具体例を教えてください。

172 :デフォルトの名無しさん:2009/11/03(火) 12:45:45
メッセージの出力とか。

173 :デフォルトの名無しさん:2009/11/03(火) 12:47:46
ファイルの読み書き

174 :デフォルトの名無しさん:2009/11/03(火) 12:49:09
スタートアップ直後 DirectXの初期化で とか

175 :デフォルトの名無しさん:2009/11/03(火) 13:07:36
>>167
>>116 を参考にしてみて

同じ学校なのかな?

176 :デフォルトの名無しさん:2009/11/03(火) 13:37:00
最近は義務教育でC言語まで教えてるのか

177 :デフォルトの名無しさん:2009/11/03(火) 13:47:39
>>167
暇だからやってみた。参考になれば
http://0x72.net/upload/src/0002.c.txt

178 :デフォルトの名無しさん:2009/11/03(火) 16:06:44
最近のコンパイラってブロックの先頭じゃなくても変数の宣言できるの?

179 :デフォルトの名無しさん:2009/11/03(火) 16:10:33
C99なら可

180 :デフォルトの名無しさん:2009/11/03(火) 17:16:24
(int *)
↑*って何

181 :デフォルトの名無しさん:2009/11/03(火) 17:17:05
asterisk だよ。

182 :デフォルトの名無しさん:2009/11/03(火) 17:22:06
ポインタ型

183 :デフォルトの名無しさん:2009/11/03(火) 17:36:07
(insert -> *)

184 :デフォルトの名無しさん:2009/11/03(火) 17:48:51
ポインタ型ってなんだよ

185 :デフォルトの名無しさん:2009/11/03(火) 17:58:05
(int *) = * を付けたら int 型

186 :デフォルトの名無しさん:2009/11/03(火) 19:37:46
* = ア○ル

187 :デフォルトの名無しさん:2009/11/03(火) 20:19:45
× アナル
○ アヌス

「アナル」は形容詞形。
「アナル○○○」と後ろに続く場合の活用形。
単体で名詞として使うなら「アヌス」とするべき。


188 :デフォルトの名無しさん:2009/11/03(火) 20:24:04
あーネイティブの発音知らないわけねw
英語弱者って電子土方やってても辛そう

189 :デフォルトの名無しさん:2009/11/03(火) 20:28:35
日本語表記においてはネイティヴの発音にいちいちあわせる必要はないだろw

190 :デフォルトの名無しさん:2009/11/03(火) 21:12:34
>電子土方やってても辛そう

最近の2chって>>188みたいに無意味に突っ掛かってくるヤシが多いよな。
氏ねばいいのに。

191 :デフォルトの名無しさん:2009/11/03(火) 21:14:50
どうでもいいことで盛り上がるなよ
みんなタヒねばいいのに
くそが

192 :デフォルトの名無しさん:2009/11/03(火) 21:15:23
劣等感ゆえの攻撃性だから、哀れみをもってスルーするのがいいよ。

193 :デフォルトの名無しさん:2009/11/03(火) 21:16:11
http://jfk.2ch.net/test/read.cgi/classical/1229764900/

194 :デフォルトの名無しさん:2009/11/03(火) 21:17:35
>>191
仕様書ある夫さんですか?

195 :仕様書ある夫さん:2009/11/03(火) 21:23:19
仕様書ある尾です

196 :デフォルトの名無しさん:2009/11/04(水) 14:32:31
int Func(void* buf)
{
SOCKET SOCK = (SOCKET)buf;

voidポインタで渡された値をソケット型にキャストしたいんだけど
これだとうまくいかない

197 :デフォルトの名無しさん:2009/11/04(水) 14:38:19
ヘッダファイル読め
SOCKETって構造体か何かじゃねーの?

198 :デフォルトの名無しさん:2009/11/04(水) 14:38:41
SOCKET sock = ...... ;
Func( (void*) sock );
呼ぶ側はもちろんこうだよな?

199 :デフォルトの名無しさん:2009/11/04(水) 14:39:29
SOCKETが何なのかわからんが、voidポインタの引数はキャスト不要じゃない?

200 :デフォルトの名無しさん:2009/11/04(水) 14:46:16
ポインタ以外の何かなら必要じゃないか?w

201 :デフォルトの名無しさん:2009/11/04(水) 14:51:26
初期化に定数以外って使えるの?

202 :デフォルトの名無しさん:2009/11/04(水) 15:14:08
今の普通のCなら使える。

203 :デフォルトの名無しさん:2009/11/04(水) 15:52:19
>>201
C FAQでも読んどけ

204 :デフォルトの名無しさん:2009/11/04(水) 15:55:48
>>203
C FAQのどれ?項番教えて

205 :デフォルトの名無しさん:2009/11/04(水) 16:12:13
int f(int a){return a+1;}
int main(){
int i = f(1); /* できるの? */

return 0;
}

206 :デフォルトの名無しさん:2009/11/04(水) 16:16:25
>>201
少なくともGNU CとC++では使える。

207 :デフォルトの名無しさん:2009/11/04(水) 16:17:41
BCC55でも使える

208 :デフォルトの名無しさん:2009/11/04(水) 16:20:19
初期値だったら定数じゃないと無理だろうけど、
自動変数の初期化なんてのは所詮は普通に代入してるだけだからな。


209 :デフォルトの名無しさん:2009/11/04(水) 18:43:10
初期化と代入は本来違うものであってしかるべきなんですが、まあ時代もかわりましたね。

210 :デフォルトの名無しさん:2009/11/04(水) 18:56:02
>>205
できない、と思っているなら
なぜそう思うのかを開陳すべき

211 :デフォルトの名無しさん:2009/11/04(水) 19:27:24
 ヽ('A`)ノ カイチン!
  (  )
  ノω|


 __[警]
  (  ) ('A`)
  (  )Vノ )
   | |  | |

212 :デフォルトの名無しさん:2009/11/04(水) 19:54:14
while((*p++ = *q++) != 0 )
;
このコードの意味を説明してもらえませんか?
自己解釈
1 qの値をpに代入する
2 その値が0でなければwhileループ内を実行する
3 p及びqのアドレスを1インクリメントする
こういう意味ですか?


213 :デフォルトの名無しさん:2009/11/04(水) 20:05:34
1. *qの値を*pに代入する
2. p及びqのアドレスを1インクリメントする
3. 1の値が0でなければwhileループ内を実行する

インクリメントは*qの値が0であってもそうでなくても行われる
whileループ内の文が実行されるのはインクリメントが行われた後

214 :デフォルトの名無しさん:2009/11/04(水) 20:14:06
>>213
thx

215 :デフォルトの名無しさん:2009/11/04(水) 20:51:17
>>212
そういうトリッキーなコードを書いてウケたのは1980年代
なんでw
30年前は兎も角現在そういうコードを書いてもプロセッサ
までその努力が全く届かないので

do{ *p=*q; p++,q++ }while(*q!='¥0');
とかの演算子の優先順位を記憶していない人でも読めるコード
で書くのが吉

216 :デフォルトの名無しさん:2009/11/04(水) 20:53:53
>>215
うっせはげ
うっせはげ
うっせはげ

217 :デフォルトの名無しさん:2009/11/04(水) 20:54:01
上のコードは等価じゃなかったw
for(;;){ *q=*p;p++,q++; if(*p=='¥0')break; }

218 :デフォルトの名無しさん:2009/11/04(水) 20:56:03
なにそのトリッキーなコード。

219 :デフォルトの名無しさん:2009/11/04(水) 21:02:01
よーし、>>218がもっと簡単なの書くぞ〜

220 :デフォルトの名無しさん:2009/11/04(水) 21:02:42
>>215
あの程度をトリッキーという技量で論じた結果がそれ
演算子の優先順位くらい理解していないから間違えた

a = 1 + 2 * 3; の優先順位くらい頼むから理解してくれ
というのと五十歩百歩の域を出ない

221 :デフォルトの名無しさん:2009/11/04(水) 21:05:12
>>217も間違っているしな

222 :デフォルトの名無しさん:2009/11/04(水) 21:15:33
strcpy(p,q);

223 :デフォルトの名無しさん:2009/11/04(水) 21:21:01
>>212
while(*p++ = *q++);
これで必要かつ充分

224 :デフォルトの名無しさん:2009/11/04(水) 21:24:29
あれがトリッキーに見えるって他言語からCに入った人?

225 :デフォルトの名無しさん:2009/11/04(水) 21:26:45
うちの職場じゃ見かけないねえ

226 :デフォルトの名無しさん:2009/11/04(水) 21:29:33
>>221
ワロタ
本当だw

227 :デフォルトの名無しさん:2009/11/04(水) 21:35:02
間違ってるとかワロタとかいいからちゃんと指摘してくれ
いえ、お願いします

228 :デフォルトの名無しさん:2009/11/04(水) 21:36:33
>>227
自分で書いたんだろう
動作テストしてみな
ちゃんと動くかどうか

229 :デフォルトの名無しさん:2009/11/04(水) 21:53:35
do{*p=*q;++p;++q;}while(*(p-1));
分解するとこんな感じか
普通に>>212のままの方がいいな

230 :デフォルトの名無しさん:2009/11/04(水) 22:35:12
>>223
冥途の土産に持っていけ

231 :デフォルトの名無しさん:2009/11/04(水) 22:53:13
要するにただの stos だろ

232 :デフォルトの名無しさん:2009/11/04(水) 23:24:49
Q . . . . . . .
. . . . Q . . .
. . . . . . . Q
. . . . . Q . .
. . Q . . . . .
. . . . . . Q .
. Q . . . . . .
. . . Q . . . .

記念

233 :デフォルトの名無しさん:2009/11/05(木) 01:03:15
>>232
わかる

234 :デフォルトの名無しさん:2009/11/05(木) 02:52:31
8Queensか

235 :デフォルトの名無しさん:2009/11/05(木) 04:33:07
pとqがchar *型なのであればstrcpyが一番。
そうでなく、int *などなら>>223で充分。イディオムとして成立している書き方が読めないのは単に経験不足。
それでもトリッキーだというのなら、
while(*p++ = *q++) {
  ; /* 空 */
}
とでもしておけばいい。

236 :デフォルトの名無しさん:2009/11/05(木) 05:07:39
ポインタを使えばアドレスを操作できるみたいだけどC言語ってアセンブリみたいに直接アドレスを指定して変えれる?

アドレス12345678の値をFBにせよ
みたいな。

こういうこと難しい?

237 :デフォルトの名無しさん:2009/11/05(木) 05:42:28
>>236
簡単にできる。

238 :デフォルトの名無しさん:2009/11/05(木) 10:18:25
*(char *)12345678 = 0xFB;
でいいのだろうか

239 :デフォルトの名無しさん:2009/11/05(木) 10:24:45
>>236
* (char *) 0x12345678 = 0xfb;

240 :デフォルトの名無しさん:2009/11/05(木) 10:26:05
あぁ

241 :デフォルトの名無しさん:2009/11/05(木) 10:45:49
16進とは書いてないだろ。

242 :デフォルトの名無しさん:2009/11/05(木) 10:50:58
アドレスって書いてあれば16進だと思うの普通じゃね?

243 :デフォルトの名無しさん:2009/11/05(木) 11:09:29
プレフィックスもサフィックスもなく、[0-9] だけで構成された数字を見たら
16進ではない、と思うのが自然な飢餓する。

244 :デフォルトの名無しさん:2009/11/05(木) 12:11:12
>>227
>>217の糞コードじゃ0がコピーされないだろ


245 :デフォルトの名無しさん:2009/11/05(木) 14:08:28
for(;;) { *q=*p; if(*p=='¥0') break; p++,q++; }

246 :デフォルトの名無しさん:2009/11/05(木) 14:17:46
アドレスを10進数で表記するような文献は見たことない

247 :デフォルトの名無しさん:2009/11/05(木) 15:14:38
>>245
それだと最終的なp, qの値が違う
for(;;) {
*q=*p;
if(*p=='\0') {
p++;
q++;
break;
}
p++,q++;
}

248 :デフォルトの名無しさん:2009/11/05(木) 15:55:24
>>246
つ情報処理技術者試験


249 :デフォルトの名無しさん:2009/11/05(木) 16:18:28
http://www.dotup.org/uploda/www.dotup.org332567.pdf.html

この課題の『Aについて』でいきなり詰まってしまいました。
少しずつ理解しながらやりたいので、だれか協力お願いします。
なんどかこのスレで質問することになると思います。

250 :デフォルトの名無しさん:2009/11/05(木) 16:27:24
整数乱数ってなんですか? とか、そういう感じの具体的な質問をお願いします
協力お願いしますでは何を答えていいのかわかりませんので

251 :249:2009/11/05(木) 16:33:13
自己解決しました。

252 :デフォルトの名無しさん:2009/11/05(木) 16:42:03
自己発電しました

253 :249:2009/11/05(木) 16:56:59
>>249です

整数乱数とはなんですか?
Aについてですが、今までは
int kansuu(int x)
{
return x*x;
}
のように数式を作るような使い方しかして来ませんでした
問題文にあるように関数の中で、min,maxを定義できるんですか?

254 :デフォルトの名無しさん:2009/11/05(木) 17:03:30
#include <stdlib.h>

int randomNumber (int min, int max) {
return rand() % (max - min + 1) + min;
}

255 :デフォルトの名無しさん:2009/11/05(木) 17:17:48
>>254
剰余を使うな。

256 :デフォルトの名無しさん:2009/11/05(木) 17:18:54
int randomNumber(int min, int max)
{
return (int)(rand() / (RAND_MAX + 1.0) * (max - min + 1)) + min;
}

257 :デフォルトの名無しさん:2009/11/05(木) 17:20:40
>>255
今更気にする必要なし。

258 :デフォルトの名無しさん:2009/11/05(木) 18:00:43
2の累乗以外の乱数を出す場合は、
振り直し法を使わないと均等にはならないよ。

例えば RAND_MAX が 7 として、
それで 1〜6 の乱数を求めたら
1/8 の確率のものと 2/8 の確率のものが混ざってしまうだろ。
これは RAND_MAX を大きくしても解決しない問題だろ。

259 :デフォルトの名無しさん:2009/11/05(木) 18:09:31
>>257
それはない。rand() の線形合同法では mod を使うのはご法度。

260 :デフォルトの名無しさん:2009/11/05(木) 18:16:04
別にいいよ

261 :デフォルトの名無しさん:2009/11/05(木) 18:51:49
>>256
実数を使っても無駄だよ。
int randomNumber(int min, int max)
{
return rand() / (RAND_MAX / (max-min+1)) + min;
}

整数でも変わらん。
どうしても均等にしたければ振り直し法を使うしかない。

262 :デフォルトの名無しさん:2009/11/05(木) 18:54:31
整数オーバーフローは起きないの?

263 :デフォルトの名無しさん:2009/11/05(木) 19:02:14
>>261
奥山晴彦氏の乱数の改良でも使えばいいだろ

http://www.vector.co.jp/soft/data/prog/se002453.html

264 :デフォルトの名無しさん:2009/11/05(木) 19:09:44
9桁以下の正の整数か否かを判別したいのですが

if(m>0 && n>0 && m<=999999999 && n<=999999999)

これでいいんでしょうか?
もっとスマートになりそうな気が…

265 :デフォルトの名無しさん:2009/11/05(木) 19:15:07
m の判定と n の判定がごちゃ混ぜになっているのが「スマートではない」な

266 :264:2009/11/05(木) 19:20:53
>>265
えっとつまり

if(m>0 && m<=999999999 && n>0 && n<=999999999)

ってことですか?
個人的に「999999999なんて入力しないんじゃなかろうか」と思ったのですが…

267 :デフォルトの名無しさん:2009/11/05(木) 19:24:43
m と n のどっちが外れているかの判別ができないけどいいの?

268 :デフォルトの名無しさん:2009/11/05(木) 19:34:10
>>266
とりあえずはね
ただし >>267 が言っているような問題がまだ残っているし
入力は屈指のこわーい所で、範囲チェックだけで済むかどうかも怪しいぞ

269 :264:2009/11/05(木) 19:45:26
>>267-268
急いでソース全部打ってきました


/* 9桁以下の2つの正の整数m,nを入力して、m/nの小数部分 */
/* を四捨五入して得られる整数値を出力するプログラム */

#include <stdio.h>
int main(void)
{
int m,n,quotient;

printf("\n9桁以下の正の整数を2つ入力して下さい\n");

scanf("%d%d",&m,&n);

if(m>0 && n>0 && m<=999999999 && n<=999999999){
quotient = (m+n/2)/n;
printf("\n%d/%dの小数部分を四捨五入して得られる整数値は、%dです。\n\n",m,n,quotient);
}else{
printf("\n入力する値は9桁以下の正の整数にして下さい。\n"
"プログラムを終了します。\n\n");
}
return 0;
}


コメント内のプログラムを作成するのが課題なのですが、ループ処理はまだ習っていないので終了という形にしてみました。
mとn分けたほうがいいでしょうか?

270 :デフォルトの名無しさん:2009/11/05(木) 19:51:44
ループがまだってことは、関数もまだか
今んとこそこまでかな

271 :264:2009/11/05(木) 19:59:39
>>270
そうですか
ありがとうございました
とりあえずif文の中を整理して提出してみます

272 :デフォルトの名無しさん:2009/11/05(木) 20:49:54
>>269
11桁とかの数入力されときどうなるんだっけ?

273 :デフォルトの名無しさん:2009/11/05(木) 21:18:59
scanf関数を用いて入力された3桁の整数に対して、
10の位および1の位を四捨五入することによって得られる2つの整数を表示するプログラムを作成せよ。
例)『425』を入力した場合、『400, 430』が画面に表示される。

宿題でこんなのが出たのですがどうしても出来ません!!
どなたか教えてください!!

274 :デフォルトの名無しさん:2009/11/05(木) 21:19:58
ちなみにこんな感じでやってみたけどダメでした

#include<stdio.h>
#include<math.h>

int main(void){
int x,a,b;

scanf("%d",&x);
a=(x/100)+0.5;
a=((int)a)*100;

b=(x/10)+0.5;
b=((int)b)*10;


printf("10の位を四捨五入して整数で表します.\n");
printf("結果=%d\n",a);
printf("1の位を四捨五入して整数で表します.\n");
printf("結果=%d\n",b);

return 0;
}

275 :デフォルトの名無しさん:2009/11/05(木) 21:25:03
>>274
惜しい!

276 :デフォルトの名無しさん:2009/11/05(木) 21:34:03
自販機のLEDあるじゃないですか
あれみたいに、
右から順にボタンLEDが点灯していき左端で停止
停止したら右からまたLEDが順に点灯していきスタック
スタックしたら右からまたLEDが・・・

ってのをやりたいのですが、「一行で」やるにはどうすればいいのですか。

ifを使うとビットシフトでできるのですが
「一行でやれよバカ」だそうです。

277 :デフォルトの名無しさん:2009/11/05(木) 21:38:33
>>276
質問の内容が意味不明だが
改行しなきゃいいんじゃないかな?

278 :デフォルトの名無しさん:2009/11/05(木) 21:39:59
1行って言われてもね……

279 :デフォルトの名無しさん:2009/11/05(木) 21:42:06
>>276
日!本!語!で!お!k!


280 :デフォルトの名無しさん:2009/11/05(木) 21:45:36
#define (コントローラのLEDアドレス)  Fuckintosh
char       LED = 0x01;

Fuckintosh = LED << 1;

で、左端のLEDまで点灯させます。 2進数で10000000です

じゃあ左端を点けたまま再度右から点灯させていくなら 10000001 -> 10000010とシフトしていけばいいのか、と
別に変数を用意し、+ したのですが
なぜかこれだと 二個同時に点いたります。

ifで分けてやると思い通りの点灯パターンを行うのですが
「(ifとか使わず)一行でやれよバカ」だそうです。

281 :デフォルトの名無しさん:2009/11/05(木) 21:47:09
二個同時と言うのは左端を含めずに二個です

シフトしていくLEDと隣り合ったLEDが点いて消えたり点いたり、
一緒にシフトして行ったり
shます

282 :デフォルトの名無しさん:2009/11/05(木) 21:53:05
1行とか言ってるソイツがアホなだけだろ。

283 :デフォルトの名無しさん:2009/11/05(木) 21:54:30
ほんと日本語へたくそだな
if使ったコード晒せよ


284 :デフォルトの名無しさん:2009/11/05(木) 22:02:38
>>280
でけたwww
int i,j,hoge;for(i=0,LED=0;i<8;i++){hoge=LED;for(j=0;j<8-i;j++)(LED=hoge|(1<<j)),*p=LED;}

その説明では状況が分からん

285 :デフォルトの名無しさん:2009/11/05(木) 22:03:19
00000000
00000001
00000010
00000100
00001000
00010000
00100000
01000000
10000000
10000001
10000010
10000100
10001000
10010000
10100000
11000000
11000001
11000010
11000100
11001000
11010000
11100000
こんな感じ?

286 :デフォルトの名無しさん:2009/11/05(木) 22:06:50
そうです

LEDが16コあって、そのうちの8つがLEDコントローラA
残りの8つがBに繋がっちょります
が、8つ点ける時点でつまずきました

287 :デフォルトの名無しさん:2009/11/05(木) 22:08:38
10000000
よしここから右端から点けよう

10000001 点いた
10000011 あれ?
10000110 あれ?
10000111 おや?
10001101 なんじゃ

なんてことになってます。


288 :デフォルトの名無しさん:2009/11/05(木) 22:11:50
>>287
コードを晒すんだ!
そのほうが日本語より直接的で分かりやすいと思う

289 :デフォルトの名無しさん:2009/11/05(木) 22:15:53
なので、
Fuckintosh = 10000000 + (FuckOSX << 1) とかしたらどうかな、と思ったのですが

上のようにワケのわからんパターンで点灯し
ならORで、とやってもだめでした


>>288
仕事場に置いてきてまってるもんで

自販機を思い浮かべてもらえれば。
あの多段ボタンLEDそのままなので。

そのLEDは2進数00000000に対応しており、点けたい部位のビットを1にすれば光ります
10000000なら左端、00001000なら右から4番目、というふうに

290 :デフォルトの名無しさん:2009/11/05(木) 22:17:53
>>285 をテーブルに入れて垂れ流せばいいよ。

291 :デフォルトの名無しさん:2009/11/05(木) 22:18:19
>>289
この時期まで研修とは…
大企業だな
裏山鹿

>>284 でおk

292 :デフォルトの名無しさん:2009/11/05(木) 22:18:26
あー違った

Fuckintosh = 10000000 + (FuckOSX << 1)の 10000000 の部分は決め打ちではありません。
変数です。
if(FuckMac >= 10000000)
 Fuckintosh = (FuckMac + (FuckOSX << 1));

という感じですかね

293 :デフォルトの名無しさん:2009/11/05(木) 22:21:35
2進数10000000は、16進数で0x80,

左端と右端を点けるには10000001、つまり0x81
やはり左端の値を保持して、新たにシフトさせていく変数を用意し
左端の値と足していけば順次シフトできるんじゃなかろうか、
と思ったのです。

294 :デフォルトの名無しさん:2009/11/05(木) 22:39:35
つーか、ビット操作なら unsigned でやれよ。


295 :デフォルトの名無しさん:2009/11/05(木) 22:58:53
排他的論理の計算ってどんなときに使うんですか?

101100110
110011101

011111011
になるのはいいんですが、この計算はたとえばどんな時に使用されるの?

296 :デフォルトの名無しさん:2009/11/05(木) 22:59:47
stdioはstandard input outputの略
ではprintfやsacanfとかって.....
語源とか気になる関数とか多いです

297 :デフォルトの名無しさん:2009/11/05(木) 23:03:17
>>295
フラグの入れ替えとかハッシュ計算とか


298 :264:2009/11/05(木) 23:07:50
>>272
11桁ですか?
おそらく弾かれて、プログラム終了となるんじゃないかと思うのですが…

299 :デフォルトの名無しさん:2009/11/05(木) 23:09:48
>>295
特定のビットだけ反転させたいときだな。
あまり使う機会はない。

>>296
print や scan に format の f 付けただけ。


300 :デフォルトの名無しさん:2009/11/05(木) 23:14:03
>>299

おお、こんなに早くお返事が!!!
サンクスです
検索かけても語源とかなかなか出てこなくって
「UNIXの古い資料調べれば全部分かる」
みたいな話はどこかに書いてありましたが
それもちょっとよく分からん話だったんで

301 :デフォルトの名無しさん:2009/11/05(木) 23:27:38
1ビットずつフラグに使ってたら、反転させたいときもあるんだろうな

302 :デフォルトの名無しさん:2009/11/05(木) 23:43:26
>>296
print formatted output

その他気になるのは↓で探すよろし
http://www.opengroup.org/onlinepubs/009695399/mindex.html

303 :デフォルトの名無しさん:2009/11/06(金) 00:09:44
ボタンとかのオブジェクト配置するには?
画面の出し方は死ぬほどサンプルあるけれど

304 :デフォルトの名無しさん:2009/11/06(金) 00:34:17
いきなりなんだよwww
windowclass にボタン指定しろよw

305 :デフォルトの名無しさん:2009/11/06(金) 00:39:22
スレ違い

306 :デフォルトの名無しさん:2009/11/06(金) 00:45:15
>>295
RAID5の計算とか
CRCとか
画像処理とか

A = 101100110
B = 110011101
A xor B = C
C = 011111011

C xor A = ...
C xor B = ...

307 :デフォルトの名無しさん:2009/11/06(金) 02:55:03
>>302
リンク先までありがとうございます
正直、英語は読めないので何をどう見たらよいやら分かりませんが調べてみます
やはりプログラマーは英語必須なんでしょうなあ

308 :デフォルトの名無しさん:2009/11/06(金) 02:59:12
英語読めなくてもプログラマやってる奴は結構いるよ
カスばっかだけど

309 :デフォルトの名無しさん:2009/11/06(金) 03:03:42
プログラミングコンテストの問題が英語だから理解出来ないとかね
プログラミング以前の段階で淘汰されてて面白い

310 :デフォルトの名無しさん:2009/11/06(金) 03:08:20
職業としてやるんじゃなかったら英語なんてたいして必要ない。
英検三級ありゃやっていける。

311 :デフォルトの名無しさん:2009/11/06(金) 03:39:30
int main()
{
unsigned char LED = 0x01;
int i,j,n;
for (i = n = 0; i <= 36; n=++i)
{
LED = 0;
for (j = 8; j > 0; n-=j*(n>=j),j--)
{
LED |= (n>=j)<<(j-1);
}

for (j = 7; j >= 0; j--)
{
printf("%d", LED >> j & 1);
}
printf("\n");
}
return 0;
}

どうしてこうなった

312 :デフォルトの名無しさん:2009/11/06(金) 04:21:24
unsigned char func(int n)
{
unsigned char LED = 0;
int i, stack = 0;
for (i = 8; n > i; n-=i--, stack++);
LED = ~0 << (8-stack) | !!n << (n-1);

return LED;
}

int main()
{
int i,j;
unsigned char LED;

for (i = 0; i <= 36; ++i)
{
LED = func(i);

for (j = 7; j >= 0; j--)
{
printf("%d", LED >> j & 1);
}
printf("\n");
}

return 0;
}

がんばってこれか

313 :デフォルトの名無しさん:2009/11/06(金) 06:00:48
stackをループじゃなくて2次式を解くことでできそうな気がするけど、またあとで。

314 :デフォルトの名無しさん:2009/11/06(金) 15:15:26
Cは無限ループifしなくても何かが起こったときに
関数に飛ぶことはできないの

315 :デフォルトの名無しさん:2009/11/06(金) 15:16:46
日本語でおk

316 :デフォルトの名無しさん:2009/11/06(金) 15:17:11
>>314
日本語でOK。

317 :デフォルトの名無しさん:2009/11/06(金) 15:20:07
>>314
signal()

318 :デフォルトの名無しさん:2009/11/06(金) 15:45:21
教えてやるから日本語で質問しろ。

319 :デフォルトの名無しさん:2009/11/06(金) 16:01:10
馬鹿は回答するな

320 :デフォルトの名無しさん:2009/11/06(金) 16:02:26
>>314
atexit()

321 :デフォルトの名無しさん:2009/11/06(金) 16:12:23
>>314
標準Cには、そういう仕掛けはない。
Win32 API なり、Pthreads なりを使うわけだが
OS が特定できんことには。

322 :デフォルトの名無しさん:2009/11/06(金) 17:15:23
signalは標準だろボケ
無知は黙ってろよカス

323 :デフォルトの名無しさん:2009/11/06(金) 17:31:42
>>322
では一つ、signal()の標準的な使い方を教えてくだされ。

324 :デフォルトの名無しさん:2009/11/06(金) 17:37:51
問題文を出力するなどのため、
引数の内容が長文化した場合、(継続文字?)について教えてください。

例えば、プリントエフ関数で、長文を表示させる場合、

printf("1行目から2行目\n3行目から4行目\n");

といったように書いていったのですが、
当然ながらだんだん見えなくなってくるので、

printf("・・・・3行目から4行目\n"
"5行目から6行目\n6行目から7行目\n・・・・");

と、表示していくことになりますが、
他によい方法はないのでしょうか。
こういう場合、どういう方法が一般的なのでしょうか。
プリントエフで一個ずつ表示するものなのでしょうか。



325 :デフォルトの名無しさん:2009/11/06(金) 17:41:12
SIGABRT, SIGFPE, SIGILL, SIGINT, SIGSEGV, SIGTERM は標準のようだ
質問の「何か」っていうのが具体的に何かわからないと何ともいえないが

326 :デフォルトの名無しさん:2009/11/06(金) 17:43:30
>>324
俺なら1行ごとに分ける
printf(
  "1行目\n"
  "2行目\n"
  "3行目\n"
  ・・・・
  "最終行\n");
それか、問題文を別ファイルから読み込む

327 :デフォルトの名無しさん:2009/11/06(金) 17:52:34
>>326
なるほど1行ずつですか。

>>それか、問題文を別ファイルから読み込む
買ってきた本でもファイルの入出力を最後のほうで取り上げています。
なんとかそこまで早くたどり着きたいものです。

最終的にはプロンプトでサウンドノベルみたく動く文字出力を実現したいです。
あの、1文字、1文字、動いていく感じがたまらなくいいので。
たぶん繰り返し処理とか使うんだろうなあとは思っているのですが。

328 :デフォルトの名無しさん:2009/11/06(金) 18:08:36
優れたプログラマ=論理演算多用 if少ない

if((A >> B) |= C) != ( ((D >> E) << F) &= (G | H)){
  VAR = I >> (J |= (K + L));
}

329 :デフォルトの名無しさん:2009/11/06(金) 18:10:13
>>328
馬鹿?

330 :デフォルトの名無しさん:2009/11/06(金) 18:11:20
劣ったプログラマ=if多い

if()
 if()
  if()
   if()
    if()
else if()
 if()
  if()
 else if()


ifを判定するだけで最低1クロック無駄にする

331 :デフォルトの名無しさん:2009/11/06(金) 18:18:10
Cでどう短く書くかより、実際の効率で考えるべき

332 :デフォルトの名無しさん:2009/11/06(金) 18:39:47
ものすごいアホがいる。

333 :デフォルトの名無しさん:2009/11/06(金) 18:43:02
>>328
まだ減らせるぞw
((A >> B) |= C) != ( ((D >> E) << F) &= (G | H))&&(VAR = I >> (J |= (K + L)));



334 :デフォルトの名無しさん:2009/11/06(金) 19:22:57
>>324
ふつーは
printf("一行目\n");
printf("二行目\n");
printf("三行目\n");
printf("四行目\n");

335 :デフォルトの名無しさん:2009/11/06(金) 19:46:24
printf("四行目\n",printf("三行目\n",printf("二行目\n",printf("一行目\n"))));


336 :デフォルトの名無しさん:2009/11/06(金) 20:05:35
>334,>335は関数呼び出しコストを度外視しているところが間抜け。
一回で済むことを4回もやるな。

337 :デフォルトの名無しさん:2009/11/06(金) 20:15:43
それ以前に、ただの文字列出力にprintf使う奴はプログラマーに向いていない。

338 :デフォルトの名無しさん:2009/11/06(金) 20:18:32
まあ普通は DrawText() 使うよな。

339 :デフォルトの名無しさん:2009/11/06(金) 20:20:03
関数くらい人に教わる前に自分で習得しろって?
そりゃ俺も C 始める前にアセンブラで PRINT マクロ作ってたさ、そのアセンブラも自作でね
けど今どうなんだろう? C の printf には BASIC の PRINT コマンドほどの教育力あるんかね
俺個人としては、かえって饒舌すぎるところがあるように思えるんだが

340 :デフォルトの名無しさん:2009/11/06(金) 20:24:32
まぁ、まともなコンパイラならprintf()の代わりにputs()を使うくらいのことはするからな。

341 :デフォルトの名無しさん:2009/11/06(金) 20:50:57
それだと結果が変わってしまうな。

342 :デフォルトの名無しさん:2009/11/06(金) 20:53:29
いまどきのコンパイラなら334も324も最適化で同じになるだろ。

343 :デフォルトの名無しさん:2009/11/06(金) 21:11:57
結局どう表示したいのか一目でわかるのが>>326の良いところ

344 :デフォルトの名無しさん:2009/11/06(金) 21:49:55
結局トレードオフなんあぢょ。

345 :デフォルトの名無しさん:2009/11/06(金) 22:06:53
あるアドレスに名前を付ける時ってどうするの?


346 :デフォルトの名無しさん:2009/11/06(金) 22:14:14
>>345
マクロとか変数名とか名前-アドレスマップとか

347 :デフォルトの名無しさん:2009/11/06(金) 22:15:57
ポインタ

348 :デフォルトの名無しさん:2009/11/06(金) 22:19:10
>>347
初心者は黙ってろ。

349 :デフォルトの名無しさん:2009/11/06(金) 22:28:10
× DIV = (300 / 2);
○ DIV = (300 >> 1)

350 :デフォルトの名無しさん:2009/11/06(金) 22:39:15
一番やりがち、真っ当なのはdefine

#define 90000000 adressV125



351 :デフォルトの名無しさん:2009/11/06(金) 22:41:20
>>348
ぬるぽ

352 :デフォルトの名無しさん:2009/11/06(金) 22:42:13
>>350
釣り針でかすぎw

353 :デフォルトの名無しさん:2009/11/06(金) 22:47:28
コンパイラが対応していれば、#plasmaでもいい。
でもプラズマは本当に「そのプラットフォーム専用」でないと用意されていない。

354 :デフォルトの名無しさん:2009/11/06(金) 22:53:32
本命は l だと思う。

355 :デフォルトの名無しさん:2009/11/06(金) 22:59:59
#import

356 :デフォルトの名無しさん:2009/11/07(土) 00:46:37
DXライブラリを使用して今までは正常にコンパイルできていたのですが、PCのフォルダなどを整理してから、

Fatal: ファイル VORBISFILE_STATIC.LIB が開けません

とメイク結果に表示されコンパイルできなくなってしまいました。
エディンタの再設定もしてあり、必要なファイルはあると思うんですが...
だれかアドバイスいただけないでしょうか。

357 :デフォルトの名無しさん:2009/11/07(土) 00:55:41
ここはそんな質問する場じゃない

358 :デフォルトの名無しさん:2009/11/07(土) 01:04:48
DBに接続するためのパスワード文字列をソースに埋め込もうと
考えたんですが、stringsコマンドでバレてしまいますよね。
通常は暗号化したパスワードを文字列として持たせるのがベターなんでしょうか?


359 :デフォルトの名無しさん:2009/11/07(土) 01:39:49
>>357
すみません初心者用の本でライブラリを使いなさいと書いてあったんです...
本の通りにやり直してもできないんです

360 :デフォルトの名無しさん:2009/11/07(土) 01:41:28
ここはそんな質問する場じゃない!

361 :デフォルトの名無しさん:2009/11/07(土) 02:39:25
気合い入れてもう一回ググッてきます。がんばってきます

362 :デフォルトの名無しさん:2009/11/07(土) 10:18:05
フォルダの整理って何したんだよ?

363 :デフォルトの名無しさん:2009/11/07(土) 11:09:18
makeしたら負けだと思う。

364 :デフォルトの名無しさん:2009/11/07(土) 11:46:42
>>363
自分で書いて面白いと思ってんの?

365 :デフォルトの名無しさん:2009/11/07(土) 11:50:14
おつにゃん

366 :デフォルトの名無しさん:2009/11/07(土) 13:17:46
printf("\
1行目\n\
2行目\n\
3行目\n\
・・・・
最終行\n\
");


367 :デフォルトの名無しさん:2009/11/07(土) 13:20:21
それインデンツできないから×

368 :デフォルトの名無しさん:2009/11/07(土) 14:31:46
printf(
"1行目\n"
"2行目\n"
"3行目\n"
・・・・
"最終行\n"
);

369 :デフォルトの名無しさん:2009/11/07(土) 15:06:46
char *s="
#include "hoge.txt"
";
printf(s);

370 :デフォルトの名無しさん:2009/11/07(土) 17:34:37
if(fgets(str, sizeof(str), stdin) == NULL)
が成り立つことってあるのでしょうか。

371 :デフォルトの名無しさん:2009/11/07(土) 17:45:41
ファイル終端。


372 :370:2009/11/07(土) 17:50:17
キーボードからの入力でファイル終端ってどういう場合なんでしょうか

373 :デフォルトの名無しさん:2009/11/07(土) 17:54:11
>>372
Ctrl-Z とか Ctrl-D とか ファイルリダイレクト とか

374 :デフォルトの名無しさん:2009/11/07(土) 17:54:12
>>372
Windows なら ctrl + z
*nix なら ctrl + d だっけか?

375 :370:2009/11/07(土) 18:02:17
ありがとうございます

376 :デフォルトの名無しさん:2009/11/07(土) 18:47:31
define BUF 1024
char buffA[BUF], buffB[BUF];
char** str;
int needss, i, j, x, y;
質問です。上記の変数を利用しプログラムを記述しました。
まったく問題なく実行でき、さらに処理を追加しようと新たに
char buffC[BUF]という配列を宣言すると、エラーを吐くようになりました。
どうも、char型の変数を増やすとbuffBに文字列が格納された瞬間にエラーがでます。
変数名を変えても改善しませんでした。
プログラム自体には問題なく、当然コンパイラーは警告すらでません。
何が問題なのかまったく分からず困惑しています。
変数名が悪いのか、配列の要素数が全体で見れば多すぎるのかと思いましたが、そんなことはないはずですよね・・。

環境はUbuntu9.04 コンパイラGCC エディタEmacsです。
エラーの考えられる原因はなんでしょうか。


377 :デフォルトの名無しさん:2009/11/07(土) 18:50:07
object-CってC使いに易しいかな?
iMacポチって待機中なんだけど…

378 :デフォルトの名無しさん:2009/11/07(土) 18:53:18
>>376
スタックオーバーフローか未初期化のポインタで何か操作しようとしてる可能性が高い

379 :デフォルトの名無しさん:2009/11/07(土) 19:07:01
>>378

ポインタはmallocでメモリを確保しています。
というか、変数を追加しなくても、実行できなくなりました・・。
mallocで確保したメモリがfreeで解放できずスタックオーバーフローになっているという落ちとかでしょうか。。

380 :デフォルトの名無しさん:2009/11/07(土) 19:13:01
malloc はスタック関係ねー

381 :デフォルトの名無しさん:2009/11/07(土) 19:13:11
>>379
bufBに文字列が格納された時にエラーが発生という
場合、格納しようとしている文字列に問題があると
考えられる。多分読み出してはならない領域を
指すポインタだとか....
正確なことはソース見なければわからないんで
うpローダ使ってアげてみたら?

382 :デフォルトの名無しさん:2009/11/07(土) 19:15:04
まあどうせ単なるショボバグだろうな。


383 :デフォルトの名無しさん:2009/11/07(土) 19:18:20
コンパイラのせいにしたいのがみえみえ

384 :デフォルトの名無しさん:2009/11/07(土) 19:19:29
>ポインタはmallocでメモリを確保しています。

というが、

>define BUF 1024
>char buffA[BUF], buffB[BUF];
>char** str;
>int needss, i, j, x, y;

の中にあるポインタはstrしかなく、
そこにmallocの戻り値を格納するとしたら、多分
(charの配列ではなく)char*の配列を確保しているわけで
何かもうそもそもソースがおもしろいことに?^^

385 :376:2009/11/07(土) 19:22:31
ネタコメント削除してソースうpしますです。。

386 :デフォルトの名無しさん:2009/11/07(土) 19:24:04
(* (char *) ABC_easy_as_a_123)(int);

これどういう意味ですか。
ポインタ型charにキャストするなら最初からそうやったらいかんのですか。

387 :デフォルトの名無しさん:2009/11/07(土) 19:25:56
>>386
関数のポインタだろうけど、なんぞこれw

388 :376:2009/11/07(土) 19:33:16
ttp://codepad.org/dcYqWa30

うpしました。ダメ出しお願いします。

389 :デフォルトの名無しさん:2009/11/07(土) 19:34:35
struct SomeStruct
{
// ・・・
};

と書けばいいのになんで

typedef struct
{
// ・・・
}
SomeStruct;

と書くのが巷で流行ってるの?


390 :デフォルトの名無しさん:2009/11/07(土) 19:39:41
structをtypedefしないんだったらそいつへのポインタを
使うのはダサイかも

391 :デフォルトの名無しさん:2009/11/07(土) 19:40:35
ヒント:構造体を使う時

392 :デフォルトの名無しさん:2009/11/07(土) 19:42:56
構造体は、struct タグ名 で宣言するが
これで宣言したのはタグ付きの構造体の中身であって、
型として認められていない。
ここでtypedef を用いると、「SomeStruct型の構造体である」ことを認めさせることになる。

typedefを使わないと、
 struct SomeStruct MyStruct;
と別に一行必要になり。これでようやくSomeStruct型の構造体と認められるわけだ


つまり、構造体の「型宣言」と同時に「構造体として使えるように名前もつけてしまおう」という横着した手法なだけだ。

構造体は、述べたように最初の段階では使用できる構造体として認められない。
必ず、「SomeStruct型の構造を持つ○○」という名前をつけてやらなければ使用できない。
だからtypedefで型と名前を同時に決めることもよくある話。

393 :デフォルトの名無しさん:2009/11/07(土) 19:47:01
C++だと、これを勝手にやってくれちゃってんで面倒なことにもなりかねない。
Cの頃からtypedef structでやっていればC++って何て便利なんだ!と思うかもしれないが
あれは余計なお世話といってよい。

394 :デフォルトの名無しさん:2009/11/07(土) 19:47:04
理屈っぽ

395 :デフォルトの名無しさん:2009/11/07(土) 19:49:40
>>388
/*ここで必要な箱の数が分かったのでmallocで領域を確保*/
/*forで必要な行数回、1行の文字数のchar型の領域を作成*/
str = ( char ** )malloc( sizeof( char * ) * ( needBr + 1 ) );
for (i = 0; i <= needBr; i++){
str[i] = ( char * )malloc(oneLineLen * sizeof (char) + 1);
}


396 :デフォルトの名無しさん:2009/11/07(土) 19:52:04
>>392
なんか勘違いしてるっぽいな。

397 :デフォルトの名無しさん:2009/11/07(土) 19:53:53
strに実体がないような?

398 :デフォルトの名無しさん:2009/11/07(土) 19:57:45
str = ( char ** )malloc( sizeof( char * ) * ( needBr + 1 ) );

思いっきり書き忘れていました・・。
しかも括弧付けわすれで評価が意図しない形になる(はず)になっていました。
charが1バイトなので+1で大丈夫だっただけですよね・・。

399 :デフォルトの名無しさん:2009/11/07(土) 20:01:04


400 :デフォルトの名無しさん:2009/11/07(土) 20:03:02


401 :376:2009/11/07(土) 20:11:20
9文字入力して4文字で改行で実行したりすると
*** glibc detected *** ./a.out: double free or corruption (out): 0x082b9018 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0xb7dfc604]
/lib/tls/i686/cmov/libc.so.6(cfree+0x96)[0xb7dfe5b6]
./a.out[0x8048823]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe5)[0xb7da3775]
./a.out[0x8048521]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:08 69284 /home/mint/Desktop/Cprogram/pr4/a.out
08049000-0804a000 r--p 00000000 08:08 69284 /home/mint/Desktop/Cprogram/pr4/a.out
0804a000-0804b000 rw-p 00001000 08:08 69284 /home/mint/Desktop/Cprogram/pr4/a.out
082b9000-082da000 rw-p 082b9000 00:00 0 [heap]
b7c00000-b7c21000 rw-p b7c00000 00:00 0
b7c21000-b7d00000 ---p b7c21000 00:00 0
b7d8c000-b7d8d000 rw-p b7d8c000 00:00 0
b7d8d000-b7ee9000 r-xp 00000000 08:08 1864 /lib/tls/i686/cmov/libc-2.9.so
b7ee9000-b7eea000 ---p 0015c000 08:08 1864 /lib/tls/i686/cmov/libc-2.9.so
b7eea000-b7eec000 r--p 0015c000 08:08 1864 /lib/tls/i686/cmov/libc-2.9.so
b7eec000-b7eed000 rw-p 0015e000 08:08 1864 /lib/tls/i686/cmov/libc-2.9.so
b7eed000-b7ef0000 rw-p b7eed000 00:00 0
b7ef0000-b7efd000 r-xp 00000000 08:08 2779 /lib/libgcc_s.so.1
b7efd000-b7efe000 r--p 0000c000 08:08 2779 /lib/libgcc_s.so.1
b7efe000-b7eff000 rw-p 0000d000 08:08 2779 /lib/libgcc_s.so.1
b7eff000-b7f03000 rw-p b7eff000 00:00 0
b7f03000-b7f04000 r-xp b7f03000 00:00 0 [vdso]
b7f04000-b7f20000 r-xp 00000000 08:08 6255 /lib/ld-2.9.so
b7f20000-b7f21000 r--p 0001b000 08:08 6255 /lib/ld-2.9.so
b7f21000-b7f22000 rw-p 0001c000 08:08 6255 /lib/ld-2.9.so
bf80c000-bf821000 rw-p bffeb000 00:00 0 [stack]
Aborted
とかもうね・・・。

402 :376:2009/11/07(土) 20:15:23
謎のエラーはmallocが1行抜けてたからのようです。。
395さんはじめありがとうございました・・。

403 :デフォルトの名無しさん:2009/11/07(土) 20:34:31
この先、メモリが10GBとかになったらC言語じゃ対応できなくね?
CってポインターがINTで4294967295までしか設定できないよね
それ以上のアドレスは指定できないけどどうすんの?アドレスが5000000000とかの指定できなくね?おわた

404 :デフォルトの名無しさん:2009/11/07(土) 20:41:56
はいはいワロス

405 :デフォルトの名無しさん:2009/11/07(土) 20:44:30
ポインタがint値だなどと誰が決めたのだ。
ポインタはポインタであってポインタでしかない。
多くの実装でlong intに変換可能だというだけ。
なんだったら見たこともない宇宙文字列で実装してもいいのだ。

406 :デフォルトの名無しさん:2009/11/07(土) 20:54:08
>>403
どれでもいいから 64bit 版のコンパイラで sizeof(void*) を表示してみそ

407 :デフォルトの名無しさん:2009/11/07(土) 20:56:10
long long long long long long long long long long long long long long long long long long long long int

408 :デフォルトの名無しさん:2009/11/07(土) 20:57:50
>403
メモリが10GB(仮想記憶含まず)ならCPUもそれを指定できないとダメ子さんになるから
(intは何ビットか計算するの面倒だからやらないまぁ、64bitで十分だろうけど)
CPUのbit数xが10G < pow(2, x)を満たす必要がある
intはpow(2, x)なるbit数であるのが一般的である

また、規格ではポインタがintに変換できるとは書かれていない
C99からintptr_tとか入った気もするけど、マジックリストにでも使うんですか
とか思って特に調べていない

409 :デフォルトの名無しさん:2009/11/07(土) 21:02:02
某ランドのコンパイラとかがC99に対応していない
long longが使えない

410 :デフォルトの名無しさん:2009/11/07(土) 21:04:17
C99 はロールバックしたうえで、C201x を練り直して欲しい

411 :デフォルトの名無しさん:2009/11/07(土) 21:07:07
>>403

2038年までにはCは終わってる

412 :デフォルトの名無しさん:2009/11/07(土) 21:09:47
>>409
long long 使えるよ
C99には対応してないけど
ECC6.1.0(Embarcadero C++ Compiler)な

413 :デフォルトの名無しさん:2009/11/07(土) 21:16:44
time_t を使っているからコンパイラが対応してれば 2038年は超えられる

414 :デフォルトの名無しさん:2009/11/07(土) 21:20:51
そりゃ何とかするでしょ
もっと新しいいい言語が出ていればそっちに変わっているだろうが、
2038年にまだC言語が使われていれば何とかするしかない

415 :デフォルトの名無しさん:2009/11/07(土) 21:22:27
あと30年も生きていられるわけないじゃないか^^

416 :デフォルトの名無しさん:2009/11/07(土) 21:25:08
おまえ何歳だ?

417 :デフォルトの名無しさん:2009/11/07(土) 21:28:06
30年もすれば日本は消滅して日本人は貧困にあえぎプログラミングどころかパソコンに触る機会もないよ

418 :デフォルトの名無しさん:2009/11/07(土) 21:28:45
C言語で楽しくプログラミングする人の集まるスレだから、アンチは別のスレに行ってよ
time_tを変えて再コンパイル、リンクするか64bitCPUに移行すれば、2038年問題なんて大したことではない
30年後もx86さまさまの人は時代後れを認識した方がいいと予言しておく

419 :デフォルトの名無しさん:2009/11/07(土) 21:29:49
64bitCPUとtime_tは関係があるわけ?

420 :デフォルトの名無しさん:2009/11/07(土) 21:31:16
64bitCPUにすれば今までのtime_tは2038年以降も正常に動くんだよ

421 :デフォルトの名無しさん:2009/11/07(土) 21:35:09
先延ばししただけじゃねーの?

422 :デフォルトの名無しさん:2009/11/07(土) 21:40:35
先延ばしじゃない方法があるのか?

423 :デフォルトの名無しさん:2009/11/07(土) 21:44:57
永遠はあるよ

424 :デフォルトの名無しさん:2009/11/07(土) 21:49:41
time_tは有限?

425 :デフォルトの名無しさん:2009/11/07(土) 21:50:37
その都度仕様を変えれば無限とも言える

426 :デフォルトの名無しさん:2009/11/07(土) 22:01:29
64bit でも 292277026596年問題が残るが、その頃のマシンがバグったらグレートウォールごと吹っ飛ぶとかあるのかな

427 :デフォルトの名無しさん:2009/11/07(土) 22:04:34
そこまでくると、さすがに超人ロックくらいしか生きてないだろうな

428 :デフォルトの名無しさん:2009/11/07(土) 22:04:51
>>426
その頃にはさすがに人類は死滅してるよ

429 :デフォルトの名無しさん:2009/11/07(土) 22:07:17
>>420
CPU関係ねーよカス

430 :デフォルトの名無しさん:2009/11/07(土) 22:08:23
嫌味で言ったつもりだったが、なに釣られてんのwww

431 :デフォルトの名無しさん:2009/11/07(土) 22:08:38
いやいや。
今仮に18歳のぴちぴち大学1年生でも
30年後は48歳だよ?

48歳の人はあんまりもうプログラムはしてないんじゃないかな。
経営側か、現場であっても少なくとも設計よりの仕事をしていて
もうやりたくてもプログラムなんてさせてもらえなくて
夜遅く家に帰ると妻はうるさく、娘には嫌われ、
トイレ横の物置を改造して作った名ばかりのパソコンルームに
30年前に自作したコンピュータがおいてあって、
それの電源をいれてほそぼそと趣味のコードを打ち込むのが日課だったり^^

432 :デフォルトの名無しさん:2009/11/07(土) 22:11:43
>>428
そう思うと勿体ないよな。
これだけの科学技術を創り出すのに、どれだけの時間がかかったことか。

再び文明が生まれたとしても、車輪の再発明をするだけだ。

433 :デフォルトの名無しさん:2009/11/07(土) 22:13:29
地球が始まった時間に比べれば一瞬の出来事

434 :デフォルトの名無しさん:2009/11/07(土) 22:21:49
>>432
人間が生まれて600万年
だが技術革命はここほんの100年余りの事だ

435 :デフォルトの名無しさん:2009/11/07(土) 22:22:40
もしかしたら今が本来の人間の姿からかけ離れて
どうかしてるかもしれないって話

436 :デフォルトの名無しさん:2009/11/07(土) 22:23:45
は?詳しく話してくれないか?それを

437 :デフォルトの名無しさん:2009/11/07(土) 22:23:58
他の惑星に移住してて、そこで新たにタイムテーブル作ってるから問題なしとか

438 :デフォルトの名無しさん:2009/11/07(土) 22:24:55
リフボードでトラパーの波に乗るんだろうな

439 :デフォルトの名無しさん:2009/11/07(土) 22:53:51
UFOに乗ってる宇宙人なんか肉体無いらしいよ
これ以上はオカルト板でしようぜ

440 :249:2009/11/07(土) 23:38:09
>>249です。
まず1列目に1〜9の数字を入れようとして
以下のようなプログラムを作りました。
http://www.dotup.org/uploda/www.dotup.org339690.c.html
しかし上のプログラムでは1列目に同じ数字が出てしまうので
1行目に出た数字は2,3行目には出ないようにしたいです。
それを改良したいのですが方法が分かりません。
教えてください。

441 :デフォルトの名無しさん:2009/11/08(日) 00:12:03
>>440
何がどうなって欲しいの?

442 :デフォルトの名無しさん:2009/11/08(日) 00:19:22
10進数を10桁の2進数に変換したいんだけどどうやったらいいかわからない
8とか16進数なら表示できるのわかるんだけど、2進数って簡単に表示できないんだっけ?

443 :デフォルトの名無しさん:2009/11/08(日) 00:21:06
C言語は2進数はサポートしてないからね

444 :デフォルトの名無しさん:2009/11/08(日) 00:22:00
AND取ってループすれば出せるでしょ

445 :デフォルトの名無しさん:2009/11/08(日) 00:22:53
8進数とか16進数の表示を自前でやってみたら

446 :デフォルトの名無しさん:2009/11/08(日) 00:24:30
2で割っていけばいいんでは?

447 :デフォルトの名無しさん:2009/11/08(日) 00:27:08
>>442
limits.hをインクルードしてsizeof(int) * CHAR_BITで
intのビット数を求め、10進数をunsignedにキャストして←ここ重要
1UL << (sizeof(int) * CHAR_BIT - 1)のマスクとandを取った結果が
0か1かを書きだして行く
マスクは>>で右シフトしてループ



448 :デフォルトの名無しさん:2009/11/08(日) 00:27:48
>>441

>>440のプログラムでは

100
100
300
など一列目に同じ数字が出ることがあるので

500
600
200
のように一列目の各行におなじ数字が出ないように改造したいです

449 :デフォルトの名無しさん:2009/11/08(日) 00:32:10
#include <stdio.h>

int main() {
int beam = 10; // チゲ
int i, n ; // counter
for ( n = 0; n != 1024; ++n ) {
printf( "%d : ", n );
for ( i = 0; i != beam; ++i ) {
printf( "%d", n >> ( beam - i - 1 ) & 1 );
}
printf( "\n" );
}
}

450 :デフォルトの名無しさん:2009/11/08(日) 00:44:32
>>448
1〜9 までの重複しない3つの数字が欲しいだけ?
もしそうならこれでおk

{
int i, x, n[9];
for(i=0;i<9;i++) n[i]=i+1;
for(i=0;i<9;i++)
{
x=rand()%(i+1);
t=n[i];
n[i]=n[x];
n[x]=t;
}
for(i=0;i<3;i++) cardForNumbers[i+1][1]=n[i];
}

451 :デフォルトの名無しさん:2009/11/08(日) 00:52:23
先生質問です。

char *ptrを引数として他の関数に渡す時は
other_Kansu (&ptr); ですよね?

char **ptrを引数として渡すときはどうなるんでしょうか?
other_Kansu (&*ptr)ですか?

452 :デフォルトの名無しさん:2009/11/08(日) 00:58:19

ちょっくら驚く豆知識

なんと!
なんとなんとなんと!
なんとなんとなんとなんとなんとなんと!

4bit CPUでも128bitデータなどを扱えるのである!!!!!!!!!!!!

何をバカな、と思ってるのは素人である。ド素人である。
4bit CPUでは、128bitデータを「1サイクルで」レジスタなどに格納できないだけであって
128 / 4サイクル使って上位4bitもしくは下位4bitから順番にメモリに128bitぶん格納していけばよいのだ。

バカか手前等。

453 :デフォルトの名無しさん:2009/11/08(日) 00:58:22
面白い質問ですね^^

void other_Kansu( char ** ) に char *ptr を渡したいときは other_Kansu( &ptr ) です。
void other_Kansu( char ** ) に char **ptr を渡したいときは other_Kansu( ptr ) です。
&*ptr でもいいですが、それは結局 ptr です。

多分。

454 :デフォルトの名無しさん:2009/11/08(日) 01:01:19
>>451
両方違うともいえるし、両方合っているともいえる

455 :デフォルトの名無しさん:2009/11/08(日) 01:07:16
>>453
非常にややこしいですね・・。

>void other_Kansu( char ** ) に char **ptr を渡したいときは other_Kansu( ptr ) です。
passing argument 1 of ‘ptr' makes integer from pointer without a cast
って言われるんですが無視でいいんでしょうか・・?

>>454
正解は存在しますか・・?


456 :デフォルトの名無しさん:2009/11/08(日) 01:27:21
&* はC言語の仕様上はダメなんじゃないの?

int a=10, *p=&a;
のとき
&*p って &10 でしょ

457 :デフォルトの名無しさん:2009/11/08(日) 01:36:22
ptr が char** だから *ptr は char* であるので
依然としてアドレス演算は可能でしょう^^

>passing argument 1 of ‘ptr' makes integer from pointer without a cast

その警告は今回の件とは直接には無関係です^^

458 :デフォルトの名無しさん:2009/11/08(日) 01:37:03
>>447
右シフト使わない前者のでunsignedにする理由って何?

459 :デフォルトの名無しさん:2009/11/08(日) 01:38:43
こいつは何をいっているんだ

460 :デフォルトの名無しさん:2009/11/08(日) 01:39:01
451は、なにか、勘違いしてるような?

461 :デフォルトの名無しさん:2009/11/08(日) 01:39:27
int a=10, *p=&a;
*p は a のアドレス(仮に1000番地)を保持

&*p は 1000番地のアドレスを指すので
&10ではなくて &(1000番地)で結局1000番地
1000番地は10

ってなる気がする

462 :457:2009/11/08(日) 01:40:41
あ、上の2行と下の2行は別の書き込みへのレスです^^
ごっちゃになってしまいました^^

463 :デフォルトの名無しさん:2009/11/08(日) 01:42:11
>>452
いきなり何の話してんの?
上のメモリに関する話にしては話がズレすぎてるし、その豆知識をどうしたいんだ。

>>455
深く考えすぎ。

464 :デフォルトの名無しさん:2009/11/08(日) 01:44:48
>>457

キャストなしで整数になるの意味が分からないんですが、引数の受け渡し方があってるならどっか根本的に勘違いが発生してそうです・・。
違う視点から警告と向き合ってみますです。

どうもありがとうございました><

465 :デフォルトの名無しさん:2009/11/08(日) 01:50:11
>>464
変数の宣言部、関数のプロトタイプ、関数の実装部を見直してみてはどうか。

466 :デフォルトの名無しさん:2009/11/08(日) 01:53:13
>>464
今ちょうど見直してましたが、間違っては無さそうです。
他の関数へは上手く**ptrが渡せてるみたいなのですが・・。
該当部分をもう一度書き直して見ます・・。

467 :デフォルトの名無しさん:2009/11/08(日) 01:54:38
>466
ソースきぼん

468 :デフォルトの名無しさん:2009/11/08(日) 02:02:05
>>467

変数名とか・・・かなり恥ずかしいんですが(/////)
ttp://codepad.org/Pb1xslqO

469 :デフォルトの名無しさん:2009/11/08(日) 02:02:55
>>467

hoge.c:68: 警告: passing argument 1 of ‘addStr’ makes integer from pointer without a cast
書き忘れました。。


470 :デフォルトの名無しさん:2009/11/08(日) 02:07:30
void addStr (char *causeBuf, int causeNeedBr, int causeOneLineLen, char** causeStr)

471 :デフォルトの名無しさん:2009/11/08(日) 02:11:06
>>470

お、お見事です・・。

472 :デフォルトの名無しさん:2009/11/08(日) 02:16:36
完全に見るところを間違えてました・・。
ゴールが見えそうです。
ありがとうございました><

473 :デフォルトの名無しさん:2009/11/08(日) 02:21:08
argument 1 of ‘addStr’
ちゃんと警告よみましょうねっていう。

474 :デフォルトの名無しさん:2009/11/08(日) 02:23:23
英語の知識か日本語のコンパイラがあれば読めてました><

475 :デフォルトの名無しさん:2009/11/08(日) 02:26:34
英語が読めなくてもいいから、今回のような失敗の時はこういう警告がでるのだということを覚えておくといいよ。
そうすれば、次に同じ警告が表示されたとき、やっぱり読めないけど、
一個目のパラメータに変なの渡してるんだなということが分かるようになる。

これはこれで慣れ。ガンガレ

476 :デフォルトの名無しさん:2009/11/08(日) 02:32:29
そうですね。
今回のでまた1つ覚えました><
C言語歴というか、言語歴2ヶ月なんで始めて出会すエラーが多く、エラー文が読めても意味がわからないことばっかりです。
頑張って完成させます。。

477 :デフォルトの名無しさん:2009/11/08(日) 04:40:09
>>458
遅レスだけど
intだと環境依存だが符号ビットが立っていると右シフトすると
おかしなマスクになる事があるから

478 :デフォルトの名無しさん:2009/11/08(日) 11:07:52
シフトに関してもアセンブラが優れている。
Cのシフトは問答無用、見境なく全部シフトさせてしまうが
アセンブラなら大抵、符号ビットを残したままシフトさせることができる。算術式シフトってやつだな!

479 :デフォルトの名無しさん:2009/11/08(日) 11:11:51
それCPUの機能であってアセンブラがどうのとは違うのでは

480 :デフォルトの名無しさん:2009/11/08(日) 11:12:44
strstr関数をライブラリ無しでやるには?

481 :デフォルトの名無しさん:2009/11/08(日) 11:18:09
ポインタをインクリメントしながら文字比較をしていくしか

482 :デフォルトの名無しさん:2009/11/08(日) 11:21:45
遅くてもいいんなら、
一文字ずつ比較する文字列比較を、開始位置を一文字ずつずらしながらループする。

483 :デフォルトの名無しさん:2009/11/08(日) 11:29:55
string s="abcde";
s="abcdef";

ってやったら、最初の行で作ったabcdeがメモリ上にのこっちゃって効率悪いんでしょ?
ガベージコレタクに頼らず自分でメモリに残ってるゴミを消す方法ないの?

484 :デフォルトの名無しさん:2009/11/08(日) 11:30:02
なつかしいな。
BM法とか勉強した記憶が。

485 :デフォルトの名無しさん:2009/11/08(日) 11:33:04
>>483
リテラルを使わなきゃいいんじゃねw

486 :デフォルトの名無しさん:2009/11/08(日) 11:40:24
string *s = new string("abcde");
*s = "abcdef";
delete s;

487 :デフォルトの名無しさん:2009/11/08(日) 11:44:16
unsigned charは1byteでmalloc(size)はunsigned char [size]と同じ大きさの連続メモリを返すってのは規格を満たすすべての処理系で正しい?

488 :デフォルトの名無しさん:2009/11/08(日) 13:00:40
ループ毎に、配列でいう1番目をサーチし、ヒットがあったなら次に2番目をサーチし、またあれば3番目をサーチしたいのですが、ちなみにヒットする項目がなければ配列に登録します

ただやりたいのが、配列1番目が1byte、2つめが4byte、最後が4byteとなっているのですが、これらを管理する上でいい方法はないでしょうか?

489 :デフォルトの名無しさん:2009/11/08(日) 13:01:09
>>477
おまえは にほんごが よめないのか?

490 :デフォルトの名無しさん:2009/11/08(日) 13:04:01
変数初期化のとき*が2つついてる奴あれ何?

491 :デフォルトの名無しさん:2009/11/08(日) 13:05:55
>>490
ポインタへのポインタ

492 :デフォルトの名無しさん:2009/11/08(日) 13:18:41
>>488
配列で異なるサイズのデータを扱う方法を訊ねてるとして
普通は、1)最大に合わせる、2)unionで全部をひとつの型にまとめる
あたり

493 :デフォルトの名無しさん:2009/11/08(日) 13:55:13
>>490
*は何個でも付けれるぞ
int ************p;
みたいなのもok

494 :デフォルトの名無しさん:2009/11/08(日) 14:04:45
(*************printf)("HELLO.");

495 :デフォルトの名無しさん:2009/11/08(日) 14:18:19
先生質問です。

char** pptr;
char strA;
int num1,num2;
//領域確保
pptr = calloc ( (num) , sizeof (char));
for (i = 0; i <= num1; i++){
pptr[i] = calloc ( (num2 + 1) , sizeof (char));
}
//文字代入
for (i = 0, j = 0; i < num; i++, j += num2){
strncpy (pptr[i], strA + j, num2);
}
この処理でnum1に5以上の値が入るとSegmentationFaultになります。
デバッガではstrncpyのラインがSegmentationFaultの原因ラインとでます。

printfで表示して確認してみると、num1でnum2が割りきれ、かつnum1が5以上のときに
pptr[0][0]に領域以上の文字化け表示が出るときが有ります。
この部分の記述で不味い点があるのでしょうか?

496 :デフォルトの名無しさん:2009/11/08(日) 14:20:37
ポインタのポインタってポインタで代用できないの???
ポインタのポインタと言えどもポインタであることは間違いがないので
ポインタのポインタとするのではなく、ポインタへのポインタでしても
ポインタのポインタであることは変わりがないじゃないの。

497 :デフォルトの名無しさん:2009/11/08(日) 14:22:35
ポインポインポインポインポインポインポインポインポインポイン
ポインポインポインポインポインポインポインポインポインポイン
ポインポインポインポインポインポインポインポインポインポイン
ポインポインポインポインポインポインポインポインポインポイン
ポインポインポインポインポインポインポインポインポインポイン

インポ

498 :デフォルトの名無しさん:2009/11/08(日) 14:25:28
pptr = calloc ( (num) , sizeof (char)); はまずい。
pptr = calloc ( (num) , sizeof (char *));
にしろ

499 :デフォルトの名無しさん:2009/11/08(日) 14:32:27
>>496
typedef int *pint;
pint *p = N;

500 :デフォルトの名無しさん:2009/11/08(日) 14:32:36
ポインタって
int *p;

*p = Hogeragecho;
とするときと
p = hogeragecho;


とするときがありますが
何が違うのですか。
どういうときにアスタリスクを意識しないといけないのですか。
明らかにアドレスを要求している文脈のときはアスタリスクつけなくていいのは分かりますが
明らかにアドレスではないものを要求しているときでさえアスタリスクつけないソースもあります。

501 :デフォルトの名無しさん:2009/11/08(日) 14:34:59
そのソースがバグってんだろ。
見せてみ

502 :デフォルトの名無しさん:2009/11/08(日) 14:35:09
>>498
見事に改善しました・・。
ありがとうございます!

sizeof (char) と sizeof (char*)では確保される領域の大きさが変わるのですか?
ggr先生に聞いてみますが、よろしければ後学の為ご教授ください。。

503 :デフォルトの名無しさん:2009/11/08(日) 14:38:31
printf("sizeof(char) = %d, sizeof(char*) = %d \n", sizeof(char), sizeof(char*));とかやってみ

504 :デフォルトの名無しさん:2009/11/08(日) 14:42:02
>>503
sizeof(char) = 1, sizeof(char*) = 4
になりました。
char*は1バイトじゃないのですね。

505 :デフォルトの名無しさん:2009/11/08(日) 14:53:03
ポインタだからな
アドレスが32bit環境なら32bit(=4バイト)

506 :デフォルトの名無しさん:2009/11/08(日) 14:56:19
>>505

とてもわかりやすい説明ありがとうございます。
ポインタのサイズにも気をつけます

507 :デフォルトの名無しさん:2009/11/08(日) 15:03:45
6502でさえ16ビットあるだろ。

508 :デフォルトの名無しさん:2009/11/08(日) 16:39:19
いい加減、バイトサイズは定めるべきだと思う
shortだとかlongだとかじゃなく

8bitにしたいなら、int8
16bitにしたいならint16

とか、明確にサイズを決められると見易く、いろいろ便利なのに

509 :デフォルトの名無しさん:2009/11/08(日) 16:43:59
バストサイズに見えた。

510 :デフォルトの名無しさん:2009/11/08(日) 16:45:05
typedefすりゃいいじゃん

511 :デフォルトの名無しさん:2009/11/08(日) 16:45:15
fortranのようにreal(8)とかでいいのにね

512 :デフォルトの名無しさん:2009/11/08(日) 17:27:46
stdint.h があるだろ

513 :デフォルトの名無しさん:2009/11/08(日) 19:27:00
>>477
しってる。だから「右シフト使わない前者」に限ったんだ。

514 :デフォルトの名無しさん:2009/11/08(日) 19:29:04
>>487
> unsigned charは1byteで
うん
> malloc(size)はunsigned char [size]と同じ大きさの連続メモリを返す
管理領域を含むから少し大きいかも。少ないことはないし、連続していることも確実

515 :デフォルトの名無しさん:2009/11/08(日) 20:54:22
ツェー程度の言語仕様で悩んでるようだと
「ツェーたすたす」とか「風呂釜掃除用薬剤」で発狂すんぞ

516 :デフォルトの名無しさん:2009/11/08(日) 21:07:14
その言い回しカッコイイすね先輩

517 :デフォルトの名無しさん:2009/11/08(日) 21:09:12
ツァーだろ常孝

518 :デフォルトの名無しさん:2009/11/08(日) 21:48:41
0から1023までの10進数を2進数に変換するプログラムを作っているのですがうまくいきません
数値をしっかり指定すれば表示されるようになるのですが、forで0から1023まで繰り返してやろうとするとうまくいかないみたいです
アドバイスお願いします

#include <stdio.h>

int main(void){
int nisin[10];
int i, j, k;
/*入力*/
for(k=0; k<=1023; k++){
k=j;

/*変換*/
for(i=0; i<10; i++){
nisin[i] = j % 2;
j = j / 2;
}

/*出力*/
for(i=10-1; i>=0; i--){
printf("%d",nisin[i]);
}
}
return 0;
}

519 :デフォルトの名無しさん:2009/11/08(日) 21:50:10
関数にまとめれば見通しがよくなるんじゃないかな

520 :デフォルトの名無しさん:2009/11/08(日) 21:51:21
j=k;

521 :デフォルトの名無しさん:2009/11/08(日) 21:51:30
>>518
k=j; // 逆?

522 :デフォルトの名無しさん:2009/11/08(日) 21:58:04
どこに10進数が出てくるのやら。

523 :デフォルトの名無しさん:2009/11/08(日) 21:59:29
>>522
1023 じゃね?

524 :デフォルトの名無しさん:2009/11/08(日) 22:00:20
10進数から2進数にしたいなら
まず10進数にするところから始めないとダメじゃん。


525 :デフォルトの名無しさん:2009/11/08(日) 22:42:01
堰澤映

526 :デフォルトの名無しさん:2009/11/09(月) 01:14:23
変数のスコープを図示する問題なんですがexternの使い方が本来のものと違うので
なんだかわけがわからなくなりました
aとbはわかったのでcの部分を教えて下さい

#include <stdio.h>

extern int a;
int b = 2;

int func(){
int b;
extern int c;
b = 3;
printf("func: a = %d, b = %d, c = %d\n, a, b, c);
c = 6;
return 0;
}

int c = 4;

int main(){
extern int c;
func();
a = 5;
printf("main: a = %d, b = %d, c = %d\n", a, b, c);
return 0;
}

int a = 1;

527 :デフォルトの名無しさん:2009/11/09(月) 01:19:21
グローバル変数の extern と同じ
ただし見える範囲が main とか func の中に限られる

528 :デフォルトの名無しさん:2009/11/09(月) 01:23:17
>>527
ということはfuncの中では6
mainの中では4ということですか?
でも実行すると
func: 〜〜c = 4
main: 〜〜c = 6
となるのですが

529 :デフォルトの名無しさん:2009/11/09(月) 01:28:52
何をどう考えたらそうなるんだ
> int c = 4;
とあるので、cの初期値は4だ
funcのprintfが実行される時点ではまだ初期値のままだから4が表示される
その後
> c = 6;
が実行され、それからmainのprintfが実行されるので6が表示される

530 :デフォルトの名無しさん:2009/11/09(月) 01:41:03
>>529
あ〜何となくわかった気がします
ありがとうございます

531 :デフォルトの名無しさん:2009/11/09(月) 03:26:01
C言語のポインタ、配列、ファイルの問題です
n件のデータを配列に入力しその平均値を出力するプログラムをつくり、
実行部において添字演算子は用いず、*(p+i)と*p++それぞれを用いるパターンを作る
ただし、入出力処理をファイル処理に、入出力ファイル名はコマンドラインで指定する

作れません、教えてください

532 :デフォルトの名無しさん:2009/11/09(月) 03:29:00
宿題は宿題スレへ
作った所までどこかにあげれば答えないこともない

533 :デフォルトの名無しさん:2009/11/09(月) 03:38:02
ぱっと見、*(p+i)を用いるのが難しそうに思うんだけどなぁ。
iどこで使おうか。

534 :デフォルトの名無しさん:2009/11/09(月) 03:38:55
#include<stdio.h>
int main(void)
{
int A[100];
int a,b,i,n,*p;

*p=A[0];
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",*(p+i));
}
for(i=0;i<n;i++){
b+=*(p+i);
}
a=b/n;
printf("%d",a);
return(0);
}


です

535 :デフォルトの名無しさん:2009/11/09(月) 03:41:19
ああやっぱり。p+i使えばp++使わなくなるよなぁ
無理矢理使えって話だろうか

536 :デフォルトの名無しさん:2009/11/09(月) 03:41:27
*p++ 使ってないぞ

537 :デフォルトの名無しさん:2009/11/09(月) 03:43:03
入出力もファイル処理になってないし
コマンドラインも無視してるな

538 :デフォルトの名無しさん:2009/11/09(月) 03:45:45
>>535

それぞれのパターンを作れってことです

539 :デフォルトの名無しさん:2009/11/09(月) 03:46:51
C言語ってintは4バイト、byteは1バイトだけど
自分で新しい型をつくることってできるんの?
6バイト扱える型とか

540 :デフォルトの名無しさん:2009/11/09(月) 03:48:01
>>539
無理
C++みたいにclassが使えないと
構造体とか共用体で無理矢理関数で似たような事は出来るが

541 :デフォルトの名無しさん:2009/11/09(月) 03:49:23
宿題は宿題スレへ
http://pc12.2ch.net/test/read.cgi/tech/1255709298/657
貼って来てやったからあっちへ逝け

542 :デフォルトの名無しさん:2009/11/09(月) 03:51:06
>>539
typedef char newtype[6];

543 :デフォルトの名無しさん:2009/11/09(月) 03:53:20
>>541

どうもです

544 :デフォルトの名無しさん:2009/11/09(月) 03:58:24
>>541
どんだけ親切なんだよ

545 :デフォルトの名無しさん:2009/11/09(月) 04:06:41
>>538 がしつこいからさ

546 :デフォルトの名無しさん:2009/11/09(月) 04:41:40
レスを向こうにコピペしてから誘導するってのはちょっと新鮮だ

547 :デフォルトの名無しさん:2009/11/09(月) 04:54:19
if()

548 :デフォルトの名無しさん:2009/11/09(月) 12:47:20
てす


549 :デフォルトの名無しさん:2009/11/09(月) 12:52:14
配列とは何かって聞かれたら

大量の変数を一括管理するための機能

でいいの?100点?

550 :デフォルトの名無しさん:2009/11/09(月) 12:53:10
2点

551 :デフォルトの名無しさん:2009/11/09(月) 12:54:15
配列は配列だろ。それ以上でもそれ以下でもない。


552 :デフォルトの名無しさん:2009/11/09(月) 13:02:59
配列とは(多くて)名前を付けるのが極度に難しかったり不合理(数字との対応性が高い)だったりする対象に遭遇したプログラマにはからわ
れたコンパイラの便宜でつ

553 :デフォルトの名無しさん:2009/11/09(月) 13:14:59
単に数が多くて名前をつけるのが大変だからって理由で配列を使うと、
配列の添え字と使用目的を関連づけるのにマクロを使う羽目になるので
たくさんの変数名をつけるのがマクロ名になるだけで利点がないばかりか
マクロであるがゆえの欠点も抱え込むことになる

正解は >>552 が2番目に挙げた「数字との対応性」

554 :デフォルトの名無しさん:2009/11/09(月) 13:25:53
ダイクストラ/ホーア/ダール共著「構造化プログラミング」の
データ構造化序論を読むべし

555 :デフォルトの名無しさん:2009/11/09(月) 13:29:51
変数の種類が配列じゃなく10万種類とか100万種類ある
プログラムを作ってみて、如何にコンパイラが名前のルックアップ
処理に時間をかけているかがわかる筈。

556 :デフォルトの名無しさん:2009/11/09(月) 13:33:01
添字付き変数

557 :デフォルトの名無しさん:2009/11/09(月) 14:13:32
>>555
ふつーにありそうだが?

float real;
float imag;
//...
が10万とか100万とかある状況下で、

これでどうやって名前のルックアップが軽くできるんだ?
float array[100000];
#define real 0
#define imag 1
//...

558 :デフォルトの名無しさん:2009/11/09(月) 14:21:08
グローバル変数の数が配列を一つのものと数えて10万個ある
プログラムってそうはないだろw

559 :デフォルトの名無しさん:2009/11/09(月) 14:28:53
struct{
double B,W,H;
int born;
int age
int virgine;
}JK00001,JK00002,JK000003,.............JK100000;
とするのか
struct{
double B,W,H;
int born;
int age;
int virgine;
}JK[100000];
とするのか、同じことをするのでもずいぶんと違うんだろな

560 :デフォルトの名無しさん:2009/11/09(月) 14:42:30
>>557
プリプロセッサのシンボルルックアップは重くなるが
コンパイラのシンボルルックアップは軽くなるんじゃないか?

561 :デフォルトの名無しさん:2009/11/09(月) 14:51:42
それは

562 :デフォルトの名無しさん:2009/11/09(月) 15:25:01
>>558
そーだよな
「名前のルックアップ」でいちいち10万エントリをサーチせずに済むようにローカル化するよな
プログラム全体で何万エントリあろうが1時点でのルックアップ範囲は狭く済むようにね

# ルックアップは何もコンパイラだけじゃなく PG 自身もやるわけで

>>559
いや、ここで論じている問題は
struct{
double a[3];
int b[3];
};
#define B 0
#define W 1
#define H 2
#define born 0
#define age 1
#define virgine 2
という配列の用法の是非だる?

563 :デフォルトの名無しさん:2009/11/09(月) 15:28:01
>>562
オレは #define より enum を使うぜ

564 :デフォルトの名無しさん:2009/11/09(月) 16:23:57
>>563
列挙子の数が配列のサイズを超えたかどうか、どうやって調べる?

565 :デフォルトの名無しさん:2009/11/09(月) 16:37:39
列挙子の最後にMAXなんちゃらってのを追加して
sizeof(配列)と比較する

566 :デフォルトの名無しさん:2009/11/09(月) 18:03:52
配列の利点はメモリ上に連続して取られることだろ
つまり、配列は連続領域を(静的に)確保及び参照するときに使う複合データ型

規格書に書いてあることでも書いたら100点もらえるんじゃないの
ISO/IEC 9899:1999 (E)
6.2.5 Types
20
― An array type describes a contiguously allocated nonempty set of objects with a
particular member object type, called the element type.36) Array types are
characterized by their element type and by the number of elements in the array. An
array type is said to be derived from its element type, and if its element type is T , the
array type is sometimes called ‘‘array of T ’’. The construction of an array type from
an element type is called ‘‘array type derivation’’.
C99でごめんねごめんね

567 :デフォルトの名無しさん:2009/11/09(月) 18:36:16
>>565 >>566
列挙子を増やすとサイズが自動的に増加する配列があったらなあ・・・

って要求にほぼ答えられる機能があるわけだが、それでも配列でと頑張ると

別に B へのポインタに +1 で W にアクセスなんかできなくていいけど、
レジスタ割付くらい可能なところでは当然やって欲しいなあ・・・

って要求は諦めることになるよな

568 :デフォルトの名無しさん:2009/11/09(月) 18:38:25
int *p;

DisplayInside_of_TheVariables = p;
DisplayInside_of_TheVariables = *p;


これは何がどう違うのですか。

569 :デフォルトの名無しさん:2009/11/09(月) 18:42:09
36)オブジェクト型は不完全型を含まないので,不完全型の配列は作ることが出来ない。


570 :デフォルトの名無しさん:2009/11/09(月) 18:44:19
>>568
上はint*型の代入で下はint型の代入


571 :デフォルトの名無しさん:2009/11/09(月) 22:51:58
>>567
こんなんでどや?
gcc でならコンパイルできるぞ

#include <stdio.h>

enum{HOGE0, HOGE1, HOGE2, HOGE_MAX};

int main(void){
int i, a[HOGE_MAX];

for(i=0;i<HOGE_MAX;i++) a[i]=i;
printf("%d\n", a[HOGE_MAX-1]);

return 0;
}

572 :デフォルトの名無しさん:2009/11/09(月) 23:10:56
>>571
その HOGE_MAX ってのを自動というかどうかだが、
その例で HOGE_MAX としている列挙子がいかなる識別子とも干渉しないことを担保する
普遍的な方法論はあるのか?

573 :デフォルトの名無しさん:2009/11/09(月) 23:56:07
>>572
そんなのある訳無いじゃん
強いて言うなら命名規則で頑張る

574 :デフォルトの名無しさん:2009/11/10(火) 00:04:53
ゲーツェーツェー

575 :デフォルトの名無しさん:2009/11/10(火) 00:09:31
X Windows Systemに代表されるようにプレフィックスをつけて長い関数名になるんですね、わかります
そんな僕は、JPEGやCore Foundationの書き方をリスペクトしている

576 :デフォルトの名無しさん:2009/11/10(火) 00:27:40
自分の揚げ足を取ることになるが「いかなる識別子」というからにはマクロ名まで含んでしまうな

#define a b
int a, b; //oops!
・・・て、そういう意図じゃなくwww

enum hage {HOGE0, HOGE1, HOGE2};
int a[sizeof(enum hage)];
で自動的に int a[3]; になるような方法ね

仮に HOGE3 を追加する場合、HOGE3 自身と HOGE0, HOGE1, HOGE2 との間に
どんな関係を保証させればよいのか、さらに保証させなくてよい(保証させてはいけない)のか、
によって色んな構文・機能を使い分けるわけだよな

そこで配列という選択に至る、なるべく仮定の少ない例を聞いているわけだ

577 :デフォルトの名無しさん:2009/11/10(火) 00:41:32
あきらめたらどう

578 :デフォルトの名無しさん:2009/11/10(火) 00:43:01
何を?

579 :デフォルトの名無しさん:2009/11/10(火) 00:50:36
>576
sizeof(enum hage)ってなんだよ

580 :デフォルトの名無しさん:2009/11/10(火) 01:01:44
いやまあ 4 にしかならんけど

配列なら
int a[3];
sizeof a / sizeof a[0]
で要素の数 3 がとれるだろ?

それと同様に、
列挙型から列挙子の数をとる一般的な方法はあるかって話
ちなみに今んとこなさそうって思いながら聞いている

581 :デフォルトの名無しさん:2009/11/10(火) 01:09:20
そういうことね

列挙型の列挙子の数をとる方法ない(気がする)
しばしば、一番最後にダミーを入れたりするが、
enum {
  foo = 128,
  bar,
  baz,
  dummy
};
とかしているときには終わっている

そもそも何の目的で列挙子の数を知りたいのかによって、
別の解決方法があるかもしれない

582 :デフォルトの名無しさん:2009/11/10(火) 01:42:16
>>581
ことの発端は >>549 でさ
俺が >>557 と返したら >>571 ときたわけよ
ダミー列挙子みたいな不純物を必要としない
きれいな方法はバラ変数か構造体で、
配列の用途じゃねえだろって立場をとってたんだ

それで仮に列挙子と配列の要素をきれいに対応させる
バラ変数や構造体よりも合理的な方法を誰か示したら
俺の負けかなって思って詰ろを作って待っていたんだが
みんな寝ちまったみたいだし、俺も眠いし・・・

583 :デフォルトの名無しさん:2009/11/10(火) 01:55:49
>>558
グローバル変数が構造体で1億個とかあるらしい>某住基ネット上アプリ

584 :デフォルトの名無しさん:2009/11/10(火) 02:10:11
>>583
ネタだと思いたいが、ひょっとして子[1]、子[2]...は駄目で、
長男、次男、三男...とかになってるのだろうか。

585 :デフォルトの名無しさん:2009/11/10(火) 02:59:01
>582
>それで仮に列挙子と配列の要素をきれいに対応させる

つまり、それは写像だな
列挙子集合E = {x | x e _N}, 配列A = {y | y e _R}が存在し、
f: x e E -> y e Aなるfを定義すれば良い

最初は全単射と思ったが、単に単射(|E| ≧|A|)であればよかった
f def= ∀y e A [∃x e E]ごめん、数学そんなにやってないんだ

C言語では、
type_t f(enum E x) {
  int x_dash;
  /* do_something */
  /* 例えば、x_dash = x / 2; */
  x_dash = x / 2;
  return A[x_dash];
}

もっとも、
type_t A[N]; /* N = 128とか */
type_t *map(type_t *array, enum E x)
{
  return (array+hash(x));
}
int hash(int x)
{
  return x % sizeof A;
}
となるが、これが合理的かと問われたら、
まったく合理的ではありませんでした、ありがとうございました
と言うよりこれは、整数のハッシュ法じゃないかよ

586 :デフォルトの名無しさん:2009/11/10(火) 03:21:26
C言語に限らないプログラミング言語一般論の領域
になってしまっている件と、生半可な集合論数学表現とか
振り回す人が出てきてる件について、この話題はいったん休止が
良いかと

587 :デフォルトの名無しさん:2009/11/10(火) 03:28:57
>>582
普通についてる>>560を何でスルーしたんだろうなぁ

それはそれとして、cのenumはやっぱ不便だよね。
他言語で改良されてる点はまさに改良だなと思う。

588 :デフォルトの名無しさん:2009/11/10(火) 03:31:36
>>586
しかもあさっての方向の話はじめちゃってるしね

589 :デフォルトの名無しさん:2009/11/10(火) 03:43:19
データ構造上やアルゴリズム上のエレガントな問題解決手段という
理由から配列を使うというのは古き良きアカデミズムな世界の話。
現実のプログラミング現場では名前空間管理の負荷が大幅に
軽減されるというコード作成上のメリットが絶望的に大きいので、
エレガントになろうがなるまいが構造体配列を使わざるを得ない
ことが多い。(てかほぼ全て)
しかしそこには問題の無理な構造化、規格化による現実との乖離の
危険性が伴うので、問題視する人も多い。

590 :デフォルトの名無しさん:2009/11/10(火) 03:46:40
構造体も配列も堅固な理論的バックボーンの成果じゃなくて
苦し紛れに作られたシンタックスシュガーに近い

591 :249:2009/11/10(火) 10:13:04
>>249>>440>>448ですが

>>450をどこにいれればいいかわかりません…

>>440を基盤に作りたいんですが>>450はどこにいれるんですか?

592 :デフォルトの名無しさん:2009/11/10(火) 10:16:53
>>586
ここで出てきている配列と列挙子は、
C に特有の性質を十分に使っているし、
性能面の評価も C 流だが?

>>587
コンパイラのシンボルルックアップが
実行時のアドレス計算として持ち越されるわけだが
全レスの義務はないし個人的につまらなかったんで・・・

593 :デフォルトの名無しさん:2009/11/10(火) 11:06:19
>>591
消したコードを元に何を言ってるんだ?
>>592
プロセッサレベルで元コードが配列として表現
されていたのかそうでないのかを区別することが出来る
とでも思っているのか?

594 :デフォルトの名無しさん:2009/11/10(火) 11:14:35
>>593
色々仮定をおけば区別がつかなくなる場合はありそうだが
この流れの中でそんなのに構うつもりはない

595 :デフォルトの名無しさん:2009/11/10(火) 12:24:11
>>592
実行時のアドレス計算は関係ないよね。
コンパイル時のシンボルルックアップ負荷の話でしょう?

596 :デフォルトの名無しさん:2009/11/10(火) 12:25:39
コンパイルにやたらと時間がかかった昔ならともかく、
今でもそういうことって気にすべきものなの?

597 :デフォルトの名無しさん:2009/11/10(火) 12:47:29
昔だって気にしないよ

598 :デフォルトの名無しさん:2009/11/10(火) 13:32:59
そういうことを気にすべきじゃないよ。
けれど、今でもビルドにやたら(数時間でいい?)と時間がかかる場合は少なくともC++でまれによくある
あえてこういう表現にしてみた。

599 :デフォルトの名無しさん:2009/11/10(火) 13:41:48
誤解があるといけないので。
シンボルルックアップのせいでやたらと時間がかかる場合があるということではないです。
もしそうなった場合にそれをコードの面で解決しようとすることはないでしょうね

600 :249:2009/11/10(火) 13:43:31
コードきれていました
>>249>>440>>448ですが

>>450をどこにいれればいいかわかりません…

http://www.dotup.org/uploda/www.dotup.org348416.txt.html
を基盤に作りたいんですが>>450はどこにいれるんですか?

601 :デフォルトの名無しさん:2009/11/10(火) 14:22:07
「まれによくある」って2ch語?

602 :デフォルトの名無しさん:2009/11/10(火) 14:22:35
消えないように貼っておいたげた
http://codepad.org/TuCBekq8

603 :デフォルトの名無しさん:2009/11/10(火) 14:23:58
>>601
2ちゃんではまれによく見るね

604 :デフォルトの名無しさん:2009/11/10(火) 14:26:34
>>601
ググればすぐ答えが出るようなものを、一々質問してんなよw

605 :デフォルトの名無しさん:2009/11/10(火) 14:27:48
まれによくある
の解釈
数的には実はよくある がそういうのは集積されており
目にすることは意外に少ない

606 :デフォルトの名無しさん:2009/11/10(火) 14:34:47
配列を使うことによるメリットとデメリットを列挙出来る?

607 :デフォルトの名無しさん:2009/11/10(火) 14:37:55
出来る

608 :デフォルトの名無しさん:2009/11/10(火) 15:04:50
居座ってる人が何をしたいのか分らん

609 :デフォルトの名無しさん:2009/11/10(火) 15:21:29
出来るがしない

610 :デフォルトの名無しさん:2009/11/10(火) 15:58:42
>>595
だから何つっちゃうよ?
プログラム中に何万だかあるシンボルを同一空間に置けつったんだろ >>560 はよ、でそれを俺はつまんねつったわけ
つーか、#define から enum へもう流れが変わってるんだが、まだ翻訳フェーズ(4)にこだわりたがるのは何でだ?

255歩譲って、翻訳フェーズ(4)の話に戻っても、翻訳環境の負荷を軽くって定量的にどのくらいやるべきだと思っている?
それは配列が向かない用途(断言)に、理を曲げてまで配列を使わせるほどの事情たりえたことが、おまえさん自身あったのか?
そのうえでだが、それは配列の存在意義を聞かれたときの答えとして妥当だと思うか?

611 :デフォルトの名無しさん:2009/11/10(火) 16:26:11
オタクがきれた^^

612 :デフォルトの名無しさん:2009/11/10(火) 16:48:25
C言語の勉強をしたいのですが、関係した資格はなんですか?
情報処理2種ですか?

613 :デフォルトの名無しさん:2009/11/10(火) 16:52:27
今は情報処理2種っていう資格は名前が変更になって
C言語以外もいろいろ選択できるようになってるけど
それでいいんじゃないでしょうか。

614 :デフォルトの名無しさん:2009/11/10(火) 16:58:30
ニコニコ動画で2009年10月15日に投稿された「【プログラミング】テトリスを1時間強で作って
みた【実況解説】」という動画が人気を集めている(写真1)。公開されてから2週間ちょっとで
15万回以上も再生され,コメントも数多く寄せられている。

内容は,開発ツールのインストールからスタートしてWindows環境でC言語を使い,わずか1時間強
でテトリスを完成させるというもの。そのあざやかな手腕には,感嘆の声がコメントで寄せら
れている。プログラミングそのものがエンタテインメントになっており,1時間強見ていても全く
飽きることがない。

ニコニコ動画で「うp主」と呼ばれる動画投稿者はどんなプログラマなのだろうか?と思い,インタ
ビューを申し込んでみた。うp主の名前は,紀平拓男さん。東京・南青山で携帯電話向けのソフト
ウエア開発会社ブロードテイルを経営する若きプログラマCEO(最高経営責任者)だ。きっとプログラ
ミング初心者の参考になる話を聞けるに違いない,と期待しながらインタビューを始めたが,予想以上に
“すごい”紀平さんのプログラミング歴に圧倒される結果となった。

──1時間強でテトリスを作れるのはすごいですね。プログラミング歴を教えてください。

幼稚園のころからですね。当時,セガが「SC-3000」というパソコンを出していて,これが家にあり
ました。あるとき,親が「ベーマガDX」(注:電波新聞社が発行していたプログラミング雑誌「マイコン
BASICマガジン」の別冊。様々なパソコン用のゲーム・プログラムなどを掲載していた)を買ってきた
ので,そこに載っているプログラムを打ち込んでいました。

当時は「これを打ち込むとゲームができる」という認識しかなかったですが。SC-3000には顔のキャラ
クタがあってそれをBASICのPRINT文で表示して親に自慢げに見せていたそうです。

テトリスを1時間強で作ってみた(ニコニコ動画)
http://www.nicovideo.jp/watch/sm8517855

http://itpro.nikkeibp.co.jp/article/Interview/20091104/340019/

615 :デフォルトの名無しさん:2009/11/10(火) 17:03:36
ニコ厨ってだけでちょっとね

616 :デフォルトの名無しさん:2009/11/10(火) 17:07:52
あえてまれによくあると表現したのはTMPだとよくあるけどTMPを駆使するのはまれだから。

617 :デフォルトの名無しさん:2009/11/10(火) 17:09:33
>>610
おお、どうしたんだい?
そもそもの、プログラム中に何万だかあるシンボルが同一空間にないという仮定を持ち出してはならんぞ。

618 :デフォルトの名無しさん:2009/11/10(火) 17:29:06
>>617
なんだそりゃ
どっから出てきた? 配列を使うからか?
違うね、配列を使うにしても分割のしようはあるが
おまえさん翻訳フェーズ(4)にご執心なんだっけ
#undef という手はあるが、前述のとおり俺は興味ない
面白そうな話でも出てくれば別だが今んとこ否定する

619 :デフォルトの名無しさん:2009/11/10(火) 17:49:59
>>618
ちがうちがう。
配列にする前の、数万だか数十万だかの変数が、同一空間にある可能性を元の話題で否定していないのよ。

620 :デフォルトの名無しさん:2009/11/10(火) 17:51:27
ちなみに>>599も俺で、
> 配列が向かない用途(断言)に、理を曲げてまで配列を使わせるほどの事情たりえたことが、おまえさん自身あったのか?
もちろんない。

621 :デフォルトの名無しさん:2009/11/10(火) 18:25:11
>>619
元々が同一空間にぶちまけられた瓦礫の山でも何とかするのが俺らの仕事
そこで配列の出番かどうかが、この流れでの論点だったはずだが、違うかい?

622 :デフォルトの名無しさん:2009/11/10(火) 18:27:16
テトリスくらいできるよ馬鹿野郎


623 :デフォルトの名無しさん:2009/11/10(火) 18:33:01
1時間でコールオブデューティー4を作る…とかだったら。

624 :デフォルトの名無しさん:2009/11/10(火) 18:53:39
むかーし、PC ショップであたかも即興でマシン語たたいて得意がってたのがいたが
何のことはない暗記してきたコードを再生していたに過ぎない(本人談

625 :デフォルトの名無しさん:2009/11/10(火) 19:00:51
砂漠が良いか賽のが原が良いかってことだったらどちらも
かなり困ったもの。程度問題。メリット、デメリットのバランス
で決めるべき問題だろ

626 :デフォルトの名無しさん:2009/11/10(火) 19:01:29
むかーし、pcショップで文字列を繰り返し表示させて画面を埋めるプログラムを書いたら、
ちょっと目をはなした隙に画面中央にその文字列を色を変えながら表示するプログラムに
書き換えられていたでござる。

627 :デフォルトの名無しさん:2009/11/10(火) 19:03:02
それからも書き換え合戦は行われ、生まれたのがWindowsです。
相手は嫁です。

628 :デフォルトの名無しさん:2009/11/10(火) 19:08:54
0 new
cls

629 :デフォルトの名無しさん:2009/11/10(火) 19:12:31
>>626
POKE 文でアトリビュート変えたんだろな

630 :デフォルトの名無しさん:2009/11/10(火) 19:40:31
>>626
実は私が犯人かもしれないw
詰まらないデモが動いてたら今で言う「伝言板スクリーンセーバー」的な
プログラムを動かすくらいはよくやってたから。
それも、リストを覗かれないように一行野郎で。

631 :デフォルトの名無しさん:2009/11/11(水) 01:00:13
enum number{
one, two, three, four, five,
six, seven, nine, zero
};


632 :デフォルトの名無しさん:2009/11/11(水) 20:12:09
4の倍数のアドレスにあるintと4の倍数からずれてるアドレスにあるintって計算コストって同じ?

633 :デフォルトの名無しさん:2009/11/11(水) 20:30:10
>>632
アドレッシング単位のプロセッサやメモリバスとのミスマッチの
問題は本来はかなり深刻。アドレスによって処理速度がかなり
極端に変わってしまう。
ただPCに限って言えばプロセッサのキャッシュが多層化され、
アドレッシング単位の違いによる相違を吸収されてしまっている
現在あんまし寝た子を起こすような質問をしないこと

634 :デフォルトの名無しさん:2009/11/11(水) 21:13:55
>>632
境界要求に違反するアクセスの結果を C は言語規則として定めない

635 :デフォルトの名無しさん:2009/11/11(水) 21:36:29
大抵はコンパイラが良い位置に配置するだろ。
char a, b, c;
int d;
とやったら c のあとに1バイトの未使用領域作ったり、
d a b c の順にするとか。


636 :デフォルトの名無しさん:2009/11/11(水) 21:44:53
自動変数ならレジスタ割付するだろ

637 :デフォルトの名無しさん:2009/11/11(水) 21:51:54
ちんこ

638 :デフォルトの名無しさん:2009/11/11(水) 21:52:17
ほら湧いてきた

639 :デフォルトの名無しさん:2009/11/11(水) 22:38:15

今思うとハァ?な叱られ

「構造体は必ずビットフィールド使え! メモリは少しでも節約するのが常識だ!」

「mallocを無駄がないように確保しろ!」



640 :デフォルトの名無しさん:2009/11/11(水) 22:40:55
unsigned int *uint;
と宣言したものを、

*(long int *)uint;
とキャストするとuintは何になるのですか。

long int **uintですか。

int int32;
(int *)int32;

とか、何になるのかよくわからないのですが。

641 :デフォルトの名無しさん:2009/11/11(水) 22:50:17
long int だろ。

642 :デフォルトの名無しさん:2009/11/11(水) 22:50:21
叱っている側としては
「ビットフィールド、ビット演算とは実体が何かよく理解して使え」
「詳細に着手する前にシステム全体のキャパシティとストラテジを把握しておけ」
「malloc の計算間違いは以ての外、超最低なので絶対にやるなよ」
といっているつもりなんだが、この原発信が
昼下がりに心がすでにアフター5な「ニュータイプ」たちの脳内で
どんな減衰劣化を受けているかは、近頃なかなか驚きゃせん
だからスパイラルを何回回れるかで道はまだあったりする
甘くも苦くもね

643 :デフォルトの名無しさん:2009/11/11(水) 22:56:23
そもそも言われた言葉の意味を理解していないからな

644 :632:2009/11/11(水) 23:01:33
レスd
ホンとはだめだけどPCなら気にスンナってことか


645 :デフォルトの名無しさん:2009/11/11(水) 23:17:45
いや、恐いよ
平然とビットズレを一切何の警告もなくやってのけたり
例外をつかまえるのにシステムコールが必要だったり

646 :デフォルトの名無しさん:2009/11/11(水) 23:18:23
ユーザモードでバッチグーだったコードが特権モードではNGだったりね

647 :デフォルトの名無しさん:2009/11/12(木) 06:25:16
プログラマが完璧に制御できてると思ってるmallocは、OSがテキトーに確保してプロセスに渡してるだけ
本当にそれだけ確保したか分からないし中の挙動も分かってない
でなきゃフラグメントなんか起こり得ない

648 :デフォルトの名無しさん:2009/11/12(木) 07:13:04
そのへんは「情報隠蔽」の理念に乗れる人と乗れない人の差だね
別に C++ でなくとも C でもやっぱり解ってなきゃいかん

649 :デフォルトの名無しさん:2009/11/12(木) 08:27:32
環境 V++2008 express winXP

#include <stdio.h>
int main(){
int a,b;
a = 10;
b = 10;
printf("a のアドレスは:%p\n",&a);
printf("b のアドレスは:%p\n",&b);
return 0;
}

実行結果
0012FF60
0012FF54

参考サイト
http://itpro.nikkeibp.co.jp/article/COLUMN/20061023/251565/?ST=develop&P=2

参考サイトの説明を読んでいるとintは4byteのメモリを確保するので
実行結果の下二桁の差が4になると思うのですが6になります
この値は環境や処理系によって変わるのでしょうか?
ちなみにグローバル変数として宣言すると差は4になります

650 :デフォルトの名無しさん:2009/11/12(木) 08:32:14
おまwww
16進数ってしってる?

651 :デフォルトの名無しさん:2009/11/12(木) 08:35:25
>実行結果の下二桁の差が4になると思うのですが6になります

なんで下二桁だけ十進で引き算するんだ? w

652 :649:2009/11/12(木) 08:38:31
>>650
>>651
ありがとうございます
めっちゃ悩んでたのが恥ずかしいorz

653 :デフォルトの名無しさん:2009/11/12(木) 09:19:28
でも、そうするとズレは 12 だな。
8 バイトは何に使ってるんだ。

654 :デフォルトの名無しさん:2009/11/12(木) 09:22:18
>>636
レジスタに割り付けられた自動変数って、アドレスはどうなんの?

655 :デフォルトの名無しさん:2009/11/12(木) 09:31:09
>>649
うちでも試したが 4 byte しか差がない
なんかソースに変なもの書いてないか

656 :649:2009/11/12(木) 10:13:21
16進数で考えればいいのかと思って計算してみてるんですがよくわかりません
0012FF60と0012FF54の間は55,56,57,58,59,5A,5B,5C,5D,5E,5Fになると思うのですが…

>>655
とくに余計なものは書いてません。インデント等も削除してみましたが変わりません。


657 :デフォルトの名無しさん:2009/11/12(木) 10:17:17
debug環境だろ。Releaseと比べるといい

658 :649:2009/11/12(木) 10:30:58
>>657
ありがとうございます。
releaseモードで実行すると0012FF78,0012FF7Cとなって予想通りの挙動になりました。

659 :デフォルトの名無しさん:2009/11/12(木) 12:16:02
4バイト境界に乗っていないデータに4バイトアクセスすると、落ちる環境もあるから要注意。
# って、言うまでもないのかな?

660 :デフォルトの名無しさん:2009/11/12(木) 12:25:11
offsetof()とポインタを無理に使わない限り落ちないけどな
しかしバスエラーとは懐かしい響きだ

661 :デフォルトの名無しさん:2009/11/12(木) 12:43:28
ポインタのcast絡みが多いね

662 :デフォルトの名無しさん:2009/11/12(木) 17:28:08
long int で境界を作っているのに、
そのアクセス用変数をcharなどでキャストすると
4バイトアクセスのはずが1バイトアクセスになるので
CPUとコンパイラによってはエラーで落ちる

663 :デフォルトの名無しさん:2009/11/12(木) 17:30:38
>>662
そんなん誰でも知ってるから

664 :デフォルトの名無しさん:2009/11/12(木) 17:44:40
制御文字について教えてください。
「\f」は改ページとありますが、実行してみたところ何らの効果もないように見えます。
てっきり実行後はカーソルがコンソールの一番上に戻るのかなと思ったのですが。

665 :デフォルトの名無しさん:2009/11/12(木) 17:46:50
プリンタにでも流しとけ

666 :デフォルトの名無しさん:2009/11/12(木) 17:49:12
アセンブラやってるとすぐピーンと来るのに、
今じゃ大学でも教えてないからな

そもそもツェーのポインタ機能ってのは、アセンブラになりたかったから付けた機能だ。
アセンブラを置き換える言語にしたかったので、メモリをいじれる機能としてポインタを付けた。
決してどっかの変数や関数のアドレスを覚えておくためじゃない。
メモリをいじれるようにしたら覚えておけるようになっただけだ。



667 :デフォルトの名無しさん:2009/11/12(木) 17:52:12
(long *)pがACVにならないのに
(char*)(long*)pがACVになるってことは規格上で可能?

668 :デフォルトの名無しさん:2009/11/12(木) 17:52:16
>>664
一部の端末エミュレータ以外は多分無視されます。プリンタなら改ページ(或いはページ長に相当する縦タブ動作)するけどねぇ。

669 :デフォルトの名無しさん:2009/11/12(木) 18:54:59
制御文字も、おかしい。

改行は必須としても、アラームとか必要あるのか。「ペ」とかつって。

そんなものよりも、好きな位置にカーソルが合わせられる機能のほうが重要ではないか。

直前の文字だけ更新したくてもできねえ

670 :デフォルトの名無しさん:2009/11/12(木) 19:00:30
数十年も前の話に難癖つけてもな

671 :デフォルトの名無しさん:2009/11/12(木) 19:02:05
> 好きな位置にカーソルが合わせられる機能

あるよ
ただ、標準 C ライブラリにないというだけ
C は元々そういうのを【作る立場】の言語であって、その気がない人は別の言語を選択すべき

# GC がないのは云々という大たわけを昔よく見かけたが、最近減った?

672 :デフォルトの名無しさん:2009/11/12(木) 19:04:05
作ればあるが、そういうのは標準で用意すべきだ。

便利だから標準ライブラリと言うものは存在するわけで

これも便利だから標準であるべきだった。

673 :デフォルトの名無しさん:2009/11/12(木) 19:04:14
C言語の変数について
宣言をした場合、乱数もしくは未定義の値に設定される。
でおk?

674 :デフォルトの名無しさん:2009/11/12(木) 19:06:44
NO

675 :デフォルトの名無しさん:2009/11/12(木) 19:07:33
正確に言えば、不明な値ではない。


「そのアドレスに確保した際、そこにあるデータを使う」


前のやつがウンコ流してない公衆トイレ左端の部屋に hoge 変数さんが確保されたら、
hogeさんは「前のやつが流してないウンコ」を得る。

なので、初期化しないでhogeさんを参照すると「前のやつが流してないウンコ」を見ることになる。


だから、正確に言えば未定義とか不定値ではない。


676 :デフォルトの名無しさん:2009/11/12(木) 19:12:53

変数が、そのアドレスに確保されるとき、「前のやつが流していないウンコ」があろうが
「ややもすると将来は立派なウンコになったやも知れぬゲロ」があろうが
それら全部適当な値で壊して適当な値になる

ってんなら未定義とか不定値と言うが、
「前のやつが残していったものをそのまま持ってしまう」ので
正確厳密に言えば不定値ではない。ということである。

677 :デフォルトの名無しさん:2009/11/12(木) 19:19:59
正確に言うなら、「俺が今実行としていることにとって無意味な値」
と言ったほうがいいだろう。

ウンコを要求するプログラムを実行しようとしていて、
hogeを確保したら その番地に丁度よくウンコがありました
ラッキー

と、無意味でないこともあるかもしれないが、それはたまたまだ。

678 :デフォルトの名無しさん:2009/11/12(木) 19:27:01
>>672
どんな範囲のものを標準で用意すべきだと思う?

C は色んな分野で色んな使われ方をしているのは言うまでもないが、
おまえさんはそれらの和集合を求めているのか、それとも積集合か?

択一選択のような言い方が鼻につくかも知れんが、そこにはっきりとポリシーを持っている点が、
C がバカウケした理由だぞ

679 :デフォルトの名無しさん:2009/11/12(木) 19:32:32
見誤ってなければ、改定なんか行われない。
C99でいろいろ追加されたが、あれだって「最初から標準であるべきだった」からだ

680 :デフォルトの名無しさん:2009/11/12(木) 19:55:06
>>679
あれがねえ・・・
どっちかつーと、古い C にあったメタボ成分を強制から任意へ緩和して欲しかったが
ふたを開けたら逆方向に走っていた、というのが正直な感想だが

例1: 構造体型の返却値
例2: 浮動小数点すべて

681 :デフォルトの名無しさん:2009/11/12(木) 19:57:18
コマンドプロンプトを操作することは可能ですか?
といってclsを実行するぐらいでいいんですけど


682 :デフォルトの名無しさん:2009/11/12(木) 20:02:10
system("c:¥¥windows¥¥system32¥¥cmd.exe /c cls");じゃ
だめ?

683 :デフォルトの名無しさん:2009/11/12(木) 20:06:43
>>682

ありがとう。大成功だったよ〜!!
これってOS共通のパスなんですか?


684 :デフォルトの名無しさん:2009/11/12(木) 20:09:19
system() の効果は system(NULL) を除き処理系定義

685 :デフォルトの名無しさん:2009/11/12(木) 20:13:09
環境、プラットフォーム依存です

686 :デフォルトの名無しさん:2009/11/12(木) 20:13:28
>>684

そうなんですか
OSバージョンも伝えてなかったのに凄いなと思って
ちなみにVISTA HOME BASICでした

687 :デフォルトの名無しさん:2009/11/12(木) 20:21:46
すごいもなにもコマンドプロンプトでcmd /?と入れたら
いろいろとメッセージが出てくるだろw

688 :デフォルトの名無しさん:2009/11/12(木) 20:21:54
>>669
直前の文字だけなら\bで、行の先頭に戻りたいなら\rでできないか?

689 :デフォルトの名無しさん:2009/11/12(木) 22:12:13
>>681
Borland のコンパイラセットなら conio に色々用意してあるよ。
画面消去からカーソル移動、他にも便利なのが色々と。

MS の VC++ でやるなら API を直に使うしかない。
と言っても、特に難しくはないから wincon.h 読め。

690 :デフォルトの名無しさん:2009/11/12(木) 22:15:06
ほんとにclsだけでいいならstdlibのsystem("cls");


691 :デフォルトの名無しさん:2009/11/12(木) 22:16:22

みんな知ってるはずなのに言われないと分からない豆知識
conio

conioは熱血硬派である。



692 :デフォルトの名無しさん:2009/11/12(木) 22:17:51
コニオってどこかにいそうな名前だね

693 :デフォルトの名無しさん:2009/11/12(木) 22:19:07
Cを一通り学習したので何か簡単なアプリケーションを作ってみたいのですが何かおすすめはありますか?
リバーシといったような簡単なゲームの類で構いません
またみなさんは初めてアプリケーションを作った時はどんなものを作りましたか?
よかったらアドバイス等よろしくお願いします

694 :デフォルトの名無しさん:2009/11/12(木) 22:30:42
>>693
テキストブラウザ

695 :デフォルトの名無しさん:2009/11/12(木) 22:31:35
ブラウザ

ブラウザー

696 :デフォルトの名無しさん:2009/11/12(木) 22:38:10
ちょっと前までのJIS式に書くならブラウザ

697 :デフォルトの名無しさん:2009/11/12(木) 22:53:46
テクスッブアゥズァ

698 :デフォルトの名無しさん:2009/11/12(木) 22:55:40
俺は、ウィルスコード作成だった

当時、あまりにもアンチウィルスソフトが反応しなかったので
「ホンマにウィルスを止めるのか」
ということでやってみた

ちゃんと止めた
感動した

699 :デフォルトの名無しさん:2009/11/12(木) 23:20:58
C じゃなかったから、ここに書くのはちょっと・・・

700 :デフォルトの名無しさん:2009/11/12(木) 23:24:25
>>693
エロ画をdlするプログラム
スレ指定するだけでそこに貼られているものを取ってきてほしい
同じのを何度も取ってこないようにしてほしい
取ってきたものを整理できる簡易viewerとfiler内蔵だとうれしい

701 :デフォルトの名無しさん:2009/11/12(木) 23:27:23
>>693
フリーオのドライバをおながいします

702 :デフォルトの名無しさん:2009/11/12(木) 23:31:14
>>693
ロックマン

703 :デフォルトの名無しさん:2009/11/13(金) 06:14:02
>>693
俺の口座にひたすら金を振り込むプログラムお願いします

704 :ニンテンドー(笑):2009/11/13(金) 09:47:54
C言語はクズばかりというのがわかるスレですね

705 :デフォルトの名無しさん:2009/11/13(金) 10:44:02
C言語はもう古い。
使いかってが悪い。
簡単なWindowsアプリケーション作るのもやたら知識が必要だしメンドクサ

706 :デフォルトの名無しさん:2009/11/13(金) 11:11:42
だから適材適所だと言ってるだろうに
GUIはC#でもDelphiでも何でも作れる
速度の必要とする部分だけDLL化してC/C++で作ればよい

707 :デフォルトの名無しさん:2009/11/13(金) 11:26:32
ポインタなど、メモリにプログラマが直接アクセスする機能が使えない言語は終わってる。

708 :デフォルトの名無しさん:2009/11/13(金) 12:08:31
C言語プログラムからUNIXのシェルを起動してshファイルを呼び出し・実行することは可能でしょうか?

裏で実行するのではなく、
バナーが見れるようにシェルを起動してそのシェルでshを実行したいです。

709 :デフォルトの名無しさん:2009/11/13(金) 12:17:30
>>708
つ[system()]

710 :デフォルトの名無しさん:2009/11/13(金) 12:23:51
>>708
UNIX機の名前をunix、rshデーモンが動いているとして、
system("rsh unix /bin/sh -c shファイル")で実行できる。
標準入出力はリダイレクトしていないので、実行する端末をそのまま使う。
もし、入力或いは出力を呼び出すプログラムで利用したいのなら、popen()を使えばいい。

711 :デフォルトの名無しさん:2009/11/13(金) 12:41:23
>>708のやりたいことは
system("xterm -c hoge.sh");
じゃないかな

712 :デフォルトの名無しさん:2009/11/13(金) 12:57:08
system("banner `hoge.sh`");だったりしてw

713 :デフォルトの名無しさん:2009/11/13(金) 14:29:12
みなさんありがとうございますm(_ _)m

system()を忘れてました
しかしあまりsystem関数に馴染みがないもので…

私がやりたい具体例をあげると
コンパイルしたEXEファイルをLinuxで実行すると

まず、シェルが立ち上がり
そのシェルでwgetを実行します。
同シェルでダウンロードしている状況を見れるようにしたいのです。
(=======>59%
などの返事、、)




714 :デフォルトの名無しさん:2009/11/13(金) 14:33:11
ようするに、
シェルを立ち上げる作業とwgetと入力する作業

の二つを自動化したいってことです


715 :デフォルトの名無しさん:2009/11/13(金) 14:33:42
EXE ファイルを実行できるのか。

716 :デフォルトの名無しさん:2009/11/13(金) 14:52:00
つwine

717 :デフォルトの名無しさん:2009/11/13(金) 14:54:08
全く具体的になっていない件。

718 :デフォルトの名無しさん:2009/11/13(金) 14:55:44
単にシェルスクリプト書けばいいのでは?

719 :デフォルトの名無しさん:2009/11/13(金) 15:04:06
dosのコマンドをprintfで出力して実行とかできますか?
例えば
#include<stdio.h>

int main()
{
printf("ipcofig /all\n");

return 0;
}
みたいなかんじで

720 :デフォルトの名無しさん:2009/11/13(金) 15:05:02
>>719
>709

721 :719:2009/11/13(金) 15:10:24
ちなみに僕の中ではこれは出来るってことになってるんですけど
なぜ出来ないかわかりやすく説明してください。

722 :デフォルトの名無しさん:2009/11/13(金) 15:12:38
>>721
printf()ではできないけど、他の手段できるよ。



723 :デフォルトの名無しさん:2009/11/13(金) 15:17:52
>>718
いやシェルスクリプトを実行するシェルスクリプトはいらないです

wgetはシェルスクリプトとして書かれているものとします。

724 :デフォルトの名無しさん:2009/11/13(金) 15:18:30
>>719
Unix系なら、そのプログラムの実行モジュールをfooとすると`foo`でできるよ。

725 :デフォルトの名無しさん:2009/11/13(金) 15:19:11
>>723
ぐだぐだ能書きはいいから、今までについたレスを全部検討して鯉。

726 :デフォルトの名無しさん:2009/11/13(金) 15:23:00
>>725
それもそうですねww
わかた

727 :デフォルトの名無しさん:2009/11/13(金) 17:27:11
変数に型をつけない言語ってあるけど
計算処理速度遅くなったりコンパイラが混乱を起こして誤作動したりしないのかなぁ?

728 :デフォルトの名無しさん:2009/11/13(金) 17:29:09
こういうのって良いの?

#include <stdio.h>
int main()
{
 int i;
 int f(int a,int b){return a+b;}
 for(i=0;i<100;i++)printf("%d ",f(i,i+1));
 return 0;
}

729 :デフォルトの名無しさん:2009/11/13(金) 17:39:02
>>728
Cにおいては特定の関数mainのみから呼び出せる関数fを定義するこ
とは出来ません。

730 :デフォルトの名無しさん:2009/11/13(金) 17:39:47
gcc拡張ならできるけどね。

731 :デフォルトの名無しさん:2009/11/13(金) 17:50:49
C++ならできるから君も後楽園遊園地でC++と握手してこいよ

732 :デフォルトの名無しさん:2009/11/13(金) 17:53:35
>>727
コンパイラが混乱を起こして誤作動したりはしないけど、
プログラマが誤動作することがしばしばある。

733 :デフォルトの名無しさん:2009/11/13(金) 17:57:36
親しくなれば型を殆ど明示せずに書く事が出来る良さもある。

734 :デフォルトの名無しさん:2009/11/13(金) 20:09:07
>>727
B は遅かったが混乱したからではなかったな

735 :デフォルトの名無しさん:2009/11/13(金) 20:12:12
型変換を明示する言語が必ずしもすべての変換を明示するわけでは
なく、むしろ徹底して暗黙化するものとそうでないものの二極に
分化している件について

736 :デフォルトの名無しさん:2009/11/13(金) 20:49:29
const char *s = "
#include "textfile.txt"
";

みたいなことやりたいときはどうしたら良い?


737 :デフォルトの名無しさん:2009/11/13(金) 20:53:43
bin2c

738 :デフォルトの名無しさん:2009/11/13(金) 21:30:33
>>736
#define hoge "\
#include "textfile.txt"\
"
const char *s = hoge;

739 :デフォルトの名無しさん:2009/11/13(金) 21:54:58
struct a{
__struct {
________int b;
________int c;
} a;
};

こういう書き方をしてるプログラムを見つけたんですが、古い書き方なんでしょうか?

740 :デフォルトの名無しさん:2009/11/13(金) 22:31:06
入れ子にしてるんじゃねえの?

741 :デフォルトの名無しさん:2009/11/13(金) 22:55:29
ポインタって%pとかやればアドレスの番号を直接見られるけど、プログラムする場合具体的なアドレスの数値は気にする必要はないの?

742 :デフォルトの名無しさん:2009/11/13(金) 23:07:13
%pなんて今の時代じゃ無意味だよ?

743 :デフォルトの名無しさん:2009/11/13(金) 23:44:10
番号w

744 :デフォルトの名無しさん:2009/11/13(金) 23:45:32
無意味ってこともない。
まあライトユーザには無意味というのは正しいが。

745 :デフォルトの名無しさん:2009/11/14(土) 00:24:55
そうね。物理メモリのアドレスなんてふつーは触れないから。

746 :デフォルトの名無しさん:2009/11/14(土) 00:29:32
それ言い出したら C 自体ふつー触れないし

747 :デフォルトの名無しさん:2009/11/14(土) 01:31:31
voidポインタから何かの型ポインタへのキャストって実行時にコストかかってるんですか?それともコンパイル時のコストだけですみますか?

748 :デフォルトの名無しさん:2009/11/14(土) 01:34:28
コンパイルして出てきたコードを見るしかないです

749 :デフォルトの名無しさん:2009/11/14(土) 03:53:32
>>747
実行時コストはかからない。

750 :デフォルトの名無しさん:2009/11/14(土) 04:04:16
経験的にはYesだが保証されたものではない

751 :デフォルトの名無しさん:2009/11/14(土) 04:33:53
>>749
規格票には何も書かれてない以上断言するのはどうかと

752 :デフォルトの名無しさん:2009/11/14(土) 05:05:16
規格票もC言語で書かれている限りC言語と同様の信頼性しかない

753 :デフォルトの名無しさん:2009/11/14(土) 05:53:00
>>752
馬鹿発見

754 :デフォルトの名無しさん:2009/11/14(土) 11:04:10
ポインタのポインタって
記述方法とかはわかるんですけど
どういう時に使うものなの?

755 :デフォルトの名無しさん:2009/11/14(土) 11:10:42
char **argv

756 :デフォルトの名無しさん:2009/11/14(土) 11:12:31
馬鹿発見

757 :デフォルトの名無しさん:2009/11/14(土) 11:13:27
void alloc(void **p, size_t s)
{
*p = malloc(s);
}


758 :デフォルトの名無しさん:2009/11/14(土) 11:15:58
ポインタの参照をかえたいとき

たとえば

main(){
x=20;
func(x);
}

void func(x){
x=10;
}

これを実行してもxの値は変わらなかったからポインタ使ったよな?
このfuncの引数xがそのままポインタにした場合を考えればいい

759 :デフォルトの名無しさん:2009/11/14(土) 11:20:24
>>754
ポインタを使うとき、を考えれば、ポインタのポインタを使うときも分かるはず
関数の参照渡しで、ポインタを渡したい場合とかね

>>758


760 :デフォルトの名無しさん:2009/11/14(土) 11:26:55
普通の変数のポインタを使うときと同じ。
少し混乱しやすいけどな。

761 :デフォルトの名無しさん:2009/11/14(土) 11:29:44
なんでC言語って数値がいっぱい型あんの?
char型とint型とdouble型だけでよくね?
ほかって何に使うの?

762 :デフォルトの名無しさん:2009/11/14(土) 11:33:52
>>754
線形リストや二分木でいやというほど使うので、まあそのときにでも。

763 :デフォルトの名無しさん:2009/11/14(土) 11:41:08
別にいやになったことはないが

764 :デフォルトの名無しさん:2009/11/14(土) 11:50:00
>>756
ディスプレイの電源が落ちてるんじゃね?

765 :デフォルトの名無しさん:2009/11/14(土) 11:50:43
>>761
I/Oのレジスタをアクセスするときって、たいていアクセス幅は決まってる
ハーフワードのレジスタは、バイトx2ではアクセス出来ない(エラーが出る)

そうでなくても、データ構造体の中に16ビット長のデータがあることは
普通にあるから、欲しくなるでしょ。IPヘッダとか見てみれば?

766 :デフォルトの名無しさん:2009/11/14(土) 12:07:20
数値型がたくさんあるのはいいけど、規格で大きさ統一しない理由がわからん

767 :デフォルトの名無しさん:2009/11/14(土) 12:20:03
統一されてたら、今頃サイズの拡張がどうとかでめんどうなことになってたと思うが。

768 :デフォルトの名無しさん:2009/11/14(土) 12:30:11
最初からint(4)とかint(8)とかreal(8)とかにしてればよかったんだ

769 :デフォルトの名無しさん:2009/11/14(土) 12:33:53
浮動小数は標準には含めないほうが良かったな。
あくまで任意の拡張扱いにしておくべきだった。

770 :デフォルトの名無しさん:2009/11/14(土) 12:53:28
質問です。
よく「C言語はコンパイル時の型チェックが厳密」と聞きますが、以下の例などでは人間が気をつけるしかないのでしょうか?
#include <stdio.h>
int func1(int);
int main(void)
{
printf("%d\n", func1(3));
printf("%d\n", func1(3.0)); //<--勘違い部分
return 0;
}
int func1(int n)
{
return n + 1;
}


771 :デフォルトの名無しさん:2009/11/14(土) 12:57:31
型チェックが厳密なのはC++では?

772 :デフォルトの名無しさん:2009/11/14(土) 14:11:30
グーグルで C 型って検索してもC型肝炎のことしかみつからねぇ
死ね

773 :デフォルトの名無しさん:2009/11/14(土) 14:36:30
-C型肝炎

774 :デフォルトの名無しさん:2009/11/14(土) 14:55:08
自分の検索スキルの無さを棚に上げるなよ情弱君


775 :デフォルトの名無しさん:2009/11/14(土) 15:17:48
どっちが良いの?

int f1(int min, int max){
return rand()/(RAND_MAX+1.0)*(max-min+1)+min;
}

int f2(int min, int max){
return rand()/((RAND_MAX+1.0)/(max-min+1))+min;
}


776 :デフォルトの名無しさん:2009/11/14(土) 15:20:30
>>775
一般的に除算は乗算よりも遅い

777 :デフォルトの名無しさん:2009/11/14(土) 15:27:41
それはべつべつの値だろ

778 :デフォルトの名無しさん:2009/11/14(土) 15:31:33
剰余で充分。
下位バイトの精度が云々と言うなら下は捨ててしまえば良い。

int f3(int min, int max){
return (rand()>>1)%(max-min+1)+min;
}


779 :デフォルトの名無しさん:2009/11/14(土) 15:34:22
>>778
min=0 max=100000 RAND_MAX=65535 であるときに出ない値の分布が…

780 :デフォルトの名無しさん:2009/11/14(土) 15:54:28
実数を使ったところで、どうせ跳び跳びになるんだから
最大値で撥ねれば良いだろ。
剰余で充分。

781 :デフォルトの名無しさん:2009/11/14(土) 15:56:37
精度よりもまず均等にすることを考えろ。
2の累乗以外の結果を求めるなら振り直し法を使うしかない。


782 :デフォルトの名無しさん:2009/11/14(土) 16:03:01
これだと、高速で2^32-1までの数字が出せる。

unsigned int xorshift() {
static unsigned int t, x=123456789UL,y=362436069UL,z=521288629UL,w=88675123UL;
t=x^(x<<11); x=y; y=z; z=w; return w^=(w>>19)^t^(t>>8); }

783 :デフォルトの名無しさん:2009/11/14(土) 16:06:05
メルヘンコースターを使えばいいんじゃね?

784 :デフォルトの名無しさん:2009/11/14(土) 16:08:15
右シフト・剰余・振り直し法
この三つを組み合わせれば最強乱数になる。
精度がいい乱数を使えば右シフトは不要だが。


785 :デフォルトの名無しさん:2009/11/14(土) 16:14:09
最強はHDDの読み取り間隔で乱数を作るのと思った。
さまざまな要因で速度は変化する。

786 :デフォルトの名無しさん:2009/11/14(土) 16:17:59
未定義の動作を起こせば真性乱数が発生してもおかしくはない

787 :デフォルトの名無しさん:2009/11/14(土) 16:27:12
>return rand()/(RAND_MAX+1.0)*(max-min+1)+min;

これって RAND_MAX に 1 足しちゃうと精度悪くなんね?
>return rand()/(RAND_MAX+0.00001)*(max-min+1)+min;
くらいで良いんじゃね?

788 :デフォルトの名無しさん:2009/11/14(土) 17:04:30
http://codepad.org/E1r5ljef
手元では
cycle=1630806039
2^32=4294967296

789 :788:2009/11/14(土) 17:06:00
ページ間違えた
http://codepad.org/IinpiWcy

790 :デフォルトの名無しさん:2009/11/14(土) 17:10:41
一つ重複したらサイクルかよ

791 :デフォルトの名無しさん:2009/11/14(土) 17:13:34
一様性は保証されないということ

792 :デフォルトの名無しさん:2009/11/14(土) 17:56:56


CPUの除算ステップを見ればよい。

俺の大好きなSH4は、除算も1ステップ実行なので
除算に対してビットシフトとかせんでよい。
除算に対して3〜10サイクルもかかっていた頃はビットシフトしか選択肢がなかった

793 :デフォルトの名無しさん:2009/11/14(土) 18:02:21
おいおい……

794 :デフォルトの名無しさん:2009/11/14(土) 18:05:32
Cゲングでも何でもそうだが、2で割るのに /2するやつはバカじゃ!


795 :デフォルトの名無しさん:2009/11/14(土) 18:08:45
ビットシフトで思い出したけど、1/10にするにはどうしたらいいの。
10倍にするなら X = ((A << 2) + A) << 1 でいいじゃないか。

796 :デフォルトの名無しさん:2009/11/14(土) 18:21:49
>>795


#include <stdio.h>
double nijyo(unsigned int n){
double sum=1; unsigned int i;for(i=0;i<n;i++)sum*=2; return sum; }

void f(unsigned int N){
unsigned int n,Y,d ;
double X, NJ;
if( N<=0 || N>=(1<<16) ) return ;
for( n=0; ( (unsigned int)1<<n ) < N ; n++ ); n += 15;
NJ=nijyo(n);
X = NJ / N ;
Y = (unsigned int) X;
d = 0;
if( X-Y > 0.5 ) Y++; else d = (unsigned int) ( NJ - (N-1) * Y ) - 1;
printf("x/%5d = (%5d*x + %5d) >> %2d\n", N, Y, d, n ); }

main(){ for(unsigned int N=1; N<65000 ; N++)f(N); }

797 :デフォルトの名無しさん:2009/11/14(土) 18:51:33
>>795
32bit数対応版も出来た。64bit演算仕うがな。

#include <iostream>
using namespace std;

void f(unsigned int N){
unsigned int n; unsigned long long NJ,d,Y;
for( n=0; (1<<n) < N ; n++ );
n += 31;
NJ = (unsigned long long)1<<n;
double X = (double)NJ/N;
Y = (unsigned long long) X;
d = 0;
if( X-Y > 0.5 ) Y++; else d = (unsigned long long) ( NJ - (N-1) * Y ) - 1;
cout<<"x/"<< N <<" = (" << Y <<"*x + "<<d<<") >> "<<n<<endl;
//for( int k=(1<<20) ; k < (1<<25) ; k++ ) if ( k/N!=(Y*k+d)>>n ) cout<<"err "<<N<<endl;
}

main(){ for(unsigned int N=(1<<16); N<(1<<18) ; N++) f(N); }

798 :デフォルトの名無しさん:2009/11/14(土) 19:02:00
I/Oがたまに他プロセスに取られて動作しなくなるのですが、
どうすればI/Oを取り戻せますか。

799 :デフォルトの名無しさん:2009/11/14(土) 19:02:39
(どうして要求されたわけでもないのに車輪の再発明をここに
貼付けるのか問うてみたい...)

800 :デフォルトの名無しさん:2009/11/14(土) 19:04:52
>>798
ポーリングをやめて割り込み駆動にする

801 :デフォルトの名無しさん:2009/11/14(土) 19:08:28
微笑み忘れた顔等
見たくはないさ
I/O取り戻せ!

802 :デフォルトの名無しさん:2009/11/14(土) 19:27:30
>>798
スレ違い

803 :デフォルトの名無しさん:2009/11/14(土) 19:41:36
んI/O取り戻〜せぃぇ〜〜ぃぇぃぇ。

804 :デフォルトの名無しさん:2009/11/14(土) 20:30:26
ユーアーショック!
Iで空が落ちてくる!

805 :デフォルトの名無しさん:2009/11/14(土) 21:59:26
個人的に許せへんのは、小文字かつ1文字の変数

i とか t とか

806 :デフォルトの名無しさん:2009/11/14(土) 22:08:00
なにか問題でも?

807 :デフォルトの名無しさん:2009/11/14(土) 22:13:31
まあ許せよ、インタープリタ方式の言語が長かった奴の性ってやつよ
K&R C が長かったり、長くもなかったりする奴の return(0); は許してるんだろ?

808 :デフォルトの名無しさん:2009/11/14(土) 22:14:55
わかりにくい。
もうちょっと何とかならんのかい。

long double ConvertGeometryMatrix(void)

というところでインクリメント用変数を使うのだとしたら、
ConvertGeometryMatrix_InclementValue
などとすれば一発で分かるのに。

809 :デフォルトの名無しさん:2009/11/14(土) 22:16:46
なげーよw

810 :デフォルトの名無しさん:2009/11/14(土) 22:27:43
こんな感じか?

IntegerVariable MainFunction(IntegerVariable ArgumentCount, CharacterVariable *ArgumentVector[])
{
 return 0;
}


811 :デフォルトの名無しさん:2009/11/14(土) 22:33:24
一文字変数に文句言うやつを何とかしてほしい。

812 :デフォルトの名無しさん:2009/11/14(土) 22:37:02
まあ、ハンガリアンとかも含めて
中二病みたいなもんだから
その内に治まるだろ。
無意味だと気付くまでやりたいようにやらせとけ。

813 :デフォルトの名無しさん:2009/11/14(土) 22:38:04
コーディングスタイルにはいろいろある
人それぞれ好みが違う
ンなことは分かりきってるし、散々いろんなところで議論されてきたのに
やっぱ目の前でモメるとイライラする。それも

int First, Second;

なのか、

int first,
  Second;

なのか程度で

814 :デフォルトの名無しさん:2009/11/14(土) 22:48:25
>>808
なんだよInclementって。わかんねーよ

815 :デフォルトの名無しさん:2009/11/14(土) 22:52:08
>>813
int first;
int second;

816 :デフォルトの名無しさん:2009/11/15(日) 00:10:30
なんか根本的なところが間違ってる、とまではいわないまでも、考え違いをしているような気がする。
もういちどスタートラインに戻って考え直してみてはいかが?

817 :デフォルトの名無しさん:2009/11/15(日) 00:16:54
>>816
だれに言ってるの?

818 :デフォルトの名無しさん:2009/11/15(日) 00:52:51


819 :デフォルトの名無しさん:2009/11/15(日) 01:16:14
いやいや俺だろ。

820 :デフォルトの名無しさん:2009/11/15(日) 02:37:55
1文字ずつ文章を表示するにはどうすればよいでしょうか?
かまいたちの夜とか風なサウンドノベルはゲーム用ライブラリなしで作れるものでしょうか?


821 :デフォルトの名無しさん:2009/11/15(日) 02:46:14
1文字ずつ文章を表示すればいいです

822 :デフォルトの名無しさん:2009/11/15(日) 02:48:08
標準Cだけではサウンドなどむりなので、開発環境にあわせたスレで聞くといい
いや聞く前にプログラム系の本を買って来い

823 :デフォルトの名無しさん:2009/11/15(日) 04:22:21
C言語でMIDIファイルを開くってできる?
コンソールで詩を流しながらみたいな感じで

824 :デフォルトの名無しさん:2009/11/15(日) 05:09:26
>>823
Windowsをはじめ、多くのMIDIライブラリはC言語で記述されて
ているが、そのようなライブラリとその使用法の情報が入手でき
ることとCコンパイラを持っていることとは同じことではない

825 :デフォルトの名無しさん:2009/11/15(日) 06:00:56


グラフィックスやサウンド、ディスプレイなど何に対してもいえるが、

ここにデータを入れると表示するぞ!っていうレジスタがある。
そこに対してアクセスし、データを入れてやれば望みどおりに動くのである。


そのレジスタがどこにあるのか、制御方法は、などは公開されているなら
自分で組むことは可能だが、本来それをやるのはドライバだ。

こういうのは本来何の言語でもできる、特にレジスタいじりやメモリいじりを得意とするアセンブラが最適だが
OS上で、という条件があるのなら、あらかじめ用意されている関数群を使うのが早い。
そういうのをAPIという。

826 :デフォルトの名無しさん:2009/11/15(日) 06:10:57
>>825

827 :デフォルトの名無しさん:2009/11/15(日) 06:20:06
異論があるならどうぞ。

828 :デフォルトの名無しさん:2009/11/15(日) 06:24:54
動作するまでは、全部変わらない。
結局、特定のレジスタに値を入れて演算させ、アキュームレータから取り出す
これを延々繰り返しているだけ。

であることからCでも書けるが、じゃあどこのレジスタに入れるんですか
アクセスするときのお約束事はなんですか
っていうのは統一されていないので、分からなければドライバやAPIに頼るしかない。

829 :デフォルトの名無しさん:2009/11/15(日) 06:26:29
レジスタというのが CPU レジスタのこを言うのなら
そこでレジスタが出てくること自体が変だ

830 :デフォルトの名無しさん:2009/11/15(日) 06:37:01
本日のマメ知識

 レジスタってのは、CPUだけにあるもんじゃない。
 産業用のコントロールICにも必ずあるし、GPUにも必ずあるし、サウンドチップにも必ずあるし、USBチップにも(ry


 そのレジスタとの橋渡しをしているのがドライバである。
 ドライバはプログラマに専用の制御関数、つまりAPIを提供する。
 プログラマが「普段」直接触れるのはAPIだけなので、ハードをまったく知らない素人は気づきにくいが
 結局は何であってもレジスタにアクセスし、値を入れているのだ。

831 :デフォルトの名無しさん:2009/11/15(日) 06:41:46
何段階もの層になっているので、ハードを知らない
いまどきのプログラマには想像できないかもしれないが
プログラマが書いたコードが直接ハードを制御しに行ってるわけではない。

API越しにプログラマが値を入れようとする
OSを介すならAPIがOSに値が入ったことを通知する
OSがAPIから受け取り、適切ならばドライバに値を渡す
ドライバはトランスコードを行う
ハードウェアに値が渡る
結果を返す
ドライバが結果を読み取る
(ry


「そのようなことは分かっている」とたいてい言うが、ハードウェアがどのように動いているかまで分かってなければ素人だ。

832 :デフォルトの名無しさん:2009/11/15(日) 06:45:00
>>830

833 :デフォルトの名無しさん:2009/11/15(日) 06:46:04
>>831 は分かってなさそうだよな

834 :デフォルトの名無しさん:2009/11/15(日) 06:56:15
具体的な反論も何も出来ないから素人って言われるんだよw

835 :デフォルトの名無しさん:2009/11/15(日) 07:12:28
>>825 >>830 >>831
なんか根本的なところが間違ってる、とまではいわないまでも、考え違いをしているような気がする。
もういちどスタートラインに戻って考え直してみてはいかが?

836 :デフォルトの名無しさん:2009/11/15(日) 07:14:12
具体的に言えない素人は勉強したほうがいいよ

837 :デフォルトの名無しさん:2009/11/15(日) 07:15:15
レジスタがない!レジスタってのはCPUだけ!

さすがにここまでの無知は初めて見た。

838 :デフォルトの名無しさん:2009/11/15(日) 07:42:02
>>825以降の変な人は
知識はありそうだが自分でも何をしたいのかわからないプログラマーの末路

839 :デフォルトの名無しさん:2009/11/15(日) 07:44:12
そもそも最初の質問がなんだったか関係なく泥沼の戦いを始めてしまうあたり頭悪い

840 :デフォルトの名無しさん:2009/11/15(日) 07:46:36
質問者の満足よりも
自分のプライドを優先してるからなw

841 :デフォルトの名無しさん:2009/11/15(日) 08:44:06
>>837
組み込み系以外だと、「レジスタ、なにそれ?」とか、「CPUの事でしょ?」というプログラマも多いよ。
ワンボードマイコンの時代に比べ、Cが広い分野で使われるようになった、という事でもあるんだが。

842 :デフォルトの名無しさん:2009/11/15(日) 09:06:30
>>841
このコメントが技術レベルを如実に語ってるな

843 :デフォルトの名無しさん:2009/11/15(日) 10:41:38
>>820

Nscripterで検索するんだ。

844 :820:2009/11/15(日) 11:30:16
>>843
いやだ、C言語でやりたい


845 :デフォルトの名無しさん:2009/11/15(日) 11:37:15
やりたければまぁご自由にどうぞ
がむばれ

846 :デフォルトの名無しさん:2009/11/15(日) 11:53:05
windowsAPIでやれ

847 :デフォルトの名無しさん:2009/11/15(日) 14:21:24
「インデント付けろよタコ!」と耳が痛い位講義で言われるんですが
if(hoge){
  uwaa();
}

if(hoge)
{
  uwaa();
}
と記述する場合は他人から見るとどっちが読み易いんでしょうか?

848 :デフォルトの名無しさん:2009/11/15(日) 14:26:33
>>847
どっちでもいいけど、スペース無しでペタっとしてるほうが気になる。

849 :デフォルトの名無しさん:2009/11/15(日) 14:26:57
宗派抗争スレでどーぞ

850 :デフォルトの名無しさん:2009/11/15(日) 14:28:57
>>847
その2つであればどちらでも問題無い

851 :デフォルトの名無しさん:2009/11/15(日) 14:31:31
有難う御座います
下を使うようにするます

852 :デフォルトの名無しさん:2009/11/15(日) 14:31:37
>>847
インデントを定義しろタコ!と言い返してやれ

853 :デフォルトの名無しさん:2009/11/15(日) 14:42:53
お爺ちゃん お口くさーい

854 :デフォルトの名無しさん:2009/11/15(日) 15:03:07
リカルデントですねわかります

855 :デフォルトの名無しさん:2009/11/15(日) 15:52:06
>>847
cソースの整形ツールに、krオプションとかあるから、好きな方で統一すればいいんでは?

856 :デフォルトの名無しさん:2009/11/15(日) 15:54:23
>>838
プログラマーと、業務アプリコーダーとの区別が付かない人が多いな。

857 :デフォルトの名無しさん:2009/11/15(日) 20:57:06
struct fuhihi
{
char flags[2];
};

これぐらいだったら参照渡しより値渡しのほうがはやいよね?

858 :デフォルトの名無しさん:2009/11/15(日) 21:55:26
>>856
今、コーダーって人いるの?
メインフレームの世界ではかつてコーダーがいたそうだが。

859 :デフォルトの名無しさん:2009/11/15(日) 21:57:43
>>857
読み取りしかしないのか?

860 :デフォルトの名無しさん:2009/11/15(日) 22:03:51
HTML/CSSコーダ

861 :デフォルトの名無しさん:2009/11/15(日) 23:14:48
>>859
struct fuhihi func(struct fuhihi arg);


862 :デフォルトの名無しさん:2009/11/16(月) 01:02:17
HTML/CSSはコーディングとは言わないが
現在のWebページでスクリプト使わないことは
殆ど無いので、JavaScriptが事実上必須となる。
JavaScriptはJavaとは別物と言えども、Javaの
素養があるのと無いのでは相当違うんで相当の
実力が必要。Cプログラマは決して見下すべき
ではないんじゃないかと

863 :デフォルトの名無しさん:2009/11/16(月) 01:05:41
プログラミング関係ないが、HTMLをまともに知らないヤツが多すぎる。
タグで挟めばいいんだろ? 程度にしか考えていないのは、もうね...

864 :デフォルトの名無しさん:2009/11/16(月) 01:12:10
>>862
極めて動作の遅いWebブラウザ環境でのJavaScriptプログラミングは
意外にも、DOS全盛期の遅いPC向けのプログラミングに似たきわどい工夫が決め手なこともよくあるんで腕が立つ人じゃないと任せられ
ないと聞くね。

865 :デフォルトの名無しさん:2009/11/16(月) 04:17:16
ちょっち質問なのですが、スレ違ならすんまそです。

C言語はボケ防止に繋がるでしょうか?
最近、警備員に就職し頭を使わないせいかボケかけています。
どうでしょうか?

866 :デフォルトの名無しさん:2009/11/16(月) 04:45:28
Cに限った話じゃないけど
新しいことを始めるのはボケ防止になるよ

867 :デフォルトの名無しさん:2009/11/16(月) 04:56:29
サンクスです。

868 :デフォルトの名無しさん:2009/11/16(月) 05:39:49
ポインタが難しいって言われるのはなんでじゃ。
ただのアドレスっしょ?
ポインタを利用したテクニックやアルゴリズムとかは難しいかもしれんが
ただポインタっていう概念はぜんぜん難しくないじゃん
何が難しいの?バカ?

869 :デフォルトの名無しさん:2009/11/16(月) 05:42:07
概念自体はまったく難しくないが
Cの文法上ポインタの扱いが糞なのは確か
理解している人もいれば混乱している人もいる
一部の混乱しているひとが「難しい」と言っているのが一人歩きしているだけ

870 :デフォルトの名無しさん:2009/11/16(月) 07:07:47
×難しい
○めんどくせーよ

871 :デフォルトの名無しさん:2009/11/16(月) 07:17:20
出来る人にとっては、何が難しいのかわからないってだけ。

872 :デフォルトの名無しさん:2009/11/16(月) 07:23:37
typedefで解決

873 :デフォルトの名無しさん:2009/11/16(月) 07:46:55
ポインタはアドレスではないのだが、>>868のように混乱している人も
いるってことだな。

874 :デフォルトの名無しさん:2009/11/16(月) 07:56:56
>>868が混乱していると思うあんたも大差ない

875 :デフォルトの名無しさん:2009/11/16(月) 09:10:17
それが難しいと呼ばれる理由はそれがそれをこれをそうする
からであって決してそれがそんなにそれほどそうこうするわけ
でもないので、それほど難しいものでは無い筈なのどがあのように
このように難しいというそのいわゆるそれが出てくるわけで....

876 :デフォルトの名無しさん:2009/11/16(月) 13:12:28
事実は逆で
ポインタも理解できないようなバカも
C言語を入門するようになったってこと

877 :デフォルトの名無しさん:2009/11/16(月) 13:16:28
いや、ここ君の日記帳じゃないんで
情報が埋もれるだけだからマジ勘弁して

878 :デフォルトの名無しさん:2009/11/16(月) 17:53:04
ポインタが使われている文は、その関数やブロックの処理内容の
全体あるいは周辺に対する関係がかなりわかっている
人にしか読めないと思ったほうが正解なのでは?
ディテールから入り最終的には全体を完璧に理解する
というボトムアップ方式で読んでいく対象としては全く
向かないと思う。「わかっている人にだけ読める文、あるいは
書いた本人しか読めない文」

879 :デフォルトの名無しさん:2009/11/16(月) 18:01:30
ということは Hello world も書いた本人にしか読めないわけか

880 :デフォルトの名無しさん:2009/11/16(月) 18:05:38
わかりかけのある時期は誤解していないか酷く悩むことも
あるだろうな。とりわけアブソリュートアセンブラを使う
機会が失われた世代以降は。

881 :デフォルトの名無しさん:2009/11/16(月) 22:45:53
http://pc12.2ch.net/test/read.cgi/tech/1051039126/
828 デフォルトの名無しさん [sage] 2009/11/16(月) 10:47:37 ID: Be:
>>826
>本来の「ハッキング」はム板では推奨される行為なので
使用許諾約款等、リバースエンジニアリングが禁止されている状況くらい
想像できないもんかね…

882 :デフォルトの名無しさん:2009/11/16(月) 23:29:11
いやー俺は推奨した憶えはないね
どこの馬の骨とも知らん奴にあーしろこーしろと干渉する気はないんで

電子土方が自分の仕事をどう思っているかなんて人それぞれだし
いかにも学生風な発言を見ててもご覧のとおり

883 :デフォルトの名無しさん:2009/11/16(月) 23:38:32
誤爆?

884 :デフォルトの名無しさん:2009/11/17(火) 00:27:39
if(
i == KEY_INPUT_LEFT || i == KEY_INPUT_RIGHT ||
i == KEY_INPUT_UP || i == KEY_INPUT_DOWN ||
i == KEY_INPUT_NUMPAD1 || i == KEY_INPUT_NUMPAD2 || i == KEY_INPUT_NUMPAD3 || 
i == KEY_INPUT_NUMPAD4 || i == KEY_INPUT_NUMPAD5 || i == KEY_INPUT_NUMPAD6 ||
i == KEY_INPUT_NUMPAD7 || i == KEY_INPUT_NUMPAD8 || i == KEY_INPUT_NUMPAD9
)
break;

こういうのもっときれいに書く方法はないもんでしょうか?
ちなみにこのマクロはビットマスクではないです


885 :デフォルトの名無しさん:2009/11/17(火) 00:28:36
配列に入れてループ

886 :デフォルトの名無しさん:2009/11/17(火) 00:30:58
switch-caseでもいいだろうけど、出力されるコードは似た感じじゃない?

887 :デフォルトの名無しさん:2009/11/17(火) 01:48:39
スタティックであるスレッドを作ったのですがその中のセンサー値(1or2)を
スタッティック外部でも扱わなくてはならなくなりました.
方法として,スタティック内でセンサー値が1の時Senser1.txt
センサー値が2のときSenser2.txt もしくは Senser.txtがあるとき1ないとき2のように
決めて外部でそのファイルがあるか無いかで判別しようと考えました.

とても,不細工なことをやっていると自覚しています.
何かよい方法をご存じありませんでしょうか?

888 :デフォルトの名無しさん:2009/11/17(火) 01:55:27
>>887
ファイルの有無で調べる程度なら
グローバル変数 と volatile 修飾でおk

889 :デフォルトの名無しさん:2009/11/17(火) 01:56:26
>>1 ・開発環境や動作環境も晒すと答えが早いかもしれません。

環境にあったスレに行って貰うほうがいいけどな

890 :デフォルトの名無しさん:2009/11/17(火) 04:00:27
>>884
判定をinline関数(orマクロ化)しちゃうかな。
方向キー・テンキー・ファンクションキーみたいな区切りで。

// Arrowキー or 0以外のNumキー
if(isArrowKey(i) || (i!=KEY_INPUT_NUMPAD0 && isNumKey(i))){
}


KEY_INPUT_NUMPAD1〜KEY_INPUT_NUMPAD9が連番であることが保障されているなら、
(i>=KEY_INPUT_NUMPAD1 && i<=KEY_INPUT_NUMPAD9)
としても不可じゃないかな?
俺はやらんが。

891 :デフォルトの名無しさん:2009/11/17(火) 09:43:03
メモリの使われ方を学ぶ為にc言語の学習を始めたのですが
再帰処理をした場合はスタックに大量の変数をつくるので
メモリを食う+速度が遅くなる+スタックオーバーフローの可能性とデメリットが多いように思うのですが
メリットは数式を単純化することで長々とコードを書かなくても良いくらいですか?
また上記の問題を解決するのに末尾再帰というのがあるようですが普通にforやwhileでループさせる以上に
メリットがあるものなのでしょうか?

892 :デフォルトの名無しさん:2009/11/17(火) 09:46:10
>速度が遅くなる
ループと再帰を比べたらって言う話?

893 :891:2009/11/17(火) 09:50:00
>>892
そう理解しているのですが違いますか?

894 :デフォルトの名無しさん:2009/11/17(火) 09:54:48
事故再起はループと同じなんじゃなかったっけ

895 :デフォルトの名無しさん:2009/11/17(火) 09:57:03
> また上記の問題を解決するのに末尾再帰というのがあるようですが普通にforやwhileでループさせる以上に
> メリットがあるものなのでしょうか?

末尾再帰は処理系によっては最適化でループにしてくれる
そうするとコードが見やすいというのはメリットだと思う

896 :デフォルトの名無しさん:2009/11/17(火) 10:18:56
>>891
簡単にループに直せるような再帰ならループで書けばいいし
クイックソートだってgoto文を使って再帰なしに書くのもそう難しくはないが
ループ終了条件が面倒だったりするとどうか
あまり再帰の例を知らないのだと思うが、もっと調べてみればメリット・デメリットについては納得がいくと思う

897 :891:2009/11/17(火) 10:20:35
>>894>>895
ありがとうございます
オブジェクトコードを吐くときに処理系によっては最適化してくれるのですね
見やすいコードで書けるということが自体がメリットということで納得できました

898 :デフォルトの名無しさん:2009/11/17(火) 10:37:31
再帰は教育で使うのは良いが、実践で使うな。
保存しなくていい情報まで記録する可能性、動作遅い可能性
いいことなし。

899 :891:2009/11/17(火) 10:37:47
>>896
ありがとうございます
おっしゃるようにもっと調べてみてメリット・デメリットのバランスを把握しようと思います

900 :デフォルトの名無しさん:2009/11/17(火) 10:46:20
よしよし、よく >>898 をスルーした
それでいい

901 :デフォルトの名無しさん:2009/11/17(火) 11:03:01
再帰なんて普通に使ってるが・・・


902 :デフォルトの名無しさん:2009/11/17(火) 11:04:33
コードが短くなる可能性があるから実行時コストも配慮しつつ一応は視野に入れるべき

903 :デフォルトの名無しさん:2009/11/17(火) 11:39:46
クリティカルにパフォーマンスに影響しない限りは、
可読性を優先した方が良いからな。
資源をケチるのは、本当にケチる必要のある時だけでいい。

904 :デフォルトの名無しさん:2009/11/17(火) 12:05:00
>>891
>また上記の問題を解決するのに末尾再帰というのがあるようですが
いや…
「処理が末尾再帰の形になっていたら、途中経過を保存するローカル変数は
 それ以降使わないということなので、その処理はループに書き換え可能」
ではあるが。

905 :デフォルトの名無しさん:2009/11/17(火) 12:13:31
コードをいかに短くできるかということは大事だ
保守、バグ減らしに効果的
可読性の減る改行へら氏などはのぞく。

906 :デフォルトの名無しさん:2009/11/17(火) 12:30:04
ループで間単にできるんなら再帰は使う必要はない。

907 :デフォルトの名無しさん:2009/11/17(火) 12:31:26
そりゃそうだ。その逆もあるしな

908 :デフォルトの名無しさん:2009/11/17(火) 12:32:14
使う必要は無いが、最適化で一緒になるなら使っても別に問題はない。

909 :デフォルトの名無しさん:2009/11/17(火) 12:47:18
最適化に期待するのはどうもねえ

910 :デフォルトの名無しさん:2009/11/17(火) 12:55:03
最近の話題でvector<string>とvector<string*>のsortがあった。
前者は最適化されて後者と速度は変わらないといってたやつがいたが
実測すると大きな違い。

911 :デフォルトの名無しさん:2009/11/17(火) 12:55:41
スレ違い

912 :デフォルトの名無しさん:2009/11/17(火) 12:56:40
STLのswapが特殊化されているため、ポインタと付け替えと同じ事が実体に対しても可能だという説。

913 :デフォルトの名無しさん:2009/11/17(火) 13:08:05
「特殊化されてないんだ」って感想書きこんだだけなのに
勝手に発言を最適化しないで欲しい

914 :デフォルトの名無しさん:2009/11/17(火) 13:29:01
最適化を信頼するのは良くないって事だ。
せいぜい、無駄な計算や同一計算の除去くらいに思っておくといい。

915 :デフォルトの名無しさん:2009/11/17(火) 13:43:43
最適化を期待するのは悪いことじゃないが
頭の悪いコード書いといて言い訳に最適化を言う奴が許せんのよ
それと最適化と言える範囲を微妙に勘違いしてる奴とは話がかみ合わなかったりね

916 :デフォルトの名無しさん:2009/11/17(火) 15:19:33
templateで、メタで再帰させるなら話は別

917 :デフォルトの名無しさん:2009/11/17(火) 16:30:19
C言語でtemplateとかSTLとかってどうやんの?

918 :デフォルトの名無しさん:2009/11/17(火) 16:38:45
はっきり「スレ違い」つっても理解できない奴に
そんな迂遠な揶揄が通じるとも思えませんが。

919 :デフォルトの名無しさん:2009/11/17(火) 16:42:20
だからスレチだと何度いえば
まぁ、俺様プリプロセッサを通せばできそうだけどな

920 :デフォルトの名無しさん:2009/11/17(火) 16:59:19
STLは昔すべてマクロで書かれており、それをインテリジェント
化して構文に取り入れたのがC++
ってか、太古のC++は実質的にマクロ記述に過ぎず、C++記述を
Cのコードに変換してCとしてコンパイルしたものだとか。
その面影はMac-OS-Xの中心的開発言語 Objective-Cにも残ってる。
OCはオブジェクト指向の拡張部分を使わなければ完全にC互換だし
なぜC/C++とスレを分けるのか少々疑問

921 :デフォルトの名無しさん:2009/11/17(火) 17:03:44
Mac(笑

922 :デフォルトの名無しさん:2009/11/17(火) 17:03:57
CSTLは、C言語で使えるC++のSTLライクなコンテナライブラリです。vector, deque, list, set, multiset, map, multimap, stringを提供します。

http://sourceforge.jp/projects/cstl/releases/

923 :デフォルトの名無しさん:2009/11/17(火) 17:24:17
でっていう

924 :デフォルトの名無しさん:2009/11/17(火) 21:44:28
ディレクトリ(フォルダ) のツリーを手繰ってファイルを列挙しなきゃいけない時
とか それに類似した構造のデータの総なめとか そんなケースは再帰しちゃうな。

構文解析とかも再帰のほうが記述しやすいんだろうけど、
俺の中では出番がほとんど無いので実感なし

925 :デフォルトの名無しさん:2009/11/17(火) 21:48:58
再帰はコードの文字数が減るので、単純ミスの混入が少なくなるので
その意味では保存性は良いが、僅かな勘違いミスとかで破損すると
すぐに動かなくなるデリケートさも持つ。(だからと言って非再帰
は常にデリケートじゃないというのも嘘だが)
しかし問題は実は別のところにあるんじゃないかと

926 :デフォルトの名無しさん:2009/11/17(火) 23:45:17
コード書くときにコメントの有効範囲をしめすためだけにスコープ置いたりするんだけど変かな?

//〜〜する処理
{
・・・
・・・
・・・
}

見たいな感じで

927 :デフォルトの名無しさん:2009/11/18(水) 00:06:52
俺は見たこと無い。
もし見かけたら何の意図でそうしたのか悩むかもなぁ。
ただ改行入れるんじゃダメなん?

928 :デフォルトの名無しさん:2009/11/18(水) 00:22:11
ORが連続しオアーオアーオアオアオアーってなるときゲームの場合、関数呼び出しで対応することもある。
関数のポインタを用いてしまうのだ。

まあ普通はビットシフトだな
ゲームパッドの入力は割り込みコントローラのレジスタを参照すれば何が来たか分かるのだが
その数値を見てしまうとマイク・バイソンのスーパーコンボである。

だから特定数ビットシフトする。
パッドキー上を入力すると0xFF80が、パッドキー右を入力すると0xFF7Fが、とか規則性があるから
これを多桁ビットシフトしても数値は規則どおりに並ぶ。
で、この数値にそってテーブルを書いて参照すればよい。

929 :デフォルトの名無しさん:2009/11/18(水) 00:23:48
CUIのままで自身のHWNDを得るには?

930 :デフォルトの名無しさん:2009/11/18(水) 00:53:44
>>929
NULLを受け付けてくれるかどうか調べる。
だめだったら、非表示のダミーのウィンドウを作ったりGetConsoleWindow関数を使ったりする。

931 :デフォルトの名無しさん:2009/11/18(水) 01:16:11
>自身のHWND
そんなもの無いだろ。
CUIアプリはウィンドウを持たない。
ウィンドウのオーナーはそのCUIアプリじゃなくて
conagent か何か、あくまで他のプログラムだろ。


932 :デフォルトの名無しさん:2009/11/18(水) 05:39:13
スレチ

933 :デフォルトの名無しさん:2009/11/18(水) 08:54:09
signalで呼び出した関数に引数を渡すにはどうすればいいの?

934 :デフォルトの名無しさん:2009/11/18(水) 13:10:59
グローバル変数でいいのでは
どうせsignalはグローバルなものだし

935 :デフォルトの名無しさん:2009/11/18(水) 13:22:32
せめてstaticにしておこう。

936 :デフォルトの名無しさん:2009/11/18(水) 14:21:37
http://codepad.org/Swssnokq

これはたまたま動いてるの?
それとも正しいコードなの?


937 :デフォルトの名無しさん:2009/11/18(水) 14:35:00
このスレのレベルでは、問題ない。
厳密な解釈で言うなら、sizeof(long) == sizeof(int)でsizeof(long) == sizeof(float)なら問題ない。
尚、sizeof(int) != sizeof(long)の場合はメモリ確保ではなく出力が問題。

938 :デフォルトの名無しさん:2009/11/18(水) 14:37:12
>>936
たまたま。
CPUのアーキテクチャによっては、alignmentがあわなくてバスエラーを起こす可能性がある。
struct foo { int i[2]; long l[3]; float f[2] } x;
について &x.f[0] と &x.i[0] の差が sizeof(int)*2+sizeof(long)*3バイトであるとは限らないのと同じ。


939 :デフォルトの名無しさん:2009/11/18(水) 14:51:29
d。ふーむ
じゃあメモリをいっぺんに確保して細かく振り分けていく方法は場合によっては危険なわけか


940 :デフォルトの名無しさん:2009/11/18(水) 14:54:45
そんな方法を思いつくのが

941 :デフォルトの名無しさん:2009/11/18(水) 15:05:53
>>939
それ、初心者にはお勧めできない。
>937の2行目のようなミスを犯すような奴にもお勧めできない。

942 :デフォルトの名無しさん:2009/11/18(水) 15:21:44
ある型のポインタにキャストできることと、それが指す変数に
アクセスできることは同じではない
その変数に

943 :デフォルトの名無しさん:2009/11/18(水) 15:31:21
しかし出来てしまう処理系が殆ど

944 :デフォルトの名無しさん:2009/11/18(水) 15:37:32
>>941
変数を構造体に押し込んで外枠をallocする方法が定石?

945 :デフォルトの名無しさん:2009/11/18(水) 15:45:48
allocせんといかんのか?

946 :デフォルトの名無しさん:2009/11/18(水) 15:46:04
やけに気の利くmallocな話だな

947 :デフォルトの名無しさん:2009/11/18(水) 15:58:42
石の中にいる!

948 :デフォルトの名無しさん:2009/11/18(水) 16:15:06
>>944
寧ろ初心者は自前で管理するべきでない。

949 :デフォルトの名無しさん:2009/11/18(水) 16:21:04
>>946
構造体が 環境依存によるバスエラーの回避としてメンバ配置に気を利かしてくれている ので
malloc は言われた大きさの連続した領域をかえしてあげるだけ

(だが、その戻すポインタが、いきなり上記のバスエラーを起こす値だったりすると都合が悪いので
ポインタ値が sizeof(int) や sizeof(long) 境界になるように実装していることもある)

950 :デフォルトの名無しさん:2009/11/18(水) 16:27:47
>>937
無知は黙ってろ

951 :デフォルトの名無しさん:2009/11/18(水) 19:45:31
> 環境依存によるバスエラー

環境依存によらないバスエラーってあるのか

952 :デフォルトの名無しさん:2009/11/18(水) 19:49:38
バスエラーにならないマイコンがある

953 :デフォルトの名無しさん:2009/11/18(水) 21:36:54
>>926
やるやる。
同じような用途の変数を複数使うときに、名前をそれぞれつけなくていいから便利。


954 :デフォルトの名無しさん:2009/11/18(水) 22:39:26
>>950
阿呆は黙って露。

って返すだけではなんなんで、まともな人に質問。
>937の2行目の条件を満たさない、初心者レベルで扱うような環境は何かある?

955 :デフォルトの名無しさん:2009/11/18(水) 22:42:33
>>954
少し前は無料でコンパクトなコンパイラとして lsi-c86 試食版が使われることが結構あった

956 :デフォルトの名無しさん:2009/11/18(水) 22:48:12
>>955
LSIC-86は、ディフォルトでは何らパディングをしなかったのでは?
そもそもx86は(ペナルティがあるかは兎も角)バスエラーは起こさないわけで。

957 :デフォルトの名無しさん:2009/11/18(水) 22:55:34
Win32環境で16bitDOSアプリを動かす場合、アクセス違反メッセージ
を出して落とすのはWin32のほうで、これは古いDOSアプリが不正な
(想定外な8086流儀に反する)アクセスをしている場合大抵怪しいアプリだったので、動作させて欲しく無いという願いが込められている
のではないかと

958 :デフォルトの名無しさん:2009/11/18(水) 23:22:15
↑あほ

959 :デフォルトの名無しさん:2009/11/18(水) 23:26:09
>>957
Win16 on Win32はDOSアプリのすべてをエミュしてるわけじゃ
なく例えば旧AT互換機のBIOS領域直接アクセスとかは不正アクセス
として落としていたような記憶が...

960 :デフォルトの名無しさん:2009/11/19(木) 07:18:19
ポインタって実態は
「ちょっと機能が変わってるINT型」
なんだな。
そのINT型の数値を利用してメモリの論理アドレスを操作できるというかそんな感じだな。

961 :デフォルトの名無しさん:2009/11/19(木) 07:48:31
次スレ用テンプレ。誰かお願いします

C言語の*入門者*向け解説スレッドです。
初心者、初級者の方は他の質問スレのほうが良いかもしれません。
【初心者歓迎】C/C++室 Ver.69【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1256022655/

教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 132代目
http://pc12.2ch.net/test/read.cgi/tech/1258158172/

・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 55
http://pc12.2ch.net/test/read.cgi/tech/1256818218/

過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000

962 :デフォルトの名無しさん:2009/11/19(木) 07:59:38
まだ早くね?
980ぐらいでいいだろ

963 :デフォルトの名無しさん:2009/11/19(木) 12:59:35
なんか、このスレ自体、存在意義が終わってね?

> C言語の*入門者*向け解説スレッドです。
> 初心者、初級者の方は他の質問スレのほうが良いかもしれません。

だぜ

964 :デフォルトの名無しさん:2009/11/19(木) 15:41:46
>・C++言語はスレ違いです。
C++言語はなぜか余り使われていないので答えるスキルを
用意してません。
だろw

965 :デフォルトの名無しさん:2009/11/19(木) 16:05:06
C言語で、引数 char *bufを書き換えるにはどうするんですか。
f( char* &buf)
だと出来ますけど

966 :デフォルトの名無しさん:2009/11/19(木) 16:07:34
DLLなどで、char *buf; int size;

f(buf, &size);で値を受け取る場合があると思うのですが。

これは参照使うんですか。

C言語のDLLで参照は使えるんですか。

967 :デフォルトの名無しさん:2009/11/19(木) 16:10:29
参照を使ったDLLの関数は、純粋なCコンパイラで動作するのかが知りたいです。

968 :デフォルトの名無しさん:2009/11/19(木) 16:25:12
調べたところDLLにすると、
ポインタ値渡しが、ポインタ参照渡しに自動で変換されるようですね。
確実かはわからないのですが。

969 :デフォルトの名無しさん:2009/11/19(木) 16:28:30
>>965
戻り値を使え。
char *buf;
buf = f(buf);

970 :デフォルトの名無しさん:2009/11/19(木) 16:31:12
何でもかんでも参照渡しばっかりで
戻り値を単なる成否チェックにしか使ってないの見るとイラっとくるよな。



971 :デフォルトの名無しさん:2009/11/19(木) 16:37:33
DLLでやってた方法は、
char *in , *out;
int insz, outsz;
f(in , insz, out, outsz);という値渡しでした。 だから>>968は間違えました。
>>969
その方法でサイズを取得したい場合は構造体にすればいいと思いますが
C言語から参照を使ったDLLは使えないんですか。
これがしりたいです。

972 :デフォルトの名無しさん:2009/11/19(木) 16:40:09
安全の為には、構造体の戻り値にすればいいのですが、
異なる戻り値の関数毎に構造体を定義しないといけないのが不便なのですが。

973 :デフォルトの名無しさん:2009/11/19(木) 16:43:40
もうちょっとまとめて書けよ。
どれとどれが同じ人の書き込みなんだ?

974 :デフォルトの名無しさん:2009/11/19(木) 16:48:06
>>970
C に参照なんざないのに、その辺の用語も怪しいのが
質問乱発してるのはもっとイラっとする。

975 :デフォルトの名無しさん:2009/11/19(木) 16:54:05
mov ax,1000
mov bx,[ax]

これがポインタや参照の正体だろ

976 :デフォルトの名無しさん:2009/11/19(木) 16:54:43
>>974
参照を使ったC++で作ったDLLはC言語で動作するのかしりたいんです。

977 :デフォルトの名無しさん:2009/11/19(木) 16:55:12
以下の○に0個以上2個以下の文字を入れてちょ

○○渡し:その変数の複製を参考資料の形で渡すこと。変数を
呼び出し先が変更しても、呼び出し元の変数には影響が出ない。
○渡し:その変数の価値、すなわちその変数そのものを呼び出し先に
変更することを許可する形式で渡すこと

978 :デフォルトの名無しさん:2009/11/19(木) 16:55:40
>>976
めんどくさいから、動作しないことにしておけ。

979 :デフォルトの名無しさん:2009/11/19(木) 17:01:04
>>976
大抵は動くだろうが、何の保証もない以上
やってみろ、としか言えない。

980 :デフォルトの名無しさん:2009/11/19(木) 17:01:12
出来ないなら、コンパイル時にエラーになるんじゃ

981 :デフォルトの名無しさん:2009/11/19(木) 17:04:17
他言語との互換性でいちいちエラーにされてたら通るコードも通らんわ

982 :デフォルトの名無しさん:2009/11/19(木) 17:04:44
通常のC/C++環境には無いWindows特有の引数評価順序指示
C++の特徴の重複名称の改竄
この難所?をクリアすればC++でもDLLファイルは作れる。
がこれは完全にWinAPIスレの話題じゃないかと

983 :デフォルトの名無しさん:2009/11/19(木) 17:05:21
>>975
型のサイズに対してよきにはからってくれる機構の部分が…

ある場合では
mov bl,[ax]

別の場合では
mov bx,[ax]
mov cx,[ax+2]

984 :デフォルトの名無しさん:2009/11/19(木) 17:09:20
>>977
逆じゃね?

985 :デフォルトの名無しさん:2009/11/19(木) 17:15:20
>>980
DLL のエントリが実際にどういう引数をとるかなど
コンパイラの知ったこっちゃない。
プロトタイプに「ポインタである」と書かれていれば、その通りに呼び出す。

986 :デフォルトの名無しさん:2009/11/19(木) 17:19:02
>>984
造語ってみた 複製渡し 即渡し

即値じゃ リテラルしか取らない意味になっちゃうからなぁ…

987 :デフォルトの名無しさん:2009/11/19(木) 17:19:17
void func(int& param)

988 :デフォルトの名無しさん:2009/11/19(木) 17:50:39
混乱するんで次の言い方を推奨(但し自己責任で使用)

参照値複製渡し==>参照値をつまり複製を渡す
変数内部名称渡し==>変数そのものを渡す
Cは基本的に参照値複製渡し
C++で変数内部名称渡しが解禁された。

989 :デフォルトの名無しさん:2009/11/19(木) 17:52:49
lccというcコンパイラで実験してみたところ
参照渡しは出来なかった。

>>985
参照渡しなのにヘッダは値渡しで書いたら無理でした。
でもLCCが参照に対応してて&をいれたら動作したけど。
参照非対応、参照対応のどちらのコンパイラでも動作させるのは無理かも。

990 :デフォルトの名無しさん:2009/11/19(木) 17:57:07
>>989
Cでも記号&は変数に対するアドレス値変換演算子として定義されているお
C++での参照変数型であることを宣言する型接尾修飾子&とは
違うんで混同しないやうに

991 :デフォルトの名無しさん:2009/11/19(木) 17:57:54
プロトタイプ宣言せんでDLLの関数呼び出したりするのか

992 :デフォルトの名無しさん:2009/11/19(木) 18:04:05
>>991
スレ違いになるので詳細は説明せんが
もろにそういうのがある

993 :989:2009/11/19(木) 18:05:41
これだとLCC C++非対応コンパイラで動作するけど、参照削ると動かん 
だから>>985の説は間違えてる。

//main.cpp
#include <windows.h>
extern "C" int WINAPI add(int &x,int &y){
int z;
z=x;x=y;y=z;
z=x+y;
return z; }

//main.def
LIBRARY DLL
EXPORTS
add

//test.c
#include<stdio.h>
#include<windows.h>
typedef int (WINAPI *fnc)(int&, int&);
main(){
HINSTANCE hd = LoadLibrary("dll.DLL");
fnc add = (fnc)GetProcAddress(hd,"add");
int a,b;
a=5; b=4;
printf("a+b=%d a=%d b=%d\n", add(a,b), a, b);
getchar(); }

994 :デフォルトの名無しさん:2009/11/19(木) 18:07:52
どのCコンパイラでも、fnc(int&);というのは通るんですか?

995 :デフォルトの名無しさん:2009/11/19(木) 18:09:56
>>993
>typedef int (WINAPI *fnc)(int&, int&);
だからこれ参照渡しだっつの阿呆。

996 :デフォルトの名無しさん:2009/11/19(木) 18:12:50
利用側 typedef int (WINAPI *fnc)(int*, int*); で宣言
add(&a, &b); で実際に呼び出す

これ以外の文法は Cの範疇外じゃないの?

997 :デフォルトの名無しさん:2009/11/19(木) 18:23:34
>>993 何、その独自変態拡張?

998 :デフォルトの名無しさん:2009/11/19(木) 18:28:49
C++において記号&は2通りの意味で使われる。一つはCと互換。
もう一つはC++独自の拡張(ただし、ある程度は混同できる)
Cでは一通りの意味しかない。

999 :999:2009/11/19(木) 18:32:15
999

1000 :デフォルトの名無しさん:2009/11/19(木) 18:39:56
1000です

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

209 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)