C言語なら俺に聞け(入門篇) Part 32
レス数が1000を超えています。これ以上書き込みはできません。
0001処理系定義の名無しさん
2008/07/09(水) 11:00:48教えて欲しいのではなく宿題を丸投げしたいだけなら宿題スレへ行ってください。
C/C++の宿題を片付けます 110代目
http://pc11.2ch.net/test/read.cgi/tech/1213796455/
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 31
http://pc11.2ch.net/test/read.cgi/tech/1214569903/
過去スレ
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
0002処理系定義の名無しさん
2008/07/09(水) 11:01:36Part 2 ttp://pc8.2ch.net/test/read.cgi/tech/1153818463/
Part 3 ttp://pc8.2ch.net/test/read.cgi/tech/1160682950/
Part 4 ttp://pc8.2ch.net/test/read.cgi/tech/1162999861/
Part 5 ttp://pc8.2ch.net/test/read.cgi/tech/1165022193/
Part 6 ttp://pc10.2ch.net/test/read.cgi/tech/1167325490/
Part 7 ttp://pc10.2ch.net/test/read.cgi/tech/1170064980/
Part 8 ttp://pc11.2ch.net/test/read.cgi/tech/1171946674/
Part 9 ttp://pc11.2ch.net/test/read.cgi/tech/1173284217/
Part 10 ttp://pc11.2ch.net/test/read.cgi/tech/1174290325/
Part 11 ttp://pc11.2ch.net/test/read.cgi/tech/1176800483/
Part 12 ttp://pc11.2ch.net/test/read.cgi/tech/1178620766/
Part 13 ttp://pc11.2ch.net/test/read.cgi/tech/1179301993/
Part 14 ttp://pc11.2ch.net/test/read.cgi/tech/1181735298/
Part 15 ttp://pc11.2ch.net/test/read.cgi/tech/1182719692/
0003処理系定義の名無しさん
2008/07/09(水) 11:02:07Part 17 ttp://pc11.2ch.net/test/read.cgi/tech/1185286631/
Part 18 ttp://pc11.2ch.net/test/read.cgi/tech/1187213990/
Part 19 ttp://pc11.2ch.net/test/read.cgi/tech/1190342593/
Part 20 ttp://pc11.2ch.net/test/read.cgi/tech/1192455273/
Part 21 ttp://pc11.2ch.net/test/read.cgi/tech/1194384258/
Part 22 ttp://pc11.2ch.net/test/read.cgi/tech/1196489491/
Part 23 ttp://pc11.2ch.net/test/read.cgi/tech/1198295362/
Part 24 ttp://pc11.2ch.net/test/read.cgi/tech/1201083176/
Part 25 ttp://pc11.2ch.net/test/read.cgi/tech/1203343907/
Part 26 ttp://pc11.2ch.net/test/read.cgi/tech/1206196600/
Part 27 ttp://pc11.2ch.net/test/read.cgi/tech/1209429897/
Part 28 ttp://pc11.2ch.net/test/read.cgi/tech/1211198816/
Part 29 ttp://pc11.2ch.net/test/read.cgi/tech/1212329099/
Part 30 ttp://pc11.2ch.net/test/read.cgi/tech/1213367888/
Part 31 ttp://pc11.2ch.net/test/read.cgi/tech/1214569903/
0004全スレ 924
2008/07/09(水) 13:27:58ソースをアップしました。
0005デフォルトの名無しさん
2008/07/09(水) 13:28:530006デフォルトの名無しさん
2008/07/09(水) 13:34:09{
unsigned short HOGE_COUNT;
char Reserve[14];
char data[2];
} HOGE_HED;
HOGE_HED* fpHOGE;
HOGEHOGE* fpHOGEDATA;
fpHOGEDATA = (HOGEHOGE *)fpHOGE->data;
ざけんな
0007デフォルトの名無しさん
2008/07/09(水) 13:35:580008デフォルトの名無しさん
2008/07/09(水) 13:37:330009デフォルトの名無しさん
2008/07/09(水) 13:39:450010デフォルトの名無しさん
2008/07/09(水) 13:41:47たぶん、それは可変長の文字列を扱うための、
あまり行儀がよくないがよく使われている方法だろう
まあここだけじゃなさそうだから少し待て
0011デフォルトの名無しさん
2008/07/09(水) 13:43:02{
free(wfp);
return;
}
これはねーよ・・・
0013デフォルトの名無しさん
2008/07/09(水) 13:47:33一応手前の確保は sizeof(HOGEHOGE) * ret 増加分は見込んでるのか
しかし -2 ってマジックワードは何よ?
あと malloc() の戻りでないアドレスに対する free() は保証外じゃなかったっけ?
そこらへんの落とし穴は大丈夫なのか?
0014デフォルトの名無しさん
2008/07/09(水) 13:49:42wfp = fpEntTy[i];
case -2 :
if (wfp->prevdata == NULL) {
wfp2 = fpEntTy[i];
}
free(wfp);
wfp = wfp2;
if ( wfp != NULL ) wfp = (HOGEHOGE *)wfp->nextdata;
この流れがあやしい
wfpとwfp2は同じもの(fpEntTy[i])を指してるよな?
wfpはfreeしてしまったんだから、同じ場所を指してるwfp2も触ってはだめなんじゃないか?
0015デフォルトの名無しさん
2008/07/09(水) 13:49:50>そこらへんの落とし穴は大丈夫なのか?
今それが一番くさいです。
なのでリストから切り離したあとfreeする部分をコメントにしたらフリーズしませんので
0016デフォルトの名無しさん
2008/07/09(水) 13:50:030017デフォルトの名無しさん
2008/07/09(水) 13:54:260018デフォルトの名無しさん
2008/07/09(水) 13:59:14printf("%s が見つかりません\n",fname);
}
読み込むファイル名の入力処理なんですが、VSだと古い形式と警告されます。
より安全にするにはどう書いたらいいんですか?
0019デフォルトの名無しさん
2008/07/09(水) 14:00:03ChkIndex() はリストの元となるデータnコのうち現在どこまで処理したかを返すだけです。
呼ばれると数字を返したあと内部で持ってるカウンターをインクリメントします。
0020デフォルトの名無しさん
2008/07/09(水) 14:02:29んでとりあえず
if (wfp->prevdata == NULL) {
wfp2 = fpEntTy[i];
} else {
wfp2 = wfp->prevdata;
}
HogeDel(i,wfp);
wfp = wfp2;
break;
これは
HogeDel(i,wfp);
wfp = fpEntTy[i];
break;
の間違いじゃないのか?
その下も同様に
HogeDel(i,wfp);
//free(wfp);
wfp = fpEntTy[i];
break;
0021デフォルトの名無しさん
2008/07/09(水) 14:04:52有志ガンガレ
0022924
2008/07/09(水) 14:05:09やってることはリストをたどりながら処理をし(ChkSwitch)不要になった
ら戻り値によって途中で削除ということなので
wfpがリストの中ほどなのかリストの一番先頭なのか
を判断してます。
0023デフォルトの名無しさん
2008/07/09(水) 14:05:37int index = ChkIndex(); -(1)
if (index < fpHOGE->HOGE_COUNT) {
...
wfp = (HOGEHOGE *)(fpHOGEDATA + ChkIndex()); -(2)
(1) の戻りが HOGE_COUNT-1 の場合
fpHOGEDATA は 0〜HOGE_COUNT-1 の HOGE_COUNT個確保しているにもかかわらず
(2) で HOGE_COUNT を返すことになり 確保外のアドレスを指示することになっている
0024デフォルトの名無しさん
2008/07/09(水) 14:08:34if(fopen_s(&fp, fname, "r")){
printf("%s が見つかりません\n",fname);
}
0025デフォルトの名無しさん
2008/07/09(水) 14:09:52どうも!
この辺の解説サイトありますか?
0026デフォルトの名無しさん
2008/07/09(水) 14:12:03http://msdn.microsoft.com/ja-jp/library/z5hh6ee9
0027デフォルトの名無しさん
2008/07/09(水) 14:12:14じゃあこうだろう
wfp2 = wfp->nextdata;
HogeDel(i,wfp);
if(ChkSwitch[wfp->Hoge06](i,wfp) == -2) {
free(wfp);
break;
}
wfp = wfp2;
002827
2008/07/09(水) 14:15:38まあとにかく、元のソースだとwfp2に入れてる値がおかしい
wfp2 = fpEntTy[i]; としても、その後HogeDel()で fpEntTy[i] が変化してもwfp2は変わんないだろ
0029デフォルトの名無しさん
2008/07/09(水) 14:17:07それだと常に削除の対象です・・・
ChkSwitchの戻り値が-1と-2は削除それ以外の場合、リストはそのままなんです。
0030デフォルトの名無しさん
2008/07/09(水) 14:18:28単品 malloc() を n回呼び出し+途中の追加も単品 malloc() のほうがマシじゃね?
0031デフォルトの名無しさん
2008/07/09(水) 14:21:29switch(ChkSwitch[wfp->Hoge06](i,wfp)) {
case -1:
wfp2 = wfp->nextdata;
HogeDel(i,wfp);
wfp = wfp2;
break;
case -2:
wfp2 = wfp->nextdata;
HogeDel(i,wfp);
free(wfp);
wfp = wfp2;
break;
default:
break;
}
0032デフォルトの名無しさん
2008/07/09(水) 14:23:590033デフォルトの名無しさん
2008/07/09(水) 14:25:34//
// 領域確保部分抜粋
//
int size = sizeof(HOGE_HED) + sizeof(HOGEHOGE) * ret;
fpHOGE = malloc(size);
if (fpHOGE == NULL ) return -18;
memset(fpHOGE,0x00,size);
fpHOGE->HOGE_COUNT = ret;
fpHOGEDATA = (HOGEHOGE *)(fpHOGE+1);
0034デフォルトの名無しさん
2008/07/09(水) 14:29:23>fpHOGEDATA = (HOGEHOGE *)(fpHOGE+1);
あーなるほど。こうすればいいんですね。
これでchar data[2];が不要になりますね。
0035924
2008/07/09(水) 14:35:13まー近い挙動のものにシューティングゲームなんかがありますけど
ゲームを構成する素材(背景や敵本体)は固定になりますが、自機や敵が吐き出す弾
は事前に・・というわけにはいきませんよね?
それでこういった2種類の領域の確保の仕方になってます。
>>31
ありがとうございます。
これでうまくいきました。
最近大改造してようやく今のスタイルにこぎつけたので混乱してました。
0036デフォルトの名無しさん
2008/07/09(水) 14:53:37は? 全て固定にしろと言っているのではなく、
全て動的にしといて たまたま固定分は先にやっちゃったね って構造のことを指しているのだが?
全て敵が吐き出す弾扱い。 背景や敵本体は初期化の時に1個1個追加してくだけじゃん
0037デフォルトの名無しさん
2008/07/09(水) 15:00:19あの変なポインタ操作みてるとヘッダ+データになったバイナリファイルをまとめて
読み込んだりしてるんでしょ?
>>31で動いたってことは領域の確保の問題じゃなく単にリスト操作の間違いだったんだし。
0038デフォルトの名無しさん
2008/07/09(水) 15:04:54リストをバイナリファイル保存するのは… テラオソロシス
ちゃんと繋ぎ替え作業しないといけないしね。
そこだけ違うコード書くってことは、そこで間違う可能性もあるわけだし…
>>31 の修正で動く
>>31 のせずに、構造体のメンバ入れ替えで挙動変化する
のは、どういう副作用かなぁ free後次の alloc する何か次第なんだろうけど…
0039デフォルトの名無しさん
2008/07/09(水) 15:21:54なので、全体の流れだけでもいいので教えてくれませんか?
以下、課題の内容です。
200x200ピクセルの画像の中に三角形、四角形、円、楕
円を用いて絵を作成しよう。その際、関数を用いて作成し
ましょう。
図形の作成、移動、回転などには関数を用いること。
効率よく関数を使って、絵を作成しましょう。
main関数は画像配列の確保と関数の呼び出しで作成する。
出力ファイル名(art.bmp)
0040デフォルトの名無しさん
2008/07/09(水) 15:23:17おそらくアロケート情報が入っていた領域先頭付近のメモリの書き換えが発生したんだろう
だからポインタを先頭に置いてたらおかしくなった
後ろに配置してたときはたまたま情報が壊れずに残ってたと
0041デフォルトの名無しさん
2008/07/09(水) 15:26:40別人28号、余談だが俺いま、双方向ツリーデータのべた書き保存してるよ。
元々はテキストで保存読込みしていたが、あまりにも遅いので、いろいろ考えた据え
メモリーイメージべた書きにした。もちろんアドレス変換つきで。
数十Mぐらいのデータ読込みに分かかってたのが一瞬で読み込めるようになった。
いや〜あまりの速さに、TPOを考慮しないプログラムもいいなと思った。(チラシの裏
0042デフォルトの名無しさん
2008/07/09(水) 15:29:420043デフォルトの名無しさん
2008/07/09(水) 15:30:301)各画像をビットマップ描画する関数を作る。
このとき、関数の引数で図形の基準座標や大きさ、角度などを指定できるようにする。
指定の方法はいろいろあるが、かなり引数が多くなることもある。
その場合には必要な変数を構造体に詰めこんでそのポインタを渡すと楽。
対象のビットマップは、引数で渡してもいいし、どうせ1個しか書かないなら、
グローバル変数で確保してもいいだろう。
2)mainで、1)で作った関数に適当に数値を与えて呼び出し、ビットマップに描画する。
3)作ったビットマップをファイルに書き出す(何かメソッドがあるはず)。
0044デフォルトの名無しさん
2008/07/09(水) 15:30:530045デフォルトの名無しさん
2008/07/09(水) 15:31:00なるほど。
ある意味先頭に持ってきたためにバグが発覚してよかったのかもなw
>>41
まあリストを保存するっていったって、保存ルールさえ決めちゃえば
問題ないしな。
0046デフォルトの名無しさん
2008/07/09(水) 15:32:28char hoge2[256];
処理
return *hoge2;
}
とする関数を定義しました。
main関数で
char test[256];
*test= func("文字列");
って書いたんですが、testにゴミしか入りません・・・
正しいやり方を教えてください
0047デフォルトの名無しさん
2008/07/09(水) 15:36:00char hoge2[256];
処理
return strcpy(test, hoge2);
}
main()
{
char test[256];
func(test, "文字列");
0048デフォルトの名無しさん
2008/07/09(水) 15:37:28}
char test[256];
func("文字列",test);
でfuncの中でtestに書き込みできるよ
004939
2008/07/09(水) 15:37:49ありがとうございます!
関数を作るってところが授業でもよくわかっていないのですが、どんな感じかソースを少し書いてみてくれませんか?
質問ばかりですいません。
0050デフォルトの名無しさん
2008/07/09(水) 15:40:370051デフォルトの名無しさん
2008/07/09(水) 15:50:52細かい部分は処理系の用意しているグラフィック機能の詳細による
たぶん実際にはC++なんだろうから、ビットマップオブジェクトクラスのメソッドを調べて使うこと
void square(BITMAP bitmap, POINT *points)
{
bitmap->pen->color=BLACK;
bitmap->pen->move(points[0].x, points[0].y);
bitmap->pen->line(points[1].x, points[1].y);
bitmap->pen->line(points[2].x, points[2].y);
bitmap->pen->line(points[3].x, points[3].y);
bitmap->pen->line(points[0].x, points[0].y);
}
あくまで感じ
0052デフォルトの名無しさん
2008/07/09(水) 16:02:200053デフォルトの名無しさん
2008/07/09(水) 16:08:050054デフォルトの名無しさん
2008/07/09(水) 16:09:20========================================
引っ越しました!
近くにお越しの際は、是非お立ち寄り下さい
========================================
C/C++の宿題を片付けます 112代目
http://pc11.2ch.net/test/read.cgi/tech/1215439445/260
0055デフォルトの名無しさん
2008/07/09(水) 16:10:400056デフォルトの名無しさん
2008/07/09(水) 16:11:460057デフォルトの名無しさん
2008/07/09(水) 16:19:51ちなみに文字列に規則性はないです。
0058デフォルトの名無しさん
2008/07/09(水) 16:19:52コンパイルできないといっているコードはコード片だったりしないのかな
0059デフォルトの名無しさん
2008/07/09(水) 16:20:520060デフォルトの名無しさん
2008/07/09(水) 16:21:36rand関数で適当にASCIIコードを進める
0061デフォルトの名無しさん
2008/07/09(水) 16:24:29本と同じ環境、同じコンパイラーならそのまま動く。
しかし、半年や1年で、OSもコンパイラーも仕様さえも変わってしまう時が有る。
一つの変化は数年だが、環境は多くのソフトで成り立つので。どれかがすぐに変わるのはザラ。
0062デフォルトの名無しさん
2008/07/09(水) 16:27:250063デフォルトの名無しさん
2008/07/09(水) 16:34:29自分で作ったけどいまいち信用できない(速度的に)
0064デフォルトの名無しさん
2008/07/09(水) 16:36:52cならそれこそマクロで皮だけ作ったら?
#define hogehoge(A,B,C,D) { API_hoge(A,B,C,D) };
0065デフォルトの名無しさん
2008/07/09(水) 16:37:41文字列置き換えって言われてもどう置き換えるの?
0066デフォルトの名無しさん
2008/07/09(水) 16:42:28文字のコードで配列を引く、これが単純。
0067デフォルトの名無しさん
2008/07/09(水) 16:59:29char *stra = "abcdefghijklmeo.....";
char *strb = "gCfEjBm.....";
で文字が一致したところで置き換える
0068デフォルトの名無しさん
2008/07/09(水) 17:48:01strb[data - 'a']
の何が不満なの?
0069デフォルトの名無しさん
2008/07/09(水) 17:58:07//szSrcの中からszKeyを探してszRepで置き換える
//置き換えた数を返す
int strrpl(char *szSrc, char *szKey, char *szRep) {
int nRepTime = 0;
size_t nSrcSize = strlen(szSrc);
size_t nKeySize = strlen(szKey);
size_t nRepSize = strlen(szRep);
char *szCpySrc = new char[nSrcSize + 1];
strcpy(szCpySrc, szSrc);
*szSrc = 0;
char *cp = szCpySrc;
char *_cp = szCpySrc;
while (cp = strstr(cp, szKey)) {
*cp = 0;
strcat(szSrc, _cp);
strcat(szSrc, szRep);
cp += nKeySize;
_cp = cp;
nRepTime++;
}
strcat(szSrc, _cp);
delete [] szCpySrc;
return nRepTime;
}
0070デフォルトの名無しさん
2008/07/09(水) 18:34:03文字コードが順番じゃなくても使える
ASCII限定でも問題ないんだろうけど
0071デフォルトの名無しさん
2008/07/09(水) 18:38:430072sage
2008/07/09(水) 21:06:35あつかましいかもしれないですが、どなたか教えてください…
�@「キーボードから10個の数値を入力して、10個の数値の最大値と最小値を表示するコードを
記述せよ」
�A「キーボードから数値を入力し、その数が素数か否かを判断するコードを記述せよ」
よろしくお願いします。
0073デフォルトの名無しさん
2008/07/09(水) 21:07:570074デフォルトの名無しさん
2008/07/09(水) 22:15:00構造体は理解できるのですが、なぜそれが繋がっていくのか(繋げれるのか)がどうにも・・・。
抽象的な質問ですみませんが、どなたかお願いします。
例となるようなソースなどもあると助かります。
0075デフォルトの名無しさん
2008/07/09(水) 22:16:41ポインターはわかります?
007674
2008/07/09(水) 22:21:33大まかには理解している、と思うんですが・・・。
intやcharなどの関数のメモリの先頭の場所で、
その関数を指すのと、その関数の場所を指すのは同じこと。
というくらいの理解なんですが・・・。
0077デフォルトの名無しさん
2008/07/09(水) 22:26:45構造体の中に自分自身と同じ構造体をさせるポインターを持たせてあって
それでつないでるのがリストです。
0078デフォルトの名無しさん
2008/07/09(水) 22:30:49「宝」と「次の宝箱の場所」が入ってるようなもんだ
0079デフォルトの名無しさん
2008/07/09(水) 22:31:44ここなんてどうかな?
0080デフォルトの名無しさん
2008/07/09(水) 22:44:29どう繋ぐかが分からず・・・。
>>78
その「次の宝の場所」は、どういう処理になっているのでしょうか?
その「次」が無数に増える場合、最初から指定しておくのは不可能だと思うんですが、
どうやってその「次の場所」を指定すれば良いのか分からないのです。
>>79
struct list {
char name[20];
struct list *next; /* 自己参照構造体 */
};
で、構造体のポインタ *nextを作成しているのは分かるんです。
でも、それがどういう働きをして「次の構造体」に行っているのかがよく分からず……。
0081デフォルトの名無しさん
2008/07/09(水) 22:51:14struct list {
char name[20];
struct list *next; /* 自己参照構造体 */
};
int main()
{
list *listptr;
listptr = (list *)malloc(sizeof(list);
listptr->next = (list *)malloc(sizeof(list);
listptr->next-next = NULL;
return 0;
}
0082デフォルトの名無しさん
2008/07/09(水) 22:52:05struct list {
char name[20];
struct list *next; /* 自己参照構造体 */
};
int main()
{
list *listptr;
listptr = (list *)malloc(sizeof(list);
listptr->next = (list *)malloc(sizeof(list);
listptr->next->next = NULL;
return 0;
}
0083デフォルトの名無しさん
2008/07/09(水) 22:53:07またまたミス。ヘッダとかは自分でいれてね。
struct list {
char name[20];
struct list *next; /* 自己参照構造体 */
};
int main()
{
list *listptr;
listptr = (list *)malloc(sizeof(list));
listptr->next = (list *)malloc(sizeof(list));
listptr->next->next = NULL;
return 0;
}
008474
2008/07/09(水) 23:05:58struct list {
char name[20];
struct list *next; /* 自己参照構造体 */
};
int main()
{
list *listptr;
listptr = (list *)malloc(sizeof(list));
/* mallocで確保したメモリの場所をlist型のlistptrに代入 */
listptr->next = (list *)malloc(sizeof(list));
/* listprtの中の*nextにmallocで確保したメモリの場所を代入 */
listptr->next->next = NULL;
/* listprtの中の*nextで指定されたlistptrの中の*nextにNULLを代入*/
return 0;
}
って理解でいいんでしょうか?
0085デフォルトの名無しさん
2008/07/09(水) 23:11:21です。
リストを管理するポインターは例のような単純なリストでも2つは欲しいですかねえ・・・
listptrはリストをつないで置くだけのポインタ。
リストの入り口ですかね。
で、リストの最後を判別するために最後の構造体のnextにはNULLを入れます。
これはリストの決まりごとみたいな感じですね。
0086デフォルトの名無しさん
2008/07/09(水) 23:14:22char name[20];
struct list *next; /* 自己参照構造体 */
};
int main()
{
list *listptr; //管理用
list *listwptr; //リストをたどる用
listptr = (list *)malloc(sizeof(list));
/* mallocで確保したメモリの場所をlist型のlistptrに代入 */
listptr->next = (list *)malloc(sizeof(list));
/* listprtの中の*nextにmallocで確保したメモリの場所を代入 */
listwptr = listptr->next;
listwptr->next = NULL;
/* listprtの中の*nextで指定されたlistptrの中の*nextにNULLを代入*/
return 0;
}
0087デフォルトの名無しさん
2008/07/09(水) 23:29:30Visual C++ 2008 Express EditionをDLし、プログラミングしてみたところ
なぜかコンパイルできません。なぜでしょう・・・?
----------------------------------------------------------
プログラム
'c:\work\sample_console1\Debug\sample_console1.exe'を開始
できません。
アクセスが拒否されました。
----------------------------------------------------------
OSはVistaで管理者権限で実行しています。
008874
2008/07/09(水) 23:44:41むむむ、分からないorz
listptr = (list *)malloc(sizeof(list));
/* mallocで確保したメモリの場所をlist型のlistptrに代入 */
でlist型の関数にメモリの場所を渡してますよね?
このとき、struct listのchar name[20];は(今は説明のため省いてある部分だと思うのですが)どういう扱いになるんでしょうか?
0089デフォルトの名無しさん
2008/07/09(水) 23:46:41一緒に確保されてる
構造体の定義が目次で、中身が本文で、本ごと手に入れるというか。
0090デフォルトの名無しさん
2008/07/09(水) 23:47:28とか
listptr->name[0]
とか
009174
2008/07/09(水) 23:59:05int main()
{
list *listptr; //管理用
list *listwptr; //リストをたどる用
listptr = (list *)malloc(sizeof(list));
/* mallocで確保したメモリの場所をlist型のlistptrに代入 */
scanf("%c",&listptr->name);
listptr->next = (list *)malloc(sizeof(list));
/* listprtの中の*nextにmallocで確保したメモリの場所を代入 */
listwptr = listptr->next;
listwptr->next = NULL;
/* listprtの中の*nextで指定されたlistptrの中の*nextにNULLを代入*/
return 0;
}
のような事をすれば、入力できると考えて大丈夫でしょうか?
0092デフォルトの名無しさん
2008/07/10(木) 00:01:24領域をオーバーしないように十分な注意を払える環境であればそれでも。
0093デフォルトの名無しさん
2008/07/10(木) 00:02:31scanf("%s",listptr->name);
だね
0094デフォルトの名無しさん
2008/07/10(木) 00:03:05そういう使い方をするならとりあえず入力の情報を受けるだけのでっかい器
を別に用意して文字数の確認なんかをした上でmemcpyとかで
入れてあげたほうが良いかもしれないですね。
0095デフォルトの名無しさん
2008/07/10(木) 00:07:39入力処理に自信がもてず、構造体に自信がもてない状態でリストに進むと、
何か問題があったときにどこが問題なのかが分からなくなるかもよ
009674
2008/07/10(木) 00:18:47構造体あたりから復習してみます。
ありがとうございました!
0097デフォルトの名無しさん
2008/07/10(木) 00:36:23と言う配列を以下のように操作したいのですがいまひとつ効率のよい方法が思いつきません。
1.hogeには0以上の整数がランダムで入っている
2.0は空きと考え、hogeを添字0から順に走査して1以上の数であれば添字の小さい順に詰める
(301200960890なら312968900000としたい)
出来る限り効率の良い方法はどのようになるのでしょうか?
0098デフォルトの名無しさん
2008/07/10(木) 00:41:06メモリ効率 or 時間効率?
0099デフォルトの名無しさん
2008/07/10(木) 00:41:520100デフォルトの名無しさん
2008/07/10(木) 00:44:59スレ汚し失礼しました
0101デフォルトの名無しさん
2008/07/10(木) 00:50:57for(;j<10000; j++) hoge[j] = 0;
0102デフォルトの名無しさん
2008/07/10(木) 00:54:320103デフォルトの名無しさん
2008/07/10(木) 01:25:10warota
0104デフォルトの名無しさん
2008/07/10(木) 01:46:440105デフォルトの名無しさん
2008/07/10(木) 01:51:450106デフォルトの名無しさん
2008/07/10(木) 05:54:590107デフォルトの名無しさん
2008/07/10(木) 10:42:45今はbccつこうとる
0108デフォルトの名無しさん
2008/07/10(木) 10:47:45あれってGUI版も作れるし、コンソールのもできるでしょ?
0109デフォルトの名無しさん
2008/07/10(木) 10:48:43統合開発環境を使うと関数のマニュアルやプロトタイプが簡単に見えたり
スペルチェックや変数名の補完もできたりするメリットはある
でも、現状それで何か不都合があるの?
0110デフォルトの名無しさん
2008/07/10(木) 11:48:04Windows用ならやっぱり開発元の作ったVisualC++がいいだろう
0111デフォルトの名無しさん
2008/07/10(木) 13:31:270112デフォルトの名無しさん
2008/07/10(木) 13:49:50• 出力はn = a^2 となるような正の整数a が
– 存在するときは上の式をみたすa の値.
– 存在しないときは“ No ”.
このプログラムの作り方を教えてください。お願いします。
0113デフォルトの名無しさん
2008/07/10(木) 14:00:57正の整数を変数nに入力し、
nの平方根を求めて変数aに代入し、
変数aが整数ならそれを出力し、
そうでないなら"No"を出力する。
ように作ればいいとおもうよ。
0114デフォルトの名無しさん
2008/07/10(木) 14:19:22ありがとうございます。
がんばってみます。
0115デフォルトの名無しさん
2008/07/10(木) 15:30:40elements.c内のstatic void XMLCALL startElement(void *userData, const XML_Char *name, const XML_Char **atts);
この関数の引数XML_Char **attsのHeap領域がどこの関数で確保されているのかが分かりません。
構造体をchar **にキャストして使用している、と予想して探しているのですが、
ご存知でしたらご教授下さい。お願いします。
0116デフォルトの名無しさん
2008/07/10(木) 17:03:35最初のポインターを配列に置き換えて考えてみたら?
0117デフォルトの名無しさん
2008/07/10(木) 17:06:230118デフォルトの名無しさん
2008/07/10(木) 17:10:160119デフォルトの名無しさん
2008/07/10(木) 17:10:22レスありがとうございます。
最初のポインタを配列に置き換えて考える、というのはどういう意味でしょうか?
0120デフォルトの名無しさん
2008/07/10(木) 17:12:280121デフォルトの名無しさん
2008/07/10(木) 17:14:02そう考えるとC++のことなんてほんとたいした問題ではない
0122デフォルトの名無しさん
2008/07/10(木) 17:14:09ええ!?クラスとかデフォルト引数とか死ぬほど便利なのに・・・
0123デフォルトの名無しさん
2008/07/10(木) 17:18:22XML_Char **attsは動的に複数個確保された構造体を指している、という事でしょうか?
0124デフォルトの名無しさん
2008/07/10(木) 17:21:480125デフォルトの名無しさん
2008/07/10(木) 17:22:04main関数でコマンドラインに渡されたパラーメータを解析するとかやったことないの?
0126デフォルトの名無しさん
2008/07/10(木) 17:29:16申し訳ありません、した事無いです。
0127デフォルトの名無しさん
2008/07/10(木) 17:34:28ポインタへのポインタってこと何だけど、これが分からないとなると...
0128デフォルトの名無しさん
2008/07/10(木) 17:41:29main引数のパラメーターの場合は二次元配列に使っている。と覚えています。
0129デフォルトの名無しさん
2008/07/10(木) 17:43:46そこまで分かってるのに
試しに、コマンドラインに渡されたパラメータを表示することとかやってみたら?
0130デフォルトの名無しさん
2008/07/10(木) 18:01:18#include <stdio.h>
#include <ctype.h>
int main(void)
{
char ch;
printf("Input > \n");
while( (ch=getchar()) != '\n' && ch != EOF ) {
ch=tolower(ch);
putchar(ch);
}
return 0;
}
でソースはわかったんですが、コンパイル後に
Input > だけ出てきて何をどうすればいいのかわかりません・・・
0131デフォルトの名無しさん
2008/07/10(木) 18:03:020132デフォルトの名無しさん
2008/07/10(木) 18:03:590133デフォルトの名無しさん
2008/07/10(木) 18:05:020134デフォルトの名無しさん
2008/07/10(木) 18:06:08のまえに getcher(); でもいれとけ
0135デフォルトの名無しさん
2008/07/10(木) 18:06:35出来上がったexeを実行して動かしました。
違ったんでしょうか?
0136デフォルトの名無しさん
2008/07/10(木) 18:07:120137デフォルトの名無しさん
2008/07/10(木) 18:07:38コマンドプロンプト開いてから実行すればよい
0138デフォルトの名無しさん
2008/07/10(木) 18:08:25でmain()から抜けるんだから、終了しない方がおかしい
0139デフォルトの名無しさん
2008/07/10(木) 18:13:36コマンドプロントから実行したらできました!
ありがとうございます!
0140デフォルトの名無しさん
2008/07/10(木) 18:13:50すみません。レスが大分遅くなりました。
帰ってからパラメーターの解析をしようと思います。
0141デフォルトの名無しさん
2008/07/10(木) 18:30:24Cのがちょっとだけ速い
0142デフォルトの名無しさん
2008/07/10(木) 18:33:200143デフォルトの名無しさん
2008/07/10(木) 18:33:34同じソースからコンパイルしたらほぼ同じものができると思うが。
0144デフォルトの名無しさん
2008/07/10(木) 18:34:40?に相当するものってありますか?
小数点第60位までを表示したいです。
0145デフォルトの名無しさん
2008/07/10(木) 18:35:180146デフォルトの名無しさん
2008/07/10(木) 18:36:080147デフォルトの名無しさん
2008/07/10(木) 18:37:240148デフォルトの名無しさん
2008/07/10(木) 18:39:56http://www.aoky.net/articles/steve_yegge/tour_de_babel.htm
一回は読んどいて損はない
0149デフォルトの名無しさん
2008/07/10(木) 18:44:22たとえば↓のようにやってもちゃんと文字が出力される
#include <stdio.h>
int main(){
char test[] = "いろはにほへと";
fprintf(stdout, test);
return 0;
}
0150デフォルトの名無しさん
2008/07/10(木) 18:46:04printf("%d\n", sizeof(test));
とやってみるといいよ
0151デフォルトの名無しさん
2008/07/10(木) 18:59:50おk、C++をドブ川に投げ捨ててきた
0152デフォルトの名無しさん
2008/07/10(木) 18:59:51SJISかな?
test[0] と test[1] の2つあわせて「い」だよ
0153デフォルトの名無しさん
2008/07/10(木) 19:03:35川から海へと流れ出し、蒸発し雲になり、それは雨となり、いつかあなたの家の蛇口から出てくるでしょう
0154デフォルトの名無しさん
2008/07/10(木) 19:07:50ここを解析していけばわかりますか?
0155デフォルトの名無しさん
2008/07/10(木) 19:09:180156デフォルトの名無しさん
2008/07/10(木) 19:14:220157デフォルトの名無しさん
2008/07/10(木) 19:17:20解析するなら、もっと簡単な奴にした方がいいのでは?
0158デフォルトの名無しさん
2008/07/10(木) 19:19:08レスありがとうございます。
例えばどのようなものがありますか?
0159デフォルトの名無しさん
2008/07/10(木) 19:29:24本屋にいって入門書を立ち読みするとか?
0160デフォルトの名無しさん
2008/07/10(木) 19:45:23elements.cを見ていて思ったのですが、
XML_ParserCreate
XML_SetUserData
XML_SetElementHandler
XML_Parse
XML_ParserFree
これらの関数はelements.c内で使われている関数ですが、
どのみちハンドラを呼び出すためには、上記五つの関数内でXML_Char **attsの部分を動的に確保する必要があると予測出来ます。
パラメーターから辿るのは今の私には無理があります。
XML_Char **attsを確保している部分の関数名を教えて頂きたいです。
0161デフォルトの名無しさん
2008/07/10(木) 19:49:12配列が理解できてるなら、ポインタも理解できると思うんだけど
基本に立ち返って、自力で**の動作確認できるプログラムを作る方がいいと思うけど
0162デフォルトの名無しさん
2008/07/10(木) 19:52:42どこでXML_Char **attsを確保する関数が呼び出されているのかが分からないのです。
0163デフォルトの名無しさん
2008/07/10(木) 19:55:11examples/elements.c の話してんの?
0164デフォルトの名無しさん
2008/07/10(木) 19:56:59XML_Char **attsをパラメータにしてる関数を検索すればいいのでは?
何が分からないのか俺には理解できない。
0165デフォルトの名無しさん
2008/07/10(木) 19:59:55そうです。
>>164
検索してもわからなかったのであなたに質問しています。
XML_Char **attsの部分を動的に確保している場所が分かりません。
0166デフォルトの名無しさん
2008/07/10(木) 20:00:45じゃ、俺はおりた。
0167163
2008/07/10(木) 20:00:490168163
2008/07/10(木) 20:04:010169163
2008/07/10(木) 20:13:52REALLOCマクロの定義は lib/xmlparse.c 552 で
#define REALLOC(p,s) (parser->m_mem.realloc_fcn((p),(s)))
上記関数ポインタの設定はparserCreateでやってる。
0170デフォルトの名無しさん
2008/07/10(木) 20:22:43レスありがとうございます。
ATTRIBUTE *temp;
attsSize = n + nDefaultAtts + INIT_ATTS_SIZE;
temp = (ATTRIBUTE *)REALLOC((void *)atts, attsSize * sizeof(ATTRIBUTE));
なるほど、ATTRBUTE構造体をここで再確保しています。
parserCreate()内でも確保しているようですが、
一番気になるのは、
const char *name;
const char *vlauePtr;
const char *valueEnd;
をどこで確保しているのか、ここが分かりません。
>>168
今からstoreAtts();を見てみます。
>>169
そこは以前に見たものですが、先程再確認させて頂きました。
ありがとうございます。
0171デフォルトの名無しさん
2008/07/10(木) 20:44:35const char *name;
const char *vlauePtr;
const char *valueEnd;
はATTRBUTE構造体のメンバです。
0172デフォルトの名無しさん
2008/07/10(木) 20:48:08storeAttsでその構造体を確保したんだからその後attsを使用してるとこ追ってけばすぐ見つかると思うけど。
0173デフォルトの名無しさん
2008/07/10(木) 20:53:08たいして見てなくて申し訳ない
0174デフォルトの名無しさん
2008/07/10(木) 21:05:38いえ、感謝しています。
今storeAtts()を見ています。
appAtts = (const XML_Char **)atts;これ以降で、appAttsが引数になっている関数はstoreAtts内に、
XmlGetAttributes()
getAttributeId()
storeAttributeValue()
poolStoreString()
addBinding()
上記の関数がありました。
私が気になったのは、名前からして、poolStoreString()です。
なので、/* String Pool */STRING_POOL;構造体を調べてみようと思います。
0175162
2008/07/10(木) 21:10:51とりあえず解析するならctagsというツールと、そのツールの出力ファイルを
活用可能なエディタを手に入れるといいと思う。
この関数の定義の場所へジャンプ、ということができるようになったりするよ。
あと、そもそも何で解析してるの?勉強?
0176デフォルトの名無しさん
2008/07/10(木) 21:15:37その通り、勉強です。
0178デフォルトの名無しさん
2008/07/10(木) 21:39:12xmlparse.c内のpoolInit関数、poolCopyString関数、poolGrow関数、poolAppend関数、
poolStoreString関数、poolClear関数、poolDestroy関数が呼び出されていました。
ATTRBUTE構造体各メンバの動的確保はここで行われているのでは無いかと予想し、
今からここを重点的に調べていこうと思います。
皆様からの回答、本当にありがとうございます。
それでは、
0179デフォルトの名無しさん
2008/07/11(金) 09:42:38最近どこかで読んだけど、silentbobとかいうのもなかなかいいそうな。
まぁ、grepでしこしこ調べるのも、まぁアリといえばアリな気がするけど。
0180デフォルトの名無しさん
2008/07/11(金) 16:25:520181デフォルトの名無しさん
2008/07/11(金) 16:37:090182デフォルトの名無しさん
2008/07/11(金) 16:44:440183デフォルトの名無しさん
2008/07/11(金) 17:01:50準拠
setjmp() は C89, C99, POSIX.1-2001 で規定されている。 sigsetjmp() は
POSIX.1-2001 で規定されている。
注意
POSIX は、 setjmp() がシグナルコンテキスト (signal context) を保存すべきかどうか
を規定していない (System V では保存しない; 4.3BSD では保存する; 4.3BSD には
シグナルコンテキストを保存しない関数 _setjmp もある)。シグナルマスクを保存したい
のなら、 sigsetjmp() を使うこと。 setjmp() や sigsetjmp() を使うと、プログラムは理解
しづらく、保守しにくいものになる。別の方法が可能なら、それを使うべきである。
とあるね、やっぱり私は使わないか。C++の例外は使ってる。
0184デフォルトの名無しさん
2008/07/11(金) 17:33:55いいとか悪いとかいうことはない
gotoの利点と欠点をよく考えた上で
必要かどうかを自分で判断すること
0185デフォルトの名無しさん
2008/07/11(金) 17:44:28最初は使わないようにして、後々使うパターンを覚えたほうが有益だと思うがいかが?
0186デフォルトの名無しさん
2008/07/11(金) 23:27:250187デフォルトの名無しさん
2008/07/11(金) 23:29:120188デフォルトの名無しさん
2008/07/11(金) 23:29:29無理。
無理やりな方法や、裏技的なやつはあるかもしれんけど、ふつーは無理。
0189デフォルトの名無しさん
2008/07/11(金) 23:37:00まぁ普通は絶対やらないけど
0190デフォルトの名無しさん
2008/07/11(金) 23:38:170191デフォルトの名無しさん
2008/07/12(土) 00:51:37char s[] = "適当な文字列";
s[0] = 'A';
0192デフォルトの名無しさん
2008/07/12(土) 00:53:100193デフォルトの名無しさん
2008/07/12(土) 00:53:180194デフォルトの名無しさん
2008/07/12(土) 00:56:04void Proc(char *string)
{
string[0] = 'A';
}
Proc("椅子座りすぎて腰痛い");
↑こんな感じの作ったらえらーでたんだけど、根本的にかきかえれないのかな
0195デフォルトの名無しさん
2008/07/12(土) 01:01:090196デフォルトの名無しさん
2008/07/12(土) 01:02:06{
str[0] = 'A';
}
で動く、stringは変数名に出来ない。
0197デフォルトの名無しさん
2008/07/12(土) 01:02:19書き換えられることが保証されていない
有体に言えば、やるべきでない
0198デフォルトの名無しさん
2008/07/12(土) 01:04:47( ゚д゚)
0199デフォルトの名無しさん
2008/07/12(土) 01:04:470200デフォルトの名無しさん
2008/07/12(土) 01:05:05規格に有りますか? 有ったらどこか教えてください。
0201デフォルトの名無しさん
2008/07/12(土) 01:05:57>>191は間違いで>>194だってことだろ
0202デフォルトの名無しさん
2008/07/12(土) 01:06:410203デフォルトの名無しさん
2008/07/12(土) 01:07:09void Proc(char *string)
{
string[0] = 'A';
}
Proc("椅子座りすぎて腰痛い");
は無理
void Proc(char *string)
{
string[0] = 'A';
}
char str[] = "椅子座りすぎて腰痛い"
Proc(str);
は可能
0204デフォルトの名無しさん
2008/07/12(土) 01:08:16なにがちがう?
0205デフォルトの名無しさん
2008/07/12(土) 01:08:420206CFAQ 1-32
2008/07/12(土) 01:09:49その配列の各文字の初期値を指定する。その他の場所で使うときは、文字の名無しのstaticの配列となる。
このときは書き込み禁止のメモリーに保存されるかもしれない。だから無事に値を変更できない可能性がある。
式が必要な場所では、いつもと同じく(6章を参照のこと)配列はその場でポインターに変換される。
だから2番目の宣言はpを名無しの配列の最初の要素を指すように初期化する。
(古いコードをコンパイルするために、文字列を書き込み可能にするかどうかを制御するスイッチを持っているコンパイラーもある。)
References:
K&R2 Sec. 5.5 p. 104; ANSI Sec. 3.1.4, Sec. 3.5.7; ISO Sec. 6.1.4, Sec. 6.5.7; Rationale Sec. 3.1.4; H&S Sec. 2.7.4 pp. 31-2.
0207デフォルトの名無しさん
2008/07/12(土) 01:10:12Template.exe の 0x00403b56 でハンドルされていない例外が発生しました:
0xC0000005: 場所 0x004134e4 に書き込み中にアクセス違反が発生しました。
って出た。
0208デフォルトの名無しさん
2008/07/12(土) 01:11:48void Proc(char * str)
{
str[0] = 'A';
}
void Proc2(char * string)
{
string[0] = 'B';
}
int _tmain(int argc, _TCHAR* argv[])
{
char bb[]="aaaaaaaaaaa";
Proc(bb);
Proc2(bb);
bb[0]='s';
return 0;
}
0209デフォルトの名無しさん
2008/07/12(土) 01:12:180210デフォルトの名無しさん
2008/07/12(土) 01:13:30ってのは、char型を21個分確保して、そこに初期値として "椅子座りすぎて腰痛い"で埋めてる。
char型配列ってのは要するに変数の集まりだから書き換えられる
Proc("椅子座りすぎて腰痛い");
ってのは、"椅子座りすぎて腰痛い"という文字列を、プログラム起動時に読み取り専用の領域に確保して、
そこへのポインタをProcに送ってる。
Procの中で読み取り専用領域に代入しようとしてるから当然エラーが出る
0211デフォルトの名無しさん
2008/07/12(土) 01:13:38それか静的領域に作られるけど属性的にロックされるのかな・・・
0212デフォルトの名無しさん
2008/07/12(土) 01:14:47静的領域におかれる
ロックされるかどうかは環境による
0213デフォルトの名無しさん
2008/07/12(土) 01:15:070214デフォルトの名無しさん
2008/07/12(土) 01:15:490215デフォルトの名無しさん
2008/07/12(土) 01:17:480216デフォルトの名無しさん
2008/07/12(土) 01:19:170217デフォルトの名無しさん
2008/07/12(土) 01:19:53変数名が問題なのではない
>>203の前者は、Proc()にWriteしちゃいけない領域を渡しているからNG
後者はWrite可能な領域(普通の配列)をProc()に渡しているからOKの違い
>>208はWrite可能な領域を渡しているからOK
たとえばchar bb[]="aaaaaaaaaaa";の代わりにchar *bb="aaaaaaaaaaa";って書いたらだめ
0218デフォルトの名無しさん
2008/07/12(土) 01:21:25申し訳ないが>>208のソースでもエラーですか?
書き忘れ VC++2005 Win2000
0219デフォルトの名無しさん
2008/07/12(土) 01:23:02正常終了です
0220デフォルトの名無しさん
2008/07/12(土) 01:24:080221デフォルトの名無しさん
2008/07/12(土) 01:28:51#define tostrcpy(dist, str) _tostrcpy(dist, #str)
char *_tostrcpy(char *dist, const char *str) //文字列両端の\"を削除する関数
{
strcpy(dist, str + 1);
size_t nLen = strlen(dist);
dist[nLen - 1] = 0;
return dist;
}
なんかの関数(tostrcpy("C:\Window\memochou.exe"));
↑これがめんどくさいから横着して入力場所を直接書き変えたかったってわけでs
いちいちパスの\を\\にするのめんどくさいという理由によって。。。
0222デフォルトの名無しさん
2008/07/12(土) 01:30:530223デフォルトの名無しさん
2008/07/12(土) 01:35:18なんかの関数(tostrcpy(aa));
2行にすればいけるが…
0224デフォルトの名無しさん
2008/07/12(土) 01:40:05まぁそうなんだけど、1行でできたらいいなぁって思った
ちなみに
#define ___(x) #x
___("C:\Window\memochou.exe"); //正常にコンパイル
___(C:\Window\memochou.exe); //エスケープシーケンスがどうのってエラー
がでるんですよね・・
0225デフォルトの名無しさん
2008/07/12(土) 01:45:05int a = b = c = 100;
とするとエラーになるのは何故ですか?
単なる代入ならばこの書き方で通るのに、宣言時だと何が変わるのでしょうか。
0226デフォルトの名無しさん
2008/07/12(土) 01:45:58char *___strchr(const char *str, int c)
{
//strchrの中身は↓こうなってるらしいですが、
c = (char)c;
while (*str && *str != c)
++str;
if (*str == c)
return (char *)str;
return NULL;
}
___strchrを使うより普通にstrchr使ったほうが1倍〜10倍以上、
速度が元物のstrchrのほうが速いんですよね。
strchrの本当の中身ってアセンブリか何かで書かれてるんですか?
0227デフォルトの名無しさん
2008/07/12(土) 01:47:53bとcの宣言はどこにあるんだよ
0228デフォルトの名無しさん
2008/07/12(土) 01:50:33ああ、この状態だと宣言せずに式の中で使っていることになるのですね。
わかりました、ありがとうございます。
0229デフォルトの名無しさん
2008/07/12(土) 01:53:26この時点ではどんな原因だと考えてたんだ?
0230デフォルトの名無しさん
2008/07/12(土) 01:56:110231デフォルトの名無しさん
2008/07/12(土) 01:56:33画像のある特定の範囲だけの色を変えるのってどうすればいいのでしょうか?
テンプレートマッチングでマッチングした部分の色を変えられず苦労しています。。
0232デフォルトの名無しさん
2008/07/12(土) 02:00:32ここ
http://pc11.2ch.net/test/read.cgi/tech/1215348804/
0233デフォルトの名無しさん
2008/07/12(土) 02:01:47すみません。ありがとうございます
0234デフォルトの名無しさん
2008/07/12(土) 02:19:41そこちゃうやろ
0235デフォルトの名無しさん
2008/07/12(土) 15:20:44void func(void)
{
int B;
for (10000000回繰り返し) A = 9999;
for (10000000回繰り返し) B = 9999;
}
変数AとBでアクセス速度に違いがあるかどうか教えてください。
0236デフォルトの名無しさん
2008/07/12(土) 15:28:45システムによって違うので、実際に測定しないとわからない。
↑というのが前提で。
最適化がまったくなかったら、グローバル変数のほうが速い場合がおおいような気がするけど、
いまどきローカル変数をレジスタに割り当てるとか当たり前だからBのほうが速いかもしれない。
0237デフォルトの名無しさん
2008/07/12(土) 15:49:15今時の最適化は、ループ自体が無くなる、は置いといて。
グローバルも、最適化ではレジスタ割り当ても有る。
優先順位としてはBの方が高いと思うけどね。
ではレジスター割り当てが出来ない場合は、Aがじか引き
Bはスタックエリアのインデックス引きでBが遅いかもしれない。
プログラムのアセンブルリストを見るのが一番速い
0238デフォルトの名無しさん
2008/07/12(土) 16:09:000239デフォルトの名無しさん
2008/07/12(土) 16:10:020240235
2008/07/12(土) 16:13:02//void msgbox(char *string, char *title = "msgbox") { MessageBox(NULL, string, title, NULL); }
LARGE_INTEGER Frequency;
QueryPerformanceFrequency(&Frequency);
LARGE_INTEGER pcBef, pcAft;
LONGLONG ll1, ll2;
QueryPerformanceCounter(&pcBef);
fori (1000000) A = 9999;
QueryPerformanceCounter(&pcAft);
ll1 = pcAft.QuadPart - pcBef.QuadPart;
QueryPerformanceCounter(&pcBef);
fori (1000000) B = 9999;
QueryPerformanceCounter(&pcAft);
ll2 = pcAft.QuadPart - pcBef.QuadPart;
sprintf(g_, "%f", (double)ll1 / (double)Frequency.QuadPart);
msgbox(g_);
sprintf(g_, "%f", (double)ll2 / (double)Frequency.QuadPart);
msgbox(g_);
測定の仕方ってこれであってます?
両方ともかかる時間は0.0024秒付近でした。
最適化ありだとほとんど変わらないぽいですね。
0241235
2008/07/12(土) 16:43:21代入による負荷は限りなく低くて無視できるようですね…
0242デフォルトの名無しさん
2008/07/12(土) 16:43:29大体の目安にはなるかもしれないけどソース埋め込みだとレジスタに置かれてたのがスタックに置かれたりして厳密な測定値は得られない
デバッガにブレークポイントからブレークポイントまでの時間を測る機能はないの?
0243デフォルトの名無しさん
2008/07/12(土) 16:47:33VC2008だけどあるかなぁ・・・
0244デフォルトの名無しさん
2008/07/12(土) 17:53:09意味のないループは最適化されやすい。
0245デフォルトの名無しさん
2008/07/12(土) 18:02:46命令の並列化とかメモリキャッシュの具合で差が出るかもしれない。
c7 05 00 00 00 00 0f 27 00 00
mov DWORD PTR ?A@@3HA, 9999 ; A, 0000270fH
c7 45 fc 0f 27 00 00
mov DWORD PTR _B$[ebp], 9999 ; 0000270fH
0246デフォルトの名無しさん
2008/07/12(土) 18:05:49; 7 : for (int i = 0; i <10000000; i++) A = 9999;
mov DWORD PTR ?A@@3HA, 9999 ; A, 0000270fH
; 8 : for (int i = 0; i <10000000; i++) B = 9999;
; 9 : }
ret 0
0247デフォルトの名無しさん
2008/07/12(土) 18:20:460248デフォルトの名無しさん
2008/07/12(土) 18:23:400249デフォルトの名無しさん
2008/07/12(土) 18:33:36ごめん、242は組み込みおじさんなんで自分の感覚で書いてしまった
MSDNのヘルプ見たけどVCではコード埋め込むのが一般的なのかな?
プロファイラが別途必要なのか、VCは疎いのでわからない
0250デフォルトの名無しさん
2008/07/12(土) 18:46:150251デフォルトの名無しさん
2008/07/12(土) 18:48:16int width, height;
int depth;
void* pixels;
} ImageData;
という構造体の宣言があってこの後のプログラムで
ImageData が型の名前として使われているようなんですがどういうことですか?
型として使うなら STRUCT_IMAGE だと思うんですが。
0252デフォルトの名無しさん
2008/07/12(土) 18:58:46って書くのめんどくさいじゃん?
0253デフォルトの名無しさん
2008/07/12(土) 18:58:48typedefしてるじゃん。
0255デフォルトの名無しさん
2008/07/12(土) 20:01:40volatileつけてみたら変わるかな?
0256デフォルトの名無しさん
2008/07/12(土) 20:10:37void main(){
int i;
int a[10];
for(i=0;i<10;i++){
scanf("%d",&a[i]);
if(入力側で改行があったら) break;
}
}
scanfで、次の要素に移るときは基本的にスペース、もし改行があったらそこでループを抜けるプログラムを書きたいのですが、
breakの条件文がわかりません・・・。
もし、適当な条件文があるなら教えていただけないでしょうか。
0257デフォルトの名無しさん
2008/07/12(土) 20:15:360258デフォルトの名無しさん
2008/07/12(土) 20:20:300259デフォルトの名無しさん
2008/07/12(土) 20:39:28ん〜今やってみましたが、改行してもscanfが終了しませんでした…
俺がscanfの仕様をよくわかってないのもあるかもしれません。
ちょっと>>256のだと語弊があることを懸念して、
「ループを利用して配列に数字を入力中、改行するとすぐさまそこで文字入力を終了する」
ということです。
…ひょっとするととんだ見当違いなプログラムを書いてしまったかも…
0260デフォルトの名無しさん
2008/07/12(土) 21:22:210261デフォルトの名無しさん
2008/07/12(土) 21:35:570262デフォルトの名無しさん
2008/07/12(土) 21:40:30わかりました。終わるときは何か他の文字を入力してもらうことにします。
ありがとうございました!
0263デフォルトの名無しさん
2008/07/12(土) 22:48:110264デフォルトの名無しさん
2008/07/12(土) 22:50:46オープンした直後なら最初のバイト。
二回目の実行なら二つ目のバイト。
0265デフォルトの名無しさん
2008/07/12(土) 22:51:29一回目は先頭
二回目は2バイト目
三回目は3バイト目
・・・
0266デフォルトの名無しさん
2008/07/12(土) 22:58:250268デフォルトの名無しさん
2008/07/12(土) 23:12:140269デフォルトの名無しさん
2008/07/12(土) 23:20:53分かりました。
ありがとうございました。
0270デフォルトの名無しさん
2008/07/12(土) 23:50:05char initial[15];
char name[15];
printf("苗字を記入\n");
scanf("%s",&initial);
printf("名前を記入\n");
scanf("%s",&name);
で、苗字と名前を記入するプログラムの練習をしてるのですが
このプログラムだと苗字、名前15文字までしか入れることができません。
で、if else をつかって16文字以上入力した場合には
「名前が長すぎる」とprintfで持ってきたいのですが、どうしてもできません。
なにかヒントみたいなものでも良いのでどなたか助言いただけないでしょうか?
0271デフォルトの名無しさん
2008/07/12(土) 23:51:300272デフォルトの名無しさん
2008/07/12(土) 23:52:33scanfのかわりにfgetsを使う
0273デフォルトの名無しさん
2008/07/12(土) 23:55:10char name[100];
while(true)
{
printf("苗字を記入\n");
scanf("%s",&initial);
if(strlen(initial)>0 && strlen(initial)<15) break;
printf("入力が長すぎます\n");
}
while(true)
{
printf("名前を記入\n");
scanf("%s",&name);
if(strlen(name)>0 && strlen(name)<15) break;
printf("入力が長すぎます\n");
}
0274デフォルトの名無しさん
2008/07/12(土) 23:59:09ヒントありがとうです
さっそく違う方法でやってみるです。
0275デフォルトの名無しさん
2008/07/13(日) 00:00:10while(0) {
printf("*");
}
このプログラムを実行したとき*は幾つ表示されるかが分かりません
実行してみたんですがエラーが出てしまいます orz
0276デフォルトの名無しさん
2008/07/13(日) 00:01:25何も表示されないだけかな
0277デフォルトの名無しさん
2008/07/13(日) 00:09:32ありがとうございますm(__)m
エラーが出ないように何回かいろんなところいじってみますorz
0278デフォルトの名無しさん
2008/07/13(日) 00:15:310279デフォルトの名無しさん
2008/07/13(日) 00:16:37○scanf("%s",initial);
0280デフォルトの名無しさん
2008/07/13(日) 00:18:39それはどっちでもいいんじゃね?
0281デフォルトの名無しさん
2008/07/13(日) 00:26:120282デフォルトの名無しさん
2008/07/13(日) 00:27:10今、試行繰り返してますが
どちらでも動くみたいです。
>>273のおかげでなんとかエラーなしで動くようになったので
これからプログラムの流れの解読開始します
0283デフォルトの名無しさん
2008/07/13(日) 00:29:40分かってるのか?って思う
0284デフォルトの名無しさん
2008/07/13(日) 00:34:32あんまりきれいではないよね
0285デフォルトの名無しさん
2008/07/13(日) 00:50:12ならない。
配列に&演算子を作用させたときに得られるポインタは配列へのポインタであって、
配列の先頭要素へのポインタではない。
memset() などでは、配列の先頭要素へのポインタを与えても、配列へのポインタを与えても、正当に動く。
なぜなら memset() の引数が void * と定義されているために、コンパイラが暗黙に適切な型変換を行うからである。
一方、可変個数の引数を取る printf() や scanf() では、そのような暗黙の変換は行われない。
scanf() で %s を指定した場合に与えるポインタは char へのポインタでなければならない。
ポインタのサイズや内部表現が同じ処理系においては、配列へのポインタを与えても
(渡される値が、型は異なっても実際には同じバイナリ列であるために)たまたま動く。
しかしそれは規格が保証した動作ではない。
0286デフォルトの名無しさん
2008/07/13(日) 00:56:11(あるいはつい同一視してしまって)&演算子をつけて printf() や scanf() に渡してしまうことがある。
これはどんなマシンであっても、たぶん動かない。
0287デフォルトの名無しさん
2008/07/13(日) 01:05:39printf("name=0x%x &name=0x%x\n", name, &name);
で、両方とも同じ値なのはなぜ?
0288デフォルトの名無しさん
2008/07/13(日) 01:27:44そのようにしたとき、&nameが配列の参照からポインタに成り下がるため、先頭アドレスが表示される
0289デフォルトの名無しさん
2008/07/13(日) 01:28:54|ポインタのサイズや内部表現が同じ処理系においては、配列へのポインタを与えても
|(渡される値が、型は異なっても実際には同じバイナリ列であるために)たまたま動く。
0290デフォルトの名無しさん
2008/07/13(日) 01:53:30違うw
配列のアドレスと配列の先頭アドレスが一致するからだ。
0291デフォルトの名無しさん
2008/07/13(日) 02:05:01同じ値になるんだな
知らなかった
0292デフォルトの名無しさん
2008/07/13(日) 02:05:540293デフォルトの名無しさん
2008/07/13(日) 02:15:06&nameと配列の参照を取得した時点で、それは先頭要素を指すポインタに変わると思ってたが、違うのかな
0294デフォルトの名無しさん
2008/07/13(日) 02:23:44&nameは配列全体へのポインタになる
&name[0]はまずname[0]が結合し次に&だから先頭要素へのポインタから0番目の要素へのポインタ=先頭要素へのポインタ
たいてーの処理系では値としてはまったく同じものでコンパイラが型チェックすることがあるだけ
でももちろんそうでない処理系もあるかもしれないということになる(C規格の上では)
%pに渡すポインタも、void*にキャストする必要があるかどうかは処理系定義じゃなかったかな
0295デフォルトの名無しさん
2008/07/13(日) 02:24:02というのがあって、aは0x10000とする。
aは当然0x10000なのだが、&aは?
&をアドレスを求める演算子と考えれば、aはもともとアドレスなので&aはaの値をそのまま返す。
ということではないのかな?
0296デフォルトの名無しさん
2008/07/13(日) 02:24:46> ポインタのサイズや内部表現が同じ処理系においては、配列へのポインタを与えても
> (渡される値が、型は異なっても実際には同じバイナリ列であるために)たまたま動く。
> しかしそれは規格が保証した動作ではない。
規格上は指す型によってポインタのサイズや内部表現が違ってもよいのですね
指すのが構造体の場合も、指す構造体によって
やはりサイズや内部表現が異なる可能性がありますでしょうか・・・?
継承っぽい動作の実装で構造体へのポインタを異なる構造体へのポインタに
キャストしてるもので。
0297デフォルトの名無しさん
2008/07/13(日) 02:26:11p が 0x10000とした場合、
&pはpがもともとアドレスにもかかわらず、pと&pは異なる値になるよ
0298デフォルトの名無しさん
2008/07/13(日) 02:28:07ちがいます。
aは&演算子のオペランドでない場合は&aになる。
0299デフォルトの名無しさん
2008/07/13(日) 02:28:09> すべてのCコンパイラで配列への(キャストのない)参照はポインターを産み出す。このポインターはTへのポインターで配列の最初の要素を指す
これについてはどう思いますかね
0300デフォルトの名無しさん
2008/07/13(日) 02:28:51逆じゃね?
&a は配列aのアドレスを返す
aは配列だが添え字とか&がなければ配列のアドレスを返す
0301デフォルトの名無しさん
2008/07/13(日) 02:33:16違うよ
aはもともとはアドレスじゃなくて識別子つまり配列そのもの
いくつかの例外(&aを含む)を除いてアドレスに変換されるけど
あとアドレス演算子とは呼ばれているけど、実際に&演算子が生み出すのはポインタ
Cのポインタは「アドレス」と「型」が一緒になった概念
ほとんどのコンパイラは前者だけを変数に保存してコンパイラだけが後者を管理するから
出力すれば同じものに見えるけどね
0302デフォルトの名無しさん
2008/07/13(日) 02:34:33構造体レベルだとたぶん変わらない
関数ポインタになると変わってくる
0303デフォルトの名無しさん
2008/07/13(日) 02:37:05どう思いますかねって何もおかしくないでしょ
そこには書いてない例外の部分もちゃんと含めてだけど
0304デフォルトの名無しさん
2008/07/13(日) 02:38:13さんくす
そうだよな、構造体は仮宣言でもポインタで取り回せるし
(それも規格に合ってるのか知らんけど)
0305デフォルトの名無しさん
2008/07/13(日) 02:40:58キャストするぶんにはそのへんコンパイラがちゃんとやってくれることになっている
0306デフォルトの名無しさん
2008/07/13(日) 12:25:41じゃあ、
char str[10];
scanf("%s",&str);
って書いた方が本来の意味として正しいってこと?
0307デフォルトの名無しさん
2008/07/13(日) 12:30:290308デフォルトの名無しさん
2008/07/13(日) 12:37:450309デフォルトの名無しさん
2008/07/13(日) 12:39:10int *p = dm;
int (*p2)[10] = &dm;
0310デフォルトの名無しさん
2008/07/13(日) 12:58:24&配列名 は当面使わなくてOK、な。
0311デフォルトの名無しさん
2008/07/13(日) 16:35:43だれかボタンを表示する方法を教えて下さい。
0312デフォルトの名無しさん
2008/07/13(日) 16:37:08TKでいいのか?
0313デフォルトの名無しさん
2008/07/13(日) 16:37:21↓
http://www.kumei.ne.jp/c_lang/sdk/sdk_15.htm
0315デフォルトの名無しさん
2008/07/14(月) 06:08:580316デフォルトの名無しさん
2008/07/14(月) 14:45:26http://www.soi.wide.ad.jp/class/20020008/slides/04/index_23.html
0317デフォルトの名無しさん
2008/07/14(月) 14:46:240318316
2008/07/14(月) 14:47:43C言語のように単なる構造化の場合どうやるんだろ?
古典的なフローだとどうもGOTO使ってるぽくていやなんだが
0319デフォルトの名無しさん
2008/07/14(月) 15:01:15古典的フローチャートにもループ記述子が存在しているからそれを使えばOK。
つーか、そもそも構造をブロック化するだけじゃないかと思うが。
0320デフォルトの名無しさん
2008/07/14(月) 16:30:35右側の構造化チャートならgoto使うイメージ無いだろ。
0321デフォルトの名無しさん
2008/07/14(月) 16:55:33自分としては一つの方法として「標準出力をフックする」というのは思いついたのですが
難しそうなので半ば諦めかけています。
何か方法はありますか
0322デフォルトの名無しさん
2008/07/14(月) 16:58:43popen はどう?
0323デフォルトの名無しさん
2008/07/14(月) 17:06:51凄い、出来ました。
ありがとうございます
#include <stdio.h>
int main()
{
FILE *fp;
char buf[256];
fp = popen("ls", "r");
while(!feof(fp))
printf("%s", fgets(buf, 256, fp));
return 0;
}
0324デフォルトの名無しさん
2008/07/14(月) 17:09:14大抵の環境でpopen()が使えると思う。
0325デフォルトの名無しさん
2008/07/14(月) 17:10:32そうなんですか
windowsでも出来るんですね
cygwinのdllでも同封してun*xコマンドを駆使しつつ
両方で活用できるソフトを作る事も出来そうですね…
ありがとうございます
0326デフォルトの名無しさん
2008/07/14(月) 17:12:52VisualStudioなら_popen()かな。
0327デフォルトの名無しさん
2008/07/14(月) 17:17:04そうなんですか
ありがたいですm(_ _)m
0328デフォルトの名無しさん
2008/07/14(月) 17:35:17pclose 推奨
0329デフォルトの名無しさん
2008/07/14(月) 22:06:1310〜100番の要素を5〜95のように同サイズで重なる領域にコピーしたいんですが
こういう場合は一旦どこかに変数を保存しないと実現できないんでしょうか?
0330デフォルトの名無しさん
2008/07/14(月) 22:08:35memmove
0331デフォルトの名無しさん
2008/07/14(月) 22:09:100332デフォルトの名無しさん
2008/07/14(月) 22:10:26おお、こんな便利な関数があるのですね
ありがとうございました
0333デフォルトの名無しさん
2008/07/14(月) 22:13:38C/C++の宿題を片付けます 111代目
http://pc11.2ch.net/test/read.cgi/tech/1214563642/136
の一部
136 名前:デフォルトの名無しさん[sage] 投稿日:2008/06/29(日) 10:13:37
void cmemmove(char*dest ,char*src, int length){
int i;
if(dest<src) for(i=0;i<length;i++) dest[i]=src[i];
if(dest>src) for(i=length-1;i>=0;i--) dest[i]=src[i];
}
0334デフォルトの名無しさん
2008/07/14(月) 23:12:550335デフォルトの名無しさん
2008/07/14(月) 23:16:04今後どうしてもC++に移行したくない理由があるわけでないのなら、
今は放置しておいてC++でリスト構造を勉強することをお勧めします。
0336デフォルトの名無しさん
2008/07/14(月) 23:18:530337デフォルトの名無しさん
2008/07/14(月) 23:19:30人が手をつないでる感じでどうですかね。
隣の人の隣の人、みたいな。
0338デフォルトの名無しさん
2008/07/15(火) 00:02:18ノードがあって
つながり方は色々
急を要するのでなければ
ノードの部分だけ分かってれば今はいいんじゃないかな
>335の言う通り、他の事も分かって改めてやってみるとぐんと分かったりするし
0339デフォルトの名無しさん
2008/07/15(火) 00:18:481つ前にいる人の位置と、1つ後ろにいる人の位置を、自分がデータとして持っているわけだ。
そういう人達が連なってできるのがリスト構造。
1つ前の人がいなくなったら、さらに一つ前の人の位置に書き換えればいい。
だから、構造の途中での削除や挿入が簡単に実現できる。
0340デフォルトの名無しさん
2008/07/15(火) 00:19:08でpが構造体のポインタ?宣言して、
p = (struct node *)malloc(sizeof(LISTEL));
でメモリ確保した時って、確保するごとに新しくpができるのかな。
意味不明だったらすみません。
0341デフォルトの名無しさん
2008/07/15(火) 00:22:33その糸の反対側は、必ず他の紙に貼り付けるか
オワリの印に五円玉を結びつける
0342デフォルトの名無しさん
2008/07/15(火) 00:37:11各ヘビは目の前のヘビのしっぽにかぶりついてるんだ。(単方向連結リスト)
最終的には大きな輪っかになってる。
その中に一つだけ、赤いヘビが混ざっていて、
一番目のヘビって言ったら、その赤いヘビから尻尾の方へ何番目って数えるんだ。
0343デフォルトの名無しさん
2008/07/15(火) 00:49:55新しくpは出来ますよ
ただ古い方のpをfreeしないとメモリリークですね
int main()
{
int i;
struct node *p = NULL;
for (i=0; i < 10; i++, p=(struct node*)malloc(sizeof(struct node)))
{ printf("%p\n", p); free(p);}
return 0;
}
と表示度にメモリ番地が変わってるのが分かるでしょう
あえて省いたのかも知れないけど
struct node *p と書かなくて node_t *p でも分かる人は分かるから
node_t は typedef struct node node_t; ね
0344デフォルトの名無しさん
2008/07/15(火) 01:45:490345デフォルトの名無しさん
2008/07/15(火) 02:45:42NULLいれるのは初期化ってことですか?
0346デフォルトの名無しさん
2008/07/15(火) 03:34:05もちろん
この場合は意味ないが
0347デフォルトの名無しさん
2008/07/15(火) 03:43:44意味がないってどういうこと?
0348デフォルトの名無しさん
2008/07/15(火) 03:48:240349デフォルトの名無しさん
2008/07/15(火) 03:49:15使ってるよ
あまり感心する使い方じゃないが
0350デフォルトの名無しさん
2008/07/15(火) 07:06:280351デフォルトの名無しさん
2008/07/15(火) 07:16:070352デフォルトの名無しさん
2008/07/15(火) 09:05:390353デフォルトの名無しさん
2008/07/15(火) 09:16:310354デフォルトの名無しさん
2008/07/15(火) 10:50:46教えてください。
0355デフォルトの名無しさん
2008/07/15(火) 10:56:34ぐぐる前に自分が使っているOSとプログラミング言語のことを知れ。
0356デフォルトの名無しさん
2008/07/15(火) 13:44:41「著作権」、「パブリックドメイン」、「Creative Commons」、「ライセンス」、「無断転載禁止」、「Web魚拓」、「引用」、「違法ダウンロード」、「海外サーバ」
こういうのが知りたいの?
0357デフォルトの名無しさん
2008/07/15(火) 19:51:09socket http でググれば?
0358デフォルトの名無しさん
2008/07/15(火) 19:55:060359デフォルトの名無しさん
2008/07/15(火) 19:55:54atoh の h って何?
0360358
2008/07/15(火) 19:56:280361デフォルトの名無しさん
2008/07/15(火) 19:59:35atoiで10進数の文字列が与えられるとintに変換しますけど
16進数の文字列をintでも何でもいいので数値かしたいだけなんですけどね・・・
0362デフォルトの名無しさん
2008/07/15(火) 20:02:190363デフォルトの名無しさん
2008/07/15(火) 20:04:06strtol
0364デフォルトの名無しさん
2008/07/15(火) 20:08:16それは書式指定して16進数の文字列を一度10進数文字列に変換したあと
atoiってことでOK?
>>363
直接変換となるとこれっぽいですね。
ありがとうございました。
0365デフォルトの名無しさん
2008/07/15(火) 20:09:35sscanf("abcd", "%x", &num);
0366デフォルトの名無しさん
2008/07/15(火) 20:11:22あーorz
すみません、そうですね。
関数の仕様を読み間違えてました。
失礼しましたorz
0367デフォルトの名無しさん
2008/07/15(火) 22:02:51変数に格納するデータは10進でも16進でも同じでしょ。
0368デフォルトの名無しさん
2008/07/15(火) 22:39:02*str='A';
str[1]='B';
str[2]='C';
str[3]='D';
str[4]='N';
str[5]='V';
str[6]='X';
str[7]='Y';
str[8]='Z';
str[9]='\0';
while(str[i]!='\0'){
if(str[i]>='Y'||str[i]>='y'||str[i]>='7'){
str[i]-=3;
printf("-3しました\n");
}else{
str[i]+=3;
printf("+3しました\n");}
++i;}
printf("%s\n",str);
まず、strというchar型でサイズ10の配列をつくりそれぞれの要素にA-Zの適当な文字を入れて、最後に終端文字を入れます
次に終端文字が来るまでY(0x59)以上もしくは
y(0x79)以上もしくは7(0x37)以上なら配列要素を-3してそれ以外なら+3するプログラムを組みましたが、
数字(0x30-0x39)以外の判定が上手くいきません
何故でしょうか。
0369デフォルトの名無しさん
2008/07/15(火) 22:44:35数字以外の判定がうまく行かない、の意図するところがよくわからないけど、
0x37以上っていうのはa〜zもA〜Zも含んじゃうから期待通りの動きをしないのでは?
y-z Y-Z 7-9のときに減らしたいのならそのように書かないと駄目です。
0370デフォルトの名無しさん
2008/07/15(火) 22:56:05あー
分りました どうもです
0371デフォルトの名無しさん
2008/07/15(火) 23:00:230372デフォルトの名無しさん
2008/07/15(火) 23:08:07そのリストを見た印象では、まともに動くものと思えない。
リストの全体を出すべき。
0373デフォルトの名無しさん
2008/07/15(火) 23:13:47だって、書くものは少しでも省略したいじゃん?
*str
と
str[0]じゃ2文字も違うんだぜ?
0374デフォルトの名無しさん
2008/07/15(火) 23:17:20そうやって可読性を下げて、後から自分自身で後悔する
こういう癖は、今のうちに虚勢した方が良い
0375デフォルトの名無しさん
2008/07/15(火) 23:20:00掘った穴に落ちてこそ意味が分かる
他人が穴ぼこだらけにしたものが回ってくるのは我慢ならんがw
0376デフォルトの名無しさん
2008/07/15(火) 23:20:45そうなのか
俺はこっちで慣れちゃってるんだが・・・
まぁ、TPOで使い分けるよ
0377デフォルトの名無しさん
2008/07/15(火) 23:21:15最初の配列は以下のように書いたほうがもっと少なくて済む上にわかりやすい。
str[] = "ABCDNVXYZ";
あとは>>369に同じ。
0378デフォルトの名無しさん
2008/07/15(火) 23:21:37去勢か矯正の間違いか?
0379デフォルトの名無しさん
2008/07/15(火) 23:22:27⇒関連語みえ【見え・見栄】
0380デフォルトの名無しさん
2008/07/15(火) 23:22:370381デフォルトの名無しさん
2008/07/15(火) 23:22:46その手があった
吊ってくる
0382デフォルトの名無しさん
2008/07/15(火) 23:30:260383デフォルトの名無しさん
2008/07/15(火) 23:34:190384デフォルトの名無しさん
2008/07/15(火) 23:36:070385デフォルトの名無しさん
2008/07/15(火) 23:37:250386デフォルトの名無しさん
2008/07/15(火) 23:37:47while よりは for(i=0;str[i]!='\0';i++) の方が楽
0387デフォルトの名無しさん
2008/07/15(火) 23:40:53あの人性格悪そうだよね。でも考え方は共感できる。
ラクすることを考えろ。書かなければバグも入らない。まさにその通りと思う。
0388デフォルトの名無しさん
2008/07/15(火) 23:50:49xmlparse.c2622行目のstoreAtts()関数について、どうしても分からない事があったので質問しに来ました。
2665行目付近にappAtts = (const XML_Char **)atts;という式があります。
これは、ATTRBUTE構造体を(const char **)にキャストして、appAttsに添え字を使ってATTRBUTE構造体の各メンバにアクセス出来るようにしていると思いますが、そうであるなら
typedef struct {
const char *name;
const char *valuePtr;
const char *valueEnd;
char normalized;
} ATTRIBUTE;
appAtts[0]はname、appAtts[1]はvaluePtr、appAtts[2]はvaluePtr、appAtts[3]はnormalizedを指していると考えているのですが、
element.cのstartElementハンドラの第三引数、const char **attsに属性名及び属性値がベクタ形式で保持されている訳ですが、
保持している場合、const char *name,const char *valuePtr,const char *valueEnd、この三つにしか保持出来ないと思うのです、
前述のappAtts = (const XML_Char **)attsはATTRBUTE構造体の各メンバに添え字を使いアクセスするためにキャストして使用している、という考え方に基づき考えていった場合
startElementハンドラ内でatts[3]にアクセスした場合は、ATTRBUTE構造体のnormalizedを指すと考えられます。
しかし、normalizedは1バイトのchar型でありポインタではありません。1バイトの領域しか指さない事になります。
では、第三引数であるconst char **atts、は一体どこを指しているのか、
かれこれ二日行き詰っています。ご教授お願いします。
0389デフォルトの名無しさん
2008/07/16(水) 00:23:480390デフォルトの名無しさん
2008/07/16(水) 00:26:20それはどこにありますか?
0391デフォルトの名無しさん
2008/07/16(水) 00:30:11もう すこし にほんご を べんきょう したら いかが ですか。
0392デフォルトの名無しさん
2008/07/16(水) 00:43:49前の質問内容が理解できていないので恐縮だけど・・・
appAttsって、テンポラリのローカル変数な予感。
確認したいんだけど、appAtts[3]って、「element.cのstartElementハンドラ」で使用されているの?
使用されていなければ、無問題なわけで。
0393デフォルトの名無しさん
2008/07/16(水) 00:43:59startElement呼んでる場所でどう処理してるかを
見てみるしかないんじゃないの
0394デフォルトの名無しさん
2008/07/16(水) 00:47:39なんでexpatのソースなんて読んでいるんだっけ?
初心者が勉強のために読むにはちょっと荷が重い気が。
あと、特定のソフトの特定の部分の挙動なんて質問しても、その部分を
読んだことがある人しか答えられないことを理解しよう。ここを読んで
いる人でexpatのソースを読んだことがある人がいる確率はものすごく低
い。
0395デフォルトの名無しさん
2008/07/16(水) 01:06:320396デフォルトの名無しさん
2008/07/16(水) 01:18:09attsが読まれて消費される速度 > appAttsが書きつぶす速度
という前提で、メモリ領域を流用しているんじゃないのかな?
atts自体はルーチンの後の方では参照しないし。
だから、appAttsがATTRBUTEの配列(atts)を無理矢理キャストして
使用しているんじゃなくて、reallocで分捕ってきたメモリ領域を、
attsとappAttsが共用していると考えるべきじゃないのかな。
0397デフォルトの名無しさん
2008/07/16(水) 01:19:46申込書とかの記入例に書いてある○○太郎とかと同じようなもん。
名前自体に意味はないという意味を持っている。
0398デフォルトの名無しさん
2008/07/16(水) 01:25:53確かにローカル変数ですが、この変数はstoreAtts()関数内で属性名:属性値の保持のために使われていると思います。
appAttsを(const XML_Char **)atts;とした時点で、appAtts(0から3までの添え字)でATTRBUTE構造体四つのメンバへのアクセスをしているであれば、
2729行目のappAtts[attIndex] = poolStoreString(&tempPool, enc, atts[i].valuePtr,atts[i].valueEnd);
添え字であるattIndexが3の時はchar normalizedを指している事になり、ポインタでなく、1バイトのchar型に属性名:属性値の保持は無理です。
しかし、2729行目のappAtts[attIndex]の添え字が3であった場合も値は格納されていて、printf()関数で属性値の表示も出来ました。。
この事からappAtts[3]はATTRBUTE構造体のchar normalizedを指していない事となります。
ではappAtts[3]はどこを指しているのか、これが分からないのです。
>>393
attsはATTRBUTE構造体を指し示すマクロでしかありません。
ハンドラが呼び出されているのはxmlparse.c2148行目、docontent()関数からです。
startElementHandler(handlerArg, tag->name.str,(const XML_Char **)atts);
ハンドラでは、attsを参照するだけなのでどのように属性名:属性値を格納しているかを調べないと解決出来ないと思います。
>>394
読んでいる理由は勉強のためです。
>>396
今から共有について調べてみます。
0399デフォルトの名無しさん
2008/07/16(水) 02:21:16入門編の範疇じゃねぇし
ことによるとCの話でもねぇよ
0400デフォルトの名無しさん
2008/07/16(水) 02:25:09(たぶんnormalizedのあとに3バイトつめものがされて4バイトなんだろう)を
const char *用の領域として流用してるんだと思う
というかここに出てる材料ではそれぐらいしか考えられない
0401デフォルトの名無しさん
2008/07/16(水) 03:20:05つまり、ATTRBUTE構造体(アライメント:32bit=4byteの区切り)16byteあり、appAtts = (const XML_Char **)atts;にキャストする事で、
属性値が保持されている4byteのアドレスをchar normalizedにも格納している、という事でしょうか?
0402デフォルトの名無しさん
2008/07/16(水) 03:27:33atts = temp;
ってなくらいだからattsはATTRIBUTEの配列なんでないの?
0403デフォルトの名無しさん
2008/07/16(水) 03:38:36>>401へのレスでしょうか?
0404デフォルトの名無しさん
2008/07/16(水) 08:35:040406デフォルトの名無しさん
2008/07/16(水) 13:08:40では>>401の考え方は正しいと思いますか?
0407デフォルトの名無しさん
2008/07/16(水) 13:08:51×char normalizedにも格納している
○char normalizedを含む4バイトのフィールドにも格納している
だろ
0408デフォルトの名無しさん
2008/07/16(水) 13:09:52それを読むことを薦めたやつに聞け
0409デフォルトの名無しさん
2008/07/16(水) 13:15:21メモリ管理周りは把握できた?
0410デフォルトの名無しさん
2008/07/16(水) 13:20:10そして質問の仕方と日本語も勉強すべき。
かれこれ二日行き詰っている間に基礎を勉強していたら違う人生を歩めてたはず。
0411デフォルトの名無しさん
2008/07/16(水) 13:49:01なるほど、把握しました。
>>408
薦められた訳ではありません。
>>410
昔は多趣味だったんですよ、私
アリエナイ理科の教科書や仏教、発電、エンジンなんかの書籍を読みあさっていましたし
カメラを分解して感電したり小さいながらもドライアイスを液化したりスターリングエンジンを作ったり、とまぁいろいろやっていました
注射器取り寄せるにも薬局でエタノール買うにも金がいります。中学生には無理な趣味だったんです。
解答ありがとうございます。
それでは、
0412デフォルトの名無しさん
2008/07/16(水) 13:54:400413デフォルトの名無しさん
2008/07/16(水) 14:57:20なぜ基礎を学んでからの方が良いという提言をスルーするの?
0414デフォルトの名無しさん
2008/07/16(水) 15:30:33自分で好きなことを見つけて学ぶのもいいけどね、
学校や親から「与えられる知識」は基礎作りにはもっと重要。
これは小さいうちしかできない乃至やらないから大事にしたほうがいいよ。
本当に伸びたければ、趣味に限ってないで何でもやらないと。
0415デフォルトの名無しさん
2008/07/16(水) 15:41:020416デフォルトの名無しさん
2008/07/16(水) 16:03:30%fkmってなぜ?
これEXEにしたらどういう表示されるの?
http://wisdom.sakura.ne.jp/programming/c/c3.html
#include <stdio.h>
main()
{
char x = 'X';
float ran = 42.195;
printf("%c感じてみろー!\n",x);
printf("フルマラソンは %fKm",ran);
}
0417デフォルトの名無しさん
2008/07/16(水) 16:05:450418デフォルトの名無しさん
2008/07/16(水) 16:10:28かな
0419デフォルトの名無しさん
2008/07/16(水) 16:15:21>>418どうも km42.195?変だなぁと気になって気になって
0420デフォルトの名無しさん
2008/07/16(水) 16:17:100421デフォルトの名無しさん
2008/07/16(水) 16:19:220422デフォルトの名無しさん
2008/07/16(水) 16:22:02km42.195
ないわぁw 倒置法ないわぁw
0423デフォルトの名無しさん
2008/07/16(水) 20:52:20もし保障されていないのなら自分で並び方を固定したいのですがどんな方法がありますか?
0424デフォルトの名無しさん
2008/07/16(水) 20:54:270425デフォルトの名無しさん
2008/07/16(水) 20:56:34一致するが一つ注意がある。
コンパイルする環境によってだけどCPUがアクセスしやすいバイト単位になるように
ダミーが入るケースがあって構造体サイズが増えることがある。
ずれるのも構造体内部のメンバの位置が数バイトだけだけどね。
0426423
2008/07/16(水) 21:03:24ありがとうございます
あるメンバからあるメンバまでをまとめてコピーしたかったので
ダミーの混入は両端のアドレスから解決できそうです
0427デフォルトの名無しさん
2008/07/16(水) 21:08:080428デフォルトの名無しさん
2008/07/16(水) 21:16:400429デフォルトの名無しさん
2008/07/16(水) 21:18:08コンパイラはlsic86の試食版を使っているのですが、
コマンドプロンプトでコンパイルして実行すると日本語部分が文字化けします。
OSはvista。おそらくIMEのverに対応してないのかどうかって所なんでしょうけど。。
何か他にお勧めのコンパイラありませんか??
やっぱりvisualcですか??
cに適した環境をご教授頂ければ非常に助かります。
0430デフォルトの名無しさん
2008/07/16(水) 21:21:43構造体間の代入はできるよ。
でも部分的に代入したくない場合は個別になるかなあ。
あとはコピーしたくない部分とコピーする部分を分けることが可能なら
構造体を2段で定義してコピーしたい部分+したくない部分としてその二つをまとめるだけの構造体
とすればOkだけどね
0431デフォルトの名無しさん
2008/07/16(水) 21:22:02マイクロソフトVC++2008かBCC developer
0432デフォルトの名無しさん
2008/07/16(水) 22:34:05int b = 5;
int c = 4;
int d;
d = a * b / c;
っていうようなdoubleとintを組み合わせて計算した場合の
答えはdoubleでしょうか?intでしょうか?
0433デフォルトの名無しさん
2008/07/16(水) 22:35:260434デフォルトの名無しさん
2008/07/16(水) 22:42:27ありがとうございました
0435デフォルトの名無しさん
2008/07/16(水) 22:44:38まずa * bでbがdoubleに格上げされて計算の結果doubleの値が生まれる
次に/ cでcもdoubleに格上げされてdoubleの値が生まれる
最後にそれをdに代入すると小数点以下が棄てられてintの値になる
0436デフォルトの名無しさん
2008/07/16(水) 23:00:06ソケットの扱いとか面倒だけどBorland C/C++
bcc32.exeとかbcc55で探せばあるかもね
0437デフォルトの名無しさん
2008/07/16(水) 23:00:57キャラデータを含む構造体をバイナリファイルとして保存するとき、
チート対策のため単純にそのまま記録するんじゃなくて暗号化したいのですが、いい方法ありませんか?
0438デフォルトの名無しさん
2008/07/16(水) 23:03:54乱数seedをファイルの先頭に保存
あとは乱数とデータのxorを保存
適当なアーカイバで圧縮してヘッダをファイル末尾に回す
0439437
2008/07/16(水) 23:09:47おお、すばやい回答ありがとう。
複合化のときは、ファイルに保存されてるseedでsrand()すればよさそうですね。試してみます。
0440437
2008/07/16(水) 23:11:190441デフォルトの名無しさん
2008/07/16(水) 23:18:18自分が解析しにくいと思う方法でやればどっちでもいいよ
どれだけ対策をしてもできる人にはできる
とりあえずチェックサムをいれておいて不正なデータは拒否
0442デフォルトの名無しさん
2008/07/17(木) 00:44:29コマンドプロンプトで日本語だけが文字化けするんですけど
これってどうしたら直るんだ・・・。
vistaじゃCはできねーのか??
誰か助けてー。。。Borland C/C++とlsic86の試食版を使ってますが
どっちも文字化けしまっす。
0443デフォルトの名無しさん
2008/07/17(木) 00:46:31Vistaじゃないから分からないけど
ソースコードの保存形式が関わってたりして
ソースの文字コード弄ってみたらいかが
0444デフォルトの名無しさん
2008/07/17(木) 02:43:020445デフォルトの名無しさん
2008/07/17(木) 08:45:160446デフォルトの名無しさん
2008/07/17(木) 10:10:02printf("%p\n", &p);
getchar();
コンソールを同じ方法で2つ起動してそれぞれ実行するとアドレスが同じになるそうですが、ならないのですが、
コンパイラはgccでdebian etchです
仮想アドレス空間がうんたらかんたらって本に書いてあったんですけど、
ポインタ完全制覇って本です
0447デフォルトの名無しさん
2008/07/17(木) 10:23:18コマンドプロンプトのプロパティでコードページを日本語に変えれ
0448デフォルトの名無しさん
2008/07/17(木) 11:05:30address space randomizationというセキュリティ対策があって、アドレ
スが一定にはならないようになっているOSもある。
Debianがそうなのかどうかは知らんけど。
0449デフォルトの名無しさん
2008/07/17(木) 11:08:20環境によって異なります。仮想アドレス空間だからと言って、同じになる保障があるわけではありません。
0450デフォルトの名無しさん
2008/07/17(木) 11:31:34WinXPでは同じになった
Fedoraでやったら起動するたびに違う値になった
0451デフォルトの名無しさん
2008/07/17(木) 13:42:51気にしたところで効率のいいコードが書けるわけじゃないし間違いを起こす可能性のほうが高い
0452デフォルトの名無しさん
2008/07/17(木) 13:52:580453デフォルトの名無しさん
2008/07/17(木) 14:15:10このプログラムではうまくいきません
どこが間違ってるのでしょうか。
#include <stdio.h>
int main(void)
{
int n,i;
double x=1;
scanf("%d",&n);
if(n>=0){
for(i=0;i>n;i++){
x=x*2;}
printf("答えは%lf\n",x);}
else if (n<0){
for(i=0;i<n;i--){x=x/2;} printf("答えは%lf\n",x);}
return 1;
0454デフォルトの名無しさん
2008/07/17(木) 14:19:23>for(i=0;i>n;i++)
ここと
>printf("答えは%lf\n",x)
ここと
>for(i=0;i<n;i--)
ここと
>printf("答えは%lf\n",x)
ここ
0455デフォルトの名無しさん
2008/07/17(木) 14:29:43なぜ違うのでしょうか。
0456デフォルトの名無しさん
2008/07/17(木) 14:33:10> 2のn乗(nは入力した数)を計算するプログラムを作りたいのですが、
> このプログラムではうまくいきません
> どこが間違ってるのでしょうか。
> #include
- for(i=0;i>n;i++){
+ for(i=0;i<n;i++){
- for(i=0;i<n;i--){
+ for(i=0;i>n;i--){
x=x/2;} printf("答えは%lf\n",x);}
0457デフォルトの名無しさん
2008/07/17(木) 14:36:39× printf("答えは%lf\n",x)
○ printf("答えは%f\n",x)
0458453
2008/07/17(木) 14:37:410459デフォルトの名無しさん
2008/07/17(木) 14:52:060460デフォルトの名無しさん
2008/07/17(木) 14:55:470461デフォルトの名無しさん
2008/07/17(木) 14:59:570462デフォルトの名無しさん
2008/07/17(木) 17:24:28%lfはscanfにはあるがprintfにはない
0463デフォルトの名無しさん
2008/07/17(木) 17:30:470464デフォルトの名無しさん
2008/07/17(木) 17:31:05だから printf 側からすると 引数は float が来ることはなく %lf は必要ないことになる
# が、 %lf をサポートしている処理系もある
0465デフォルトの名無しさん
2008/07/17(木) 17:45:30>463
それ以前から、サポートしている処理系が多いことは事実。
0466デフォルトの名無しさん
2008/07/17(木) 17:53:38scanf と printf のフォーマット文字列の対称性をもたせるのに
あえて printf での %lf も解釈できるようにしているんだろうね
0467デフォルトの名無しさん
2008/07/17(木) 18:00:08しかしそれで勘違いしたままだとva_arg(ap,float)なんて書いてしまうという更なる罠が
0468デフォルトの名無しさん
2008/07/17(木) 18:02:12むしろprintfでは%fを廃止して%lfに一本化するのが
正しかった気がしないでもないがいまさら遅すぎだな
0469デフォルトの名無しさん
2008/07/17(木) 18:22:10冗談さておき、対称性なんて有り得ないんだがなぁ。
初心者本を書いているのが実務経験ない人間だと言うことがよく判るのもこの辺りだからね。
0470デフォルトの名無しさん
2008/07/18(金) 00:56:42バッファオーバーフローを起こす可能性が高いというだけですか?
0471デフォルトの名無しさん
2008/07/18(金) 00:59:48ここ↓
http://www.6809.net/tenk/html/cgokai/scanf.htm
0472デフォルトの名無しさん
2008/07/18(金) 01:12:43もし宜しければ検索する為のキーワード等のヒントを頂けませんでしょうか?
0473デフォルトの名無しさん
2008/07/18(金) 01:21:511 2<Enter>
ならよし
1<Enter>と入力したとき、scanfから抜けてこないということではないかな
1<Enter>
2<Enter>
で抜けてくる?(やったことがないのでよくわからん)
つまり%dの個数分しっかりと入力する必要があるということ
0474デフォルトの名無しさん
2008/07/18(金) 01:28:32とりあえず読み込んで関数を抜けてくれるから
良いと言うことなんでしょうか?
0475デフォルトの名無しさん
2008/07/18(金) 01:33:58はい、そのとうりです。
0476デフォルトの名無しさん
2008/07/18(金) 01:38:090477デフォルトの名無しさん
2008/07/18(金) 01:43:15int main()
{
char c;
int d;
scanf("%d",&d);
scanf("%c",&c);
printf("%#x \n",c);
return 0;}
これ実行したらわかるけどscanf("%d",&d);は改行文字を入力ストリームに残すため
次のscanf("%c",&c);では入力ストリームに残った改行文字を自動的に食う
printf("%#x \n",c);を見ればcに0x0a(改行文字)が入ってるのが解る
0478デフォルトの名無しさん
2008/07/18(金) 01:49:54わざわざ有難うございました
scanf("%d", &d);
getchar();
と常にしておかないと不味いですよね
併用しなければならない分scanfはやっぱり良くないと…
そういえばfgetsを使用した場合指定したサイズより多い数を入力した場合で
入力ストリームをクリアする標準的な方法と言うのを知らないのですが
while(getchar() != '\n');
で良いのですかね?
0479デフォルトの名無しさん
2008/07/18(金) 01:53:29標準入力をどう利用するかの仕様にも拠るけど、それでいいんでない?
読み捨てちゃ拙いんだったらダメだけど。
0480デフォルトの名無しさん
2008/07/18(金) 01:57:52色々とありがとうございました
0481デフォルトの名無しさん
2008/07/18(金) 01:58:57いっとくが%dや%sで読むぶんには改行を含む空白を読み飛ばすのでその必要はない
不用意に%cを使うからおかしくなるだけ
0482デフォルトの名無しさん
2008/07/18(金) 01:59:43ご忠告ありがとうございますw
0483デフォルトの名無しさん
2008/07/18(金) 02:07:21文字列を読み込む場合scanfを使って
char buff[256]
scanf("%255[^\n]%*[^\n]", buff);
getchar();
と書くのもあんまり良くないんでしょうか?
こうすれば入力ストリームのクリアも考えなくて済むので
良さそうかなと思ったりもするのですが
0484デフォルトの名無しさん
2008/07/18(金) 02:10:02本番ではそういう仕様で済むことがないので使わないけど。
0485デフォルトの名無しさん
2008/07/18(金) 02:14:18やはり実際の現場では使えないのですね…
もうちょっと勉強します
0486デフォルトの名無しさん
2008/07/18(金) 02:14:29いきなりenterが入力されることを考えて
scanf の前に buff[0]='\0'; が欲しい
0487デフォルトの名無しさん
2008/07/18(金) 02:17:14うーん…いろいろな事を想定するというのは難しいですね
0488デフォルトの名無しさん
2008/07/18(金) 02:21:450489デフォルトの名無しさん
2008/07/18(金) 02:23:290490デフォルトの名無しさん
2008/07/18(金) 02:29:11その辺りがまだ経験が足りなくて良く分かってないんです、すみません…
0491デフォルトの名無しさん
2008/07/18(金) 02:33:58EOF
0492デフォルトの名無しさん
2008/07/18(金) 02:44:43残りっぱなしになるという理解で良いでしょうか?
0493デフォルトの名無しさん
2008/07/18(金) 02:46:15自分が期待している処理よりも、期待しない処理のほうがはるかに多いのが常。
期待しない処理を取りこぼしたとき、いわゆるバグが発生する。
0494デフォルトの名無しさん
2008/07/18(金) 02:47:30それはバッファオーバーランという別の罠がまっているかもしれません。個人的に %s は使いたくないです。
0495デフォルトの名無しさん
2008/07/18(金) 02:49:55とりあえず、C言語を大雑把に全体的に勉強したので
次はもっと細かいところに目を向けようと思ってまた勉強してるのですが
難しいですねやっぱりw
>>494
あ、いえ質問の意図的には>>483のような手法で受け取った場合と言うことなんです
変な表現をしてしまってすみません
0496デフォルトの名無しさん
2008/07/18(金) 03:52:51文字列読み込むなら
#include <stdio.h>
#include <string.h>
int main()
{
char *crlf;
char buff[256] = {'\0'};
fgets(buff,sizeof(buff),stdin);
if(crlf = strrchr(buff,'\n'))
*crlf = '\0';
return 0;
}
みたいな感じ
0497デフォルトの名無しさん
2008/07/18(金) 07:40:470498デフォルトの名無しさん
2008/07/18(金) 08:21:34別にwin以外でコンパイルしたとしても
蛇足な名前をあえて使って意味を込める手法は良く取られると思うが。
それとも最初にpがついてない事を言っているのか
0499デフォルトの名無しさん
2008/07/18(金) 08:38:03isspace辺りで切り落とすとか
0500デフォルトの名無しさん
2008/07/18(金) 08:44:12あくまで書式が決められた文字列入力解析用の関数だからね
0501デフォルトの名無しさん
2008/07/18(金) 08:44:53crlfと言えば、普通は"\r\n"だな。
0502デフォルトの名無しさん
2008/07/18(金) 09:00:53ファイルから読み込む訳じゃないから取得データが\r\n→\nとかじゃないんだな
これは失礼いたした
lbとかlnbkとかがいいかもな
0503デフォルトの名無しさん
2008/07/18(金) 18:31:510504デフォルトの名無しさん
2008/07/18(金) 18:33:59意味がわからん
hoge[SIZE]は静的に確保される位置で定義するの?
それとも動的に確保するの?
0505デフォルトの名無しさん
2008/07/18(金) 18:35:210506デフォルトの名無しさん
2008/07/18(金) 18:39:38どうせ
#define SIZE 128
とかしてるんでしょ?
0507デフォルトの名無しさん
2008/07/18(金) 18:40:280508デフォルトの名無しさん
2008/07/18(金) 18:44:42malloc使って領域確保して・・・
とかじゃなければコンパイルもしくは実行時にわかるよ。
まーたぶんコンパイルは間違ってなければ通るので
実行時にメモリ不足でこけるかどうかだろうね。
でSIZEは何ぼ?
doubleって8バイトしかないよ?
0509デフォルトの名無しさん
2008/07/18(金) 18:45:570510デフォルトの名無しさん
2008/07/18(金) 18:48:040511デフォルトの名無しさん
2008/07/18(金) 18:49:10staticにとるなら実行時の心配はまずしない。
mallocでヒープにとるとしてもその程度なら全然。
0512デフォルトの名無しさん
2008/07/18(金) 18:49:31計算してみなよ。
32768x8x6 = 1572864
まー約1.5M?
マイコンじゃあ厳しいけどwindowsだと1024x768フルカラーBMPやwavデータより軽いね
0513デフォルトの名無しさん
2008/07/18(金) 18:49:41組み込みなら知らないが
動的確保すれば今時のPCなら問題ないレベル
32k*8*6=1.5M
0514デフォルトの名無しさん
2008/07/18(金) 19:39:100515デフォルトの名無しさん
2008/07/18(金) 19:56:22俺みたいな馬鹿でも理解できそうな本はありませんか?
0516デフォルトの名無しさん
2008/07/18(金) 19:58:080517デフォルトの名無しさん
2008/07/18(金) 20:00:07簡単なプログラムを動かせ
0518デフォルトの名無しさん
2008/07/18(金) 20:00:46そういう質問はよくあるが、お前の馬鹿さ加減なんて言葉じゃ伝わらないし、
解説本の類が馬鹿でも分かるから馬鹿には分からないまで順序付けられるわけでもないから、
正直ひとそれぞれだとしか答えられない。
アマゾンの書評でも読んで良さそうだと思ったのを、大きな本屋いって立ち読みすればいいと思うよ。
0519デフォルトの名無しさん
2008/07/18(金) 20:01:25基礎的な事ならどの本も似たようなものだし
0520デフォルトの名無しさん
2008/07/18(金) 20:08:08夏休みに色々探してみようと思います
0521デフォルトの名無しさん
2008/07/18(金) 22:29:22いい時代になったなあ。
0522デフォルトの名無しさん
2008/07/18(金) 22:34:50独習CとかGOODだろ
0523デフォルトの名無しさん
2008/07/18(金) 22:37:46自力で学習できる能があるやつはどんな本使ってもものになるし
そうでないやつはどんな本使っても教師がよければいいしダメだとダメ
0524デフォルトの名無しさん
2008/07/18(金) 22:40:070525デフォルトの名無しさん
2008/07/18(金) 22:43:020526デフォルトの名無しさん
2008/07/18(金) 22:43:110527デフォルトの名無しさん
2008/07/18(金) 22:51:500528527
2008/07/18(金) 22:52:25もう寝よう・・
0529デフォルトの名無しさん
2008/07/18(金) 22:52:34ずっと昔から使っているんですけれども、いまだに、なんだかとっても不安なんですが気のせいですかそうですか
0530デフォルトの名無しさん
2008/07/18(金) 22:55:04本が嘘を書いてある場合があるので要注意。
0531デフォルトの名無しさん
2008/07/18(金) 22:55:310532デフォルトの名無しさん
2008/07/18(金) 22:59:230533デフォルトの名無しさん
2008/07/18(金) 22:59:360534デフォルトの名無しさん
2008/07/18(金) 23:03:31なに、あなたが心配するまでもなく、多くの人間が理解していると思いますよ。
昔は、far とか near とかを駆使してやっていたんです。
0535デフォルトの名無しさん
2008/07/19(土) 02:53:060536デフォルトの名無しさん
2008/07/19(土) 04:01:450537デフォルトの名無しさん
2008/07/19(土) 05:06:380538デフォルトの名無しさん
2008/07/19(土) 10:40:330539デフォルトの名無しさん
2008/07/19(土) 10:45:430540デフォルトの名無しさん
2008/07/19(土) 11:09:57int main(void)
{
int a;
a=5;
printf("%d",a);
これでやると
a.c: In function `main':
a.c:6: error: parse error at end of input
となってしまうんですが、どこか間違っているんでしょうか?
0541デフォルトの名無しさん
2008/07/19(土) 11:10:380542デフォルトの名無しさん
2008/07/19(土) 12:01:140543デフォルトの名無しさん
2008/07/19(土) 15:21:270544デフォルトの名無しさん
2008/07/19(土) 16:57:000545デフォルトの名無しさん
2008/07/19(土) 18:14:39確保したポインタを渡せば。教えてください。
0546デフォルトの名無しさん
2008/07/19(土) 18:37:11残念ながらないのです。自分でラッパ関数を作って覚えておくしかないでしょうね。
0547デフォルトの名無しさん
2008/07/19(土) 18:53:05約-10^38 〜 10^38の実数となっているのですが、
なぜその範囲になるのかがわかりません。
float値 = (-1)^(符号部) * 2^(指数部-127) * 1.仮数部で計算すると
-10^-36、10^36となるところまではできたのですが
38乗にするには何が足りないのでしょうか
初歩的な質問で申し訳ありませんが、お願いします。
0548デフォルトの名無しさん
2008/07/19(土) 19:11:20使えるビット数削って精度を落としたのがfloatなだけだし
http://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0
0549デフォルトの名無しさん
2008/07/19(土) 21:24:29最大値
〜2^(2^7 - 1) * 2
〜2^128
〜10^(38.4)
はいかが?
0550デフォルトの名無しさん
2008/07/19(土) 21:35:27〜10^(38.5318)
0551デフォルトの名無しさん
2008/07/19(土) 22:32:40へこむわー
0552デフォルトの名無しさん
2008/07/19(土) 23:35:04fortran でしたっけ?
0553デフォルトの名無しさん
2008/07/19(土) 23:54:24次々と取り出したいのですが、いい方法はありますか?
下の方法で一旦ファイルディスクリプタを取得してからfstatで取り出すと
ディレクトリの方のstatを取り出してしまい、上手くいきません。
DIR dir=opendir("."); struct stat dirstat; struct dirent *dirent;
while ((dirent=readdir(dir)) != NULL ){
fstat(dirfd(dir), &dirstat);
printf("I-node number: %ld\n", (long) dirstat.st_ino);
}
できればファイル名を用いてstatを取得したくないです。
よろしくお願いします。
0554デフォルトの名無しさん
2008/07/20(日) 00:08:280555デフォルトの名無しさん
2008/07/20(日) 00:10:59.
と
..
を除外したいということ?
ディレクトリ全般の情報が必要ないということ?
_findfirst とかは?
0556553
2008/07/20(日) 00:22:00ごめんなさい
>>555
いえ、"ls-l" みたいなのを実現したいんです。
上のプログラムではテスト用としてi-nodeを表示させてるのですが、
direntはどんどん先に進むのに、statは前に進まず...
statもファイル名を指定すれば取得できるのですが、フルパスを設定
するのもめんどいし、せっかくディレクトリストリームが取得できて
いるんだから(ディレクトリストリームが何者かはしらんが)それを使って
ファイルを参照した方がオーバーヘッドが減るんじゃないかと思いまして。
0557デフォルトの名無しさん
2008/07/20(日) 01:30:57環境依存スレへどうぞ。
まぁ、ディレクトリのステータスを取る関数でファイルのステータスが取れるかについては移動してまでも聞くようなものでもありませんが。
0558デフォルトの名無しさん
2008/07/20(日) 01:32:03要するにディレクトリ内部のファイルstatを次々に取り出したいわけでしょ
じゃあディレクトリストリームを引数にとってstatかファイルディスクリプタを返すような
そういう関数がないかどうか調べるんだ
ないならいちいちファイル名ひっこぬいて変換するしかない
0559デフォルトの名無しさん
2008/07/20(日) 01:36:32int main(void)
{
char a;
scanf("%c",&a);
printf("%c",a);
}
とやると a と打ったら a と表示されるのはあたりまえですが、
こんな感じで a と打ったら アスキーコードの 97 と表示されるようにしたいのですが
どうしたらいいでしょうか?
0560デフォルトの名無しさん
2008/07/20(日) 01:37:380561デフォルトの名無しさん
2008/07/20(日) 01:41:05int main(void)
{
int a;
scanf("%d",&a);
printf("%d",a);
}
こういうことでしょうか?
これだと
$ ./a.exe
a
4199268
こうなってしまうのですが・・・
0562デフォルトの名無しさん
2008/07/20(日) 01:42:080563デフォルトの名無しさん
2008/07/20(日) 01:45:00int main(void)
{
char a;
scanf("%c",&a);
printf("%d",a);
}
あ、これでできました。
ありがとうございました
0564553
2008/07/20(日) 01:45:56C言語初心者ですが、頑張ってgnu_lsのソース読んでみました。
そしたら、ガリガリファイル名使ってstat呼び出してました。
なんで、ないかもしれないです。なんで、フルパスとファイル名を
頑張って取得して作ってみます。ありがとうございました。
0565デフォルトの名無しさん
2008/07/20(日) 01:46:480566デフォルトの名無しさん
2008/07/20(日) 01:47:550567デフォルトの名無しさん
2008/07/20(日) 03:25:38オープンしたディレクトリにchdir(2)しとくといいよ。
0568デフォルトの名無しさん
2008/07/20(日) 15:05:07マージソートなどの領域計算量とはどのように求めればいいのでしょうか
お願いします
0569デフォルトの名無しさん
2008/07/20(日) 15:28:280570デフォルトの名無しさん
2008/07/20(日) 15:49:210571デフォルトの名無しさん
2008/07/20(日) 17:52:38印字ヘッドに起因しているらしいですが、ちょっとよくイメージできないので誰か教えてください。
0572デフォルトの名無しさん
2008/07/20(日) 17:56:12LF → 改行 → 下に移動
0573デフォルトの名無しさん
2008/07/20(日) 18:07:27印字ヘッドを右から左に動かすのに200msecかかるらしいのでその間の文字が
消失するようなことを聞いたのですが、テレタイプ自体知らないのでどういう風な構造で
動いているかまったくイメージ出来ないのです。ごめんなさい。
0574デフォルトの名無しさん
2008/07/20(日) 18:40:48まさか、タイプライターを見たことがないってことはないよね。
0575デフォルトの名無しさん
2008/07/20(日) 18:46:37ラインプリンタとか見ないしなー
0576デフォルトの名無しさん
2008/07/20(日) 18:57:540577デフォルトの名無しさん
2008/07/20(日) 20:31:22読み上げてもらった文章を紙と鉛筆で書きとめることを想像してみるんだ。
改行するときも休まず読み上げられたら追いつかないね。そういうときは読み上げる速度を落としてもらうか待ってもらうかするってことかな
0578デフォルトの名無しさん
2008/07/20(日) 20:55:40但し、バッファリングがないので「復帰」中のデータは取りこぼします。
ってところかな。
0579デフォルトの名無しさん
2008/07/20(日) 23:18:04iが奇数番号のときにprintf("奇数\n");としたいんだけど
どうすれば?
0580デフォルトの名無しさん
2008/07/20(日) 23:19:190581デフォルトの名無しさん
2008/07/20(日) 23:27:260582デフォルトの名無しさん
2008/07/20(日) 23:30:29間違ってるぞw
0583デフォルトの名無しさん
2008/07/20(日) 23:34:040584デフォルトの名無しさん
2008/07/20(日) 23:44:50if(!(i&1))だな
0585デフォルトの名無しさん
2008/07/20(日) 23:58:020586デフォルトの名無しさん
2008/07/21(月) 00:00:18さらに間違っててワロタww
0587デフォルトの名無しさん
2008/07/21(月) 00:07:270588デフォルトの名無しさん
2008/07/21(月) 00:11:250589デフォルトの名無しさん
2008/07/21(月) 00:12:520590デフォルトの名無しさん
2008/07/21(月) 00:14:26if ( ( i & 1 ) == 1 ) { printf("奇数\n"); }
としておけば間違いない。
0591デフォルトの名無しさん
2008/07/21(月) 00:16:200以外は真
0592デフォルトの名無しさん
2008/07/21(月) 00:28:480593デフォルトの名無しさん
2008/07/21(月) 00:31:270594デフォルトの名無しさん
2008/07/21(月) 01:30:19プログラムかいてて
中クリックして変なとこにコピペしたことある?
0595デフォルトの名無しさん
2008/07/21(月) 01:40:260596デフォルトの名無しさん
2008/07/21(月) 08:51:260597デフォルトの名無しさん
2008/07/21(月) 10:11:460598デフォルトの名無しさん
2008/07/21(月) 10:17:29現実には、倍でないといけないという決まりはないけどね。
0599デフォルトの名無しさん
2008/07/21(月) 12:02:15多重定義でエラーにしてくれないなら意味がないように思いますが。
0600デフォルトの名無しさん
2008/07/21(月) 12:08:57externをつけた場合とつけない場合で変数の場合は挙動が変わるのだから意味があるのさ。
関数の場合? しらねw
0601デフォルトの名無しさん
2008/07/21(月) 12:20:19分割コンパイルの時しかツカワネ
0602デフォルトの名無しさん
2008/07/21(月) 12:21:25変数の挙動の違いについて教えてください。
忘れましたが、グローバル変数の話です。
GCC 4.1.2では同じ名前のグローバル変数を定義しても
リンク時にエラーにならないのですが。
0603デフォルトの名無しさん
2008/07/21(月) 13:08:460604デフォルトの名無しさん
2008/07/21(月) 13:22:43externをつけて宣言した識別子は、外部識別子であって、実体を伴わない。
つまりその実体は必ずどこか別のソースファイルで
外部識別子として定義されているはずだということを意味する。
externをつけずに宣言した外部識別子は、他に同じ外部識別子がなければ
実体定義として扱われる。externのない複数の同じ識別子の宣言は
そのうち一つだけが実体として扱われる。
0605デフォルトの名無しさん
2008/07/21(月) 14:00:41それがエラーにならないのはgccやUinx系の古いコンパイラだけ。
gccだと--fno-commonでエラーにできるはず。
0606デフォルトの名無しさん
2008/07/21(月) 14:25:59複数の文字列を配列として扱うためには
配列名を定義するときにポインタを付けなきゃいけないのですか?
もしそうならその理由も教えてくらさい
0607デフォルトの名無しさん
2008/07/21(月) 14:37:030608デフォルトの名無しさん
2008/07/21(月) 14:39:34そういうことはないと思いますが、なにを想定しているのかCで書いていただくと、意図がこちらにも伝わりやすいかと。
0609デフォルトの名無しさん
2008/07/21(月) 14:41:46char *q = "fuga";
char *str[] = {p, q};
こういうことだと思うが。
まあ文字列を格納している配列のアドレスを格納するための配列だからポインタが付くんだろ
0610606
2008/07/21(月) 14:44:58char *str[] = {”hoge”, "fuga"};
としても同じことなのですか?
もしそうならなぜ同じになるのかも教えてくらさい
0611デフォルトの名無しさん
2008/07/21(月) 14:48:260612デフォルトの名無しさん
2008/07/21(月) 14:49:07p = "hoge";
char *str[1];
str[0] = "fuga";
わかりやすく書くとこういう感じ。
0613デフォルトの名無しさん
2008/07/21(月) 14:53:57どう違うと思うのかかいてみれ
0614デフォルトの名無しさん
2008/07/21(月) 14:56:13char *p = "string";
って書けばメモリ空間上のどこかに 's','t','r','i','n','g','\0' がこの順で格納される領域が(実はコンパイル時に)生成され、
しかもこの領域の先頭アドレスが p に格納されるわけです。
char *p[]={"abc", "xyz"}
も同じこと。
"abc" とかけば、その「値」は、どこぞに格納されている"abc"の先頭アドレスになる、ということでしょうか。
こんなトリッキーな書き方があります。
printf("%c\n","abcdefg"[3]);
printf("%p\n", "abcdefg");
実際にためしてくだされば理解がはやいと。
0615606
2008/07/21(月) 14:59:430616デフォルトの名無しさん
2008/07/21(月) 15:00:210617デフォルトの名無しさん
2008/07/21(月) 15:50:010618デフォルトの名無しさん
2008/07/21(月) 23:47:270619デフォルトの名無しさん
2008/07/22(火) 02:21:40リアルでお聞きになったのですか?お年がわかるような気が‥‥‥
0620デフォルトの名無しさん
2008/07/22(火) 03:09:09�@char c[][5] = {"hoge", "piyo"};
�Achar *c[] = {"hoge", "piyo"};
�Bchar **c = {"hoge", "piyo"};
これらはどこが違うんですか?�Bはエラーになりますよね
────────────────────────────────────────
char **pp;
pp = c;
こういう風にできないのはなぜでしょう?�@はエラーになりますよね
────────────────────────────────────────
char *c[] = {"hoge", "piyo"};
char **pp;
pp = c;
�@printf("%s", &pp);
�Aprintf("%s", pp[0]);
────────────────────────────────────────
この�Aが正しいのは直感的に分かるのですが、�@がおかしなことになるのは何故でしょう?
&ppは「ポインタのポインタ」の所持する値(アドレス)のポインタ(アドレス)を指し、
そのアドレスは"hoge"の先頭だと思っていたのですが。
どうも理解していたつもりが、全然理解できていなかったようです。
0621デフォルトの名無しさん
2008/07/22(火) 03:31:20�@は、要素が 5 の char の配列の配列を宣言して、それを {"hoge", "piyo"} で初期化している。
ここでコンパイラは自動的に、省略した最初の添字を初期化要素の数から 2 と決定し、
c は c[0][0] から c[1][4] までの 10 の要素を持つ二次元配列となる。
このとき c の各要素には、
[h][o][g][e][\0]
[p][i][y][o][\0]
という値が格納される。
�Aは、char へのポインタの配列を宣言して、それを {"hoge", "piyo"} で初期化している。
やはりコンパイラは自動的に、配列の要素数を 2 と決定し、c[0] と c[1] は、
コンパイラによってどこかに用意された "hoge" "piyo" という文字列をそれぞれ指すように初期化される。
�Bで宣言しようとしているものは char へのポインタへのポインタである。このとき c はただ一つの char ** 要素しか持たない。
よって、"hoge" "piyo" という二つの文字列(この場合は char * 型の値として扱われる)要素で初期化することは、
型の点でも数の点でもできない。
>>620 下
pp[0] は pp の指しているオブジェクト(正確には pp の指している場所から数えて 0 番目の場所にあるオブジェクト)を返す。
pp が 指しているのは c の先頭要素であり、これは char * である。だから %s で出力できる。
&pp は、pp の指しているオブジェクトでもその更に先にあるオブジェクトでもなく、常に pp へのポインタを返す。
そしてそれは char *** である。%s で出力できるわけがない。
0622デフォルトの名無しさん
2008/07/22(火) 03:40:39>>620 中
上で書いたように、�@で宣言した c は配列( char [5] )の配列( char [2][5] )である。
この c は(いくつかの例外はあるが)大抵の場合その先頭要素へのポインタとして扱われる。
つまり、ここで c は配列へのポインタになる。pp はポインタへのポインタである。だから pp に c は代入できない。
0623デフォルトの名無しさん
2008/07/22(火) 03:54:34丁寧にありがとうございます。よく分かりました。
なんとなくポインタとアドレス、宣言と初期化がごっちゃになっていた気がします。
配列とポインタは似たようなもの、と覚えたものの、細かいところまで理解していないと良くないですね。
一番下についてはただの勘違いでした。
&ppじゃなくて*ppですね……。
0624デフォルトの名無しさん
2008/07/22(火) 03:59:27ポインタが配列の要素を指すことがあることと、
配列が先頭の要素へのポインタとなることがあるだけで、
それぞれはまったく違うものだということを理解しよう
0625デフォルトの名無しさん
2008/07/22(火) 16:52:51配列がすぐポインタになってしまうことを理解できれば全てわかる
逆に言うと大抵の入門書ではここをちゃんと教えない
0626デフォルトの名無しさん
2008/07/22(火) 16:54:07ところでprintf(3)とscanf(3)のフォーマット指定子についてですが、
printf(3)で浮動小数点数を表示する場合doubleでもfloatでも「%f」を
使用しますが、scanf(3)の場合はなぜ「%lf」と「%f」がそれぞれあるのですか?
0627デフォルトの名無しさん
2008/07/22(火) 16:57:04なにこの痛い宣言
0628デフォルトの名無しさん
2008/07/22(火) 16:58:120629デフォルトの名無しさん
2008/07/22(火) 17:01:03printfが受け取るのは値で、これはいつもdoubleに格上げされる
一方scanfが受け取るのは値を納める変数へのポインタで、
その先にある領域の大きさは当然floatとdoubleでは違う
0630627
2008/07/22(火) 17:02:01そりゃ精度の問題じゃないの?
なんでそうやって分かれるかの歴史的いきさつは知らんけど。
0631デフォルトの名無しさん
2008/07/22(火) 18:17:510632デフォルトの名無しさん
2008/07/22(火) 19:59:27カーニハンという人による入門書にはちゃんと書いてたぞ。
0633デフォルトの名無しさん
2008/07/22(火) 20:16:18float型で引数を渡そうとするとdouble型に格上げされるという規則がある。
なんでそうなったのかの歴史的いきさつは知らんけど。
0634デフォルトの名無しさん
2008/07/22(火) 21:28:27intへの格上げの方は、当時のハードウェア、現在のハードウェアのいずれにおいても妥当かなと思えるが、doubleへの格上げは
0635デフォルトの名無しさん
2008/07/22(火) 22:19:52K&Rは入門書ですか?
0636デフォルトの名無しさん
2008/07/22(火) 22:23:410637デフォルトの名無しさん
2008/07/22(火) 23:11:15if(条件){
func2(data):
}
処理
}
void func2(DATA data)
処理
func(data);
}
DATAは構造体です。
mainでfuncを呼んで、条件にひっかかったら、func2を呼んで処理したあと、funcを呼びなおしています。
これだとfunc処理が2回行われてしまうんですが・・・
改善するにはどうしたらいいですか?
0638デフォルトの名無しさん
2008/07/22(火) 23:15:55void func(DATA data)
{
if(条件){
func2(data):
}
処理
}
void func2(DATA data)
{
処理
}
これじゃいけない理由っていうのは「処理」の部分に隠れているのかな?
0639デフォルトの名無しさん
2008/07/22(火) 23:18:56そうしようと思ったんですが、
funcで渡したdataをfunc2で処理しても、func内だと処理される前と変わらないんですよね・・・
0640デフォルトの名無しさん
2008/07/22(火) 23:18:58ただ、DATA型の変数dataがfuncで処理するのが不味い形で
func2で修正するというのならば
void func(DATA data)
{
while(条件)| /* 条件を満たすまで修正する */
func2(&data):
}
処理
}
void func2(DATA *data)
{
処理
}
にするとか?
まあどんなソースかさっぱり分からんからなんとも言えない
0641デフォルトの名無しさん
2008/07/22(火) 23:24:44すいません
0642デフォルトの名無しさん
2008/07/22(火) 23:30:581つ聞かせてください。
この構造体の中身を渡すのに
function(data);
int function(DATA *data){
}
みたいになってます。これはどういう事なんですか?アドレス function(&data)みたいに渡してdataの内容を書き換えて戻ってくる
みたいに書けません。
他人の書いたスパゲティコードなのでかなりくるしんでます;
0643デフォルトの名無しさん
2008/07/22(火) 23:33:29呼び出し元でdataがどう宣言されてるのか分からないし
もしかして配列として宣言されてるなら、そう言う書き方も出来るし
0644デフォルトの名無しさん
2008/07/22(火) 23:35:400645デフォルトの名無しさん
2008/07/22(火) 23:37:01上のdataはポインタじゃないのか?
0646デフォルトの名無しさん
2008/07/22(火) 23:38:07とりあえず大元のfuncとfunc2はヘタすると無限再帰して落ちるだろうことはわかった
0647デフォルトの名無しさん
2008/07/22(火) 23:40:07signed short l;
signed short r;
}P1;
typedef struct{
unsigned short count;
unsigned long datanum;
unsigned short bit;
P1 *pattern1;
}DATA;
こんな感じなんですが
0648デフォルトの名無しさん
2008/07/22(火) 23:41:07処理の全体像が見えないと答えようがないと言ってるんだ
0649デフォルトの名無しさん
2008/07/22(火) 23:42:18問題を見せずに答え教えてくれといってるようなもんだぞ
0650デフォルトの名無しさん
2008/07/22(火) 23:42:19とか
DATA data[1]
とかになってるんじゃないのか?
0651デフォルトの名無しさん
2008/07/22(火) 23:42:30|unsigned long datanum;
|unsigned short bit;
ここで既にお察しくださいだな・・・
0652デフォルトの名無しさん
2008/07/22(火) 23:43:460653デフォルトの名無しさん
2008/07/22(火) 23:45:030654デフォルトの名無しさん
2008/07/22(火) 23:46:340655デフォルトの名無しさん
2008/07/22(火) 23:46:46全くといっていいほど理解していません。適当なサイトとか教えてもらえたらうれしいです
0656デフォルトの名無しさん
2008/07/22(火) 23:46:58お前さんの持ってるソースの目的など誰もわからない
一方でそれが業務ソースだとしたらそれをそのまま出した場合に
もし万が一何らかの問題が起きたらお前の責任問題になる
要するにこの問題をこのスレで解決するには
お前があくまでもアマチュアであるか、
あるいは自分の言葉で問題を的確に説明できる必要がある
0657デフォルトの名無しさん
2008/07/22(火) 23:48:04黙ってK&RとCFAQを読む
0658デフォルトの名無しさん
2008/07/22(火) 23:49:100659デフォルトの名無しさん
2008/07/23(水) 00:01:040660デフォルトの名無しさん
2008/07/23(水) 00:02:490661デフォルトの名無しさん
2008/07/23(水) 00:03:090662デフォルトの名無しさん
2008/07/23(水) 00:04:05data->hoge
ですよね?それは知ってます
0663デフォルトの名無しさん
2008/07/23(水) 00:04:25みたいな感じ。
タイプ数を減らしたければ -> を使えばいいけど、きみにままだ早すぎる。
0664デフォルトの名無しさん
2008/07/23(水) 00:06:31誰かそれを俺に教えてくれ
0665デフォルトの名無しさん
2008/07/23(水) 00:14:050666デフォルトの名無しさん
2008/07/23(水) 00:15:00関数内で書き換えるコードはかけるんですが、
参照渡ししてるのに元の関数で値を表示すると書き換わっていないのです
0667デフォルトの名無しさん
2008/07/23(水) 00:18:050668デフォルトの名無しさん
2008/07/23(水) 00:18:190669デフォルトの名無しさん
2008/07/23(水) 00:22:05constがついている程度なら警告は出るだろうが、書き換えはできるよ。
0670デフォルトの名無しさん
2008/07/23(水) 00:23:010671デフォルトの名無しさん
2008/07/23(水) 00:25:06書き換えは鼻から悪魔的な行為じゃなかったけか
0672デフォルトの名無しさん
2008/07/23(水) 00:25:37どうもすいません。構造体の宣伝が Data *dataとなっているんですが、
これはポインタの宣言ですよね?
0673デフォルトの名無しさん
2008/07/23(水) 00:27:45ポインタの宣言ですね。
0674デフォルトの名無しさん
2008/07/23(水) 00:28:370675デフォルトの名無しさん
2008/07/23(水) 00:28:58毎回同じ中身で初期化/生成していた可能性があるな。
0676デフォルトの名無しさん
2008/07/23(水) 00:29:020677デフォルトの名無しさん
2008/07/23(水) 00:29:220678デフォルトの名無しさん
2008/07/23(水) 00:29:280679デフォルトの名無しさん
2008/07/23(水) 00:29:450680デフォルトの名無しさん
2008/07/23(水) 00:31:34int a;
この宣言の意味を正確に答えられたら教えてやるよw
0681デフォルトの名無しさん
2008/07/23(水) 00:34:28定義
0682デフォルトの名無しさん
2008/07/23(水) 00:37:34int型の変数名aという場所を確保ですか?
0683デフォルトの名無しさん
2008/07/23(水) 00:46:031.自分の技量が足りないんだと諦める
2.他人の書き方が悪いんだと諦める
3.自分の技量が足りないので該当ソースに追いつくようひとまず置いて勉強する
4.他人の書き方が悪いんだろうというので解決策を探る
俺は1
0684デフォルトの名無しさん
2008/07/23(水) 00:50:31構造体をそこらじゅうにコピーすると、メモリと処理時間がもったいないからです。
だからアドレスだけ受け渡しする。
、、、という側面もあります。
0685デフォルトの名無しさん
2008/07/23(水) 00:57:190686デフォルトの名無しさん
2008/07/23(水) 07:07:48偽装したいファイル(バイナリ?)の0と1を反転させるだけのアプリを作りたいんですけど
何行くらいで書けそうですか?
0687デフォルトの名無しさん
2008/07/23(水) 07:07:57http://pc11.2ch.net/test/read.cgi/tech/1216759614/
0688デフォルトの名無しさん
2008/07/23(水) 07:39:530689デフォルトの名無しさん
2008/07/23(水) 07:52:42cmd.exeでは不可能
command.comなら可能
0690デフォルトの名無しさん
2008/07/23(水) 08:01:27command.com上で動かすことを前提にお話しますが
printf("\x1b[31mこんにちは\x1b[m\n");
で表示できますか?
0691デフォルトの名無しさん
2008/07/23(水) 08:05:370692デフォルトの名無しさん
2008/07/23(水) 08:06:530693デフォルトの名無しさん
2008/07/23(水) 11:11:47要望の物なら14行で書けた
別の言語で更にパス認証あり
ファイルの自動認証ありのプログラム組んだがソース無くした事に気づいた…
0694デフォルトの名無しさん
2008/07/23(水) 11:19:530695デフォルトの名無しさん
2008/07/23(水) 11:27:54俺はこれが限度だな
0696デフォルトの名無しさん
2008/07/23(水) 11:36:450697デフォルトの名無しさん
2008/07/23(水) 11:39:560698デフォルトの名無しさん
2008/07/23(水) 11:46:040699デフォルトの名無しさん
2008/07/23(水) 11:46:10int main(c,v)char**v;{if(*++v&&!freopen(*v,"rb",stdin))return-1;if(*++v&&!freo\
pen(*v,"wb",stdout))return-1;while((c=getchar())-EOF)putchar(~c);return 0;}
3行にしかならんお…
0700デフォルトの名無しさん
2008/07/23(水) 12:14:570701デフォルトの名無しさん
2008/07/23(水) 12:20:030702デフォルトの名無しさん
2008/07/23(水) 12:24:21プログラム終了時にcloseされるよ。
0703デフォルトの名無しさん
2008/07/23(水) 12:28:490704デフォルトの名無しさん
2008/07/23(水) 13:24:44fscanf(fdataB,"%f,%f,%f,%f,%f",&b1,&b2,&b3,&b4,&b5);
として、5列のcsvファイルを取り込みました。
b1,b2,b3,b4,b5
の順に出力したいのですが、
b2,b3,b4,b5,b1
という風にずれてしまいます。
原因がわかりません。
よろしくお願いします。
0705デフォルトの名無しさん
2008/07/23(水) 13:26:23csvファイルうp
0706704
2008/07/23(水) 13:27:16-18,28,117,32,327
27,30,117,34,327
-20,28,116,32,327
27,28,115,32,327
-18,28,115,30,327
27,29,116,31,327
-17,28,116,30,327
27,30,116,30,327
-17,27,117,31,327
28,28,117,30,327
-17,27,117,32,327
お願いします
0707デフォルトの名無しさん
2008/07/23(水) 13:32:25下記のコードだと問題ない
問題が再現するコードうp
#include<stdio.h>
int main(void){
float b1, b2, b3, b4, b5;
FILE *fp;
char *filename="a.csv";
fp=fopen(filename, "r");
if(!fp) return 1;
while(fscanf(fp,"%f,%f,%f,%f,%f",&b1,&b2,&b3,&b4,&b5)==5){
printf("%f,%f,%f,%f,%f\n",b1,b2,b3,b4,b5);
}
fclose(fp);
return 0;
}
0708704
2008/07/23(水) 14:13:51#include <iostream.h>
#include <math.h>
void main()
{
float bEcg[1024],bx[1024],by[1024],bz[1024],bTa[1024];
float b1,b2,b3,b4,b5;
FILE *fdataB;
if ((fdataB = fopen("test.csv", "r")) == NULL) {
printf("file open error!!\n");
exit(EXIT_FAILURE);}
for (i=0;i<LINE_MAX;i++){
fscanf(fdataB,"%f,%f,%f,%f,%f",&b1,&b2,&b3,&b4,&b5);
bEcg[i]=b1; bx[i]=b2; by[i]=b3; bz[i]=b4; bTa[i]=b5; }
fclose(fdataB);
for (i=0;i<20;i++){cout << bx[i] << '\t' << by[i] << '\t' << bz[i] << '\n';}
}
0709デフォルトの名無しさん
2008/07/23(水) 14:16:03| | < それはC++です
\_/
_| |_
| |
0710704
2008/07/23(水) 14:16:25その後データを利用するので、配列に格納後に出力しています。
0711デフォルトの名無しさん
2008/07/23(水) 14:23:550712デフォルトの名無しさん
2008/07/23(水) 14:25:28値を表示する部分の順番がおかしいんじゃね?
てか、bx, by, bzの三つしか無いけど。
0713704
2008/07/23(水) 14:29:29実際は、by,bz,bEcgが表示されてしまいます。
csvに出力した場合も、一行ずれてしまいます。
>>709さん
すいませんc++です
0714デフォルトの名無しさん
2008/07/23(水) 14:31:350715704
2008/07/23(水) 14:43:14一行一列目のみ飛ばされてそこからずれています。
そのせいで全部が一行ずれてしまっています。
昨日はうまくいってたのですが、今日プログラムを動かしてみたらズレルようになっていました。
以前にもこのようなことがあったのですが、全く弄っていないので原因がわかりません。
0716デフォルトの名無しさん
2008/07/23(水) 14:53:280717デフォルトの名無しさん
2008/07/23(水) 14:55:090718デフォルトの名無しさん
2008/07/23(水) 14:55:15頭になんかゴミでもあるんじゃないの?BOMとか
0719デフォルトの名無しさん
2008/07/23(水) 14:59:19俺の環境では普通に動いたよ。
0720デフォルトの名無しさん
2008/07/23(水) 15:17:41ほかの言語をどうやってCに取り込んで使うの?
0721デフォルトの名無しさん
2008/07/23(水) 15:20:380722デフォルトの名無しさん
2008/07/23(水) 15:22:260723デフォルトの名無しさん
2008/07/23(水) 15:29:30ばかおつ
0724デフォルトの名無しさん
2008/07/23(水) 15:53:21b2に3列目、b3に4列目が入ったあとb4に1列目が入るってのは妙だな…
本当にファイル正しいか?2バイトコード入ってたりしないか?
0725704
2008/07/23(水) 16:07:31ありがとうございました。
別の方法を考えてみます。
またお世話になることがあると思いますが、
そのときはよろしくお願いします。
0726デフォルトの名無しさん
2008/07/23(水) 16:57:30void *p = &n;
printf("%d\n", *(int*)p);
printf("%d\n", (int*)*p);
の違いがよく分かりません。
教えてください。
0727デフォルトの名無しさん
2008/07/23(水) 17:10:11voidポインタは逆参照できない
0728デフォルトの名無しさん
2008/07/23(水) 17:22:47全部pから順に右へ結合する
上はvoid *をint *にキャストしてからその実体を参照している
下はvoid *の指している実体参照してからそれをint *にキャストしようとしている
しかしvoid *はその先に何もない(位置だけを記憶している)という意味なのでそもそも参照できないし
もしもし仮にint型の実体を参照できたとしてもそれをint *にキャストするのは間違っている
0729デフォルトの名無しさん
2008/07/23(水) 17:34:03Cの演算子は識別子(この場合p)から順番に隣へ(右か左かは場合によるがこの場合は左にしかないので左へ)結合していく
だから*(int*)pはまず(int*)pが評価されてそのあと*が結合する
(int*)pはpの持っているvoidへのポインタの値をintへのポインタの値に変換しますよという意味
すると次に、そのintへのポインタの値に*が結合して、これはintへのポインタの値が指し示しているint変数を参照しますよという意味
だからこの場合*(int*)pはnと書いたのと同じになる
同様に(int*)*pと書いたらまず*pが評価されてそのあと(int*)が結合する
*pは、pの値が指し示している「もの」を参照しますよという意味だが、
ここでpはvoid*なのでその「もの」がない、のでエラーになる
0730デフォルトの名無しさん
2008/07/23(水) 21:17:38hoge.txt
40
212
252
889
FILE *fp;
if(fopen_s(&fp, filename, "r")){
printf("%s が見つかりません\n",filename);
return;
}
for(i=0;i<4;i++){
fscanf(fp,"%d",data[i]);
}
data[0]=40 data[1]=212 みたいに読み込ませたいんですが、うまくいかないんです。どうしてですか?
0731デフォルトの名無しさん
2008/07/23(水) 21:22:16ソース見れば分かる人は分かるかもしれんが労力は減らしたほうがいいだろう
0732デフォルトの名無しさん
2008/07/23(水) 21:25:20おそらく fscanf で & が抜けてる
0733デフォルトの名無しさん
2008/07/23(水) 21:27:58うっかりみすでした。&をつけたらうまくいきました。
これで問題はありませんか?EOFの処理とか考えなくてOKっすか?
0734デフォルトの名無しさん
2008/07/23(水) 21:30:48問題があるかどうかそれを判断できるだけの情報を持っているのはあなただけですw
0735デフォルトの名無しさん
2008/07/23(水) 22:15:53文字の間に改行が入った文字列を改行なしの文字列にしたいのですが、
例:abcd\nあいうえ→abcdあいうえ
どうやったら出来るでしょうか?
よろしくお願いします。
0736デフォルトの名無しさん
2008/07/23(水) 22:17:240737デフォルトの名無しさん
2008/07/23(水) 22:33:41strtokで\nを元に区切る
0738デフォルトの名無しさん
2008/07/23(水) 22:39:20ありがとうございます。
strtokは試してみたのですが、その後一つの文字列に戻す方法がわからないのですorz
0739デフォルトの名無しさん
2008/07/23(水) 22:47:230740デフォルトの名無しさん
2008/07/23(水) 22:49:53{
char ch;
while ((ch = *str++) != '\0') {
if (ch != '\n')
*res++ = ch;
}
*res = '\0';
}
0741デフォルトの名無しさん
2008/07/23(水) 23:10:50char *data[2];
data[0] = strtok(buf,"\n");
data[1] = strtok(NULL, "\n");
delNewline(data[0], data[1]);
printf("%s",data[0]);
このようにやってみましたがうまくいきません、、。
どこが間違っているのでしょうか?何度も質問すみません;
0742デフォルトの名無しさん
2008/07/23(水) 23:18:03data = (char *)malloc(ほにゃほにゃ);
0743デフォルトの名無しさん
2008/07/23(水) 23:21:29char *s = "aaaa\nzzz\nppp"; // 処理対象の文字列
char res[100]; // 処理結果を入れる領域(処理対象の文字列以上の長さが必要)
delNewline(s, res); // これで res に改行が削除された文字列が入る。
printf("%s\n", res); // aaazzzppp と出力される。
>>740 は動作確認もしてないからバグってるかもしれんけど
0744デフォルトの名無しさん
2008/07/23(水) 23:35:15しかし、これ以上ご迷惑をかけられないので後は自分で頑張ることにしますorz
ありがとうございました。
0745デフォルトの名無しさん
2008/07/23(水) 23:54:22dataは「ポインタの配列」で配列の中でポインタ先のアドレスが必要
配列の中のポインタは有効なアドレスを持っていないので
>742のようにメモリを確保しなければならない
下記は別の方法だが、dataをポインタとして宣言してメモリを確保
strtokを使って随時ゲットしていく
int sizebuf = sizeof(char)*(sizeof(buf)+1);
char *data = memcpy(malloc(sizebuf), "\0", sizebuf);
char *slice = strtok(buf, "\n");
do{
strcat(data, slice);
} while(slice = strtok(NULL, "\n"));
0746デフォルトの名無しさん
2008/07/24(木) 00:37:10void main()
{
char *str = "地震キタ Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒(。A。)!!!"
while(1)
{
printf("%s\n", str);
}
}
0747デフォルトの名無しさん
2008/07/24(木) 08:10:350748デフォルトの名無しさん
2008/07/24(木) 08:12:400749デフォルトの名無しさん
2008/07/24(木) 09:56:31{
while(*s++ = *t++)
;
}
このプログラムってナル文字がコピーされて式が評価されたときに偽になるのですか?
ナル文字の値は0ですからね。
ということはそれぞれのポインタはこのループが終わった後ナル文字の次を指しているということですか?
0750デフォルトの名無しさん
2008/07/24(木) 10:14:33そうだね
俺は代入式の評価のときは( )を余分につけるのが趣味
while((*s++ = *t++))
0751デフォルトの名無しさん
2008/07/24(木) 10:17:20そうした方がいいかもしれませんね。
GCCで-Wallスイッチを付けてコンパイルしたら警告が出ましたし。
多分プログラマの意図と違うんじゃないかってことを知らせているのですね。
0752デフォルトの名無しさん
2008/07/24(木) 10:21:20の間違いじゃないですかといいたいんだと思う
間違いじゃないなら( )つけろよ
って感じ
0753デフォルトの名無しさん
2008/07/24(木) 10:24:31> ナル文字がコピーされて
0754デフォルトの名無しさん
2008/07/24(木) 10:37:44環境によっては警告出るのね。完全に趣味の問題だと思ってた
0755デフォルトの名無しさん
2008/07/24(木) 10:38:100756デフォルトの名無しさん
2008/07/24(木) 10:39:02残されるって聞きますけど、ストリームって緩衝領域みたいなのがあるんですか?
0757デフォルトの名無しさん
2008/07/24(木) 10:40:45いや、それが昔からのlintで警告を消す方法なんだよ
0758デフォルトの名無しさん
2008/07/24(木) 10:44:24病院の待合室みたいな感じじゃね?
scanfでループさせると終わらなくなるのは
「数字さーん、数字さーん、お入りくださーい…あれ?」
「まだ待合室には人がいるわね」
「数字さーん、数字さーん、お入りくださーい…あれ?」
以下略
ってのが繰り替えされるからじゃないかとナース好きの俺の妄想
0759デフォルトの名無しさん
2008/07/24(木) 11:39:40いや、それだと順番無視して数字さんが入ってしまうからダメ。
寧ろ、こっちのイメージ。
「はい、次の人どうぞ。
……ダメダメ、あんた数字じゃないだろ。次は数字の番なんだ」
以下同様に
0760デフォルトの名無しさん
2008/07/24(木) 12:02:130761デフォルトの名無しさん
2008/07/24(木) 15:30:340763デフォルトの名無しさん
2008/07/24(木) 15:43:040764デフォルトの名無しさん
2008/07/24(木) 15:44:500765デフォルトの名無しさん
2008/07/24(木) 15:45:410766デフォルトの名無しさん
2008/07/24(木) 15:48:00間違いじゃないかと推測したことが間違いだったから涙目wwww
0767デフォルトの名無しさん
2008/07/24(木) 15:49:350768デフォルトの名無しさん
2008/07/24(木) 15:49:530769デフォルトの名無しさん
2008/07/24(木) 15:50:07おまえは
どうしようも
ないな
0770デフォルトの名無しさん
2008/07/24(木) 15:51:19何もおかしくない
0771デフォルトの名無しさん
2008/07/24(木) 15:52:410772デフォルトの名無しさん
2008/07/24(木) 15:53:180773デフォルトの名無しさん
2008/07/24(木) 15:54:29お手を触れないようお願い致します
0774デフォルトの名無しさん
2008/07/24(木) 15:54:32> while(*s++ == *t++)
==
0775デフォルトの名無しさん
2008/07/24(木) 15:55:43真偽=booleanは一連の流れの発端>749と掛けている
文章の出だしの「取り合えず」をローマ字表記すると
toriaezu
濁点を清音にするとtoriaesu
並び替えると i sao true
saoを英語的に読むとソゥ、ずばりsawである。
I saw true、私は真実が分かった、という文章になるのだ。
つまり「私の文章が分かったでしょう、本当は解説は不要です」という事だ
\何だってー/
Ω Ω Ω
0776デフォルトの名無しさん
2008/07/24(木) 15:57:050777デフォルトの名無しさん
2008/07/24(木) 15:57:370778デフォルトの名無しさん
2008/07/24(木) 16:02:40= と == の違いが分かっていてそれはないわw
0779デフォルトの名無しさん
2008/07/24(木) 16:03:040780デフォルトの名無しさん
2008/07/24(木) 16:05:25という話だろ、何の問題も無い。
0781デフォルトの名無しさん
2008/07/24(木) 16:05:390782デフォルトの名無しさん
2008/07/24(木) 16:05:57この警告を殺すには 代入式自体を () で囲む
0783デフォルトの名無しさん
2008/07/24(木) 16:06:44「whileの条件が代入文だが比較じゃないのか?」というのがコンパイラの警告なわけで、
それだけ見れば>752は間違っちゃいないんだ。
つまり、「間違いじゃないなら()つけろよ」ではなく
「代入で間違いないなら()で括っとけ」と書いていれば下らない煽りはなかっただろうと。
0784デフォルトの名無しさん
2008/07/24(木) 16:06:54NULL == p
とかいう記述をする奴もいるぐらいだしな
0785デフォルトの名無しさん
2008/07/24(木) 16:07:59あ、約一名は別に多くはないか
0786デフォルトの名無しさん
2008/07/24(木) 16:08:12ポインタの位置についてが質問者の一番の焦点だったわけで。
なのに、比較して一致しなかったらループを抜けるつもりなのか?っと
思い違いをして、括弧がどうとか言い出したから、あれ?ってなったんだが・・・
0787デフォルトの名無しさん
2008/07/24(木) 16:08:21それは国民の生活が楽になるように車一台国が用意するべき
ぐらい飛躍した話だな
>752はそこまで酷い記述でも無いし
引っかかったなら引っかかったで後で笑い話にでもすればいい
0788デフォルトの名無しさん
2008/07/24(木) 16:09:42お前は小学校からコツコツやりなおせ
0789デフォルトの名無しさん
2008/07/24(木) 16:11:40その話はとっくに終わっている
勘違いしてるのは お ま え
0790デフォルトの名無しさん
2008/07/24(木) 16:13:24なるほど、scanfの失敗の例え、ここに極まり
あとは色んな所にコピペするだけだ
0791デフォルトの名無しさん
2008/07/24(木) 16:13:25逆にそれ以外につながるべき文脈が>>750以前にはないだろうに
0792デフォルトの名無しさん
2008/07/24(木) 16:13:27>>752 は >>750-751 の流れで
「GCCで-Wallスイッチを付けてコンパイルしたら警告が出ましたし」
だけに関したトピックでしょ
0793デフォルトの名無しさん
2008/07/24(木) 16:14:030794デフォルトの名無しさん
2008/07/24(木) 16:17:45そーゆー使い方してる人だとピンと来ないんだろうなぁ
0796デフォルトの名無しさん
2008/07/24(木) 18:47:50恥ずかしくて荒らさずにいられなくなってしまったスレが、この辺にあると聞きました。
ここであってますか?
0797デフォルトの名無しさん
2008/07/24(木) 18:50:250798デフォルトの名無しさん
2008/07/24(木) 18:53:150799デフォルトの名無しさん
2008/07/24(木) 18:57:17一文にしたとたん意味が分からなくなる>>786の文才は凄いと思うよ
鬼才ってこういうのを言うんだと思う
0800デフォルトの名無しさん
2008/07/24(木) 19:01:01リアル鬼ごっこの著者とか、そういうタイプ
0801デフォルトの名無しさん
2008/07/24(木) 19:07:16勘違い必死だなw
0802デフォルトの名無しさん
2008/07/24(木) 19:09:41勘違い必死だなw
0803デフォルトの名無しさん
2008/07/24(木) 19:11:540804デフォルトの名無しさん
2008/07/24(木) 19:12:46必死だな
0806デフォルトの名無しさん
2008/07/24(木) 19:13:32(´,_ゝ`)オマエモナー
0807デフォルトの名無しさん
2008/07/24(木) 19:15:16↑あってると思うからなに言っても無駄だよ。ほっときなw
0808デフォルトの名無しさん
2008/07/24(木) 19:16:030809デフォルトの名無しさん
2008/07/24(木) 19:16:45突っ込むならどこがどうおかしいか具体的に例示してくれ
それをせずに安価さすだけなら要らないよ意味が無いから
0810デフォルトの名無しさん
2008/07/24(木) 19:19:050811デフォルトの名無しさん
2008/07/24(木) 19:25:32752 名前:デフォルトの名無しさん[sage] 投稿日:2008/07/24(木) 10:21:20
while(*s++ == *t++)
の間違いじゃないですかといいたいんだと思う
間違いじゃないなら( )つけろよ
って感じ
0812デフォルトの名無しさん
2008/07/24(木) 19:28:47> ナル文字がコピーされて式が評価されたときに
whileの中は代入だと分かる決定的な証拠、発言があるのだが
どうして評価だと思ったのか?まぁ、とりあえず
>>752 が必死だなってことで、今日の所はこれくらいにしてやって、お前らw
もう >>752 のHPは0よ、これ以上やったら教会に連れて行っても
神父さんは蘇生させてはくれないわっ!
ドラゴンボール集めも大変なんだからw
0813デフォルトの名無しさん
2008/07/24(木) 19:30:310814デフォルトの名無しさん
2008/07/24(木) 19:31:55もうすでに何度も蘇生経験済みだよ
0815デフォルトの名無しさん
2008/07/24(木) 19:33:00盛大に吹いた
0816デフォルトの名無しさん
2008/07/24(木) 19:34:28「コンパイラにしてみれば」
while(*s++ == *t++)
の間違いじゃないですかといいたいんだと思う
間違いじゃないなら「真偽値として扱っていることを明示するために」( )つけろよ
って感じ
>>812
>>749-752のながれをちゃんとよもう。
0817デフォルトの名無しさん
2008/07/24(木) 19:36:00Cマガに取り上げられてまで叩かれた私はどうなるのでしょう?
0818デフォルトの名無しさん
2008/07/24(木) 19:37:15評価式のところに代入式を書いてしまうミスが多かったから
評価式の間違いじゃないの?って警告を出すようになったんだよ
0819デフォルトの名無しさん
2008/07/24(木) 19:37:32アホはお前
0820デフォルトの名無しさん
2008/07/24(木) 19:39:11今日のところはこれくらいで勘弁してくださいw逆にw
0821デフォルトの名無しさん
2008/07/24(木) 19:39:500822デフォルトの名無しさん
2008/07/24(木) 19:40:49衆人環視の中「人体切断、イリュージョンで復活」みたいなw
どっちかといえば切断されっぱなしのままか
0823デフォルトの名無しさん
2008/07/24(木) 19:43:04業界に入ってくるつもりがあるならそれまでに理解できるようになっててね
0824デフォルトの名無しさん
2008/07/24(木) 19:49:420825デフォルトの名無しさん
2008/07/24(木) 19:51:01>>749
> ナル文字がコピーされて式が評価されたときに
0826デフォルトの名無しさん
2008/07/24(木) 19:51:17現在のファイルサイズを越えて書き込もうとするとバスエラーに
なります。writeを使って無意味な文字を書き込んでファイルの
領域を確保すると上手くいくんですが、他に何か方法ってありませんか?
0827デフォルトの名無しさん
2008/07/24(木) 19:51:50まだ四面楚歌だということに気づいてなかったの?
ずいぶん長いカラオケやっちゃってんだなぁ
0828デフォルトの名無しさん
2008/07/24(木) 19:51:51コードも 日本語も 理解できないお馬鹿さーんw
>>823 とっとと業界から失せろよw
0829デフォルトの名無しさん
2008/07/24(木) 19:52:50> GCCで-Wallスイッチを付けてコンパイルしたら警告が出ましたし。
0830デフォルトの名無しさん
2008/07/24(木) 19:55:20え、まさか業界に、いるの?
いやいやまさか>>752をバカにするという発想ができる人は業界にいるはずないよなw
いたらなんかの間違いだろwww
0831デフォルトの名無しさん
2008/07/24(木) 19:55:49ファビョんなゴミ
0832デフォルトの名無しさん
2008/07/24(木) 19:56:23スレ違い。よそいってやれ。
0833デフォルトの名無しさん
2008/07/24(木) 19:57:54while(*s++ == *t++) のように、比較して一致しなかったら
ループを終了したいのかな?しかし、質問者はそうではなく
*sにナル文字が代入されたときにループを抜けたいのなら、
while( (*s++ = *t++) ) という感じに
もう1つ括弧で括ったらどうかと?
ってかーんじ。
0834デフォルトの名無しさん
2008/07/24(木) 20:00:33どこから直したらいいのか分からんぐらいに壊れてるな
とりあえず出直せ。で、同様のコンパイラの警告を何度か受けて理解しな
0835デフォルトの名無しさん
2008/07/24(木) 20:05:040836752
2008/07/24(木) 20:06:23こんなの初めて
0837デフォルトの名無しさん
2008/07/24(木) 20:09:56なんでわざわざ == と比較演算子にしちゃったん?(節子のAA略)
いや、もう最近の>>752って必死でしょ?
>>749
> ナル文字がコピーされて
質問者は代入されていることが分かっているのに、何で比較していると
勘違いしちゃったんですかっ!? ><;
0838デフォルトの名無しさん
2008/07/24(木) 20:11:32さっさと市ね
0839デフォルトの名無しさん
2008/07/24(木) 20:13:14だからコンパイラがそういう警告だすんだって
なんで>>749と>>752しか読まないの?
0840デフォルトの名無しさん
2008/07/24(木) 20:14:020841デフォルトの名無しさん
2008/07/24(木) 20:15:280842デフォルトの名無しさん
2008/07/24(木) 20:16:010843デフォルトの名無しさん
2008/07/24(木) 20:17:06というコードがあったとするよな。
これはiの値に関係なく真になるんだ。
しかし、これは if (i == true)のtypoである可能性が高いとコンパイラは判断するんだ。
なぜなら、真偽判定を行う部分で代入処理を行うことは少ないし、
それがtypoであった場合にコンパイルエラーにはならず、バグに気づかない可能性もある。
そのため、==なのではないか?という警告を出力するようになっている。
0844デフォルトの名無しさん
2008/07/24(木) 20:17:43バグではありません
仕様です
0845デフォルトの名無しさん
2008/07/24(木) 20:18:26ことあるごとにくりかえしくりかえし切断されまくって‥‥‥。
0846デフォルトの名無しさん
2008/07/24(木) 20:19:25まっとうなプログラマなら一度は見たことのある警告のはずだが
0847デフォルトの名無しさん
2008/07/24(木) 20:20:110848デフォルトの名無しさん
2008/07/24(木) 20:20:50OSは何?
0849デフォルトの名無しさん
2008/07/24(木) 20:24:29あるかもしれないし、ないかもしれない
Cは基本的なファイル操作関数を用意していてそれらが正しく動くことは保証するけれど、
その正しい動作が常にこちらの望む結果をもたらしてくれることまでは保証してくれない
(というかそんなことはできるはずがない)
メモリマップドIOなどの特殊なファイル操作に関する技はいつも環境依存である
環境についているマニュアルを読むこと
0850デフォルトの名無しさん
2008/07/24(木) 20:29:27>>750が説明しているのに、間違いじゃないか?なんて憶測で言ったがために
物議を醸してしまった罪は重い。早々に業界から立ち去れいっ
0851デフォルトの名無しさん
2008/07/24(木) 20:30:310852デフォルトの名無しさん
2008/07/24(木) 20:33:04お前が消えろ
0853デフォルトの名無しさん
2008/07/24(木) 20:33:56>>752には悪者になって欲しい、というふうに読んだ。
0854デフォルトの名無しさん
2008/07/24(木) 20:40:37ごめんなさい、環境はLinuxです。
0855デフォルトの名無しさん
2008/07/24(木) 20:49:52理論しってるのか、すごいな。
0856デフォルトの名無しさん
2008/07/24(木) 20:51:52現在のファイルサイズってどういう意味?
0857デフォルトの名無しさん
2008/07/24(木) 21:00:57過去のでも、未来のでもない、今の時点のファイルサイズという意味です。
0858デフォルトの名無しさん
2008/07/24(木) 21:04:37読解力をもう少し身につけよう
>>750で代入は式自体を括弧で囲むの趣味だといい
>>751では>>750に同意しつつ、そうしなかった場合の警告について言及している
>>752では>>751で出される警告に対して、コンパイラの判断についてコンパイラ自身の立場から推測している
0859デフォルトの名無しさん
2008/07/24(木) 21:08:10ちなみに、Windowsプログラム(?)の勉強も兼ねたいので
どっかの無名教授・研究者・マが作った凄くマイナーな独自ライブラリ(まるで宣伝みたいな)、
とくにWinAPI等を隠蔽したライブラリを使った開発は嫌です。(勉強にならなそうなので)
実務でより役に立ちそうな開発手段がいいです。
出来れば言語はCせめてC++がいいです。
0860826
2008/07/24(木) 21:08:35ごめんなさい、説明が悪かったです。
書き込み先のファイルの終端って事です。
例えば、300バイトしかないファイルや中身が空のファイルに
1000バイトの内容をメモリマップドファイルからSYNCして書こうとすると
バスエラーになってしまうんです。
今のところ、writeで無意味な文字列を書き込んで無理やりファイルサイズを
大きくし、そしてメモリマップドファイルから書き込んでそのエラーを回避して
るのですが・・・
0861デフォルトの名無しさん
2008/07/24(木) 21:14:17それで正しい。
0862デフォルトの名無しさん
2008/07/24(木) 21:17:15APIが隠蔽されてるのが嫌ならAPIを直接触れば良いじゃない
そうすればここじゃなくてWin32APIスレで質問するべき話になるし
0863デフォルトの名無しさん
2008/07/24(木) 21:22:12KanonもAirもときメモも一晩ありゃ作れた
http://www.amazon.co.jp/s/ref=nb_ss_gw?__mk_ja_JP=%83J%83%5E%83J%83i&url=search-alias%3Daps&field-keywords=%83A%83h%83x%83%93%83%60%83%83%81%5B%83Q%81%5B%83%80%83v%83%8D%83O%83%89%83%7E%83%93%83O
0865デフォルトの名無しさん
2008/07/24(木) 21:25:45http://www.amazon.co.jp/%E7%8C%AB%E3%81%A7%E3%82%82%E3%82%8F%E3%81%8B%E3%82%8B%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E7%8C%AB%E3%81%A7%E3%82%82%E3%82%8F%E3%81%8B%E3
%82%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E7%B2%82%E4%BA%95-%E5%BA%B7%E5%AD%9D/dp/4797333332/ref=pd_sim_b_2
0866デフォルトの名無しさん
2008/07/24(木) 21:26:57実務で役に立つような〜というのなら、ゲームで縛らず素直にWinAPI学べばいいと思う
まあ本格的なゲームになるとDirectXに移行したほうがいいけど、
それでもWinAPIの知識は必要になるし、やっておくにこしたことはない
0867デフォルトの名無しさん
2008/07/24(木) 21:28:38また、日付の比較もしたいですが、散々探して分かりませんでした。
すみませんが、教えてください。
0868デフォルトの名無しさん
2008/07/24(木) 21:30:14手元の本(はじめての486, 蒲池輝尚, アスキー1994)では、ファイルポインタの移動は lseek() でやっていますね。とすると、ファイルサイズを超えたアクセスは無理でしょうね。
Linux の実装ではどうなっているのでしょうか?
0869デフォルトの名無しさん
2008/07/24(木) 21:35:19文字列中の最後の文字に1を加算すればいいんじゃね?
でも31日とか30日しかない月の場合は月の箇所を、
場合によっては西暦も変更する必要がある
比較って何をどう比較するかも書いて欲しい
0870デフォルトの名無しさん
2008/07/24(木) 21:39:17文字列を数字化して加算、比較
必要な時に文字列化
int i;
char str[10];
i atoi("20080724");
sprintf(str, "%d", i);
0871デフォルトの名無しさん
2008/07/24(木) 21:40:09すみません。それってやっぱりものすごい手間ですか?ガリガリ書かなきゃ
ダメって感じでしょうか?簡単な関数とかはないでしょうか?
比較は、
if("20080724" > "19990101")
という感じで、日付を比較したいんです。
0872デフォルトの名無しさん
2008/07/24(木) 21:41:54strcmp で十分
0873デフォルトの名無しさん
2008/07/24(木) 21:42:01本気でゲーマーにならない限りお勧めしない
WindowxsAPIも一人前になるのに5年はかかる
0874デフォルトの名無しさん
2008/07/24(木) 21:44:1810年もあったら仕様が全く変わってしまう
DX7 DX9 DX10 ぜんぜん違う
0875デフォルトの名無しさん
2008/07/24(木) 21:44:44説明不足で申し訳ありません。+1日したいんです。
それだと、7月32日とかになっちゃいますよね・・。
やっぱり自作関数レベルのおおごとでしょうか・・・orz
0876デフォルトの名無しさん
2008/07/24(木) 21:45:280877デフォルトの名無しさん
2008/07/24(木) 21:47:11C++&SDL
0878デフォルトの名無しさん
2008/07/24(木) 21:48:41あの時代は本当に泣かされたよな
本読んでも全然コンパイル通らないし入門者に鬼門だった
0879デフォルトの名無しさん
2008/07/24(木) 21:50:350880デフォルトの名無しさん
2008/07/24(木) 22:12:290881デフォルトの名無しさん
2008/07/24(木) 22:23:37ありがとうございます。strcmpって、同じ文字列かどうか比較する以外にも
使えるんですか?日付の大小が比較できるんでしょうか?どうやるんですか?
>>876
マジで自作関数ですか・・・orz
0882デフォルトの名無しさん
2008/07/24(木) 22:28:37標準で用意されていないから自作ですね。
< とか > では比較できないです。
ただ、YYYYMMDD形式なら文字列の大小がそのまま日付の大小と一致するのでstrcmpでよいです
0883デフォルトの名無しさん
2008/07/24(木) 22:29:01strcmp(a, b) で、aが大きかったらプラス、bが大きかったらマイナス、等しかったら0が返る。
0884デフォルトの名無しさん
2008/07/24(木) 22:30:07time.hでぐぐれ
0885デフォルトの名無しさん
2008/07/24(木) 22:35:11ありがとうございます!!
while(YYYYMMDD > YYYYMMDD)
のようなことをやりたいんですが、こうなりますか?↓
while( strcmp(a, b)> 0 )
>>884
頑張ります・・うう・・
0886デフォルトの名無しさん
2008/07/24(木) 22:36:210887デフォルトの名無しさん
2008/07/24(木) 22:36:330888デフォルトの名無しさん
2008/07/24(木) 22:36:3812345年1月1日のつもりの"1234500101"と
2008年7月24日のつもりの"20080724"を比べるのでもない限りうまくいく。
桁数が同じなら、より後の日付の方が文字コードの辞書式順序でも後に並ぶのは明らか。
そもそも文字列で扱うのをやめるという選択肢はないの?
日付時刻の内部的な扱いにはtime_tのようなシリアル値が一般的。
time_tなら、mktimeを使えば7月32日のようなぶっとんだ日付でもtime_tにしてくれる。
唯一の気がかりは2038年問題だけど。
0889デフォルトの名無しさん
2008/07/24(木) 22:37:22time64_t の出番か!
0890デフォルトの名無しさん
2008/07/24(木) 22:37:280891デフォルトの名無しさん
2008/07/24(木) 22:55:36> そもそも文字列で扱うのをやめるという選択肢
それができるレベルになってないだけだと思うので、time.hとかstrftimeとかの
キーワードを元に知識を深めることができるタイプだといいな。
0892デフォルトの名無しさん
2008/07/24(木) 22:56:440893デフォルトの名無しさん
2008/07/24(木) 23:00:45#include<stdio.h>
#include<stdlib.h>
#include<time.h>
long translate(long value){
struct tm x={0};
time_t y;
x.tm_year=((value/10000)%10000)-1900;
x.tm_mon=((value/100)%100)-1;
x.tm_mday=value%100;
y=mktime(&x);
x=*localtime(&y);
return (x.tm_year+1900)*10000+(x.tm_mon+1)*100+x.tm_mday;
}
int main(void){
char str[]="20080732";
puts(str);
sprintf(str, "%lu", translate(atol(str)));
puts(str);
return 0;
}
0894デフォルトの名無しさん
2008/07/24(木) 23:01:040895デフォルトの名無しさん
2008/07/24(木) 23:01:24敷居が高いように感じてしまう時期があると思うんだ
自作関数がオオゴトだと思う頃みたいだし
0896デフォルトの名無しさん
2008/07/24(木) 23:02:200897デフォルトの名無しさん
2008/07/24(木) 23:05:24自作関数(って名前ができる事自体違和感だが)って
初めてのコンパイルから分割コンパイルの間ぐらいかなと思う
ってか未だにsetjmpとか使いこなせない…
0898デフォルトの名無しさん
2008/07/24(木) 23:06:10それは使いこなしちゃダメだw
0899デフォルトの名無しさん
2008/07/24(木) 23:10:05キケンなだけだ
0900デフォルトの名無しさん
2008/07/24(木) 23:20:06ありがとうございます。実はPro*Cで、日付のシリアル値をとってこれなかった
(とってき方が分からない)ので、文字列にしてみたんです。
CHAR 8byte のYYYYMMDD のカラムAを、
SELECT
TO_DATE(カラムA, 'YYYYMMDD')
INTO
:shoriDate
みたいに変数に入れてみたんですが、どうもダメなようで、C言語で
日付計算なら容易いかな、と思ってたんですが、とんでもなかったです。。
0901デフォルトの名無しさん
2008/07/24(木) 23:27:39わざわざありがとうございます!!!難解すぎる・・・。
日付を文字列で扱うこと自体、あまりスマートじゃないんですね。
シリアル値でとってくる方法、もう少し頑張ってみようかと思います。
若干スレちすみません。
0902デフォルトの名無しさん
2008/07/24(木) 23:27:510903デフォルトの名無しさん
2008/07/24(木) 23:38:55いや、SQL外部で処理する必要があるんです・・・。
while()
{
日付 = 日付 + 1
}
と、するんですから。
0904デフォルトの名無しさん
2008/07/24(木) 23:45:25分からないことだらけだけれど、SQLと連携する段になったので
可能な限りCでやらずにすむ方法を考えた方が楽だと思う。
なんならストアドファンクション作るって考えもあるわけで。
0905デフォルトの名無しさん
2008/07/24(木) 23:47:01char *date = "20080724";
int i;
int year, month, day;
char y[5], m[3], d[3], str[9];
for(i = 0; i < 4; i++)
{
y[i] = date[i];
if(i < 2)
{
m[i] = date[i + 4];
d[i] = date[i + 6];
}
}
y[4] = m[2] = d[2] = '\0';
year = atoi(y);
month = atoi(m);
day = atoi(d);
day++;
sprintf(str, "%d%d%d", year, month, day);
0906デフォルトの名無しさん
2008/07/24(木) 23:52:05sscanf("20080724", "%4d%2d%2d", &year, &month, &day);
この方が楽かと
でも、日付の処理はしないといけない
+1 しかありえないなら閏年判定して月の最終日を求めるだけでもいいけど
0907デフォルトの名無しさん
2008/07/24(木) 23:58:04小出しで申し訳ありません。
while(日付A > 日付B)
{
/* TBL更新処理 */
(略)
日付B = 日付B + 1
}
てな感じです。日付Bはこの処理の前に、SQLでSELECT INTOして来て使ってます。
ストアド作るほど大げさなプログラムじゃないと思うんです。てか思いたいんです・・。
0908デフォルトの名無しさん
2008/07/25(金) 00:02:58関数の大きさは画面一杯って言う人もいるぐらいだから
例え単純な処理でも関数に分けちゃっていい場合もある
0909デフォルトの名無しさん
2008/07/25(金) 00:11:53SQLの方が向いている処理、Cの方が向いている処理というのがあるからね。
SQLで解決できないことが分かった上でならいいんだけど、
なんでSQLでやらなかったんだろう?って思われないようにSQL側でも検討
してみたらどうでしょ。
その気があるならテーブルレイアウトとやりたい事を明確にしたうえでSQLスレにどぞ。
0910デフォルトの名無しさん
2008/07/25(金) 00:13:16http://pc11.2ch.net/test/read.cgi/db/1210940477/
0911デフォルトの名無しさん
2008/07/25(金) 00:25:15なんとか(涙)
でもホントにここまでやらなきゃだめなほど、大変なんですね・・。
>>909->>910
ありがとうございます。私もできればSQLの方が得意なので、もうちょっと
考えてみます。(私が考えた設計ではないので)
0912デフォルトの名無しさん
2008/07/25(金) 10:17:24sscanf()でyear, month, dayに分離したら、struct tmに放り込んでmktime()でOK。
放り込むときに日数の調整もしてしまえばいいし、なんら難しいことはないと思う。
0913デフォルトの名無しさん
2008/07/25(金) 10:44:29// mktime()が強力なので、おかしな日付も適当に解釈してくれる。
// 例えば、./a.out 20000000 と実行すると2000-01-01の一ヶ月前の一日前(=1999-11-30)として処理されるのが判る。
#include <stdio.h>
#include <time.h>
int main(int argc, char ** argv)
{
int year;
int month;
int day;
if (sscanf(argv[1], "%04d%02d%02d", & year, & month, & day) != 3) {
fprintf(stderr, "%s is illegal form.\n", argv[1]);
return 1;
}
char buf[20];
struct tm tmp = {0, }; // 1900-01-00 09:00:00で初期化。時刻計算が入るときは要注意。
tmp.tm_year = year - 1900;
tmp.tm_mon = month - 1;
tmp.tm_mday = day;
mktime(& tmp);
strftime(buf, sizeof(buf), "%F", & tmp); // %Fが正規に使えるのはC99から。そうでなければ%y/%m/%dとでも
printf("Next day of %s ", buf);
++ tmp.tm_mday;
mktime(& tmp);
strftime(buf, sizeof(buf), "%F", & tmp);
printf("is %s.\n", buf);
return 0;
}
0914デフォルトの名無しさん
2008/07/25(金) 11:34:34シリアル値といって、ある基準の日付から経過した秒数で
管理されているわけだから、それを指定した書式に展開する
ライブラリを用いて管理した方が楽だし。わざわざ年月日を
文字列として扱うとか、マジ面倒臭ぇ〜●ンコの臭いがぷんぷんすんぜ、くらい臭ぇ。
0915デフォルトの名無しさん
2008/07/25(金) 15:29:27って定義があった場合に
p[1]();
みたいにして関数を呼べますよね?
p[1]()は(*(p + 1))()のシンタックスシュガーですよね?
ではなぜp++は出来ないのですか?
0916デフォルトの名無しさん
2008/07/25(金) 15:32:010917デフォルトの名無しさん
2008/07/25(金) 15:49:09int *n;
n = i;
i++; /*できない*/
n++; /*できる*/
0918デフォルトの名無しさん
2008/07/25(金) 15:51:34p+1 と p++ は違うからね
0919デフォルトの名無しさん
2008/07/25(金) 18:57:29In function `GaussRandom':: undefined reference to 'sqrt’と In function `GaussRandom':
: undefined reference to `exp'というエラーがでて実行できません。もちろん<math.h>は定義しました。
レポート課題なのでマジで困ってます。是非教えてください。ソースを下に載せておきます。
ちなみにxが一様乱数で、yが正規乱数です。
double GaussRandom()
{
double x;
double y;
x=UniformRandom();
y=1/sqrt(2)*exp(-1/2*x*x);
return y;
}
double UniformRandom()
{
double x;
int r=1;
r=1229*r+351750;
x=r/1664501;
return x;
}
0920デフォルトの名無しさん
2008/07/25(金) 18:58:490921デフォルトの名無しさん
2008/07/25(金) 18:59:13コンパイルオプションの最後に -lm を付ける
0922デフォルトの名無しさん
2008/07/25(金) 19:01:41答えて損した
0923デフォルトの名無しさん
2008/07/25(金) 19:15:07今度からは自重します。すいません。後ありがとうございます。
0924デフォルトの名無しさん
2008/07/25(金) 19:24:010925デフォルトの名無しさん
2008/07/25(金) 19:46:30つか、そのレベルの悩みはそのコードを書く途中で出てくるものであって
コードを書き上げて出てくるもんではないよな。
他人のソースを理解しないまま提出するすべての学生に災いあれ
0926デフォルトの名無しさん
2008/07/25(金) 21:48:13じゃあファイル操作に関する制御文?(printfとか)を知ってるだけ挙げてほしい
意味は自分でググルから頼んだ
0927デフォルトの名無しさん
2008/07/25(金) 21:53:07とりあえず stdio.h と io.h を読め
0928デフォルトの名無しさん
2008/07/25(金) 22:06:380929デフォルトの名無しさん
2008/07/25(金) 22:11:580930デフォルトの名無しさん
2008/07/25(金) 22:12:18あとなんかあったっけ
0931デフォルトの名無しさん
2008/07/25(金) 22:13:500932デフォルトの名無しさん
2008/07/25(金) 22:14:180933デフォルトの名無しさん
2008/07/25(金) 22:15:20fgetpos, fsetpos, rewind, 忘れちゃいけないfgets。
0934デフォルトの名無しさん
2008/07/25(金) 22:24:29freopenも
0935デフォルトの名無しさん
2008/07/25(金) 22:39:450936デフォルトの名無しさん
2008/07/25(金) 22:47:360937デフォルトの名無しさん
2008/07/25(金) 22:51:02ttp://minori.linux.or.jp/cgi-bin/namazu.cgi?key=%1B%24B%25U%25%21%25%24%25k%1B%28B+Linux+Programmer%27s+Manual+%283%29&submit=Search%21&whence=0&dbname=JM&max=20&format=long&sort=score
ttp://minori.linux.or.jp/cgi-bin/namazu.cgi?key=%1B%24B%25U%25%21%25%24%25k%1B%28B+Linux+Programmer%27s+Manual+%282%29&submit=Search%21&whence=0&dbname=JM&max=20&format=long&sort=score
0938デフォルトの名無しさん
2008/07/25(金) 22:51:13できない
Cにディレクトリという概念は無い
0939デフォルトの名無しさん
2008/07/25(金) 22:55:01C言語の仕様にはディレクトリの概念は無かったと思うよ
ただ opendir readdir closedir はほとんどのコンパイラで使えると思う
0940デフォルトの名無しさん
2008/07/25(金) 23:03:16またまたご冗談を
0941デフォルトの名無しさん
2008/07/25(金) 23:06:36逆に>939が冗談ではないと言う仮定からスタートすれば、
>939が狭い了見しか持ち合わせていないことが判ろう。
0942デフォルトの名無しさん
2008/07/25(金) 23:12:57LSI-C には無い
LCC には無い
Borland C++ Compiler にはある
gcc にはある
0943デフォルトの名無しさん
2008/07/25(金) 23:15:25findfirst findnext とか
なら似通ってるのがあるな
0944デフォルトの名無しさん
2008/07/25(金) 23:20:360945デフォルトの名無しさん
2008/07/25(金) 23:29:520946デフォルトの名無しさん
2008/07/26(土) 02:50:06xxxx.cとかいう単位ってなんて表現すればいいんだ?
C#なんかだとクラスとか呼べるがCの場合そういう表現方法がないような・・・
0947デフォルトの名無しさん
2008/07/26(土) 02:55:170948デフォルトの名無しさん
2008/07/26(土) 03:02:38どういう手順で作っていけばいいと思いますか?
丸投げするのもなんだし、関連サイトみても仕組みがわからないからかけない
0950デフォルトの名無しさん
2008/07/26(土) 03:12:36言わないよ。
うちでは単に「ソース」と呼ぶ。
0951デフォルトの名無しさん
2008/07/26(土) 03:31:560952デフォルトの名無しさん
2008/07/26(土) 07:42:44cはソースファイル
hはヘッダファイル
と呼んでいる
0953デフォルトの名無しさん
2008/07/26(土) 07:42:47int array[ARRAY_SIZE];
って出来ないんですけど。
0954949
2008/07/26(土) 07:54:10>>953
//こっちをヘッダとか定義してる上のほうへ
#define ARRAY_SIZE 100
int array[ARRAY_SIZE];
0955デフォルトの名無しさん
2008/07/26(土) 08:49:34Cでは変数を定数値として扱えないので大人しく>954のようにマクロを使うしか。
>>949
普通にソースファイルとインクルードファイルと呼んでいる。
>>954
モジュールと言う概念とソースファイルと言う概念は一対一に対応しない。
寧ろ、出来上がったバイナリファイルの単位で使うケースが多いと思われ。
cf. 実行モジュール、オブジェクトモジュール &c.
0956デフォルトの名無しさん
2008/07/26(土) 09:58:04Cは無理
C++ならできる
0957デフォルトの名無しさん
2008/07/26(土) 10:35:240958デフォルトの名無しさん
2008/07/26(土) 10:39:53そのばやい、sizeof arrayにちうい。
0959デフォルトの名無しさん
2008/07/26(土) 11:43:12ちなみに、Cの規格書の中では翻訳単位 (translation unit)という言葉を使っている。
普段はあまり耳にしないけど。
0960デフォルトの名無しさん
2008/07/26(土) 12:08:120961デフォルトの名無しさん
2008/07/26(土) 12:30:340962デフォルトの名無しさん
2008/07/26(土) 13:13:280963デフォルトの名無しさん
2008/07/26(土) 13:23:201ヶ月がむばってくる
0964デフォルトの名無しさん
2008/07/26(土) 13:38:12方言だろうけど、うちの場合「機能モジュール」とか呼ばれてるもんぐらいの範囲と思われ。
0965デフォルトの名無しさん
2008/07/26(土) 13:43:580966デフォルトの名無しさん
2008/07/26(土) 14:06:340967デフォルトの名無しさん
2008/07/26(土) 16:18:32ところで文字列リテラルって配列なんですかね?
それともcharへのポインタなんですかね?
0968946
2008/07/26(土) 16:25:56うーん
やはり古い言語だけあっていい表現がないですね〜
これがC++になるとクラスの概念がでてくるので問題ないんでしょうけどね〜
今うちで分けてる方法はまさにクラスのような感じで1ソースファイル内でデータの管理とそれに関連する
処理を行っていて、関連する別ソースからは関数経由(この場合はインターフェース?)でないと
情報の取得や更新ができないようにしてるんですよね・・・
でもクラスのように動的に生成されるわけでもなく、コンパイル時に実行ファイル内に取り込んじゃうので・・・
0969デフォルトの名無しさん
2008/07/26(土) 16:36:23foo();
って実はポインタなんですかね?
fooだけで見ると
それでパーレンが付くとその関数呼び出しということになるのでしょうか?
0970デフォルトの名無しさん
2008/07/26(土) 16:38:03まあアドレスわからないと呼び出せないよね
0971デフォルトの名無しさん
2008/07/26(土) 16:46:08それを裏付けるかのように、配列がポインタに変換されるのと同じように、
関数は関数へのポインタに変換されるという規則もある。
昔の偉い人も同じような考えに至ったらしい。
0972デフォルトの名無しさん
2008/07/26(土) 16:46:21関数ポインタに括弧つけると関数呼び出しになる。
&演算子のオペランドでない関数は関数ポインタに成り下がる。
0973デフォルトの名無しさん
2008/07/26(土) 16:55:060974デフォルトの名無しさん
2008/07/26(土) 17:07:000975デフォルトの名無しさん
2008/07/26(土) 18:25:17クラスはモジュール分割のためにあるわけじゃないよ。
クラスと言うキーワードで全てを理解しようとしすぎているように感じる。
0976デフォルトの名無しさん
2008/07/26(土) 20:08:00次スレが立つ前に質問するバカは徹底スルーしてください。
過去スレは一覧へのリンクがあるので>>2-3みたいに個別にURLを並べる必要はないと思います。
以下テンプレ
C言語の入門者向け解説スレです。
教えて欲しいのではなく宿題を丸投げしたいだけなら宿題スレへ行ってください。
C/C++の宿題を片付けます 114代目
http://pc11.2ch.net/test/read.cgi/tech/1216746971/
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 31
http://pc11.2ch.net/test/read.cgi/tech/1214569903/
過去スレ
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
0977デフォルトの名無しさん
2008/07/26(土) 20:17:330978デフォルトの名無しさん
2008/07/26(土) 21:02:13http://pc11.2ch.net/test/read.cgi/tech/1217073697/
0979デフォルトの名無しさん
2008/07/26(土) 21:49:400980デフォルトの名無しさん
2008/07/26(土) 21:50:160981デフォルトの名無しさん
2008/07/26(土) 21:52:560982デフォルトの名無しさん
2008/07/26(土) 22:00:560983デフォルトの名無しさん
2008/07/26(土) 22:03:560984デフォルトの名無しさん
2008/07/26(土) 22:04:450985デフォルトの名無しさん
2008/07/26(土) 22:05:110986デフォルトの名無しさん
2008/07/26(土) 22:05:130987デフォルトの名無しさん
2008/07/26(土) 22:06:280988デフォルトの名無しさん
2008/07/26(土) 22:07:000989デフォルトの名無しさん
2008/07/26(土) 22:07:300990デフォルトの名無しさん
2008/07/26(土) 22:07:350991デフォルトの名無しさん
2008/07/26(土) 22:08:200992デフォルトの名無しさん
2008/07/26(土) 22:08:480993デフォルトの名無しさん
2008/07/26(土) 22:08:580994デフォルトの名無しさん
2008/07/26(土) 22:09:000995デフォルトの名無しさん
2008/07/26(土) 22:09:300996デフォルトの名無しさん
2008/07/26(土) 22:10:070997デフォルトの名無しさん
2008/07/26(土) 22:10:320998デフォルトの名無しさん
2008/07/26(土) 22:11:050999デフォルトの名無しさん
2008/07/26(土) 22:11:061000デフォルトの名無しさん
2008/07/26(土) 22:11:1510011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。