余裕の2
l ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
|
>>1 が書き忘れたみたいだけど
∧_∧ | このスレは環境依存の内容も
♪〜 ( ´∀)∠ 激しくOKらしいモナ〜
j つ-) l______________
((,,,_ く ヾ
;''⌒ヽー'、,_)7'⌒ヽ
':;.,___ノ""""ヘ.,___ノ
>3 忘れたのはスレタイにだけだろw 4様
5ヒロミ
ろくなもんじゃねぇ
うっかり8兵衛
9速にスレの質が低下してまいりました。
#include <stdio.h> #include <stdlib.h> int main() { int **p; int i, j, x, y; scanf("%d %d", &x, &y); p = (int**) malloc(sizeof(int*) * x); for (i = 0; i < x; i++) { p[i] = (int*) malloc(sizeof(int) * x); } for (i = 0; i < y; i++) { for (j = 0; j < x; j++) { p[i][j] = NULL; printf("%d", p[i][j]); } printf("\n"); } for (i = 0; i < x; i++) { free(p[i]); } free(p); return 0; } 二次元配列を行>列で(↑ではx=4,y=5など)動的確保すると 開放の時失敗してしまうのは何故ですか?
>>10 x と y を使う場所がかなり混乱してるよ。
あと、p[i][j]はintだから、NULLを代入しちゃダメ。
>>10 確保する時に両方要素数がxになってるぞ。どっちかはyのつもりなんだろう?
あと、
p[i][j] = NULL;
はintとint*のサイズが同じマシンでは動くことは動くだろうが、
正しくは
p[i][j] = 0;
だな。
>>12 NULLを(void *)0としているC処理系ではエラーだろうな。
14 :
10 :2005/06/08(水) 16:39:04
>>11-13 アドバイスありがとうございます。
ちょっと試行錯誤してみます。
>>13 MicrosoftのCLコンパイラはただのワーニングで通すよ、
エラーではなく。
エラーにするコンパイラ、ある?
__STDC__ではNULLは(void*)0
__cplusplusなら0
と定義してる処理系が多いのではないだろうか。
16 :
10 :2005/06/08(水) 18:16:13
NULLの部分は修正しました。で、この辺りに問題があると思い p = (int**) malloc(sizeof(int*) * x); for (i = 0; i < x; i++) { p[i] = (int*) malloc(sizeof(int) * x); } x,yの位置の組み合わせ(↑だとxxx)を全パターン試してみましたが 結果 ○:一見動いているように見える。 ×:Debug Error! DAMAGE: after Normal block〜省略 不:不正な処理。 A:アドレス?がprintfされた。 入力値 1: x=y 2: x>y 3: x<y ___|1|2|3 xxx|○|○|不 xxy|○|×|不 xyy|○|×|× yyy|○|×|○ yxy|○|×|A xyx|○|×|× yxx|○|×|A yyx|○|×|× 全滅ですた…
>>16 p = (int**) malloc(sizeof(int*) * y);
for (i = 0; i < x; i++) {
p[i] = (int*) malloc(sizeof(int) * x);
}
だろ。
>>17 for (i = 0; i < y; i++) {
だろ。
>>16 問題はそこだけじゃない。
ぜんぶのforで、iが0からいくつで変化するか、考えてみよう。
っていうか p[i][j] に対して p[x][y] を常に入れれば問題はなくなるだろ。
もしくは
>>19 的な p[i][j] と p[y][x] でもいいし。
とりあえずp[x][y]でいくなら
>>16 と
>>17 の3行は上からx, x, y。
それと
>>10 の
for (i = 0; i < y; i++) {
for (j = 0; j < x; j++) {
のとこ逆。
p[y][x]でいくならまた話は変わるけど。
22 :
10 :2005/06/08(水) 18:45:05
ありがとうございます。
>>21 x:列(横)
y:行(縦)
p[行][列]のつもりでした。
>>18 x,y→row, colにしました。
>>17-21 引続き試行錯誤してみます。
23 :
10 :2005/06/08(水) 19:12:58
できたー! int main() { int **p; int i, j, row, col; scanf("%d %d", &row, &col); p = (int**) malloc(sizeof(int*) * col); for (i = 0; i < col; i++) { p[i] = (int*) malloc(sizeof(int) * row); } for (i = 0; i < col; i++) { for (j = 0; j < row; j++) { p[i][j] = 0; printf("%d", p[i][j]); } printf("\n"); } for (i = 0; i < col; i++) { free(p[i]); } free(p); return 0; } x,yという名前でさらに混乱してました アドバイスありがとうございました。
>>23 こうすると解放が簡単。
int main(void)
{
int **p;
int i, j, row, col;
scanf("%d %d", &row, &col);
p = (int **)malloc(sizeof(int*) * col);
p[0] = (int *)malloc(sizeof (int) * row * col);
for (i = 1; i < col; i++) {
p[i] = p[0] + row * i;
}
for (i = 0; i < col; i++) {
for (j = 0; j < row; j++) {
p[i][j] = 0;
printf("%d ", p[i][j]);
}
printf("\n");
}
free(p[0]);
free(p);
return 0;
}
25 :
10 :2005/06/08(水) 21:14:56
26 :
デフォルトの名無しさん :2005/06/09(木) 02:47:27
二次配列を作るための関数を作成して、メイン関数で後々使うことを 目的としているんですが、どうもうまくいきません コンパイルはできるのですがxの値が2を超えた瞬間に 「*a[i] = new int [y];」の部分がエラーといわれて止まってしまいます どういうことなんでしょうか? void make(int ***a , int x , int y) { *a = new int* [x]; for(int i=0; i<x; i++){ *a[i] = new int [y]; } } void main() { int **a, x , y ; cout<< "値入力\n"; cin >> x >> y; make(&a, x , y); }
28 :
26 :2005/06/09(木) 02:52:34
2分とたたない、すばやい回答ありがとうございます 無事エラーが無くなりましたm(_ _)m
C++で、ファイルから読み込んだバイト数を知りたいのですが、 readはその数を返してくれませんよね。 freadは返してくれるけどstdioをインクルードしないといけないから本来はCの関数ですよね? C++ではどうやるんでしょうか?
>>30 #include <cstdio>と書けばstd::freadがある。
>>30 read()は返してくれるだろ
まあread()は標準じゃないけどな
33 :
30 :2005/06/09(木) 16:02:12
レスありがとうございました。 上手く出来ました。
1バイトの変数に255が入っている時、++したら その変数の8ビット目の次の無関係の領域のビットに繰り上がりますか? つまり char a[4]; a[3]++; というような処理で、aをunsigned intの様に扱えるのだろうかという事です。
>>35 扱えません。
どうでもいい話だが
charがsignedで8bitなら、「255」は入らないだろ
unsignedと仮定すると、255の時点でインクリメントすると0になる
オーバーフローしないっけ
unsigned整数はオーバーフローは絶対にしない K&Rにそう明記されている
サンクス
union使え
何にだよw
夜の生活に決まってるだろ
あんなんにunionなんぞ使わんでも元からintにしときゃいいし
オレティメットキャスト使え
46 :
デフォルトの名無しさん :2005/06/10(金) 07:04:17
fopen等の読み取り専用モードでファイルを開く時、 メモリ上に既に他のプロセスで読み取り専用で開かれたそのファイルのデータがあったら HDDにアクセスする事無くそのメモリ上のデータへのポインタを返して欲しいのだけど そういう機能ってあるんでしょうか? 例えばWEBページの静的ページなどはメモリ上に固定化して置いておけると HDDアクセス無く出力できるので もしそういう機能が無いなら何らかの方法でそういう方法を取ろうと思うのですが。
前回のアクセスからそう間をおかなければ勝手にOSのディスクキャッシュにひっかかるだろ。
>>46 他プロセスの持ってるポインタをクレって時点で普通じゃないと知れ
>>48 確かにそうですが・・・
例えばOSとかapacheでそのデータをメモリ上に固定して置いて
ページ生成時にそれを使うとか。
>>47 fopenがディスクキャッシュを使っていると思って良いのでしょうか?
こういうライブラリの詳細な内容って何処かで分からないものでしょうか。
>>49 「fopenが」ではなく「OSが」そんなディスクキャッシュを持っている。
OSを信じてやろうよ。
なんか、根本的にOSが判っていないのに上辺の知識だけ身についてる感じ?
UNIX 系なら mmap()+mlock()、Win32 なら CreateFileMapping()+MapViewOfFile()+VirtualLock() で できそうな気はするけど、他のプロセスにとって迷惑でしかないと思われるので本当にシビアな場合以外は、 素直に OS に任しておくべきだと思う。
>もしそういう機能が無いなら何らかの方法でそういう方法を取ろうと思うのですが どうやって?
54 :
デフォルトの名無しさん :2005/06/10(金) 13:29:28
#include <iostream> #include <cstring> using namespace std; // 受け取った文字列を逆順にする関数 void Reverse (char *str) { int i, j; char temp; for (i = 0, j = strlen(str) - 1; i < j; i++, j--) { temp = str[i]; str[i] = str[j]; // どうやら、これがエラー str[j] = temp; // どうやら、これがエラー } } int main () { char *str = "abcdefgh"; Reverse(str); cout << str << "\n"; return 0; } すみません、質問です。 ↑のは文字列を逆にする関数ですが、 関数内で文字列を代入するときエラーが出てしまいます。 これはなぜなんでしょうか。 ツールはVisual C++ 6.0を使ってます。 コンパイルは通るけど、実行段階でエラーが出てます。。
void Reverse (char *str) { int i, j; char temp, *_str2; _str2 = &str[strlen(str) - 1]; // 最後の文字のポインタを格納 for (i = 0, j = strlen(str) - 1; i < j; i++, j--) { temp = *str; *str = *_str2; *_str2 = temp; str++; // 先頭から進める _str2--; // 後ろから戻す } } どうも↑でもダメなようです。 根本的に考え方が間違ってるんでしょか。
>>54 char str[] = "abcdefgh";にすれば動くと思うよ。
""で括った文字列リテラルはconstだから書き換えできない。
char []にするとそこへ文字列のコピーを作るということになって書き換えできる。
>>56 うほっ、できました!
char *str = "abc" は自動的にconstになるんですか・・
そえば、なんかどっかで「基本的に書き換えちゃだめ」とか聞いたかも。
一つ勉強になりました。
どうもありがとー。
────── main.cpp ──────── #include <iostream.h> #include "hoge.h" void main() {util();} ────── hoge.h ───────── extern void util(); ────── util.cpp ──────── #include <iostream.h> void util() {cout << "run" << endl;} ────── makefile ──────── out.exe:main.obj util.obj [タブ]bcc32 main.obj util.obj main.obj:main.cpp hoge.h [タブ]bcc32 -c main.cpp util.obj:util.cpp [タブ]bcc32 -c util.cpp makeを用い、以上のファイルをコンパイルしたいのですが Error makefile Command syntax errorと出てコンパイル出来ません すみませんがどうか正しいmakefileの書き方を教えて下さい
>>58 俺のとこではエラーでなかったけど、まあ他に気になったのが
out.exe:main.obj util.obj
[タブ]bcc32 -e$@ main.obj util.obj
って風につけくわえないと main.exe って名前になってしまう。
reverse_iteratorというものがあって、それを使おうとして、 ヘルプを調べたのですが↓ basic_string::reverse_iterator typedef reverse_iterator<iterator, value_type, reference, pointer, difference_type> reverse_iterator; この型は、制御シーケンスの逆方向反復子としてオブジェクトを定義します。 読み方がまったくわかりません。 いったいどうやって使えばよいのでしょうか? これで文字列を逆順で表示できると思ったのですが。
>>61 typedef std::string::reverse_iterator riter;
std::string s = "abcdefg";
for ( riter r = s.rbegin(); r != s.rend(); r ++ )
std::cout << * r;
>>61 std::string::reverse_iteratorとstd::reverse_iterator<std::string::iterator>は同じもの。
実際には,rbegin(), rend()を、
std::string str;
std::copy(str.rbegin(), str.rend(), std::ostream_iterator<char>(std::cout));
みたいに使う。
>>57 K&R時代のふるーいCプログラムの場合は確信犯的に
文字列リテラルの中身を書き換えたりするものもある。
実際、文字列リテラルをどういったセグメントに配置するかはコンパイラによるし、
オプションで変更できる場合も多い。
readonlyなセグメントに配置された場合は、当然それを
書き換えようとすればsegmentation faultになる。
俺の知る限り、gccはデフォルトでTEXTに配置し、MicrosoftのCLはDATAに配置する。
ま、今のスタイルとして、文字列リテラルを書き換えるのは間違いなく「邪悪」だから、
やらないほうが良いのは確かだな。
そもそも書き換えるのなら「リテラル」である意味が無い
>>62-63 できました、ありがとうございました。
> std::copy(str.rbegin(), str.rend(), std::ostream_iterator<char>(std::cout));
けれど、これはコピペしてみたのですが
'ostream_iterator' : 'std' のメンバではありません
'ostream_iterator' : 定義されていない識別子です。
と、出て動きませんでした。うーむ・・・
template については少し理解があるつもりなのですが、
reverse_iterator<iterator, value_type,reference, pointer, difference_type>
とある場合、何を入れたらいいのかがわかりません。もう慣れるしかないんですかね
なにはともあれ、レスありがとうございました。申し越し頑張ってみます
>>59-60 ありがとうございます、ちょっと敷居が高そうですがもう少し頑張ってみます
>>66 #include <iterator>してる?
>>66 ostream_iteratorは<iterator>をインクルードすると使える。
> reverse_iterator<iterator, value_type,reference, pointer, difference_type>
こんな型は標準にはない。reverse_iteratorには引数をひとつ渡せば十分。
仮に処理系が余分なパラメタを設定しているとしても、指定しなくても良いように
デフォルト引数があるはず。
>>68 成功しました。何度もありがとうございます。
>>69 デフォルト引数! 最近知ったばかりです。そうなのでしたか、
安心しました。m(_ _)m
あと、一応関係ないですが、僕は55の人じゃないので、
質問が似てただけで、偽者とかじゃないです。
気を悪くしてたらすみません >55
応用力の無い初心者は手の施しようが無いな。
>>71 どの変換も肝はLCMapString。
AnsiStringはstd::stringやCStringにでも置き換えろ。
>>71 #include <windows.h>
#include <string>
#include <vector>
std::string han_to_zen(std::string han)
{
std::vector<char> buf(LCMapString(GetUserDefaultLCID(), LCMAP_FULLWIDTH, han.c_str(), -1, 0, 0));
LCMapString(GetUserDefaultLCID(), LCMAP_FULLWIDTH, han.c_str(), -1, &buf[0], buf.size());
return std::string(&buf[0]);
}
#include <iostream>
int main()
{
std::cout << han_to_zen("ゴルァ");
return 0;
}
OS WindowsXP CPU セレロンD335 2.8GHz メモリ 512MB 開発環境 VisualC++6.0 #include <stdio.h> const int A = 1024; const int B = 128; int main() { double hairetu[A][B]; return 0; } 上記のように配列を宣言するだけのプログラムですが。これを実行すると 「問題が発生したため、test.exe を終了します。 ご不便をおかけして申し訳ありません。」 と表示されプログラムが正常に動いてくれません。 配列の要素数がこの半分のときは普通に動くのですが。 メモリが足りないのでしょうか?対処法があれば教えてください。
>>75 リンカの設定でスタックサイズを増やせ。デフォルトでは1MBだ。
78 :
75 :2005/06/11(土) 01:28:54
>>76 ベリーサンクス。プロジェクト→設定→リンク→アウトプット→スタックアロケーション
で2000000と打ってみたらうまくいきました。これであってますよね?
>>78 ま、それで動くけど、俺なら0x200000と入れたいな。好き嫌いの問題だが。
#include<iostream> #include<time.h> int main(){ char a[100] = ""; time_t *b; time(b); strftime(a,99,"%Y/%m/%d %H:%M:%S",localtime(b)); cout << a << endl; } このプログラムで目的の時刻表示は出来たのですが、もっとスマートな書き方ってありませんか?
81 :
80 :2005/06/11(土) 08:33:30
あ、bがポインタって事は
>>80 のプログラムはもしかしてメモリリークしてますか?
メモリリークはせんがそれ以前にbはどこも指してねーぞそれ。
スマートかは知らないけど、時刻とかならlocaltime()を使う 方法もありますよ。 あと、*bはメモリを自分で確保してるわけではないので、 開放は必要ないかと。
84 :
80 :2005/06/11(土) 08:45:37
あ!time()側で時刻データが用意されてbに時刻データへのポインタが入力されたり システムの時刻データ保持領域へのポインタをくれるのかと思ってたんですが time_t b; time(&b); localtime(&b); とやるのですね。
85 :
80 :2005/06/11(土) 08:50:03
すると
>>80 のプログラムはbの指す位置から
sizeof(time_t)分のメモリが書き換えられてしまって
他のプロセスに影響が出る可能性があるのかな。
連投すみません。
>>83 あ、間違えた
>>83 は、>localtime()を使う方法
ではなく、 >tm構造体を使う方法でした。
雑魚なのに、でしゃばってしまいました m(__)m
文字列の改行についての質問です。
ttp://www.plustarnet.com/aspil/Programming/c02.htm このページを参考に、
画面に出した文字列を任意の場所で改行する"\n"を入力しても、無視されてしまいます。
"あいうえお\n"
"かきくけこ"
と入力したのに、実行すると
「あいうえおかきくけこ」と表示され、改行されないんです。
試しに\nの位置を変えてみて、
"あいう\nえお"
"かきくけこ"
という感じで設定して実行すると、
あいう
えお
と、表示された後、改行された後にある「えお」の部分が消え、最終的には
「あいうかきくけこ」
という風に、"\nえお"の部分がなかったものにされたかのような表示がされます。
改行のさせ方自体が根本的に間違っているのでしょうか?
>>87 まずint main(void)にしろ。
話はそれからだ。
(・ε・)エエェーいつも main() にしてるよぉ
main()とmain(void)は同義だ void mainのこと言ってんだろ、88は
>>87 参考にしたページなぞどうでもいい、それよりもオマエの書いたソースを晒せ
main() { printf("もうだめぽイェア\n"); }
>>90 main() と同義なのは、
C: main(...)
C++: main(void)
>>87 ありゃ、普通に改行されるけど。void mainでも同じ。
#include <stdio.h>
int main(void)
{
printf("あいうえお\n""かきくけこ");
return 0;
}
だから>91 自分で気がつかない・分からない凡ミスなんてよくあること ソース見せなきゃ始まらない
printf("あいうえお\n""かきくけこ"); printf("あいうえお\n""かきくけこ"); printf("あいうえお\n""かきくけこ"); printf("あいうえお\n""かきくけこ"); printf("あいうえお\n""かきくけこ"); printf("あいうえお\n""かきくけこ"); printf("あいうえお\n""かきくけこ"); printf("あいうえお\n""かきくけこ"); printf("あいうえお\n""かきくけこ"); printf("あいうえお\n""かきくけこ");
なにか、晒してるようだが・・ うーん、謎だ。ここはご本人様の登場を待ちたい。
99 :
デフォルトの名無しさん :2005/06/11(土) 18:35:12
#include <stdio.h> int main(void) { int i; for(i=0; i<10; i++) printf("printf(\"あいうえお\\n\"\"かきくけこ\");\n"); return 0; }
100
スイカップの古瀬絵理って結局今何してんの? ぜんぜん見ないみたいだけど、引退?
102 :
デフォルトの名無しさん :2005/06/11(土) 20:32:38
Linuxで複数のユーザがアクセスするプログラムを書きたいのですが、 常駐プログラムとしてではなく普通にプログラムを書いたら、 同時にアクセスされた場合にプログラムが二つ起動してしまうでしょうか?
103 :
102 :2005/06/11(土) 20:43:40
連投すみません。 場合によるかもしれないのでもう少し詳細に書きます。 このプログラムは1つのソースファイルに書かれています。 いくつかの関数があって、ユーザの与えた引数によってswitchして呼び出す関数を変える様になっていて、 それで呼び出された関数以外はそのアクセスでは使われません。 これでもし同時アクセス時にプログラムが二つ起動するとなると、 使われない関数が多数メモリにロードされる事になるのでは無いだろうかと心配です。
やればわかるじゃない。 まあ聞く場所を間違えたようだな。
ごめん、全角半角切り替えが過去に出ていたので便乗質問させていただきますが char のポインタでの全角半角変換ってどうすればできます? std::stringからcharのポインタ変換できなくて困ってます。 便利な関数なので使いたいのですが。
>>105 もちつけ。
charのポインタに全角半角の変換機能があるなんて初耳だ。
どれが便利な関数でどうなんだ?
とりあえずstd:stringのからC文字列へのポインタが欲しければc_str()
108 :
102 :2005/06/11(土) 21:24:30
>>104 自分一人ではデバッグ出来ないので・・・
確かに聞く場所を間違えました。
この質問はスルーしてください。
visual c++6.0で書いているのですが、これってCとC++のどちらで 書くかを設定するコマンドってありますか? 何も気にしないでプロジェクトつくると勝手にC++仕様になっていると思うのですが。 CとC++ではクラス以外にも微妙な文法の違いがあるので、 それをいろいろ試してみたいと思いまして。
110 :
デフォルトの名無しさん :2005/06/11(土) 22:42:32
>>109 手元にVC6.0が無いから詳しく説明できないが、
拡張子がcppならc++、cならcがデフォルトで選ばれるようになる。
後から変更したいのならば、ファイルのプロパティでコンパイラを選べたはず。
112 :
109 :2005/06/11(土) 23:38:58
113 :
デフォルトの名無しさん :2005/06/11(土) 23:55:37
2次元配列の勉強をしていてちょっとわからないところがあるのですが 例えば data[][10]={適当な文字列を複数}; と宣言して、 先頭の文字が a で始まるものだけを表示したい場合 for文とif文で表現できると思うのですがこの時for文の継続条件式は どう書くのでしょうか? for(i=0;文字列分<i;i++)と書いたら宣言内の文字列が変わった時に条件式も変えていくしかないのでしょうか? 長文ですみません
for(i = 0; i < sizeof(data) / sizeof(data[0]); ++i)
>>113 forループ内でdataの内容が変わるならそういうことになるな。
その時点で設計を疑った方がいいと思うが。
後はバッファを用意するとか。
116 :
デフォルトの名無しさん :2005/06/12(日) 00:07:19
PGMファイルを読み込んで、画素にアクセスし、何もしないでそのまま出力。 という課題があるんですが、どうしたらいいかよくわかりません。 どなたかアドバイスをお願いします。 visual studio でCを使います。
118 :
デフォルトの名無しさん :2005/06/12(日) 00:16:16
>>105 >>74 を見て書けばいいじゃん、と思うわけだけれども。勢いで作ってしまった
から、引数はconst std::string& hanにすべきだったなと今になって思うが。
【質問の不明確な点】
[0] OSは?
[1] Windowsだとして、
>>74 に直接char*を渡してはいけない理由は?
(渡せばstd::stringのコンストラクタに任せてしまえばいい)
[2] Cで書かなければならないとして、char*を返すとしたらそのメモリの確保と
解放の方法は?malloc&free?
>>119 OSはWindowsです。
何故か直接渡せませんorz
malloc使っております。
>>120 Cで書くとこんな感じ。参考に。
#include <windows.h>
#include <stddef.h>
#include <stdlib.h>
char* han_to_zen(const char* han) {
size_t n = LCMapString(GetUserDefaultLCID(), LCMAP_FULLWIDTH, han, -1, 0, 0);
char* buf = (char*)malloc(n);
LCMapString(GetUserDefaultLCID(), LCMAP_FULLWIDTH, han, -1, buf, n);
return buf;
}
#include <stdio.h>
int main(void) {
char* zen = han_to_zen("ゴルァ");
printf("%s", zen);
free(zen);
return 0;
}
>>121 親切すぎに有難うございます。
お蔭様でやりたい事が出来ました。
親切すぎ?
ワロスww
125 :
121 :2005/06/12(日) 19:53:19
テラワロスww
126 :
デフォルトの名無しさん :2005/06/12(日) 22:58:44
newとmallocの違いって、コンストラクタを呼び出すかしないかの違いでいいんですよね?
>>126 機能面から見ればその通り。
ただし、メモリ確保を同じように実装している保証はない。
したがって、例えばnewで得られたポインタをfreeするのは正しくない。
129 :
デフォルトの名無しさん :2005/06/12(日) 23:15:47
確保するメモリ量を変えていく場合、毎回newでとるよりrealloc使ったほうが 効率いいんですか?
標準C/C++の範囲内の話ならstd::vectorみたいにあらかじめ多めに確保しておくのが一番。 プラットフォーム依存ならWindowsのVirtualAllocみたいにアドレスだけ予約。
最近の初心者は他人にデバッグさせるんですか?
>>128 なるほろどもです。
実装は異なっても*pとかp++とかは同じようにできるんですよね。
なんか不思議。でもないか。。。
>>131 > どこが間違ってるんでしょうか?
藻前の頭
>>133 それはアドレスを進めてるだけだからそんなに不思議でもないぞ
配列もポインタで操作できるし
int* i=new int[ 10]; ってやったとき、この配列が10個って言うのを、 調べる方法は無いんですか? 別の変数で保存しておくしか無いんでしょうか?
>>135 実装が違うと、同じ演算子でも呼び出すコードは違うんでしょうね。
繰り返し演算するときは、演算時間も変わってくるかもですね。
>>137 は、速いレス恐れ入ります。ありがとうございました。
140 :
デフォルトの名無しさん :2005/06/13(月) 01:02:50
deleteで気になって仕方がないんですが、例えば、 char* str=new char[ 256]; とnewしたら delete [ ] str; しなさいって本に書いてますよね。 これ、delete str;ってしたら先頭の要素だけ解放されて、 残りの255個の要素はメモリリークするってことなんですか? 逆に、例えば、 int* i=new int; : delete [ ] i; ってやったらまずいんでしょうか。 実行時エラーは起きないんですが。
>>136-137 あれ、でも delete する時サイズ指定しなくてもいいってことは、どこかにサイズって記録されてるんじゃないの?
>>142 そして、保存されていてもアプリ側から取得できるかどうかはわからない
正規な手段は無いが、取ろうとすれば取れる。
ウソコケw
クソコケw
VC++6.0だと先頭アドレスの前にサイズが格納されてるな。
150 :
◆bk1IKp1NkI :2005/06/13(月) 18:01:04 BE:171152993-#
あるHPに printf("\x1b[2J") と書くと画面が消える、と書いていたのですが、実際には変な記号のようなものが表示されるだけで、消去できません。 どうすれば画面消去できるのでしょうか? ちなみにXPを使っています。
telnetサービスを起動後、適当なtelnetクライアント (teratermとか、puttyとか、poderosaとか)を使って、 localhostに接続、ログイン後、そのプログラムを動かせ。
153 :
◆bk1IKp1NkI :2005/06/13(月) 18:05:30 BE:38034432-#
BCCを使っています
154 :
デフォルトの名無しさん :2005/06/13(月) 18:11:31
簡単な関数を作って使おうと思っているのですが satoshiDlg.obj : error LNK2001: 外部シンボル ""protected: int __thiscall CSatoshiDlg::dangerous(int)" (?dangerous@CSatoshiDlg@@IAEHH@Z)" は未解決です Debug/satoshi.exe : fatal error LNK1120: 外部参照 1 が未解決です。 link.exe の実行エラー satoshi.exe - エラー 2、警告 0 と出てしまいます。何が原因なのでしょうか?
>>154 そりゃあCSatoshiDlg::dangerous(int)が定義されてないんだわよ
さとしくん
サービスからクライアントに接続する凄技
>>151 が居るスレはここですか?
157 :
151 :2005/06/13(月) 20:31:29
>156 わけわからん。「telnetサービス」はMSが決めた名前だが、 不満でもあるのかい?
159 :
デフォルトの名無しさん :2005/06/13(月) 20:40:08
ans = sin( 0.5*180.0 ); printf( "ans = %f\n ",ans ); と,書いても1がでないんですが,どうやったら正しい値がでますか?
.cpp以外のものはどういう場合で使うのですか?
sin(0.5*3.141592654);
163 :
デフォルトの名無しさん :2005/06/13(月) 20:49:48
>>161 ぱいって180じゃないんですね
どうもっす
ゆとり教育のせいかか・・
165 :
デフォルトの名無しさん :2005/06/13(月) 21:01:27
かなり初歩的な質問なのですが、 char command[10]; scanf("%s”, command); if(command == "hoehoe"){hoe()} 上のプログラムで入力された文字列を比較したいのですが、うまく出来ません。 文字列の比較をするにはどうやったらよいですか?
strcmp
c++のwriteは、リファレンスによるとその時のストリームに対して出力するという機能らしいですが その時のストリームってどうやって指定するんですか? 標準出力に出力したいのですが。
>166 ありがとう。 標準関数使えばいいんですね。 上手くできました
>>167 C++にwriteなんてものない。
何かのクラスのメンバじゃないか?
_write データをファイルに書き込みます。 int _write( int handle, const void *buffer, unsigned int count ); ↑はあるみたいよ
>>169 それは ostream::writeのことを言っているのか?
STLで派生先のテンプレートに隠蔽されている。
派生先のテンプレートクラスを使えばいい。
173 :
172 :2005/06/13(月) 21:35:23
174 :
169 :2005/06/13(月) 21:43:04
そんなところにあったのかよ。 ○| ̄|_
int ax=5; float bx=1.8; int cx=ax*bx; 9にならないんでしょうか?(´・ω・`)
176 :
167 :2005/06/13(月) 22:04:55
>>176 cout.write("hoge", 4);のように使う。
まあ、今みたいにナル文字終端なら<<使えばいいわけだが。
178 :
デフォルトの名無しさん :2005/06/13(月) 22:32:58
>>175 ならない。
int ax=5;
float bx=1.8;
float cx=ax*bx;
int dx=(int)cx;
>>175 なるよ
結果の代入先の型のせいでなってないだけ
5*1.799999...=8.9999...->切り捨てー>8とか?
>>180 intとfloatの内部構造が同じだと思ったら大間違い
うちの環境だとfloat>doubleにしたら9になった
確かにdoubleにすると9になりますね 精度の関係なのでしょうか('_'?) 実数型とビット構造について少し調べてみます 答えてくださった方、ありがとうございました
Cでn次の連立方程式に対して反復法のヤコビ法を行うプログラムつくってるんですけど、 スタックオーバーフローおこしちゃうんですよね。 2次元配列ふたつと一次元配列ひとつmallocでメモリ確保したり、 変数にstaticつけたりしてるんですけどなかなか解決しません。 スタックオーバーフローの回避方法として何かいい方法はないでしょうか?
>>184 コンパイルオプションでスタックを巨大に取っておくとか。
187 :
184 :2005/06/14(火) 01:39:17
>>185 再帰使ってないんですよね。よくわからなくて^^;
余裕があれば使ってみようと思います。
>>186 そんな方法があるのは知りませんでした。ちょっと調べてみます。
>>187 再帰を使うときは、関数呼び出しだけでもスタック使いまくるから
呼び出し回数が多いとアウツになるかも試練。
呼び出し途中で落ちるなら、引数の数をなるべく減らすとか、
構造体にしてアドレスで渡すとか工夫汁。
>>184 単純に配列のサイズ間違えちゃったりしてると、
予測不能の動きになるから、その辺もアヤシイ。
>>184 どのタイミングでエラーになるとか調べた?
デバッガ使える?
使えなければデバッグライトとか入れてみて、
どこで落ちるのかとか調べてみ。
ウィンドウズなんかのプログラムだと、
やたらと複雑なダイアログ作りまくりのうえでループ走らせたりすると、
簡単にスタックオーバーフローになったりするが。
16ビット環境だったらかなりしんどそうだ。。。
193 :
デフォルトの名無しさん :2005/06/14(火) 12:28:13
c++のコンパイラでコンパイルできないcのソースというのは在りえますか? あるとすれば、例えばどういったことをしている場合が考えられるでしょうか。 c++はcの機能を内包してるんじゃないのでしょうか。
>>194 まず変数・関数名にC++のキーワードを使っていたら駄目だな。
あとC++はCよりも型に対するチェックが厳しくなっている。例えばvoid *からその他のポインタへの変換はC++ではキャスト(static_cast)が必要。
C99とは互換性がないのでこれもアウト。(inlineとかC++由来の機能は平気だが)
詳しくはX3014の最後の方にCとの互換性のなくなったものが理由付きで一覧になっている。
196 :
デフォルトの名無しさん :2005/06/14(火) 14:43:59
C++なんですが、 std::endlやstd::endsなど 関数なのに括弧なしで呼び出すことが出来るのは なぜですか? std::strstream str; str << "hoge" << std::endl; // ←コレ 同じように引数をとらない関数を括弧なしで呼び出したいんですが・・。
>>196 その式で直接呼び出されているのはstd::endlではなくてstd::ostream::operator<<(ostream &(*)(ostream &))。
この関数にstd::endlへのポインタを渡している。
>>196 strstreamは古い。stringstreamを使え。
>>196 std::endlなんかは関数ではなくて関数オブジェクトというモノ
その構文が納得行かなければ「関数オブジェクト」と
「オペレーターオーバーロード」でぐぐってみ
>>200 関数だよ。
>>197 に書いてある通りostreamは関数へのポインタを受け取る。
関数⊆関数オブジェクトではあるが。
()を付けないと関数のポインタが取れるだけで関数は関数だということを知らない人なのだろうか、
>>200 は
メモリリークのチェックの仕方を教えてください。 実行環境はlinuxなのですが、 プログラムを何度か実行しながら時折vmstatでメモリ残量を確認してみても メモリ残量が増えたり減ったりしていて参考になりそうに無いです。
ここって環境依存OKじゃないの?
うはwwwっをkwwww
構造体を下記のように書きたいんだけど、下記の場合コンストラクタって どう書けばよいのですか? typedef struct { char a; long b; } STest;
>>208 C++なんだから構造体タグ名だとかtypedefだとかいうCの慣習は
不要であって、
たんに
struct STest {
char a;
long b;
};
と書けばよい
無論コンストラクタは STest()ね。
>>210 よけいなお節介だが、C++でのstructとclassの差って分かってるよね?
基本的に
structのメンバのデフォルトがpublic、classはデフォルトがprivate
の差でしかない。
>>211 よけいなお節介と知りながら書き込む人は嫌いです。
213 :
デフォルトの名無しさん :2005/06/15(水) 00:55:16
簡単な質問ですみません。 自動変数で、 double d[100]; の配列を一気にすべての要素を0.0に初期化する方法ってありませんか。 int d[100]={0.0,0.0,0.0,, ,,0.0}; っていうのは面倒で間違えそうなので。 初期化のたびにforループで回すのもなんだかなーって思うんです。
>>213 double d[100] = {0};
std::fill_n(d, 100, 0.0);
さっそくのレスありがとうございます。
>>214 それってC++標準なのでしょうか。
VC++6.0だと先頭の要素しか0にならなかったもので...orz
何か間違ったかな。。。
>>215 それはやったことが無いのでためしてみますです。
>>211 structに関数が入れられるというのか・・・
or2 < 剥き出しの関数を打ち込んでくれ!
220 :
名無しさん@お腹いっぱい。 :2005/06/15(水) 11:41:45
以下のgccでコンパイルすると test.c: 関数 `main' 内: test.c:23: 警告: 互換性のないポインタ型からの引数 1 個の `mat_add' を渡しますです test.c:23: 警告: 互換性のないポインタ型からの引数 2 個の `mat_add' を渡しますです とエラーが出ます。原因が解かる方お願いします。 #include <stdio.h> /*--- 2行3列の行列maとmbの和をmcに格納する ---*/ void mat_add(const int ma[2][3], const int mb[2][3], int mc[2][3]) { int i, j; for (i = 0; i < 2; i++) for (j = 0; j < 3; j++) mc[i][j] = ma[i][j] + mb[i][j]; } int main(void) { int i, j; int ma[2][3] = { {1, 2, 3}, {4, 5, 6} }; int mb[2][3] = { {6, 3, 4}, {5, 1, 2} }; int mc[2][3] = { 0 }; mat_add(ma, mb, mc); for (i = 0; i < 2; i++) { for (j = 0; j < 3; j++) printf("%3d", mc[i][j]); putchar('\n'); } return (0); }
>>220 int (*)[3]からconst int (*)[3]には安全に変換できない。
222 :
220 :2005/06/15(水) 11:50:53
>>221 有難うございます。
constを外して以下のようにしたらコンパイルできました。
void mat_add(int ma[2][3], int mb[2][3], int mc[2][3])
223 :
221 :2005/06/15(水) 11:54:59
いや、変換自体は安全だな。 安全性をgccが認識していないということか。 まあ、c++ではエラーだから妥当な警告だと思うが。
>互換性のないポインタ型からの引数 1 個の `mat_add' を渡しますです すげー訳だな。
225 :
デフォルトの名無しさん :2005/06/15(水) 13:09:20
32バイトの変数を作る方法ってありますか? 4バイトのint8個の配列を作っても、 int a[8]; a = a & 0x3333333333333333333333333333333333333333333333333333333333333333; というコードはエラーになってしまうし、 この論理積は単調だからループ処理で4バイトずつ行う事も出来るけど、単調でない場合はかなり面倒です。
>>225 な に を し た い ん だ
そもそも普通はchar a[32]だろ。
227 :
225 :2005/06/15(水) 13:25:39
>>226 立っているビットの数を求めるアルゴリズムの中で
>>225 に書いたような処理があるのです。
>>225 多倍長整数を扱えるライブラリを使うか、自分で実装する。
>>225 素直に16進ダンプ文字列とのビット演算するロジックを書けばいいのでは?
>>225 int a[8];
int count = 0;
int i;
for( i=0; i<sizeof(a)/sizeof(a[0]); i++ )
{
count = countbit( a[i] );
}
として、countbit()を実装すればいいだけでは?
231 :
230 :2005/06/15(水) 13:48:31
>>230 ×count = countbit( a[i] );
○count += countbit( a[i] );
orz
232 :
225 :2005/06/15(水) 14:36:03
>>230 に言われた通り要素ごとにカウントして合計する方法にします。
レスありがとうございました。
233 :
デフォルトの名無しさん :2005/06/15(水) 22:18:22
すみません。 C言語とかで (0==hoge)? 10: 20; とかの判定?について調べたいのですが、これはどういう命令になるのでしょうか? WEBの検索キーワードは何と入力したら…
>>233 条件演算子。
単項・2項演算子と違い3項演算子は条件演算子しか存在しないので条件演算子のことを指して3項演算子とも言われる。
その場合0がhogeなら10、そうでなければ20となる。
こういう風に自然に読むと妙な文章になるからhoge == 0と書け。
235 :
デフォルトの名無しさん :2005/06/15(水) 22:36:58
>>234 ぐはっ!すぐに引っかかった!
しかも見てたサイトで…(涙)
ありがとうございました。
精進します…
236 :
デフォルトの名無しさん :2005/06/15(水) 23:53:57
なんと説明すればいいのかわからないのですが・・・ int型4バイトの整数7777777というものがあったとします。 そしてこれをファイルに書き込もうと、fwrite関数を使ったりしようとすると 整数7777777を文字としなければならず そうして書き込むと'7'が7個分の7バイトとして書き込まれてしまいます。 この7777777という4バイトの整数値を、ファイルに書き込むときになんとか 4バイトで書き込む方法はないでしょうか?
>>236 fprintfで書き込むと文字としての7777777になるけどfwriteで書き込めばsizeof (int)、お前の言う4バイトで書き込まれると思うが。
238 :
236 :2005/06/16(木) 00:12:18
>>237 どうすればいいのかわからないです・・・
int num = 7777777;
としたときにこの値をファイルに4バイトで書き込むにはどうしたらいいのでしょう。
fwrite(num,sizeof(int),1,ファイルポインタ)
とするとエラーがでますし
numを文字配列に char *buf = "7777777";
のようにして
fwrite(buf,sizeof(int),1,ファイルポインタ)
とやってもうまくいきません・・・
× : fwrite(num,sizeof(int),1,ファイルポインタ); ○ : fwrite(&num,sizeof(int),1,ファイルポインタ);
240 :
236 :2005/06/16(木) 00:56:25
>>239 ありがとうございます!
おかげさまでできました!
CでN×Nのdoubleの二次元配列aがあったときに、 for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { a[N * i + j] = 右辺; } } って書いてるコードがあるんですが、このa[N * i + j]って a[i][j]と同じであってます?
>CでN×Nのdoubleの二次元配列a Cには配列の配列しかないんだが とりあえず a[N * i + j] は違うな
>>158 うぉ 質問しようとしたことがそのままかかれとる。
結局ansi.sysはさほど意味がなかったのねorz
>>242 違うと言うのは?
Cの参考書に書いてあるコードなので、100%とは言いませんが、ある程度信頼できるかと思うのですが。
a[N * i + j]ってのは一次元の配列をさも二次元配列のように扱うための常套手段ではあるが。
>>241 aの型が double * ならそのコードで正しい
aの型が double (*) [N] なら間違い
double [N][N]の配列を指すポインタの型は本来 double (*) [N]だ。
だから、aの型が double * なら、double[N][N]の二次元配列を指すには
キャストが必要になる。
ま、たまたまCの二次元配列のレイアウトはそうなってるから、
キャストして、そのコードのように一次元配列のように扱うこともできる。
>ま、たまたまCの二次元配列のレイアウトはそうなってるから、 それって標準でそうなってるの?
>>247 Cの所謂二次元配列は配列の配列でしかないから必然的にそう為らざるを得ないね。
// time1.h // Timeクラスの定義 // メンバ関数はTIME.CPPの中で定義 // ヘッダファイルを重複してインクルードするのを防ぐ #ifndef TIME1_H #define TIME1_H // 抽象データ型(ADT)Timeの定義 class Time { public: Time(); // コンストラクタ void setTime(int, int, int); // 時,分,秒を設定する void printMilitary(); // 軍事形式で時刻をプリントする void printStandard(); // 標準形式で時刻をプリントする private: int hour; // 0〜23 int minute; // 0〜59 int second; // 0〜59 }; #endif ↑コンパイル出来ましぇん(T_T) 宣言の構文エラーとか表示されます
>>249 コンパイルした方法とエラー内容を正確に示そう
cとしてコンパイルしているか、他でTimeが宣言されているんジャマイカ。
>>250 ボーランドのコンパイラを使っております
上のファイルをコンパイルしたところ
「宣言の構文エラー」でコンパイルに失敗しました
どうやらエラー箇所は「class Time{」
という行にあるみたいです.
>>250 確かに他でTimeが宣言されていますが,
名前を全く違うものに変更しても同じエラーが発生しました
だから、どうやってコンパイルしたかを正確に書けと言ってるじゃない か。 bcc time1.h とかしてないよね?
思いっきりそうしてます コンパイルはアプリケーションまかせなので・・・ どうやら間違った方法のようですね 正しい方法を教えてくださいm(_ _)m
それって、やっぱりCとしてコンパイルしているんジャマイカ。
bcc32.exeしか持ってないんですけど これじゃ駄目なんですか??
//
>>256 //めんどくせぇからこれをfoo.cppとしてbcc foo.cppしろ。
#include "time1.h"
c++としてコンパイルさせる場合はどうしたらいいんですか?? 確かにC++Builderとあるのに・・・
ヘッダファイル .h はコンパイルする必要はない。
>>260 そうなんですか!?
全然知らなかった・・・
今度は先ほどのtime1.hをインクルードしたプログラムを作ったのですが(time1.cpp)
これをコンパイルすると
外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照)
というエラーが発生しました.
main関数は絶対必要なんですか??
time1.cppの中にはmain関数はないのですが・・・
それくらい自分で調べられないならプログラミングをやめて首吊って氏ね
初心者歓迎というのは嘘でつか?? ここはC++の勉強を一方的に教える諸サイトと違って インタラクティブに解決できると思ったのに・・・ 参考書に書いてある通りにしてできないものをどう調べろと?? 調べてもいいけど、これってC++の文法云々じゃない気がする
>>262 初心者歓迎なんだから、それはさすがに言いすぎ。
>>261 exeファイルを作りたいなら、main関数は必要だよ。
でないと、どこから実行したらいいかわからないからね。
>>261 おい待てコラ
>>249 でヘッダのコメントに書いてある
// メンバ関数はTIME.CPPの中で定義
はどうしたんだよ
わざわざ新しくtime1.cppなんて作らんでも、上記のTIME.CPP使えばええじゃないか
つーか、>257、>259は蒸し貝。
>>264 構造的には
time1.hというヘッダファイルがあって
time1.cppというプログラムがtime1.hをインクルードしてて(ここで実装している)
list06_05.cppというプログラムがドライバとしてテストしている(ここにmain関数あり)
というものです。
list06_05.cppを実行しようとすると,Timeという型が理解できないと言われたので
やはり原因は
>>249 のプログラムにあると思ったのですがいかがなもんでしょう??
>>267 list_06_05.cppではinclude "time1.h"してる?
>>268 ( ; ° °)
どうやら"time1.h"を"time.h"にしてたようですm(_ _)m
それでもまだ動きません。
list_06_05.cppに
「注意: TIME1.CPPと一緒にコンパイルすること」
とあるのですが,ひょっとしたらこれかもと今ふと思いました。
ひょっとして同時にコンパイルとかも可能なんですか??
270 :
デフォルトの名無しさん :2005/06/16(木) 16:27:46
>>267 最初からこの内容で質問しろ。
>list06_05.cppを実行しようとすると,Timeという型が理解できないと言われたので
>やはり原因は
>
>>249 >のプログラムにあると思ったのですがいかがなもんでしょう??
大間違い。初心者が正確な判断できるわけ無いのだから自分の判断で情報を小出しにしないこと。
>>268 に加え、list06_05.cppとtime1.cppを同時にコンパイルして実行ファイルを作らせたらいいはず。
271 :
デフォルトの名無しさん :2005/06/16(木) 16:28:46
>>269 >list_06_05.cppに
>「注意: TIME1.CPPと一緒にコンパイルすること」
>とあるのですが,ひょっとしたらこれかもと今ふと思いました。
おまえ馬鹿だろう。
>>271 馬鹿ですね。
でも一緒にコンパイルするなんてこと分からなかったから
仕方ないじゃないですか(言い訳)
みんな厳しいけどいい人ばっかやね。
ソースコードにコンパイル時の注意がコメントされているのに それを思いっきり無視して自分の思い込みだけで対処しようとするところが 馬鹿なの。
とりあえず
>>249 はコマンドラインコンパイラの引数について勉強するといいお^^
っ[ -P -c ]
276 :
超初心者 :2005/06/16(木) 18:12:10
お恥ずかしい質問になると思うですが、自分なりに調べてもよく わからなかったので、質問させてください。 「C言語による、外部ファイルへの出力方法を調べろ」と言われたのですが 外部ファイルすらよくわからず、どなたか説明できないでしょうか。。 勉強不足ですみません。
初心者を超えたら初心者じゃないから歓迎しない。
>>276 OSのファイルシステム上に存在するファイルって意味じゃないか?
平たく言えばごく普通のファイル。
279 :
超初心者 :2005/06/16(木) 18:28:51
>>277 すみません。。
>>278 ありがとうございます!けれど、外部ファイルのことはわかった
のですが、出力方法というのがいまいちぴんとこないのですが
お教えいただけないでしょうか。。?
>>279 fopenでファイルを開いてfprintfで書き出してfcloseで閉じる。
こんな流れ。
しかしそこでstd::ofstream使って怒られるのがナウでヤング
略して
以下のプログラムを書いてみたんですけど #include <stdio.h> int main() { double a,b,c,x,y; scanf("%lf",&a); scanf("%lf",&b); scanf("%lf",&c); scanf("%lf",&x); y = (c-(a*x))/b; printf("%lf\n",y); return 0; } b!=0でないという条件がある場合どのように書き加えたらよろしいでしょうか? また a1*x + b1*y = c1 a2*x + b2*y = c2 のx,yを求めるプログラムを作る場合の x,yの求め方を教えていただきたいです。 これも条件があって a1*b2 != a2*b1 になります
>>284 >b!=0でないという条件がある場合
何の条件だ?
入力にその条件を期待してよいと言うことなら、コードに変更の必要はない。
286 :
AA :2005/06/16(木) 22:57:55
ウィンドウが非アクティブ状態でもキーボードの 押された文字が取得できるようにするにはどうしたらいいんでしょうか? 聞くところによるとフックという物を使うそうなのですが... それが用わかりません。
288 :
デフォルトの名無しさん :2005/06/16(木) 23:52:51
main() { char a,b; scanf("%d",&a); printf("%d\n\n",a); scanf("%d",&b); printf("%d\n",b); printf("%d",a); ←ここでaが0になるんだけどなんででしょうか? printf("%d\n",a+b); }
>>288 これこれ、scanf()に"%d"と指定しておきながらcharのアドレスを渡しちゃ
いかん。scanf()はその書式指定を信じて、そのアドレスからsizeof(int)分の
領域に書き込むからメモリが壊れるぞ。
一方、printf()に渡すのはかまわんがな。
>>288 >scanf("%d",&b);
この段階で、aを壊している。
当然、scanf("%d",&a); もダメ。
charに代入したいなら一旦intで受けてからコピーすべし。
291 :
288 :2005/06/17(金) 00:04:43
>>284 連立方程式を解く機械的な方法を考えて、その通りに実行するプログラムを書くだけ。
293 :
デフォルトの名無しさん :2005/06/17(金) 00:27:29
soukoというファイル内に100バイトのサイズの固まりと500バイトの固まりが ?個、交互においてあります。 このファイル自体のサイズは調べずに?個の100バイトの固まりを ファイル内からすべて取り出しなさい。 とあったので以下のようにすると永遠に動き続けてしまいます。 一体何処が悪いのでしょう? 100バイト 500バイト 100バイト 500バイト ・ ・ ・ 100バイト 500バイト main(){ FILE *fp = fopen("souko","rb"); char buf[200]; int total = 0; while(feof(fp) == 0){ fread(buf,100,1,fp); total++; bufの中身クリア; fseek(fp.500,SEEK_CUR) } //無限ループになってしまう
工工エエェェ(´д`)ェェエエ工工
>>293 >fseek(fp.500,SEEK_CUR)
これは何のジョークかね?
fseek(fp, 500, SEEK_CUR);
の間違いだよなもちろん。
で、feof()だけじゃなくferror()もチェックしたらどうよ。
ふー、落ち着け、落ち着け。 まだ人類が負けたと決まったわけでは無い。
>>293 fread()の戻り値をチェックせよ。
>>293 fseekを行うとeofが返ってこなくなるよ。
>>300 どれぐらいのポータビリティが必要かによるだろ
Cで本気でポータビリティを求めるなら(未だに)K&Rスタイルで書くか、
ansi2knr.cを添付するかしなきゃいかんワケだし
一方、(たとえば)boostは十分ポータブルだと考えるなら、そこの
記述の多くは古くて無視可能なものだろうな
もうだめだ・・・。
独習Cと独習C++の例題と問題を一通り理解して簡単なプログラムは作れるようになったのですが DOS窓に計算結果や文字が表示されたりするだけのプログラムを作るだけで終わってしまいました。 Windowsアプリやimodeのアプリ、Perlを使った掲示板等を作ってみたいのですが、一体自分は今 どのあたりまで到達しているのでしょうか?100%中10%位? 500ページもある本を二冊も読んだのにDOS窓の中で動くプログラムしか作れない現実に絶望気味ですorz
とりあえずペイントブラシ程度のものを・・・。
>>304 ようやくパーセンテージが付けられるようになった状態。つまり0%。
>>308 環境非依存の内容が終わったところだったら、まだ出発点じゃない?
ペイントブラシって知らないけどウインドウズのおまけみたいなのと仮定すると 40%〜50%くらい?ちょっと甘いかな。
>>309 環境非依存ってなんですか?
>>310 0%と40%じゃえらく違うな・・・。
もう半分は来ているのか。
100%は何なんだ C++コンパイラが書けたら100%っていうんならべつに Windowsプログラミングの知識なんぞ要らないぞ
宿題スレで組み立てていただいたプログラムなのですが、 難しくて自分で説明ができません。 #include <stdio.h> #include <stdlib.h> void swap(int *a, int *b) { int tmp; tmp = *a, *a = *b, *b = tmp; } void random_shuffle(int *start, int *last) { int *next = start; size_t index; for (index = 2; ++next != last; ++index) swap(next, start + (rand() % index)); } main() { int i; int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; srand(0); random_shuffle(array, array+10); for (i = 0; i < 10; ++i) printf("%d\n", array[i]); } の
{ int *next = start; size_t index; for (index = 2; ++next != last; ++index) swap(next, start + (rand() % index)); } と int i; int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; srand(0); random_shuffle(array, array+10); for (i = 0; i < 10; ++i) がわからないのですがどういうことなのでしょうか? とくに配列のarrayの使い方とindexがよくわかりません
中学レベルの英文法を勉強したくらい。
ペイントブラシみたいなソフトとまでは行かなくても、グラフィック表示したり 音を出したりする位のことは簡単にできるんじゃないのかと思っていたのですが 1000ページ読んで出てきたのは文字と\a記号のビープ音orz どうやったら文字とビープ音だけの世界から抜けられるのでしょうかorz
イントの箱が10個ありまんねん。 一つ目には1、二つ目には2とはいってますにゃ。 それをぐちゃぐちゃっと。
>>313 絵に描いて考えろ。話はそれからだ。
こんな夜中に釣られるテシト
>>317 マジレスすると開発環境買って来い。
VCでもBCBでもいいから。
↑補足 1000ページ勉強したことは開発環境を使う上で無駄にはならんから安心しろ。
>>320 MSのVC++2005Expressならありますが・・・これじゃだめ?
ただで配るなんてMSも腹が太い。
>>322 とりあえず勉強にはそれでいいから、次はGUIの勉強をしなさい。
324 :
284 :2005/06/17(金) 02:42:19
流れを切って申し訳ないのですが・・・ a1*x + b1*y = c1 a2*x + b2*y = c2 の連立方程式のx,yを導き出す方法が思いつきません どのようにx = y = とすればよいのでしょうか・・・ よろしければご教授いただければと思います。
>>324 それ中学校の数学
著しくスレ違い&板違い
自分でなんとかしろ
>>313 random_shuffle()の中で、
1) nextポインタはstartが指す配列の1, ... 9番目という具合に動く。
2) indexは、2, 3, ... 10の範囲を動く。
3) rand() % indexの結果は、
0〜1, 0〜2, 0〜3... 0〜9
の範囲を動く。
4) そして、swap()によって、配列の
1番目と、0〜1番目のいずれか
2番目と、0〜2番目のいずれか
3番目と、0〜3番目のいずれか
:
を交換している。これで、配列の要素を「シャッフル」しているわけだ。
arrayの使い方がよくわからないってのは、よくわからないな。
int array[] = { 1, 2, ... };
は、要素数10コのintの配列を宣言すると同時に初期化している。
random_shuffle()の呼び出しでは、配列の先頭のポインタと、配列の末尾
を一個超えたポインタを、終端として渡している。これはたまたま、
random_shuffle()が、そういう風に作ってあるからだ。
327 :
313 :2005/06/17(金) 03:52:56
>>318 ,319
そこまではなんとかわかります。
10個の箱があってそれぞれに1〜10までの数値が入っていてそれをごちゃ混ぜにしたのを
頭から表示させているんですよね?
いま悩んでいるのは、このプログラムを構成している途中経過を説明するように言われて
これをどう説明すればいいのかわからなくて困っているのです。
わかりにくい書き方をして申し訳ありませんでした
328 :
313 :2005/06/17(金) 04:02:53
>>326 詳しい説明ありがとうございます!
授業でポインタは「うまく説明できないから」と飛ばされてしまったのでよくわかっていなかったのと、
授業で配られた資料のなかにarrayに関するものがなかったので理解に困っていました。
> 授業でポインタは「うまく説明できないから」と飛ばされてしまった どんな授業だよw
>>329 大学や専門学校の授業の平均像なんてこんなもんだ。
文系学部の教養なら許容範囲だが。。。
333 :
デフォルトの名無しさん :2005/06/17(金) 09:58:19
Windows2000, MFC, VC++6.0です。 デフォルトのコントロールのフォントはMS Pゴシックですよね。 これだと韓国語や中国語は表示できません。 で、フォントをArialにすると、韓国語や中国語、日本語やその他の言語も表示できたんですが、 Arialって文字コード表で見ると日本語や韓国語などは含まれていません。 なのになぜ表示できるんでしょうか。 同じようにMSPゴシックには韓国語は含まれていないのですが、Arialとの違いは何なのでしょうか。 また、フォントにない文字はおそらく他のフォントが割り当てられているのでしょうが、そのフォントは何なんでしょうか。
FontLinkでググれ
>>331 うちの大学なんか、ソースコードをサブディスプレイに表示して
教授眠くなるような口調で延々と読み上げるだけだったぞw
説明一切なしで、学科の80%の人間は理解不能。
FDDでコピーがあたりまえだった。
もうねアホかとバカかと小一時間問いつめたくなったね。
ワープロの講義だろこれ。と。
336 :
333 :2005/06/17(金) 12:36:41
337 :
331 :2005/06/17(金) 14:07:02
>>335 畑は違うが、教科書棒読みあだ名がラリホーという講師は確かにどこにでもいたなぁ。
ファイル(バイナリ)の読み込みで質問があります。 おもにWisdomSoftのC言語入門を参考に、猫でもも見てCの勉強はじめたのですが ファイルサイズの取得方法が解りません。 バッファ式とでもいうのでしょうか? 数バイトづつの読み書きは説明もあり解るので すが、読み込みたいファイルに合わせてメモリ確保したいのです。
fseekでファイル末端へ移動したあとftellすればファイルサイズわかるんでないの。
>>338 ファイルサイズを取得する方法は幾つかあるが、完全に移植性のある方法は(現実的な範囲では)ない。
・標準関数を使う方法
fopen()してfseek()で末尾に移動、ftell()でオフセットを得る。
・stat()を使う方法
Windowsだと_stat()かな? fstat()でもいいかもしれない。
・APIを使う方法
GetFileSize()
尚、2GBを超えるサイズのファイルの場合はこれらの手法が使えないので注意。
>>339 殿、
>>340 殿ありがとうございます。<(_ _)>
標準関数にはGetFileSize()のようなのはないのですね。
アセンブラで書いたものをCではどうやるのか勉強していまして、
質問させて頂きました。
stat()というのは知らないので勉強して決めたいと思います。
ありがとうございました。
>>329 >ポインタは「うまく説明できないから」
これはなかなか至言だ
>>337 詐欺だよな。あれは。
大学というのは資格ビジネスなのか所詮・・・。
>>340 GetFileSize()は2GB超もいけるだろ。
まぁ、どのみち32bit版Windowsで2GB超のファイルを一気にメモリ上に取り込むこと自体不可能に近いが。
2GB未満でもバカでかいファイルを一気にメモリに読み込むのは阿呆だけどな。
まぁCreateFileMapping()とかあるが。
>>340 ここWin限定とかじゃないから、Win32APIと書いた方がいい気がするが。
346 :
ham :2005/06/17(金) 16:41:22
長いので分けます。 質問,下記をコンパイルすると最初の関数宣言 ”void max(int study[][SUB],int STU);”でエラーになります。 なぜですか?教えて下さい。
>>346 エラーメッセージを書くこと。
以上。
はい、次。
348 :
ham :2005/06/17(金) 16:45:45
346です。 #include <stdio.h> #define SUB 3 /*科目*/ #define STU 5 /*生徒人数*/ void max(int study[][SUB],int STU); void average(int study[][SUB],int STU); int main(void) { int study[STU][SUB]; int i,j; puts("点数を入力してください。"); for(i=0; i<STU; i++){ for(j=0; j<SUB; j++){ printf("生徒 No%d",i+1); switch (j){ case 0 : printf("国語"); break; case 1 : printf("数学"); break; case 2 : printf("英語"); break; } scanf("%d",&study[i][j]); } } average(study,STU); max(study,STU); return 0; }
349 :
ham :2005/06/17(金) 16:47:00
346です。つづき /*平均点*/ void average(int study[][SUB], int STU) { int i; int l,m,e; for(i=0; i<STU; i++){ l+=STU[i][0]; m+=STU[i][1]; e+=STU[i][2]; } printf("国語の平均 %d\n",l/STU); printf("数学の平均 %d\n",m/STU); printf("英語の平均 %d\n",e/STU); }
350 :
ham :2005/06/17(金) 16:47:20
/*各科の最高得点*/ void max(int study[][SUB],int STU) { int i,j; int l_max,m_max,e_max; l_max=m_max=e_max=study[0][0]; for(i=0; i<SUB; i++){ for(j=0; j<STU; j++){ if(i==0 && l_max<study[i][j]) l_max=study[i][j]; if(i==1 && m_max<study[i][j]) m_max=study[i][j]; if(i==2 && e_max<study[i][j]) e_max=study[i][j]; } } printf("国語の最高 %d\n",l_max); printf("数学の最高 %d\n",m_max); printf("英語の最高 %d\n",e_max); }
351 :
ham :2005/06/17(金) 16:48:51
以上です。 コンパイルすると error C2143: 構文エラー : ')' が 'constant' の前に必要です。 C:\Documents and Settings\mol\mols\lesson1\baka2.cpp(5) : error C2143: 構文エラー : ';' が 'constant' の前に必要です。 C:\Documents and Settings\mol\mols\lesson1\baka2.cpp(5) : fatal error C1004: 予期せぬ EOF が検出されました と表示されます。
宣言時にサイズが不定だからでは?
>>348 STUがdefine定数だから、
void max(..., int STU);
は展開されて
void max(..., int 5);
になる。よって、エラー。
以上。
はい、次。
354 :
ham :2005/06/17(金) 17:19:33
回答ありがとうございます。 ですが判りません。すいません。 引数のSTUがdefine定数で5じゃダメなんですか? 展開のことをもう少し追加説明をよろしくお願いします。
>>354 駄目、駄目。
STUがどうのではなく
int hoge としたら hogeは未定義の名前でなければならない。
即ち宣言なんだが。
コンパイラが解釈する前に展開される。
この場合の展開は置換のようなもの。
コンパイラは5という定数は変数に使えないからエラーにしている。
356 :
デフォルトの名無しさん :2005/06/17(金) 17:45:08
Windowsフォームアプリケーションについて解説してる書籍か サイトないですか?
357 :
デフォルトの名無しさん :2005/06/17(金) 17:45:31
ちなみにVC++.net2003です。
358 :
ham :2005/06/17(金) 17:46:42
意味が判りました。 丁重にありがとうございました。
*.hと*.hppの違いを教えてください。
hppは「これはC++用のインクルードファイルじゃヴォケ!」という自己主張。それだけ。
>>324 二次方程式を解くアルゴリズムが思いつかないってことか?
掃き出し法でググれ
362 :
361 :2005/06/17(金) 18:22:18
すまん二元連立一次方程式のまちがい
ランダム関数を使う時、どうにも発生するら乱数が十分に見えない場合はどう改善すればいいんでしょうか
>>363 右シフトしてみたりMTを使ってみたりする。
>>364 右シフトして意味あるの? underflow起こしたり、有効桁数がなくなるだけじゃない?
>>365 大体の擬似乱数は下位ビットの精度が悪いことが多い。
>>367 見ました
ちょっとイジってみたんですけど、ちょっとマシになったくらいかな?って感じです
まだ初心者の身分なんで、あまりに難しそうなところは飛ばして読んだんですが、助かりました
ここに質問してもいいのか悩んだのですが、質問させてください。 SNESの音楽データフォーマット、SPCファイルにかかれている ID666の情報を取得して、リストとして表示するプログラムを考えています。 ID666におけるヘッダ情報はいろんなサイトを巡って見つけたのですが、 曲名に当たる部分が32バイトしかありません。 中には32バイト以上の曲名も存在します。 そのようなSPCファイルをWinampで読み込ませてみたところ、きちんと曲名が表示されています。 しかしID666における曲名該当部分には、曲名の途中までしか入っていません。 このような曲名が長い場合、どこに曲名がかかれているのか、 また、どうやって曲名が長いファイルを自動選別できるか、 よろしければご教授おねがいします。 開発環境はWindows2000、コンパイラは失念しました。 たしかGCCだったと思いますけど・・・。
拡張ヘッダとか称して別の場所に名前を埋めてるんじゃないの?
バイナリエディターで検索かければおおよその位置が判り 何をやっているかわかるかもしてない。
>>369 それはファイルフォーマットの質問であって、
C/C++の質問じゃないだろう。
すいません、ではどこで質問したらいいでしょうか・・・
ローカルルールを読めばとりあえずどこに行くべきかわかりそうなものなんだがなぁ・・・
SPCのデコーダ作ってる人に聞いてみるとかね(俺ならそうする)
fread()について教えてください。 VC6です。 ファイルサイズ分malloc()で確保したメモリに読み込みなんですが、 読み込み後4バイト単位で扱ったり1バイトで扱ったりします。 なので、読み込めればさえいいのですが。 size_t fread(void *バッファ , size_t サイズ , size_t カウント , FILE *ストリーム); のsize_t サイズ , size_t カウント ,をどうすればいいのか決めあぐねています。 一応size_t サイズにファイルサイズを、size_t カウントを1としたものと、 size_t サイズを1に、size_t カウントをファイルサイズ分にしたものをビルドし実行 しましたところちゃんと読み込めているようなのですが、これでいいのでしょうか? よろしくお願いします。
>>377 基本的には戻り値に影響するだけなんで、適当に選べばいい。
あとは、パフォーマンスが違うかもしれない。(環境依存だろうけど)
VC7.1ではsize * countとしていた。VC6もそんなんじゃない?
380 :
& ◆po73KQOmZk :2005/06/18(土) 11:01:25
テキストを読むために #include <stdio.h> struct info { char* name; /* 名前 */ int age; /* 年齢 */ char* sex; /* 性別 */ }; int main(void) { struct info data; FILE *fp; int i; fp = fopen( "test.txt", "r" ); if( fp == NULL ) { puts( "test.txtが開けません" ); return 1; } for(i=0; i<5 && !feof(fp); ++i) /* 5人分読み込む又はファイル末尾で終了 */ { fscanf( fp, "%s %d %s", data.name, &data.age, data.sex ); printf( "%s %d %s\n", data.name, data.age, data.sex ); } fclose( fp ); return 0; } こうすると強制終了されますが、なぜなの??文字列をポインタで扱うときのやり方に間違い があるっぽいんだけど、どこを間違えてるのか教えてください
>>380 >fscanf( fp, "%s %d %s", data.name, &data.age, data.sex );
ここで、data.nameとdata.sexは何も指していない。
fscanfに渡すポインタは有効なオブジェクトを指していないといけない。
382 :
質問です :2005/06/18(土) 11:22:33
fstreamでバイナリーデータをバイト数を指定して出力する方法を教えて下さい。 どこのサンプルを見ても文字列出力ばかりでわかりやすいサンプルが見つかりませんでした。
>>377 殿、
>>379 殿、素早い解答ありがとうございます。<(_ _)>
戻り値については全く考慮していなかったので注意したいと思います。
ちょっと難しく考えすぎていたのでしょうか? 標準関数については警告
やエラーが出なければ良しとし進めたいと思います。
ありがとうございました。
>>382 std::ostream::write
385 :
383 :2005/06/18(土) 11:27:53
386 :
質問です :2005/06/18(土) 11:27:55
>>383 C/C++でその進め方は危ない。マニュアル(VCならMSDN)見て判断しろ。
195バイトのファイルを開いたとして、 size_t foo = fread(buffer, 100, 10, fp); すると100バイト読み込んでfooは1、 size_t foo = fread(buffer, 10, 100, fp); すると190バイト読み込んでfooは19。
int main(void) { short S; long L = 0x10008000; printf("S=L= %x\n", S = L); } このプログラムの動作はどういう風に説明すればいいいのでしょうか? int counter = NULL; char strings[MAX] = NULL; memset(&structX, '\0', sizeof(structX)); char *cp = '\0'; このコードの間違いはどれなのかおしえてください。
>>388 指定要素数分全部読み込めない場合のファイルポインタ移動量は
必ず要素サイズの倍数になる、って決まってるの?
>389 格上げ、符号拡張、NULL
> int counter = NULL; > char strings[MAX] = NULL; 死罪
NULL ポインタ変数向けの型なのでintに入れちゃいかん 配列の初期定義にも使えない &structX ぬるぽ
C++ではNULLはただの0だがなー
C++の場合型チェックが厳しくなったために「voidポインタを,この型のポインタ変数に代入できない」 という意味のエラーを出し使い物にならないから苦肉の策として 0 を「ポインタがオブジェクトを参照していないことを示すポインタリテラル」にしたので
>>394 そうとも限らんぞ。ヌルポインタ定数とだけおぼえておけばいい。
>>396 そうとも限るんじゃないのか
定数0はあらゆるポインタに代入可能であってnull pointerと解釈されるが、
それ以外に、キャストせずにあらゆるポインタに代入可能なものが
C++では存在しないだろ
>>390 保証されない。普通の実装では巻き戻ししないで終端まで行ったままの筈。
てんぷれーt(ry NULLは意味論的にポインタなんだから、文法論でどうこう いったってしかたないよ。'\0'もおなじ。
ああそういえば0より安全なNULLの定義を模索して四苦八苦みたいな ネタ昔読んだなあ
template <typename T> operator T*() {return 0;} こんなメンバを持つクラスにすればいい。
402 :
デフォルトの名無しさん :2005/06/18(土) 17:36:32
C言語にはBASIC言語のrightやleft midと言ったような関数って 無いですが、みなさん自作されてるんでしょうか??
>402 必要なら作る
>>402 ないけどたいしたことはない。
sをchar配列やcharへのポインタだとするとLeftはs + nとするだけ、(書き換えされては困るならコピーを作ってから)
Rightもstrncpyでなんとかなる。組み合わせればMidもできる。
C++ならstd::basic_stringにいろいろとある。
>>402 MFCのCStringにはそういうインタフェースがあるけどな
Cには文字列という型はないし
ポインタ操作や'\0'の挿入で代わりになるので
わざわざ関数作るまでもない、かな
すみませんが質問です、 テキストを読んでいるとcurses.hとunistd.hをincludeする必要が出て来たのですが BCCにはそのようなライブラリは無いのです 同じ書式で同じ効果を期待出来る様な、そんな都合の良いものは無いのでしょうか?
質問です。 double型の算術計算のオーバーフローを検出する方法ってあるでしょうか 例えば double a = 1.79e307; double b = 1.79e307; double c = a + b; これを実行するとcは0になります。例外とか出力されるとうれしいのですが・・・ コンパイラはC++Builder6です。
>そんな都合の良いものは cygwin+gcc入れろ
>>407 x86例外
普通は無限大になると思うんだけどなぁ…
_controlfp(_EM_OVERFLOW, _MCW_EM);
プログラマー板に書いたが放置されそうなので マルチしますがスマソ。 マイコン組み込み系のソフト組んでて こういう感じのテーブルジャンプのPGを組んだ。 void (*const rom_KansuuTable[10])(void) ={ test1, test2, test3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, }; void (*test_pointer)(BYTE *);
続き Loop1 = 0; //関数アドレス読み出し test_pointer = rom_KansuuTable[0]; //NULLがくるまで or 10個チェックするまで while((test_pointer != NULL) && (Loop1 < 10)){ //関数実行 test_pointer(5); //ループカウンタ更新 Loop1++; //次の関数アドレス読み出し test_pointer = rom_KansuuTable[Loop1]; } 特にコンパイルエラー/ワーニングがでるわけはないし,動作もちゃんとするんだけど MISRAチェックをかけると void (*test_pointer)(BYTE *); ^ --------------.c(---) ++ WARNING ++: <=4=(3672) constではない関数へのポインタを使用しています。Misra Rule 104 って怒られる。 ただ単純にtest_pointerを使わずにrom_KansuuTable[Loop1]を直接書きゃ解決なんだけど ROM容量食うしね。 今は動作もちゃんとしてるんで,放置プレイしてるんだけど,なんか気持ち悪いので 解決方法があれば教えてください。
MISRAチェックしなきゃいいじゃんw
>>413 でもMISRAチェックしなきゃ出荷審査通らないんだよ。
CMMもやってるから品質にはやかましくて。
とりあえず問題なしとして今までは通しておるが,できるなら消したいと思い
よくわかんないんだけど 関数の型が違くね?
>>415 void (*const test_pointer)(void);
ってこと?
しかし関数ポインタってよくわからんなぁ。
こっちの方が直感的でいいと思うが。
void test_pointer(void)* const;
まずはその関数の引数をvoidなんだかBYTE*なんだかはっきりしろよ ジャンプテーブルの宣言では引数はvoidだと言ってて test_pointerの宣言では引数はBYTE*だと言ってるじゃねーか しかし test_pointer(5); という呼び出しを見ると、実はintだという落ちじゃねーだろうな あと、Cでは面倒なら関数ポインタの仮引数リストを宣言しないという手もある C++と互換性が無いコードになるしお勧めはできんがな
単にテーブルの「const」の位置が間違ってるだけじゃないのか?
>>411 rom_KansuuTable と test_pointer の型が違う。
関数ポインタが、まだ理解できないなら、
とりあえず、typedef して共通の型になるようにしとけ。
420 :
デフォルトの名無しさん :2005/06/19(日) 00:31:07
最近C++も飽きてきたんでC++を補完するような良い言語って無いですか?
>>420 C#でもDでも何でもどうぞ。補完しているかどうかは別にして。
>>420 間違いなくC#
設計思想は素晴らしいがdirtyな文法も許容される
良い意味でC++らしさを残した言語です
#include <stdio.h> #include <stdlib.h> int main(void) { char a; do { printf("何か入力して下さい\n"); scanf("%d", &a); printf("a = %d\n\n", a); if(a == -40) exit(-1); } while(a != '67'); return 0; } 最近C言語を始めたのですが、どうもわからないことがあります。 このプログラムなんですが、aに文字を入れると値が-40になります。 AだろうがQだろうがUだろうが-40になってしまいます。 それだけならいいのですが、aに-40が入ったらループを抜けるようにしないと scanfを無視してループしてしまいます。 これはなんなのでしょうか…。
424 :
423 :2005/06/19(日) 01:13:55
環境はWindowsXp コンパイラはVC6++についてきたものです。
char a;
'67'もわろた
scanf("%c", &a) printf("a = %c\n\n", a)
最近VC6++が流行っているのですか?
VC6++ の検索結果のうち 日本語のページ 約 73 件中 1 - 20 件目 (0.29 秒)
>423 scanf("%d", &a); の前にも printf("a = %d\n", a); を入れてみるといいよ。 あと、scanfは(printfもだけど)int型の関数だから なにか値を返すらしいよ。
printf("%d:",'67'); printf("%d\n",67); printf("%c:",'67'); printf("%c\n",67); 困ったときはdebug write
432 :
423 :2005/06/19(日) 02:06:04
>>430 #include <stdio.h>
#include <stdlib.h>
int main(void)
{
char a, b;
do {
printf("a = %d, b = %d\n", a, b);
printf("何か入力して下さい\n");
printf("scanfの戻り値 %d\n", scanf("%c %c", &a, &b));
printf("a = %d, b = %d\n\n", a, b);
} while(a != 69);
return 0;
}
実際にprintfを入れて試してみたらよくわかりました。
代入されなかったら0が返るんですね。
ヘルプを見てみると、戻り値の数だけ引数が増えるというのでやってみました。
aとbに両方正しい値が入ると引数が2になります。
恐らくscanfに値が入らないとラインバッファに値が残っているため
その値をを入れようとしても入らないためにまた残るので
永久ループになっていたのだと思います。
>>431 その67というのは69を入れようとして間違ったんですよ。
最初は'E'で比較していたのですが、Eのアスキーコードをいれてやれば
代用できるんじゃないかなと試してみました。
そのときにシングルクォーテーションをとり忘れてるんです。
'E'の方がいいだろ
434 :
423 :2005/06/19(日) 02:17:36
>>433 やっぱりそうですか。
でも、書き方はいろいろ覚えておいたほうが損は無いかなと思ったんです。
>>434 コンパイル後には同じになるんだから、
人間が見て見やすい方にしろ。
436 :
423 :2005/06/19(日) 02:33:44
>>435 よく考えたら誰が見てもわかりやすいものが一番いいですね…。
そうすることにします
const int val = 5 class CA { char hoge[val]; }; こうした場合、::val にしろと言われたのですが、これは 信じていいのですか? この x 。 ::x にしろと、いつか言われたのですが、 これは洒落でしょうか?
しまった(;´Д‘) 下の二行は無視してください。
>>437 「::」が何を意味するのか考えれば自明だろ?
漏れはWin32API呼ぶときとかは必ず付けてるけどな
const が定数を意味するんだから付ける必要もないかなぁとか思ってたんですが、
ここにいる人に聞くと、なんか説得力あるんだよな・・・
>>440 ありがとうございました。付けた方が良さそうですね。
> const が定数を意味するんだから付ける必要もないかなぁとか思ってたんですが 激しく勘違いしてる余寒
>>441 おーいー
>「::」が何を意味するのか
を激しく勘違いしとるぞ
答えだけ言うと、例題を見る限りはいらない
ていうかグローバルネームスペースに
valなんて汎用的な名前を漏らすなよ
class CA { static const int MAX_VAL = 5; (ry とかにしとけ
446 :
411 :2005/06/19(日) 11:21:35
>>415 >>416 >>417 >>419 すまん。例としてその場で書いたので間違いがあったようです。
なので
void (*test_pointer)(BYTE *); はvoid (*test_pointer)(unsigned char *);
void (*const rom_KansuuTable[10])(void) をvoid (*const rom_KansuuTable[10])(unsigned char)
test_pointer(5);をtest_pointer((unsigned char)5);
と読み替えてください。
というわけでどうすべきか皆さんの意見聞かせてください。
それでもunsigned char *へのポインタを引数にする関数にunsigned charを引数として渡していることになるわけだが。 それはさておき、こうしたらだめ? for (Loop1 = 0; (test_pointer != NULL) && (Loop1 < 10); Loop1++) { void (*const test_pointer)(BYTE *) = rom_KansuuTable[Loop1]; test_pointer(5); }
>>446 > void (*test_pointer)(unsigned char *);
> void (*const rom_KansuuTable[10])(unsigned char)
どっちにしろ型が違う。
型が違うという事は、
環境によってはサイズが変わるから、必ず同じ型に汁。
449 :
447 :2005/06/19(日) 12:07:58
いまさらながら気付いた。 > unsigned char *へのポインタ ○| ̄|_
>>411-412 の例で、test_pointerを使う必要性が感じられない。
って言うか、警告すら出ないのが不思議なくらいだ。
for( i=0; i<sizeof(rom_KansuuTable)/sizeof(*rom_KansuuTable) && rom_KansuuTable[i]; i++ )
{
/* 関数テーブル呼び出し */
rom_KansuuTable[i]( 5 );
}
で、いいんジャマイカ。
>>447 test_pointer の代入前に比較しちゃアカン。
>>411-412 やりたい事は、こんな感じか?
#include <stdio.h>
/* 関数ポインタ型定義 */
typedef void (*FunctionPtr)( int hoge );
/* 関数プロトタイプ */
void Hoge1( int hoge );
void Hoge2( int hoge );
/* 関数テーブル定義 */
const FunctionPtr FncTable[] =
{
Hoge1 /* 関数 1 */
,Hoge2 /* 関数 2 */
,NULL /* ストッパー */
};
/* main() */
int main( void )
{
int i;
for( i=0; FncTable[i]; i++ ) /* ストッパーが来るまでループ */
{
/* 関数テーブルから呼び出し */
(FncTable[i])( i );
}
return 0;
}
453 :
おしえて :2005/06/19(日) 13:24:46
雑誌の付録についてくるサンプルコードには、 たまにcppでかかれてて分割ファイルになってたりするのがありますよね。 あれはVC++ではどうやってコンパイルしたらいいのですか。 プロジェクトファイルとかワークスペースみたいなものがついてなくて、 どれからコンパイルすればいいのかわからないし。どうやってリンクしたら いいのかも実はわかりません。 makefileがついてたのでbccでやってみたんですがエラーになります。 たぶんbcc用のじゃなくてgccとかのmakefileのようです。 どうすればいいの??
>>453 cygwin でも使えばいいんじゃないかな。
>>453 VCならとりあえず新しいプロジェクトを作り、
プロジェクトのフォルダの中に元と同名のcppファイルやh/hppファイルなどを作り、
それぞれ元のファイルから内容をコピーするってのはどうだ?
>>455 そんな無駄な努力せんでも既存ファイルをプロジェクトに追加するのは可能だが。
まぁ、単純にコンパイルすればいいだけなら*.c/*.cppファイルだけ全部プロジェクトにつっこんでビルドすれば大体いける
457 :
デフォルトの名無しさん :2005/06/19(日) 14:02:04
カレントディレクトリにexample.txt、change_txtというファイルが置いてあって main{ char *filename = "example.txt"; printf("%d\n",remove(filename)); printf("%d\n",rename("change.txt",filename)); } と入力すると、その出力が両方とも-1(remove,renameともに失敗)となります。 なにか原因として考えられることはあるでしょうか?
458 :
457 :2005/06/19(日) 14:05:39
訂正です ×カレントディレクトリにexample.txt,change_txt ○カレントディレクトリにexample,txt,change.txt
まずmainがおかしい。
461 :
& ◆hJb7GWrzxo :2005/06/19(日) 14:29:39
>>461 「うまくできない」じゃわからん。エラーメッセージかなんか貼れよ。
まあmakeが入ってないんだろう
464 :
457 :2005/06/19(日) 14:57:11
>>460 なるほど、perrorという関数でエラーの種類がわかるのですね。
そこで使ってみたところ、「Permission denined」というエラーが出ました。
英語を調べてみたところ「許可が否定された」ということらしいのですが原因がわかりません。
一応カレントディレクトリのファイルを調べてみたところ、
読み取り専用の項目にチェックはついていませんでした。
>>464 カレントディレクトリのWritePermissionを調べよ。
あー、WinNT系か。それなら「読取専用」だけでなく「セキュリティ」タブも調べよ。
466 :
おしえて :2005/06/19(日) 15:10:48
CFLAGS = -DWIN32 LIBS = -lglut32 -lglu32 -lopengl32 -lm SRC = main.o diff.o meshdraw.o gl_screenshot.o a.exe: $(SRC) g++ -o $@ $(SRC) $(CFLAGS) $(LIBS) .cpp.o: g++ -c $< こういうmakefileがはいってるんだけど、コレってDOS窓でmakeできないよね?? つーかmake a.exeって実行方法が間違いじゃねーよね??
>>466 なんでできないと思ったの?エラーが出るならエラーメッセージ貼れよ。
468 :
& ◆hJb7GWrzxo :2005/06/19(日) 15:14:10
g++なんかねーよとエラーがでるんだけど
>>466 そのmakefileなら、普通はmakeに引き数は要らない。
>>468 アホかい。cygwinでもインストールしてcygwin上でmakeせい。
#gccにチェックを入れるのを忘れずに。
>>468 だったら g++ が無いのが原因。
DOS窓のせいでも make のせいでもない。
実行方法は間違いじゃない。
すみません、プリプロセッサディレクティブ?で↓ってどんな条件なんでしょうか? #if 0 #endif
>>472 「この間はコンパイルしない」
コメントアウトの強力版としてよく使われる。
>>473 あーそうなんですか、即レスありがとうございます
レスで気になったので再度すみませんが質問を…
コメントアウトで十分な気がするんですが、どんな時に使うのでしょう?
>474 利点としては ・#if 1 にすればすぐに復活可能 ・ネストできる
476 :
おしえて :2005/06/19(日) 15:31:22
g++のところをbcc32に変えてDOS窓でコンパイルしようと思ったんだけど それって無理なんすか
>>475 お〜分かりました
ありがとうございましたー
>>476 学習能力無いのか?
なんで無理だと思ったの?エラーが出るならエラーメッセージ貼れよ。
>>474 /*
/* */
*/
これだと2行目でコメント終わり。3行目でエラー。気をつけろ。
481 :
デフォルトの名無しさん :2005/06/19(日) 15:59:23
ソースファイルから、特定のパターンを持つ(引数のタイプとか戻り値とか)関数を 抽出するコマンドラインツールはないでしょうか。 % listfunc "void *(int,int)" sample.c void func1(int a, int b) void func2(int a, int b) といったイメージです。
grep
483 :
481 :2005/06/19(日) 16:23:34
実際には関数名だけ取得できればよいので grep+sedでがんばってみたのですが 改行があったり#ifdefがあったり、なかなかやっかいなので 既存のツールがあればと思って質問させてもらいました。
485 :
デフォルトの名無しさん :2005/06/19(日) 16:27:01
C言語で通信をするプログラムを作っています 受信したデータbufferをパラメータとそれ以外のデータに分けたいんですが パラメータ以外の項目数やデータ型や長さなどが明確でないので sscanfが使えないんですが どうすればあっさりできるでしょうか? buffer・・・12345 hoge 123 aaa... パラメータ・・・12345 それ以外のデータ hoge 123 aaa...
486 :
481 :2005/06/19(日) 16:31:28
>>484 ctagsコマンドの出力のtagsファイルをgrepなどすれば望みがかないそうです。
ありがとうございました
>>485 スペース区切りならスペースまで読み出せばいいんじゃないの?
489 :
デフォルトの名無しさん :2005/06/19(日) 17:03:42
C言語プログラムをmakefileでコンパイルしたら 警告: `関数' は前方で暗黙的に `int' を返すと宣言されました という警告がでました。 この関数はdouble型を返すように宣言しています。 勝手にintで返すためプログラムがうまく動作しません 警告はなぜ発生するのですか?
つ[プロトタイプ宣言]
491 :
485 :2005/06/19(日) 17:27:04
>>487 サン スペースまで読み出すってどうすればいいんでしょうか?
sscanf(buffer,"%d %s",param,soreigai);ってするとsoreigaiにはhogeしかはいらないんですが
493 :
489 :2005/06/19(日) 17:32:00
プロトタイプ宣言しようとしたら conflicting types for `関数' previous declaration of `関数' というエラーがでてコンパイルできませんでした。 (たぶん宣言の仕方は間違ってないと思うけど・・・) というよりプロトタイプ宣言しなくても関数は使えますよね?
>>493 手前に同じ名前の関数が宣言されていて、その内容と食い違っている。
495 :
489 :2005/06/19(日) 17:42:56
#include<stdio.h> #include<math.h> #define Th 30.0 int check[1000][1000]; char *sep(char,int,int,int,int,int,int,int); main() { } unsigned char *sep(unsigned char *input,int bX,int eX,int bY,int eY, int k,int nx,int ny) { } こんな感じですけど間違いはありますか? この他にもう1つ関数がありますが同様に宣言しており 同じ名前の関数は宣言されてません。
496 :
485 :2005/06/19(日) 17:44:13
sscanf(buffer,"%d % ",param,soreigai);ってするとsoreigaiには何も入らず sscanf(buffer,"%d %[]",param,soreigai);ってすると実行エラーになるんですが
> char *sep(char,int,int,int,int,int,int,int); > unsigned char *sep(unsigned char *input,int bX,int eX,int bY,int eY, int k,int nx,int ny) 宣言と定義でちがっとる。
すみません、あるところで見かけたソースなのですが、 簡潔に書くとこんな感じ。 template <typename _T, int _X> class Test { public: Test( _T hoge ) : len(_X) {}; protected: const int len; }; main() { Test<int, 2>;} Test( _T hoge ) の : 以降の部分が何を意味するのかわかりません。 const int のキャストと同じ意味でしょうか?
499 :
489 :2005/06/19(日) 17:55:27
unsigned char *sep(unsigned char,int,int,int,int,int,int,int); unsigned char *sep(unsigned char *input,int bX,int eX,int bY,int eY,int k,int nx,int ny) ということでしょうか? 他にも考えられる宣言をしているのですがエラーがでます。 下の行が実際の関数なのでそれに合う正しいプロトタイプ宣言 はどうなるのでしょう?
(´ー`)っ unsigned char *sep(unsigned char *,int,int,int,int,int,int,int);
501 :
489 :2005/06/19(日) 18:06:20
エラーもなくなり動作するようにはなりましたが 依然と実行結果は変わらず、原因は他にあるのだとわかりました。 勉強になりました。ありがとうございました。
>>498 メンバ変数lenを_Xで初期化している。
というか、宣言は定義からそのままコピーしてもいい気がするが。 unsigned char *sep(unsigned char *input,int bX,int eX,int bY,int eY,int k,int nx,int ny);
>>498 質問とは関係ないが、アンスコ始まりの名前使うな。
>>485 その受信データに改行コードがないことが判っているなら、
%[^\n]
#つーか、少しは検索してみろよ。
507 :
485 :2005/06/19(日) 19:22:21
先頭の文字から指定文字数取ってくる関数はある(strcpy)のに 指定した文字数目から末尾まで取ってくるっていう関数がほしかったのです ありがとうございます 何とかなりました
508 :
& ◆QWv3R1XL8M :2005/06/19(日) 19:27:20
エラー E2209 main.cpp 5: インクルードファイル 'GL/glut.h' をオープンできない
エラー E2303 meshdraw.h 17: 型名が必要
エラー E2139 meshdraw.h 17: 宣言に ; がない
エラー E2303 meshdraw.h 18: 型名が必要
エラー E2238 meshdraw.h 18: 'MaterialStruct::GLfloat' の宣言が複数見つかった
エラー E2344 meshdraw.h 17: 一つ前の 'MaterialStruct::GLfloat' の定義位置
エラー E2139 meshdraw.h 18: 宣言に ; がない
エラー E2303 meshdraw.h 19: 型名が必要
エラー E2238 meshdraw.h 19: 'MaterialStruct::GLfloat' の宣言が複数見つかった
エラー E2344 meshdraw.h 18: 一つ前の 'MaterialStruct::GLfloat' の定義位置
エラー E2139 meshdraw.h 19: 宣言に ; がない
エラー E2303 meshdraw.h 20: 型名が必要
エラー E2238 meshdraw.h 20: 'MaterialStruct::GLfloat' の宣言が複数見つかった
エラー E2344 meshdraw.h 19: 一つ前の 'MaterialStruct::GLfloat' の定義位置
エラー E2139 meshdraw.h 20: 宣言に ; がない
エラー E2303 meshdraw.h 23: 型名が必要
エラー E2139 meshdraw.h 23: 宣言に ; がない
エラー E2303 meshdraw.h 24: 型名が必要
エラー E2238 meshdraw.h 24: 'LightStruct::GLfloat' の宣言が複数見つかった
エラー E2344 meshdraw.h 23: 一つ前の 'LightStruct::GLfloat' の定義位置
エラー E2139 meshdraw.h 24: 宣言に ; がない
エラー E2303 meshdraw.h 25: 型名が必要
エラー E2238 meshdraw.h 25: 'LightStruct::GLfloat' の宣言が複数見つかった
エラー E2344 meshdraw.h 24: 一つ前の 'LightStruct::GLfloat' の定義位置
エラー E2139 meshdraw.h 25: 宣言に ; がない
エラー E2228 meshdraw.h 25: エラーあるいは警告が多すぎる
*** 26 errors in Compile ***
** error 1 ** deleting main.o
>>479 g++をbcc32に書き換えてもこんなエラーがでるので無理なんかなとおもったんですが。
>>507 sをchar配列やcharへのポインタとしたらs + nでn番目の文字数目からの文字列を表せる。それをstrcpyでもすればいい。
>>508 学習能力無いのか?
'GL/glut.h' をインクルードできないのが問題だろ。
bcc32 のせいでもDOS窓のせいでもない。
511 :
508 :2005/06/19(日) 20:06:05
>510 bcc32用にglutをセットアップしてmakeしてみた。 するとこんなエラーがひとつ出た。 エラー E2337 c:\Borland\Bcc55\include\stdlib.h 584: オーバーロード関数群の中の 1 つだけしか "C" にできない どういう意味だよオイ。 検索しても出ねえ。
>>511 extern "C" として宣言される関数は、関数名だけで一意に判別できないといけないので、
引数の型によるオーバーロードができない。
stdlib.h の 584行目で宣言されてる関数と
同じ名前の関数が無いか調べてみるといい。
>>512 いや、これはエラーメッセージを手がかりにするのは厳しいだろう。
せめて extern "C" と書いてあればなんとかなるだろうが。
まあテンプレート使ってると意味不明なエラーメッセージなんぞ 日常茶飯だからな
だからテンプレートって嫌いです><
つーか
>>511 は質問しているのか?
それともチラシの裏なのか?
519 :
508 :2005/06/19(日) 20:43:07
extern "C"ってのはC++からCの関数を呼び出すときの規約なんですか。 学習能力がないので知りませんでした。 つーかstdlib.hの584行目は using std::exit; だったんですが、これが一体どうだっていうんですか?おしえてください
>>519 他にグローバルでexit()っていう関数がない?
glut.hにあるな。削ってみれ。
522 :
508 :2005/06/19(日) 20:50:41
glut.hを書き換えたりして、いいんですか?????????????????
あ?俺なんかvmunixとかntoskrnl.exeとか書き換えるよ? ゴクヒで ヘッダなんざただのテキストファイルなんだから、viでチョイチョイだろ ゴクヒで
>>522 藻前はコンパイルしたいのかしたくないのかどっちなんだ?
>>522 そうだよな。そのまま何度もコンパイルしてたほうがいいよなw
527 :
デフォルトの名無しさん :2005/06/19(日) 21:09:00
英文字の大小比較ってどうすんですかね? たとえばa,dという文字ならa<dっていう感じにしたいんですが。
>>527 asciiならそのまま'a' < 'd'で。
529 :
508 :2005/06/19(日) 21:17:05
エラー E2451 c:\Borland\Bcc55\include\GL/glut.h 486: 未定義のシンボル exit(関数 __stdcall glutInit_ATEXIT_HACK(int *,char * *) ) エラー E2451 c:\Borland\Bcc55\include\GL/glut.h 503: 未定義のシンボル exit(関数 __stdcall glutCreateWindow_ATEXIT_HACK(const char *) ) エラー E2451 c:\Borland\Bcc55\include\GL/glut.h 549: 未定義のシンボル exit(関数 __stdcall glutCreateMenu_ATEXIT_HACK(void (*)(int)) ) コメント化したexitが未定義のシンボルになってエラーでます。 上の三行もコメント化してみたんですが、すると エラー E2268 meshdraw.cpp 41: 未定義の関数 'glutInit_ATEXIT_HACK' を呼び出した(関数 MeshDraw::init(int,char * *,Solver *) ) エラー E2268 meshdraw.cpp 45: 未定義の関数 'glutCreateWindow_ATEXIT_HACK' を呼び出した(関数 MeshDraw::init(int,char * *,Solver *) ) こうなりました。 やっぱglut.hのexit使ってるみたいなんだけど・・・これって解決困難?
>>529 んじゃ、glut.hでinclude <stdlib.h>とか。
>>529 exit の宣言が要るんなら、削除じゃなくて #include <stdlib.h> に置き換えればいいんじゃね?
532 :
508 :2005/06/19(日) 21:28:49
みなさん、どうしてそんなに頭がいいんですか
535 :
デフォルトの名無しさん :2005/06/19(日) 21:37:55
Linuxのプログラムについてお聞きしてもいいですか? ちょっとしたネットワークプログラムを作っています。 SIGCHLDをキャッチしてその中からログファイルへの書き出し をしているのですが、localtimeを呼び出しているところで ブロックしてしまいます。 デバッグのためにElectricFenceをリンクしているのですが それを外せばブロックしません。 解決方法などはあるのでしょうか? または何かおかしいことをやっているのでしょうか? なお、VineLinux3.1 FTP版 gcc-3.3.2-0vl8 kernel-2.4.31 ElectricFence-2.2.2-11vl2 です。 VineLinuxの公式kernelの、kernel-2.4.27-0vl7.3でも同じ問題が発生しました。 なお、同じ問題が再現するソースを次に示します。
536 :
535 :2005/06/19(日) 21:39:09
--- a.c --- #include <stdio.h> #include <signal.h> #include <time.h> void handler(int signo) { time_t t = time(NULL); struct tm *tt = localtime(&t); } void setup_signal() { struct sigaction act; memset(&act, 0, sizeof(act)); act.sa_handler = handler; sigemptyset(&act.sa_mask); act.sa_flags = SA_NOCLDSTOP | SA_RESTART; sigaction(SIGCHLD, &act, NULL); } int main() { setup_signal(); if(fork() == 0) exit(0); sleep(1); return 0; } # gcc a.c -lefence
537 :
508 :2005/06/19(日) 21:45:00
みなさんどうもありがとうございます。 で、その類のエラーは消えたんですがa.exeが見つからないというエラーがでるようになりました。 makefileはこう書き換えてあるんですが CFLAGS = -DWIN32 LIBS = -lglut32 -lglu32 -lopengl32 -lm SRC = main.obj diff.obj meshdraw.obj gl_screenshot.obj a.exe: $(SRC) bcc32 -o $@ $(SRC) $(CFLAGS) $(LIBS) .cpp.o: bcc32 -c $< ところで、a.exeってなんすか。 a.outみたいなもんすか。 もしかしてcygwin用ですか。 DOS窓でbccでやるときにはa.exeは何か別の名前にすべきなんですか
538 :
デフォルトの名無しさん :2005/06/19(日) 21:45:35
高校の宿題でゎからなぃプログラムのところが ぁるんですけど、そーゆーのって ここで聞いてもぃぃnですか??すぃませnooo
コミュニケーション取れるようになってから出直してきてね
541 :
デフォルトの名無しさん :2005/06/19(日) 22:01:38
COBOLなnでつがぁ・・・・・ ―――――――――――――――――――――――― | KURASU-TAB | ―――――――――――――――――――――――― |SEITO(1)|SEITO(2)|SEITO(3)|〜〜|SEITO(40)| ―――――――――――――――――――――――― テーブルKURASU-TABのSEITO(1)に1を、(2)に2を・・・ SEITO(40)に40を初期値として空欄をうめなさぃ。 MOVE (ア) PERFORM UNTIL (イ) COMPUTE SOE = SOE + 1 MOVE (ウ) TO SEITO(SOE) END-PERFORM
ここはC/C++スレですが、何か?
>>535 ElectricFenceとやらを知らないので、外してるかもだけど、
localtime の代わりに localtime_rを使ってもだめ?
>537 おまいには学習能力がない。ひょっとしたら人並みの思考能力もないかもしれない。 このままプログラミングをやってもおまいも含めて周りの人間を不幸にしかしないと思われる。 よって、プログラミングをやめるか、さもなくば首吊って氏ね。 冥土の土産に答えとくと bcc32 -o $@ $(SRC) $(CFLAGS) $(LIBS) を bcc32 -o$@ $(SRC) $(CFLAGS) $(LIBS) に書き換えて make しろ。
546 :
535 :2005/06/19(日) 22:48:06
localtime_r でも駄目でした。 うーむ、localtime_rも「安全な関数」ではないですが これが原因なんでしょうかね。 しかしどちらにしろ推奨されていない実装はよした方がいいですね。 別の方法も考えて見ます。
>>546 最低限、以下の事に答えて頂けると、答える側としては助かります。
よろしくお願いします m(__)m
1. その「駄目」というのは、546と同じ症状、つまり「localtime_rでブロックして
しまう」という解釈でいいですか?
2. 「ブロックしてしまう」というのは関数が呼ばれたまま返ってこないという
解釈でいいですか?
3. 「ブロックしてしまう」というのは具体的にはどうやって確かめましたか?
4. ネットワークプログラムを作っているそうですが、そういう余計なものを
一旦取っぱらって、単にforkしてlocaltimeを呼ぶだけという短いプログラムでも
同じ状況が再現されますか?
5. timeの結果は正しいと確認できてますか? (どのように確認しましたか?)
548 :
508 :2005/06/19(日) 23:25:53
>544 書き換えてmakeした結果↓ Fatal: ファイル A.EXE が開けません ・・・駄目じゃん。思考力がないのはその通りなのでもっとヒントをくれよ
>>548 はぁ?自分で実行したプログラムくらい管理せい!
-o $@削ったら、main.exeができるんとちゃう? たぶn別のリンカエラーがまたでてくる木がするけど
うーん、こんなにアホなのにOpenGLかぁ
class A { public: void showX(); private: A* x; int v; }; void A::showX() { std::cout << x->v << std::endl; } というコードをうっかり書いたらコンパイラ通っちゃったんですが x->vでアクセス違反にならないんでしょうか?気になって夜も眠れません。
>>553 アクセス制御はインスタンス単位ではなくクラス単位に働くのですよ
>>553 文法的に間違ってないし。
でもとりあえず解決してから寝たほうがいい。
>>553 それは正常な動作。
showX が実行されるときに、xがちゃんと初期化されていれば
アクセス違反にはならない。
>>593 未初期化のポインタを使ってるから未定義動作だろ。
>>553 通らない理由がないからコンパイルは通るね。
例えばコンストラクタで適切に値をセットするならアクセス違反にもならないし。
そんなことで眠れなくなるくらいならプログラミングをやめた方がいいよ。
#寧ろデスマ要員として就職できたりしてw
おーい、>593やー、未初期化のポインタを使ってるんだとよ〜 つーか、>558は預言者かい。
561 :
535 :2005/06/19(日) 23:47:59
>>547 1,2 はい、その通りです。
3 前後にprintfを挟んで確認しました。
また、プログラムが永久にハングします。
4.単にforkしてlocaltimeを呼ぶだけでは発生しません。
5. printf("%d\n", t); として確認しました。
562 :
553 :2005/06/19(日) 23:48:38
省略してますが初期化はしてます。
>>555 クラス単位なんですか。この場合アクセス制御することは出来ないんでしょうか?
>>562 >省略してますが初期化はしてます。
w
アクセス制御とメモリの保護を一緒にしないでね。
>>561 >>547 ではないけどさ
1と4の答えのつじつまが合ってないように見えるんだが、気のせい?
>>562 なんでしたいのか良くわからんけど
コンパイル時にアクセス制御したいなら無理かも
実行時ならthis と xを比較すればいいんじゃね?
567 :
535 :2005/06/20(月) 00:08:16
>>567 誤読ならすまんが
1ではlocaltime とか localtime_r でブロックしてしまう、と言っているように見える。
4ではlocaltimeだけなら大丈夫だった、と言っているように見える。
(聞きたいのは localtime (localtime_r) 自体でブロックしているのかいないのか)
とにかくブロックしてないコードにちょっとずつコードを追加していってみては?
シグナルハンドラではあんまり処理させちゃイケナイから、 time()の結果をパイプに書いておしまいにするみたいにしたら。 パイプは、selectとかで待つとして。
571 :
535 :2005/06/20(月) 00:53:37
>>567 あ、なるほど、そういうことでしたか。
私はforkだけで、signalを使わないプログラムでは発生しない
というつもりで書いてました。紛らわしい書き方をしてすみません。
572 :
535 :2005/06/20(月) 01:05:54
>>569 やはりそういう方法を取ろうと思います。
PUSH EBP ;DATA_XOR_PROC MOV EBP,ESP SUB ESP,0C MOV EAX,[ARG.1] ;buffer adrress MOV [LOCAL.1],EAX MOV EAX,[ARG.2] ;buffer size CDQ AND EDX,3 ADD EAX,EDX SAR EAX,2 MOV [LOCAL.3],EAX MOV [LOCAL.2],0 JMP SHORT b: a: MOV ECX,[LOCAL.2] ADD ECX,1 b: MOV [LOCAL.2],ECX MOV EDX,[LOCAL.2] CMP EDX,[LOCAL.3] JGE SHORT z: MOV EAX,[LOCAL.2] MOV ECX,[LOCAL.1] MOV EDX,DS:[ECX+EAX*4] XOR EDX,12345678 MOV EAX,[LOCAL.2] MOV ECX,[LOCAL.1] MOV DS:[ECX+EAX*4],EDX JMP SHORT a: z: MOV ESP,EBP POP EBP RETN このように成る様Cで書いてるんですが上手くかけません。
574 :
537 :2005/06/20(月) 02:33:11
int DATA_XOR(int buffer, int bufsize){ int a = buffer; int b = bufsize/4; int i; for (i=0;i < b;i++){ a = (a + (4 * i) ^DATXOR); } return 0; } これだとダメなわけですが、既にあるbefferを配列として扱えるのでしょうか?
575 :
574 :2005/06/20(月) 02:34:05
537ではなく573です。すみません。
つint* buffer
ありがとう
>>576 さん。
でもダメでした。
>>574 ので XOR EDX,12345678 までは同じコードになるのですが、
以降違ってしまいます。 配列にしようとしたところ、4行目辺りから
違うものになってしまい、配列は関係ないようです。
a+i = (a + (4 * i) ^DATXOR); こんな感じのが許されるなら同じに
なりそうなのですが。
つ int * a = buffer; a[i] = a[i ^ DATXOR];
ありがとう
>>578 さん。
でも、付け加えるのか、置き換えるのか、解りません。
最初の定義だとしてチャレンジ中です。
580 :
579 :2005/06/20(月) 04:19:37
a+i = (a + (4 * i) ^DATXOR); これと置き換えると、かなり近いコードに なりましたが、まだダメでした。 申し遅れましたが最近Cの勉強を始め、WisdomSoftのC言語入門、48.バイナリデータ まで、解ったつもりの初心者でした。
581 :
580 :2005/06/20(月) 05:27:26
void DATA_XOR(int buffer, int bufsize){
int *a = buffer;
int i;
int b = bufsize/4;
for (i=0;i < b;i++) a[i] = a[i]^ DATXOR;
}
以上の様にしましたところ、同じになりました。
>>578 さん、ありがとうございました。<(_ _)>
582 :
デフォルトの名無しさん :2005/06/20(月) 12:34:54
windowsフォームアプリケーションでドラッグアンドドロップのやりかたが わかりません。 だれか教えてください。 よろしくお願いします。
584 :
デフォルトの名無しさん :2005/06/20(月) 13:10:51
誰か助けてください。C言語で鶴亀算(?)ってできるのでしょうか?一応linuxです…
機械的な手順に落とせるのならできる
>>584 #include <stdio.h>
#define MAX( a, b ) ( a < b ? b : a)
#define MIN( a, b ) ( a > b ? b : a)
/* 足の少ない方の動物の頭数を返す ( -1 == ERROR )*/
int get_head1(int feet1, int feet2, int all_head, int all_feet)
{
if(feet1 < 1 || feet2 < 1) return -1;
if( MIN(feet1, feet2) * all_head > all_feet ) return -1;
if( MAX(feet1, feet2) * all_head < all_feet ) return -1;
return ( all_feet - all_head * MIN(feet1, feet2) ) / MAX(feet1, feet2);
}
/* 脚の多い方の動物の頭数を返す (-1 == ERROR )*/
int get_head2(int feet1, int feet2, int all_head, int all_feet)
{
int ans = get_head1(feet1, feet2, all_head, all_feet);
if( ans != -1 ) ans = all_head - ans;
return ans;
}
int main()
{
int kame_feet = 4;
int turu_feet = 2;
int all_head = 10;
int all_feet = 30;
printf("turu = %d\n", get_head1(kame_feet, turu_feet, all_head, all_feet));
printf("kame = %d\n", get_head2(kame_feet, turu_feet, all_head, all_feet));
return 0;
}
char str1[20] = "aaaaa\n"; char str2[20] = "bbbbbb\n"; char str3[20] = "ccc\n"; char tmp[20] = ""; 上記のような変数を用意し、tmpにそれぞれをコピーしようとしています。 正確にはファイルから1行読み取り、改行手前までのデータをコピーするのですが。 このとき、strncpy(tmp,str1,strlen(str1)-1); と strncpy(tmp,str2,strlen(str2)-1); までは 正常に動作するのですが、 strncpy(tmp,str3,strlen(str3)-1); を実行するとうまくできません。 strncpy(tmp,str1,strlen(str1)-1); → tmp : aaaaa strncpy(tmp,str2,strlen(str2)-1); → tmp : bbbbbb strncpy(tmp,str3,strlen(str3)-1); → tmp : cccbbb str3をコピーして、tmpにcccだけを格納したいのですが、 どのようにすればいいのでしょうか。 環境はWindows2000で、コンパイラはbccです。
588 :
584 :2005/06/20(月) 14:23:20
間違えた。 get_head1 が脚の多い方。 get_head2 が脚の少ない方。 です。
スマン番号ミス。 >588 は、 584 ではなく、>586の訂正。
すいません、自己解決しました・・・orz
591 :
586 :2005/06/20(月) 14:29:56
げ、計算あってない。スマン。
592 :
582 :2005/06/20(月) 14:44:15
>>592 検索も出来ない人にageられても困ります。
594 :
582 :2005/06/20(月) 14:56:09
>>583 だったらURL張ってみてください。
最後まで検索かけましたが何か?
595 :
586 :2005/06/20(月) 14:58:51
できた。以下の関数を訂正。 /* 足の少ない方の動物の頭数を返す ( -1 == ERROR )*/ int get_head1(int feet1, int feet2, int all_head, int all_feet) { int tmp; if(feet1 < 1 || feet2 < 1) return -1; if( MIN(feet1, feet2) * all_head > all_feet ) return -1; if( MAX(feet1, feet2) * all_head < all_feet ) return -1; tmp = all_head * MAX(feet1, feet2) - all_feet; if( tmp % MIN(feet1, feet2) != 0 ) return -1; return tmp / MIN(feet1, feet2); } なお、get_head1 が脚の少ないほう、get_head2 が多いほうです。 すれ汚しスマソ。
596 :
582 :2005/06/20(月) 16:08:19
>>583 結局みつからないのならはじめから煽らないでください。
>>582 いいから消えろ
.NETが見つからん言うてVCスレとか探してみたんかてめぇは
____________
|| ||
|| バカは放置! ||
|| 。 ΛΛ || / ̄ ̄ ̄ ̄ ̄ ̄ ̄
ハーイ! || \. (゚Д゚,,) <
>>597 さん、いいですね!
||________⊂ ∪ \_______
∧ ∧ ∧ ∧ ∧ ∧ | |
( ∧ ∧ ( ∧ ∧ ( ∧ ∧ UU~
〜(_( ∧ ∧ __( ∧ ∧__( ∧ ∧ ハーイ!
〜(_( ∧ ∧_( ∧ ∧_ ( ∧ ∧
〜(_( ,,)〜(_( ,,)〜(_( ,,)
〜(___ノ 〜(___ノ 〜(___ノ
599 :
デフォルトの名無しさん :2005/06/20(月) 17:15:29
char *a = mallocで作られたポインタ; free(a); としたら、*aを使うのは危険になりますが、aは大丈夫なのでしょうか? つまりこのまま a = 別のmallocで作られたポインタ; 等とするのは大丈夫なのでしょうか?
600 :
582 :2005/06/20(月) 17:15:45
>>597 だったらはなから.netスレ池とかかくなヴォケ
うまく誘導できないくらいならするなと言いたいだけだ。
まぁこんな糞なことしか議論できない低脳に聞いた俺が馬鹿だったって話なんだがな。
freeの後で*aを使うのはもちろんだめだが aを再利用するのは問題ない
>>599 OK。キミはちゃんと変数を理解している。
希に、delete a; すると、
「aが使えない」「aにNULLが入る」等と勘違いする人がいる。
>>599 aはただの入れ物であり、free(a)で解放されるのはaに入れていたアドレスの先にある領域
aにはなんら影響を及ぼさない
余談だが、free(a)したら直後にa=NULLにしておくことをオススメする
ただ、変数の意味が変わるような使い方は好ましくないとされてるみたい。
608 :
584 :2005/06/20(月) 18:20:23
>>586 ありがとうございます
ですが…
C言語で連立方程式を解くに
はそんなにかかるんですか…
もっと勉強しなきゃ…or-z
実は授業で出た課題なんですが
scanf関数とかしかやってない
のにこれはちょっと無茶では
いや、これは連立方程式ではなく鶴亀算。 連立王定式なら、もっと煩雑になるだろうな。
一次連立方程式なら、行列を使った解法がいくらでもあるんじゃない?
611 :
◆CDoPhxVDCI :2005/06/20(月) 18:36:08 BE:76068926-#
printf("\x1b[2J") ができません。画面が消えません。 device=%SystemRoot%\system32\ANSI.SYS を追加したんですができませんでした。 OSはXPでコンパイラはフリーのBCCを使っています。
XPではだめなんじゃ? command.comならいける
そういうことではなく、32ビットコンソールアプリとNT系コンソールの組み合わせがNG. XPのcommand.comから32ビットコンソールアプリを起動してもミリ。
cygwin でもミリ?
XPにcommand.comってあったっけ? cmd.exeならあるんだが。 で、エスケープシーケンスで色つけたいなら端末エミュレータを使えばいい。
c:\windows\system32 のディレクトリ 2001/08/28 12:00 64,814 command.com
>>608 連立一次方程式。整数解のみ版
#include <stdio.h>
int main()
{
int a, b, c, d, e, f;
int x, y;
int v1, v2;
printf(">> ax + by = c\n");
printf(">> dx + ey = f\n");
printf("input [ a b c ] > ");
scanf("%d %d %d", &a, &b, &c);
printf("input [ d e f ] > ");
scanf("%d %d %d", &d, &e, &f);
v1 = e * c - b * f;
v2 = e * a - b * d;
if( v1 % v2 != 0 ) { printf("整数解はありません\n"); exit(1); }
x = v1 / v2;
v1 = c - a * x;
v2 = b;
if( v1 % v2 != 0 ) { printf("整数解はありません\n"); exit(1); }
y = v1 / v2;
printf("%dx + %dy = %d\n", a, b, d);
printf("%dx + %dy = %d\n", d, e, f);
printf("( x, y ) = ( %d, %d )\n", x, y);
return 0;
}
鶴亀計算するなら。
input [ a, b c ] = [ 1, 1, 頭の合計]
input [ d e f ] = [ 2, 4, 脚の合計] で
( x, y ) = ( 鶴の数, 亀の数 ) と出ます。
619 :
618 :2005/06/20(月) 19:06:45
バグ訂正 下から5行目 誤> printf("%dx + %dy = %d\n", a, b, d); 正> printf("%dx + %dy = %d\n", a, b, c);
620 :
デフォルトの名無しさん :2005/06/20(月) 19:42:56
初心者です。 関係演算子の説明で "a < b aがbよりも小さければ1,そうでなければ0という値を生成する" ってあるんですけど値って・・・。 単純に不等号だと思ってればいいんですよね?
>>620 int a = 1, b = 2, c = a < b;
これでcに1が入るって事。
>>620 それでもいいけど、0は偽・0以外は真ということを理解しといた方がいい。
>>620 つまりa < b < cなんてのが数学とは違う解釈になる。
operator < ()
0, '\0', NULL これらは、条件式では偽となる。 それ以外はすべて真。 Cにはブーリアン型がないので、これらをブーリアン「偽」の代用と し、集合論の原理からそれ以外のすべての値は真となる。 しかし、定数としての真を定義しなければ、実装上厄介なため、 無数にある真値の中から代表として1を使用している。
627 :
620 :2005/06/20(月) 20:21:07
>>622-626 なるほど、数学の不等号と違うんですか・・。φ(`д´)メモメモ...
それでプログラムを作ったんですがエラーが・・・もうちょっと考えます。
Cの「式」は、数学の「式」と同じじゃないのサ 評価することができて、値が存在する何者か。 =は等式じゃなくて単に「代入する」んだし 代入式にも「式の値」が存在する。
629 :
620 :2005/06/20(月) 20:29:49
scanf("%d" , &n1);/*値を2つ取得*/ scanf("%d" , &n2); n3 = n1 > n2; /*n3に値0,1のいずれかを取得させる*/
630 :
620 :2005/06/20(月) 20:31:13
を n3 = n1 > n2; /*n3に値0,1のいずれかを取得させる*/ scanf("%d" , &n1);/*値を2つ取得*/ scanf("%d" , &n2); としてたため、0しか吐いてくれませんでした(;´Д`) 629ので正確に0or1を吐いてくれます。皆さんありがとうございますた。
631 :
608 :2005/06/20(月) 20:43:48
あ、なるほど!!!
>>618 さん、ありがとうございます!
ほんとに助かりました!!
ところでmainのまえのintは
必要なのですか?
C99では必須。C++でも必須だったはず。それ以前のCではなくても問題ない。 間違ってもvoidなんて書くなよ。
633 :
608 :2005/06/20(月) 20:57:03
>>632 授業ではいきなりmain()...と書いていたのですが…
>>633 main()と書くのはC89などではint main()とと書くの同義。
とにかく int main って書いておけ。いきなり main はもうとっくに時代遅れだ
636 :
608 :2005/06/20(月) 21:34:33
わ、わかりますた…
637 :
608 :2005/06/20(月) 21:41:21
ところで、Microsoft Visual C++ Toolkit 2003って どうやって使うんでしょうか… なんか自分のPCでもコンパイルとかしてみよう と思ってダウンロードしてみたのですが コマンドとか良くわからないもので… 学校のlinuxならやり方は当然習っているのですが ためしに画面にgccと打ち込んでみる…or-z
よくわからんがインストールした辺りから vcvars32.bat を探し出すと幸せになれるかもな。
>637 いっそ cygwin 入れて gcc 使えば?
しかし学校でやってるなら同級生の詳しい奴に聞いた方が早くないか?
a.同級生が他にいない(1人だけである) b.これでも自分が一番詳しい う〜ん、その他は?
typedef int(*VLCFUNC)(const char *aptr, int asiz, const char *bptr, int bsiz); この様に型が定義されていて VILLA *vlopen(const char *name, int omode, VLCFUNC cmp); この様にその型の関数を使う関数のあるライブラリがあるのですが, マニュアルによると上の定義で関数を書いてvlopenに指定しろ、との事なのですが 例えばどう書けば良いのでしょうか?
c.特に理由は無いがなんとなく嫌
>644 int xxx(const char *aptr, int asiz, const char *bptr, int bsiz) { }
647 :
644 :2005/06/21(火) 00:27:36
>>646 レスありがとうございます。
そう書いておいて
VILLA *vlopen(const char *name, int omode, xxx);
とすれば良いのでしょうか?
実際に試してみたところエラーは出ないのですが、関数の結果におかしな所があるので
合ってるかどうか良く分からないんです。
>>644 C の sqrt に関する情報を集めるといいことがあるかも。
qsortのことだろうか・・・
条件演算子って2つ使うことはできないのでしょうか? 例えば、以下のようなときです ・x1,x2,x3を取得し最小値を出力する。 #include<stdio.h>/*最小値を取得8*/ int main(void) { int x1 , x2 , x3 , min; /*値を3つ取得*/ scanf("%d" , &x1); scanf("%d" , &x2); scanf("%d" , &x3); min = (x1 < x2) ? x1 : x2; min = (x3 < x2) ? x3 : x2; printf("最小値は%dです。" , min); return (0); } としましたが2番目のmin が反映されません・・・。
652 :
651 :2005/06/21(火) 06:16:07
min = (x3 < x2) ? x3 : x2; min = (x2 < x3) ? x2 : x3; と修正してもダメです(;´Д`)
何がやりたいのかよくわからん。 最小値もとめるならこうじゃないのか? min = (x1 < x2) ? x1 : x2; min = (min < x3) ? min : x3;
654 :
651 :2005/06/21(火) 06:22:53
>>653 指摘どうもありがとうございます。
変数もうひとつ用意したら出来ました。
でも
>>653 さんのほうがシンプルですね・・・。
つーか、あんた馬鹿? よく理解できないまま書いているだろ。
[課題Q]3角形の底辺の長さ,高さをキーボードから読込み,その面積を計算するプログラムを作成しなさい. ただし,底辺の長さ,高さ,面積の値を入れる変数名をそれぞれteihen, takasa,mensekiとし,いずれも実数型(double型)とする. void main( void ) { double teihen, takasa, menseki; printf( "底辺は?\n" ); /* 入力を促すメッセージを表示 */ scanf( "%d", &teihen ); menseki = teihen * takasa / 2; printf("%f\n",menseki); } これ誰か完成させてくれ
findfirst関数を利用するために、いろいろ調べてみたら ffblkという型の構造体を用意するとかかれていました。 ff_ftimeやff_fdateはどういう状態なのかを書いたサイトがあったのですが、 ff_reservedは調べてみてもよくわかりませんでした。 これってなんなんですか?
660 :
デフォルトの名無しさん :2005/06/21(火) 13:41:01
どこの掲示板で書けばいいのかわからず、 とりあえずは、ここが近いと思い書かせてもらいます。 今、nmakeを使ってデータのみをコンパイルしたいと思い、 サクサクとコードを記述したのですが、C++コンソールで作成しました ツールを動作させますと、実行結果は問題ないのですが、 下記のエラーが必ず出てしまいます。 nmake : fatal error U1077: 'fpatch.exe' : リターン コード '0x1f' Stop. 更に下記にnmake側のコードを記述します。 #************************************** T= c: #************************************** ALL:\ $(T)\test.bin #************************************** $(T)\test.bin: fpatch.exe #************************************** ※fpatch.exe はc++コンソールで作成しました自ツールです。 試しに単なるprintf文だけ表示させるだけの実行ファイルを fpatch.exeを入れ替えてnmakeを実行させますと printfの内容は表示されるものの、やはり同じエラーが返ってきます。 開発環境でのOSはWindows2000ですが、何か問題があるのでしょうか?
C++にリフレクションが無い理由を教えてください。
662 :
660 :2005/06/21(火) 13:47:41
すいません。nmake側のコードで記述されているタブが どうも消されてしまっているようなので、 #************************************** ALL:\ $(T)\test.bin ←タブ #************************************** $(T)\test.bin: fpatch.exe ←タブ #************************************** 書いときます。すみません;;
>>660 そのメッセージのとおり、fpatch.exeの戻り値が31になってるんじゃないの?
main()の最後でちゃんとreturn 0してる?
665 :
660 :2005/06/21(火) 14:22:26
>>663 ぉおおおお!
main()側は確かに戻り値は指定していませんでしたので、
早速、修正しましたら、エラーがでなくなりました;;
なんと・・・戻り値がないだけで、エラーってましたか・・;;
素早い対応、感謝感激であります;;
>>665 あのねぇ……
main()の戻り値(=exit()の引き数)はOSに対するエラー通知に使われるわけ。
makeツールはそれを実行したプロセス(この場合fpatch.exe)のエラー情報として使うわけ。
#まぁ、まともなmakeツールならそれを無視することもできるだろうけどね。
すいません、凄く初歩的な質問なんですけれど 著/高橋 麻奈 やさしいC 第二版の49ページに基本形の表が書いてあるのですが、 long intとintの差がわかりません。 両方とも記憶できる値の範囲例が int -2147483648~2147483647 long int -2147483648~2147483647 となっています。 これはintとlong intは同じと考えて良いのでしょうか?
>>668 今現在の大抵の環境では、偶偶同じ長さというだけ。
また、同じという前提で書かれたプログラムも多数あるので注意。
>>668 16bitコンパイラだと
int -32768~32767
long int -2147483648~2147483647
になったりする
strtokが返してきたポインタに書き込んでも大丈夫?
>>671 strtok()が返すポインタは、引数として渡した文字列のどっかを指している。
で、strtok()の仕様上、readonlyな文字列を渡すことができない。
というわけで、問題はないはず。
>>671 strtok()が返すのはあんたが用意したメモリ空間だから構わないっちゃ構わないが、
混乱する元だから止めておいたほうがいいよ。
#つーか、strtok()自体スレッドセーフじゃないからお勧めできない。
>>668 規格で決まってるのは
1) shortは最低16bit
2) longは最低32bit
3) sizeof short <= sizeof int <= sizeof long
ってことだけ。
16bitや64bitの環境を考慮する場合は気をつけろ。
>>673 strtok()のスレッドセーフ版がstrtok_r()の場合もあるが、
Microsoft VC++のように、マルチスレッド版のCランタイムでは
strtok()という同じ名前でスレッドセーフにしている場合もある。
まあ、推奨しないのは俺も同感だがな。
それじゃ何故区切られた文字列ポインタが帰ってくるのですか? 単語の終わりに0入れたら、次のstrtok呼び出し時、困るような気がするのですが。 文字列サイズが含まれてるわけでもないのに。
>>676 libcのソースを見てもらうのが手っ取りはやいのだが
(VC++にもlibcのソースはついている)
典型的な、スレッドセーフ*でない*実装では、
次のトークンを指すstaticなポインタを内部で保持しとるのだよ。
それがトークン区切りの'\0'の後を指してるから、問題は無いわけ。
>>676 疑問を感じたら実装に当たろう。
ソースを見れば一目瞭然。随分危ない橋を渡っているのが分かるはず。
>>674 てことは、intが24bitなことも有りうる?
安全圏内での書き換えは大丈夫ということですね。 レスThanks
安全圏=0までの文字列 スレッドはシングル(コンソール)なので問題ないです。
>>679 規格上は有り得る。が、常識的な実装上はまずない。
684 :
683 :2005/06/21(火) 16:50:30
訂正。 「まずない」→「余りない」 勢い余っちまったw
int i; int* a = buf; i = i+0x800; //800h加算される a= a+0x800; //何故か0C80h加算される aにbufオフセット800hをセットしたいのですがどうやればいいのでしょうか? ちゃんと800h加算された事もあるのですが・・・・・・
>>685 pがポインタのとき、p+1はpの「次の要素」を指すポインタ。
つまり、pをsizeof (*p)バイト進めたもの。
明示的にアドレスをいじりたいなら、
a = (int *)((char *)buf + 0x800);
とでもするといい。
どのみち0C80hでは計算があわんがのう 2000h加算される、とかなら分かるのだが
689 :
685 :2005/06/21(火) 17:27:16
>>687 なるほど。
この場合int(4byte)で4倍されていたのですね。
ありがとう。
>>688 すみません、今みたら2000hになってました。
int* a = a+0x0800としてみたり、
int a = buf+0x800としたりやってたんで、間違いました。
>>687 charが9ビットだったらsizeof(char)はいくつになるの?
っていうか((char *)buf + 0x800)がどうなるのか知りたい。
>>691 sizeof(char)は必ず1になる。
>>691 sizeof(char)は常に1だ。
仮にそれが9ビットだとしても変わらない。
質問です。
今リスト構造というのを勉強してるのですが、
試行錯誤の末、↓のサンプルを作りました。
http://www.vipper.org/vip37005.txt ↑には
struct list * pop (struct list *pListTop , int &nNum)
という関数があります。
これはリストの前列の値をとりだして、
その後不要なメモリを削除する関数です。
取り出した値は第二引数の int &nNum に入れてるのですが、
戻り値をint型にするにはどうすればいいんでしょうか?
int pop (struct list *pListTop)
こんな感じで、取り出した値を戻り地にしたいんですが・・
わかりにくいプログラムで申し訳ありませんが、
どなたかお願いします m(__)m
>>694 >int pop (struct list *pListTop)
ってすればいいじゃん。
何がわからないんだ?
なんだってわざわざC++でこんなプログラムを…… というのはさておき int pop(struct list**pListTop); として、pListTopを値/結果引数にすると良いだろう。 ob1 = pop(ob1, nNum); のようなコードのかわりに nNum = pop(&ob1); と書ける。
>>695 >>696 レスどうもです。
>>695 それだと pListTopのアドレスが変わらないので、
結果がヘンになってしまっていたのです orz
>>696 実はこの後クラスにするつもりだったんですが、
リスト構造は初めてのため、理解するために
まず構造体で作ったたのですが・・
** だと、関数の中でアドレスを変えたら
呼び出し先のアドレスも変化するのでしょうか?
ちょっと今からやってみます。
>>609 呼び出し側の値を書き換えたければポインタ/参照渡し。これ基本。
swap()の例ぐらいは流石にしってるでしょ?
struct list *pListTopを書き換えたければ&pListTopを渡す。
で、その型はstruct list**
ただそれだけのこと。
C++なら、ポインタへの参照を使えばいいんじゃない?
>>698 なんとかできました m(__)m
ポインタのポインタは使ったこと無いので、
記述方を調べるのに時間かかってしまいました。
これで大丈夫でしょうか?
int pop (struct list **pListTop)
{
struct list *pOldList; // リスト削除用
int nNum;
// リストが空の場合
if (*pListTop == NULL) {
cout << "リストは空です\n";
nNum = 0; // なんとなく0を入れとく
return nNum;
}
pOldList = *pListTop; // 取り出したあと削除するため、今のアドレスを保存
nNum = (**pListTop).num_data;
*pListTop = (**pListTop).nextlist; // 最前列のアドレスを、一個前のアドレスに変える
delete pOldList; // 値を取り出したので削除
return nNum;
}
あと、swap()の例とかいうの、知らない orz
>>699 はい。次はそれに挑戦してみます。ども。
要素が-1,0,1のいずれかで、長さが10の配列 3^10通り をずべて求めたいのですが、 {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1} すべての場合を尽くして {1,1,1,1,1,1,1,1,1,1} にするためのアリゴリズムがわかりません・・。 どなたかご教授願います。(わかりにくい文章ですみませんorz)
>>701 10ケタの3進数と考えればいいんじゃない?
>>701 C++の<algorithm>にstd::next_permutation()なんてのがある。
>701 案1.再帰を使う void set(int *target, int idx) { if(idx==10) { /* 処理 */ } else { int i; for(i=-1;i<=1;i++) { target[idx] = i; set(target, idx+1); } } } int main(void) { int array[10]; set(array, 0); } 案2.再帰をループに展開する 案3.ほぼ等価になるような気もするけど >702 int i, array[10]; for(i=0;i<10;i++) array[i]=-1; do { /* 処理 */ ++array[0]; i=0; while(i<10 && array[i]==2) { array[i]=-1,++array[++i]; } /* 繰り上がり処理 上の代入と合わせて for 文にすることも可能 */ } while(i<10);
真面目に基数変換してみるとか。 #include <stdio.h> void foo(int m[], unsigned n) { for (unsigned i = 0; i < 10; ++i) { m[i] = (n % 3)-1; n /= 3; } } int main() { // 3^10 = 59049 int m[10]; for (unsigned i = 0; i < 59049; ++i) { foo(m, i); for (unsigned j = 0; j < 10; ++j) { printf("%2d ", m[j]); } printf("\n"); } return 0; }
50 00 00 00 0C 02 3C 00 38 30 00 00 00 00 00 00 P....<.80...... 6B 61 67 65 2E 62 6D 70 00 00 00 00 00 00 00 00 kage.bmp........ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 50 00 00 00 44 32 3C 00 30 09 00 00 00 00 00 00 P...D2<.0....... 6B 61 67 65 2E 78 00 00 00 00 00 00 00 00 00 00 kage.x.......... 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ このようなArchiveファイルのインデックスをメモリに読み込みました。 4hからの4バイトがArchive内の位置、8hからがファイルサイズ、 10hからがファイル名です。 void list(int *a) { int i; int b = (archivesize - 0x0800 - 0x100)/0x050; //アーカイブ内ファイル数 a = a+0x200; //ファイル先頭 for(i=0;i < b;++i){ printf("%s\t%10d\t%d\n",&a[4], a[2], a[1]); a = a+0x14; //NEXTレコード(1レコード50hバイトなので) } } これを構造体として扱いたいのですが、どうすればいいのでしょうか?
707 :
701 :2005/06/22(水) 00:34:21
>>702 ,703,704,705
みなさんありがとうございまうす!
かなり勉強になりますね。自分も頑張ります^^;
#pragma pack(4) struct{ DWORD id; DWORD pos; LONGLONG filesize; BYTE fname[0x40]; }
typedef unsigned char Byte; struct record { Byte mark[4]; unsigned int32_t offset; unsigned int32_t length; unsigned int32_t dummy; Byte fileName[0x40]; };
>>708 さん、
>>709 さん、ありがとう。
マニュアルで#pragma、pack見てるのですが解りません。
宣言ですよね?
WisdomSoftなどを参考に、最初↓こんな感じで書きました。
struct fillist{
int ID;
int pos;
int filesize;
int dum;
char name[0x40];
}
struct fillist a{
a.ID = //どうしてよいやら・・・・・・
pragmaは処理系依存なので以下略。 地道にメンバごとに読み込んでくのが以下略。
void list(int *a) { typedef unsigned char Byte; struct record { Byte mark[4]; unsigned int pos; unsigned int len; unsigned int dummy; Byte fileName[0x40]; }; int i; int b = (decsize - 0x0800 - 0x100)/0x050; struct record *ptr; ptr = a; ptr = (char *)ptr+0x0800; for (i = 0;i < b;++i) { printf("%s\t\t%d\t%d\n", ptr->fileName, ptr->len, ptr->pos); ptr = (char *)ptr+0x50; } } これで一応動いたんですけど、これでいいのでしょうか? 何故構造体で扱いたかったかと言うと、Win32APIのlistviewでファイル選択 したかったからなのです。
typedefやstructをそんなとこでやるもんじゃねぇ てかBYTEは既にWINDEF.hでtypedefされとるんだからそれ使えばええじゃろ
714 :
709 :2005/06/22(水) 06:08:01
私ゃ環境が提示されてなかったからByteをtypedefしたんだがね。
環境聞けよ
#ifndef使えばどこでも動くけどな
>>709 unsigned int32_t って大丈夫?
uint32_t じゃない?
あと、 int32_t 使うなら Byte も uint8_t でいいんじゃね?
おいおい、そもそもuint32_tがなんだと思ってるんだ・・・
719 :
717 :2005/06/22(水) 07:29:57
>>718 ちょうど32ビットのビット幅を持つ符号無し整数型。
んー。なんか勘違いしてるのかな。
基本型使えばいいやん。あほらし
WINの改行コードは\r\nですが fprintf(fp,"sentence\n"); としたとき、\r\nに書き換わりますが、どういう仕様なのでしょうか? strstr(str,"\n");としたときや、 strlen(str);// str="123\n" strtok(str,"\n"); など どのように処理されるか疑問です。処理系によるんでしょうか。 置換処理だけで、あとはそのままの処理('\n'なら'\n'で'\r'なら'\r'で'\r\n'なら'\r\n')の 気がしますが。 説明下手かもしれません。
>>721 テキストモードでオープンされたファイルに対し、
書込時には'\n'を'\r'+'\n'のコードに、
読込時には'\r'+'\n'を'\n'のコードに、
それぞれ置き換えているだけ。
プログラム内部では'\n'は'\n'で'\r'は'\r'だ。
fgetsで取得した文字列の改行は \r\nだったような気がしますが?
>>723 バイナリモードでファイルを開いていれば、そうなるわなあ
テキストモードなら、行末は\nで終端だよ
その辺は、libcの中でも、stdioよりもっと低レベルの層でやってる。
fgets取得の文字列を実験してみた。 text.txt内:"100\r\n" -> つまり、100と改行のみ int main(void) { char buffer[256]; FILE* fp = fopen("text.txt","r"); fgets(buffer,256,fp); printf( "%d\n", strtol(strtok(buffer,"\r"),0,10) ); printf( "%d\n", strstr(buffer,"\r") ); return 0; } 結果は 100 0 でした。 strstrは、予想通りの結果で、strtokは\rでも区切りに成功してます。
>725 ところで、このコードの実行結果について、どうおもう? char p[]="100"; printf( "%d\n", strtol(strtok(p,"\r"),0,10) ); printf( "%d\n", strstr(p,"\r") );
Windowsでトリップ(2chのものと一致しなくても可)を生成したいんですけど、簡単にする方法ってないですか?
何に使うの?
cryptを使う?
文字列終端に対しての区切りだった...。
733 :
デフォルトの名無しさん :2005/06/22(水) 21:07:02
多重ループで九九の表を作ったんですけど 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 ・・・ みたいにずれてしまいます。もう少しきれいに表示させるのはムリなんですか?
>>733 数字と数字の区切りにタブを使ったり、フィールド幅を指定したりすればいい。
よく考えると桁の関係でどうしようもない気がしますけど・・・。
>>735 すごい、それでうまくいきました、ありがとうございます。
>>734 それは、まだ知らないです(;´Д`)勉強します。
C++のクラス定義で class 文字列 クラス名というのを見かけるのですが この文字列はどういったものなのでしょうか?
もうちょっと具体的に
class "Hoge" foo? ありえねーっつーの
class hoge : public hage のこと?
>>740 すみません。
class _EXP Foo {
Foo();
}
こんな感じなのですが・・・あまり詳しくなってません
_declspec(dllexport)
>>744 ありがとうございます。
検索してみます
746 :
740 :2005/06/22(水) 22:05:58
>>746 なるほど、理解が深まります。
ありがとうございました
ホントにわかってんのかな?
たぶん匿名なのを良い事にまた同レベルの質問を性懲りもなくしてくる
説明が足りなかったらすいませぬ、 static unsigned long *Data = NULL; static int X, Y; : : int size = sizeof(unsigned long) * X * Y; Data = (unsigned long *)malloc(size); のmallocの部分をnewにするにはどう組み替えればできまつか? new unsigned long (size)とか試してたんでつが、できる気配もなく・・・
Data = new unsigned long[X * Y];
>>750 Data = new unsigned long[X*Y];
:
:
delete [] Data; //← delete Data; じゃだめよ
>>751 ,752
なんと[]で囲むのでつか。
deleteのほうもなるほど・・・お二人共ありがとうございますだ。
「囲む」っていう表現から、微妙に勘違い臭が感じられる・・・。
BOOL WINAPI GetVersionString(LPTSTR lpBuffer); // lpBuffer:文字列を格納するバッファ という関数で lpBuffer の代わりに string buf を使うことは出来ませんか?
buf.c_str()
>>756 書き込む前に試したけど無理でした。
'const char *' から 'LPTSTR' に変換できない
というコンパイルエラーが出ます。
>>755 LPTSTRはtypedef TCHAR *LPTSTRなので
const char* c_str()は渡せない(constが邪魔)
間違っても::GetVersionString(const_cast<char*>(buf.c_str());
とかやらないでね
マイクロソフトはSTL敬遠してるから止めとけ。 CString,CList,CArrayを用意するくらいだからな。 素直にTCHARの配列渡せばいい。どうせ頻繁に呼ぶわけじゃないんだし。
>>759 > マイクロソフトはSTL敬遠してる
はつみみです。
761 :
デフォルトの名無しさん :2005/06/23(木) 11:25:35
質問です。 携帯JAVAから入ったC++初心者なのですが、 class CHoge{ public: static int test(){ return 0; } } void main(){ int a = CHoge.test(); } とやりたいのですが、JAVAと違ってC++ではうまくいきません。 もちろん言語が違うのでC++の作法に合わせなければと思ったのですが、VC6.0が 「error C2275: 'hoge' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。」 これが理解できません。 そんなアクセス演算子使ってないorz どなたかご教授お願いできますでしょうか。 C++のサイトを見て回った感じ、私のやりたいことをやるには。 void main(){ CHoge hoge; int a = hoge.test(); } とすればよいように見えるのですが、なるべくならCHogeのメソッドをそのまま呼べるのが嬉しいです。
>>761 int a = CHoge::test();
C++ではクラス名の後には::をつける。
>>761 CHoge::test()
C++はメンバアクセスの演算子が場合に応じて色々。これはおぼえるしかない。
>>762-763 ありがとうございます!
早速試してみたらうまくいきました(`・ω・´)
アスタリスクで * *** ***** ・・・ と表示させるプログラムは出来たんですけど、これを * *** ***** みたいに中央寄せ?はできないのでしょうか・・・? 初歩っぽい質問ですいません。
766 :
765 :2005/06/23(木) 12:31:56
--*-- -***- ***** みたいに三角にってことです。火狐でずれた;; (-は見やすいように書きました)
無責任なアドバイスに見えて実は核心に
>>767 痛いところを(;´Д`)
とりあえずもう少しやってみます。
770 :
デフォルトの名無しさん :2005/06/23(木) 12:56:43
#include<stdio.h> #include<stdlib.h> #include<string.h> void main() { char ary[10]; strcpy(ary ,"1.23456"); double dig; dig = atoi(ary); printf("%lf\n", dig); } これをやっても小数が代入されずに値が1.000000になってしまいます。 小数でなければうまくいくのですが…。
atoiがどういう関数か調べろドアホ
ついでに、 >void main() この辺とか >printf("%lf\n", dig); この辺、要注意で。
773 :
デフォルトの名無しさん :2005/06/23(木) 13:07:42
質問させてください。 C++ではnewはアドレスを返すんで、Hogeクラスのオブジェクトを生成するとき Hoge * pobj = new Hoge(); ってやって、メンバへのアクセスは pobj->func(); とかやるわけですが、JAVA風に参照で書きたくて Hoge & obj = * new Hoge(); というふうにやって obj.func(); という感じでメンバにアクセスすることを考えてみました。 BCC5.5では基本的にきちんと動くようです。 こういうやり方に何か問題点とかありますか? たとえば余計なコンストラクタが呼ばれるとかメモリを余分に使うとかそういう類。 その他にも、保守性、可読性、生産性、互換性などに関しても気になります。 ばかげた質問かもしれませんが、アドバイスよろしくお願いします。
>>766 考えてみよう。
その表示を見ると、
・左側の空白
・アスタリスクの列
・右側の空白
の三つに分けられる。
左側の空白はn段のときはn-1, n-2, ... 0、
アスタリスクは同じように1, 3, ... 2*n-1、
右側の空白も左側と同じだけ、記号が並んでいる。
と言うことは、
for (int i = 0; i < n; ++i) {
}
というループを考えるならそれぞれ、n-1-i, 2*i+1,n-1-i個ということだ。
従って、ループの中身は
for (int j = 0; j < n - 1 - i; ++j) {putchar('-');}
for (int j = 0; j < 2 * i + 1; ++j) {putchar('*');}
for (int j = 0; j < n - 1 - i; ++j) {putchar('-');}
putchar('\n');
ということになる。
この辺りをベースに、もっと要領のいい方法がないか模索してもいいね。
>>773 >JAVA風に参照で書きたくて
この辺が間違い。
つーか、本当にnewする必要があるかどうか検討してみよう。
例えばローカルに必要なオブジェクトなら、
int anyFunction()
{
Hoge obj;
...;
}
だけで充分なわけだ。
#クラスが巨大なら話は別だが。
776 :
デフォルトの名無しさん :2005/06/23(木) 13:10:30
>>772 void main()では何かまずいことでもあるんですか?
値を返さないので別に問題ないと思いますが…。
printf("%lf\n", dig);
よくみたらlいりませんね。
printf("%f\n", dig);これでもOKでした。
>774の for (int j = 0; j < n - 1 - i; ++j) {putchar('-');} for (int j = 0; j < 2 * i + 1; ++j) {putchar('*');} for (int j = 0; j < n - 1 - i; ++j) {putchar('-');} ↑この辺が顔文字っぽくて可愛いw
>>776 C/C++の仕様では、intの戻り値を返すことが決められている。
承知の上で無視するなら兎も角、きちんと理解しておくことをお勧めする次第。
>>775 そうそう。
破棄するタイミングを調整したいなら複文化すればいいしね。
780 :
デフォルトの名無しさん :2005/06/23(木) 13:14:56
>>778 int main ()
{
return 0;
}
なるほど、こっちのほうがいいということですね。
781 :
773 :2005/06/23(木) 13:20:32
>>775 > この辺が間違い。
> つーか、本当にnewする必要があるかどうか検討してみよう。
もちろん本当にnewする必要がある場合の話です。
たとえば大量のインスタンス作る必要があるときなどは当然newする必要があると思います。
おっしゃる通りクラスが巨大な場合もあるでしょう。
コードを簡略化したので無駄なことをやっているように見えたかもしれませんが、実際には本当に必要な場面を想定してほしかったです。
説明不足ですみません。
とりあえず
Hoge & obj = * new Hoge();
というステートメントに焦点を充ててもらえたらと思います。
保守性・可読性は悪くなるだろうな。 deleteするとき delete &obj; なんて書かなきゃならんし なにより他の人が見て混乱しそうだ。
>>778 C++ではint main()以外も禁止されてねーぞ。
>>781 自分もJavaを触ることの方が多いけど、
Hoge & obj = * new Hoge();
C++でこんな書き方する奴がそばにいたら、蹴とばします。
>>773 objを配列化に変更するとき面倒。
うっかり std::vector<Hoge> foo みたいなコンテナに入れて酷い目に。
>>784 It shall have a return type of type `int', but otherwise its type is implementation-defined.
ってあるんだけど。3.6.1の2ね。
788 :
773 :2005/06/23(木) 14:13:02
>>779 > 破棄するタイミングを調整したいなら複文化すればいいしね。
ちょっと意味がわからないです。
すみません。
>>782 そうですね。
delete するときは delete * obj; なので、宣言するときと破棄するときの2点だけは気をつけないといけなくなってしまいますね。
ただその他の点では可読性に関して利点があるように思います。
とりあえずC++でインスタンスを参照によってアクセスすることで、変数が「ポインタであるかどうかの識別」が必要なくなるのではないかと考えました。
「参照かどうかの識別」は大概必要ないですし。
ポインタに慣れていればいるほど無意味さを感じるかと思いますが、全てのメンバに同じ方法でアクセスできるようになることは利点ではないかと。
例えば関数の引数でオブジェクトを参照渡しする場合など、呼び出し前の姿と呼び出し後の姿が同じになるわけです。
そういう意味でなるべく参照で扱うということによる利点はあるのではないかと思いました。
保守性に関しては微妙ですねw
790 :
773 :2005/06/23(木) 14:24:11
>>786 う、たしかにそれはイタイですね・・・。
テンプレートへの対応がかなりマズそうですね。
あ、あとdelete & obj;ですね。寝ぼけてました。
そろそろ吊ってくる時間かもです。
おやすみなさい。
>>785 わかってて言っているのか謎ですが、とりあえず屋上でケツでも晒して這い蹲って待ってます。
791 :
775 :2005/06/23(木) 14:36:23
>>773 例えば、
関数の途中でオブジェクトを破棄しておきたい場合、
int func()
{
Hoge * foo = new Hoge;
...;
delete foo;
...;
return 0;
}
となる。これを、newを使わない場合は
int func()
{
{// from
Hoge foo;
...;
}// to
...;
return 0;
}
とすればfrom突入で生成されてto脱出で破棄されることが保証される。
私が言いたいのは、C++なんだから郷に入れてはってことでJAVA風に書くことに拘るのが間違い、と言うこと。
>私が言いたいのは、C++なんだから郷に入れてはってことでJAVA風に書くことに拘るのが間違い、と言うこと。 そういう話じゃないんじゃないか? newの結果を参照で受けることの利点欠点を論じろよ。
793 :
775 :2005/06/23(木) 14:48:29
795 :
デフォルトの名無しさん :2005/06/23(木) 16:07:23
char型の配列の末尾に、int型の変数aに入っている2という値を文字として 入れるにはどうしたらいいですか?
>>795 char buf[100] = "for example:":
sprintf(strchr(buf, '\0'), "%d", a);
797 :
デフォルトの名無しさん :2005/06/23(木) 16:53:17
>796 ありがとうございます。できました。
この板見てるとsprintfって使う人よく見掛けますね。 人気がある関数なんですか?
この板見てるとprintfって使う人よく見掛けますね。 人気がある関数なんですか?
800 :
デフォルトの名無しさん :2005/06/23(木) 17:10:37
一般論として女性のプログラマは色っぽいよな
>>800 ケツにブツブツができてるのを見てからいまいち…
>>798 snprintf()が標準じゃないから。
何かと思ったらずーっとPCの前に座ってるからなんだな
>>804 ちょっと待て!PCの前に座ってるとケツにブツブツができるのか!?
>>796 strrchr() で \0 がひっかけられることを初めて知ったC歴12年の自分。
みんなも気をつけようネ!
風呂できちんとあらっていればならないんですけどね、見落としがちな罠です
>>806 strrchrでもいけるとは漏れも初めて知った。
>>812 strchrで'\0'検出はごく自然だけどね。
C89/C90/C99で規格上どーなってるか知らないけど、 FreeBSDのstrrchr(3)のmanには'\0'検出のことはちゃんと明言されてるな。 DESCRIPTION The strrchr() function locates the last occurrence of c (converted to a char) in the string s. If c is `\0', strrchr() locates the terminating `\0'.
ずっと、&buf[strlen(buf)]って書いてた……
まあmemchr(s, 0, INT_MAX) とかでもいいけど strchr()はなかなかエレガントだな
>>815 もしかして
fgets()の改行切り捨てるのにも
buff[strlen(buff)-1] = '\0';
とか書く口?
819 :
812 :2005/06/23(木) 18:05:34
それはchar * p = strrchr(buff, '\n'); if (p) {* p = '\0';}だなぁ。
820 :
815 :2005/06/23(木) 18:13:54
>819 昔、そんな感じのコードを書いた記憶がありまつ
>>818 それでも全然問題ないように見えるんだけど、ダメなの?
>>821 fgets()の場合、末尾に必ず改行がついてるとは限らないので、よろしくない。
俺は常に
if (p = strchr(buff, '\n'))
*p = '\0';
だね。
まあこう書くと、条件式で代入を使ってるとか ウザい警告を出すコンパイラもあるけれど
>>822 あぁ、そうか
stdinから読み込むことばかり考えてた
stdinからなら必ず改行が着くから無問題だよね?
一行がバッファ長を超えなきゃね。
CTRL-D(またはCTRL-Z)を行の途中で二度押された場合も終端には改行がつかずに終了するぞ。
>CTRL-Z)を行の途中で二度押された場合も終端には改行がつかずに終了するぞ。 どこのOSですか?
UNIX系は大抵Suspendだったような。<CTRL+Z
自作OSじゃね?
>>827 Windows NT系のcmd.exeはそういう挙動だと思った
command.comはもっと間抜け
DOSもWindowsもC-zでEOFになるのは、行の先頭に きたときだけだった気がするけどなあ。
834 :
へこぽん :2005/06/24(金) 02:54:06
下記scanfの数値をビット表示できないのですが間違いを教えて下さい。 #include <stdio.h> void print_bit(int na); int count_bit(void); int main(void) { int na; printf("数値を入力"); scanf("%d",&na); print_bit(na); return 0; } /*ビット表示*/ void print_bit(int x) { int i; for(i=count_bit()-1; i>=0; i--){ x>>=i; printf("%d",(x & 1U )? '1' : '0'); } } /*ビットのカウント(桁)*/ int count_bit(void) { int i; int count=0; for(i=~0U; i>=0; i>>=1) count++; return count; }
Ctrl-c 同じプロセスグループのフォアグラウンドプロセス全てににSIGINTを送ります。 Ctrl-v エスケープ記号を打ちます。(例: Ctrl-v ESC c Enter) Ctrl-s 端末を固めます(XON)。
fread関数がビッグエンディアン式にデータ読み取る環境にあるんですが、 データファイル(バイナリ)自体はリトルエンディアンで いちいち1バイトずつ読み込むのは大変なんで 何か良い方法はありませんか?
>fread関数がビッグエンディアン式にデータ読み取る環境 はて? 書くほうにhtonlとかで書くように頼めば?
>>838 4バイトとか細切れに読み取っていくしかなさそうで。
htonlは便利そうですね。もう書きましたが...。
レスありがとうございました。
>>837 12 34 56 78
って言うファイルを
78 56 34 12
で読み取ってくるの?なんかすげーな。
>>837 エンディアンについて勘違いしてる悪寒。
ビッグエンディアン 上位アドレスに下位ビットを配置する狂った思想。 データ列の解釈がアクセス幅に依存する。
リトルエンディアンのほうが変だろ
大きい桁を先に書く記数法が変。
アセンブラ使い→リトルエンディアン支持 C言語使い→ビックエンディアン支持
>>840 シークの仕方は先頭からだが
変数へバイトデータを入れるのはエンディアンで変わるだろ
ものすごく初歩的な質問かもしれませんが、他のファイルのクラスを利用したい場合って、 そのクラスの宣言部分を含んだファイルをincludeするしかないんでしょうか。 class hoge{ int A; public: int ShowA(void); } int hoge::ShowA(void){ return A } というクラスがあったとして、 extern class hoge; extern int hoge::ShowA(void); みたいな事がしたいのですが…。
>>847 だから普通はヘッダに宣言を書いてcppには関数本体だけを置くようにする。
インラインはOKだけどな。 class hoge{ int A; public: int ShowA(void){return A;} };
const char *str; char *tmp; ofstream to("test"); if(!to.is_open()) return 0; to<<str<<endl; to.close(); ファイルにconst char *型の文字列を出力しようとすると、ofstreamのあとに内容が変わるんですけど、何か間違ってるんでしょうか
>>848 やっぱりそうするしかないですか…。
どうもありがとうございます。
>>849 う、書いてから気づきました。
そういうふうに書いてもインライン関数になるんですね。
>>844 なら、十は「01」で百は「001」か?
>>853 機械が解釈する場合はその方が都合がいい。
どこがどう間違っているか指摘してくれないと 何が言いたいかわかりせん。
↑846
右から左に綴る自然言語(アラビア語など)でも数字は左から右だよね。
>変数へバイトデータを入れるのはエンディアンで変わるだろ あのさぁ、 char* p={0x12,0x34,0x56,0x78}; がエンディアンによって p[0]=0x78 p[1]=0x56 p[2]=0x34 p[3]=0x12 なんてなるわけ無いだろ。
00 01 を 変数aに書き込む時、 リトルエンディアンだったら a = 1 だけど ビッグエンディアンであれば a = 0x100 で結局はエンディアン都合でデータ変わるって。 そのバイト区切りの配列の例は、例になってません。 せめて、0x12345678とかにしないと エンディアン影響ゼロ
>バイトデータを入れるのは 読めない?
というか元々freadの話だろ。
>>859 の説明で充分だと思うが。
>>858 自然言語の読み進む方向を「上位」と定義するならアラビア語とかは(数値の表記も含めて)
リトルエンディアンということになるわけだが。
"abcdefg"
っていうテキストファイル読み込んだらエンディアンによって
"gfedcba"
になるって言ってんだろ
>>846 は。
変数をメモリマップで考えると分かりやすいと思う
>>866 ロードとストアでアクセス幅が同じならば、データ列のイメージはエンディアンに依存せず
同じになる。
868 :
デフォルトの名無しさん :2005/06/24(金) 19:08:15
struct hoge{ union{ int i; char c[4]; }; }; VC++のデバッグで確認したら i = 0x12345678 c[0] = 0x78,c[1] = 0x56,c[1] = 0x34,c[1] = 0x12 だった(;´Д`)
エンディアンについて悪寒なのが多いのか? ビックエンディアンだろうが同一機種ならなんも問題ない。 ビックエンディアンが不便なのは符号拡張をするときだ。 どっちだろうが a = 0x0001 とすれば1が入る。 メモリに書き出す時にその違いが出るのであって、 レジスタレベルでエンディアンが分別されることはない。 エンディアンの名前の由来はガリバー旅行記だ。
そもそもエンディアンで宗教戦争するのは無意味。 だからエンディアンという。
871 :
デフォルトの名無しさん :2005/06/25(土) 00:18:55
『Technical Master はじめてのプログラミング』(秀和システム)という本で今日から勉強を始めたところです。 コンパイラはBorland C++ Compiler 5.5です。 #include <stdio.h> main() { printf("こんにちは、世界"); } というプログラム(hello.c)をコンパイルしようとしているのですが、何度やっても C:\TM-C>bcc32 hello.c Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland hello.c: 警告 W8070 hello.c 6: 関数は値を返すべき(関数 main ) Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Fatal: ファイル UUID.LIB が開けません となってしまいます。どこが問題なのでしょうか?
もし本当にその本に #include <stdio.h> main() { printf("こんにちは、世界"); } と書いてあったならそんな本は捨てること。今すぐ捨てること。
>どこが問題なのでしょうか? あんたの頭。
>>872 なんで?
そのサンプル、K&Rの最初の例に酷似してると思うんだが
もしかして日本語リテラルをCソースコードに埋め込むのが我慢ならない人?
int型と明示したmainじゃないと鳥肌が立っちゃう人かと。
877 :
871 :2005/06/25(土) 00:38:03
>872 それは、あまりにくだらないことを書いたテキストであるということでしょうか? それとも、私がテキストを写し間違えたということでしょうか? >873 確かに頭にも問題が多々ありますが、ご指導願えませんか? >874 はい。
じゃあK&Rは捨てろってことか
>>877 偏屈野郎の下らない宗教戦争みたいなもんだ、気にするな
>>871 ilink32.cfgじゃなくて、bcc32.cfgじゃね?
書いたならその内容を張ってみろ。
881 :
871 :2005/06/25(土) 00:43:02
>>880 -I"C:\Borland\Bcc55\include"
-L"C:\Borland\Bcc55\lib"
です
>>871 別に問題なさげに見えるな。
uuid.libだけ見つからないのはおかしい。
そのファイルを確認してみてくれ。
或いは再インスコした方が早いかもしれん。
その手のトラブルな気が少しするわ。
libにディスクチェックもしてみて。
883 :
871 :2005/06/25(土) 00:46:55
>882 はい。ありがとうございます。
つか、そんなコードでなぜuuid.libなんぞ探すんだ 腐ってるな、bccって
885 :
871 :2005/06/25(土) 00:54:36
再インストールして最初からやってみたらうまくいきました。 どうもありがとうございました。
886 :
850 :2005/06/25(土) 00:56:33
>>852 書き忘れてましたけど、ファイル出力までに関数でstrの値を決めてます
>>886 そこの処理を書け
おそらくそこが間違っている
>>886 悪いこたぁ言わねぇからstr定義辺りも含めて全文貼って味噌。
たまには悪い事も言って欲しい。
891 :
デフォルトの名無しさん :2005/06/25(土) 02:14:25
本日よりC言語の勉強を開始することとなりました。 コンパイラにBorland C++ Compiler 5.5をインストールし設定しました。 2種類のcfgを設定し、コマンドプロンプトで「bcc32」「path」と入力し 確認?をしてみました。 で、実際にメモ帳にて「test.c」を作成しコンパイルを実行すると test.cは見つかりません。という表示が出ます。 どこの設定が間違っているのでしょうか?
893 :
デフォルトの名無しさん :2005/06/25(土) 02:18:17
すみませんでした、ここに来るには早すぎたようです・・・。 誘導ありがとうございます!
ヒープサイズ、スタックサイズの他に、 グローバル変数の置かれる領域(名前は忘れた)のサイズも コンパイラに指定することは可能なのでしょうか? (コンパイラによっては) グローバル変数の置かれる場所の専用語句が分かれば 検索できそうなのですが。
>>894 可能。
>895の言うヤツで、これらをセグメントという。
897 :
デフォルトの名無しさん :2005/06/25(土) 05:30:54
今、大学4年で来年から某自動車会社で働く予定です。 現在卒研で熱物質移動の可視化のために画像処理系の研究を 行っています。ソフトはC++Builder.6を使用しています。 そこで質問なのですがプログラミングのスキルが生産技術部 で役に立つのかどうかしりたくてここに書き込みました。 どうか回答宜しくお願いします。
役立つつというか、役だて!
役立つ、というか役立てろ。
>>897 自動車メーカーなら開発部門でプログラミングしているかもしれない。
プログラミング能力よりも、物理知識の方が重要かもしれないけど。
それ以前にFORTRANでも使ってたら、一から勉強しなおしだ。
ハァ?
struct ques { double x; double y; }; という構造体を配列にして、中の値を隣り合った配列の値とやり取りして 計算するようなプログラムを書いているのですが、実行後エラーが出て 質問に伺いました。 ques q[5]; ques *qp; qp=(ques*)malloc(sizeof(ques)*5); として *(qp+i).x=q[i-1].x+q[i].x+q[i+1].x などと連続計算して、printf関数で出力した後 q[i].x=(qp+i)->x と再代入してから free(qp) とするという計算をしているのですが、 計算はしてくれるのですが(連続計算にしていますが 最後までやってくれます)、プログラムを閉じる段階でエラーが出てしまいます 何か消し忘れているのでしょうか?ご指導お願いします
>>903 全文晒したら?
それはさておき、*(qp+i)はqp[i]に、(qp+i)->xはqp[i].xと書いた方が直感的だと思うが。
905 :
903 :2005/06/25(土) 19:12:49
では晒します #include<stdio.h> #include<stdlib.h> struct ques { double x; double y }; int main() { ques q[3]; ques *qp; int count; int i; for(i=0;i<3;i++) { qp->x=0; qp->y=0;//初期化です } q[0].x=2; q[0].y=4; q[1].x=0; q[1].y=0; q[2].x=1; q[2].y=3;
907 :
903 :2005/06/25(土) 19:35:32
続きです
for(i=0;i<3;i++)
{
printf("q[%d].x=%lf,q[%d].y=%lf\n",i,q[i],x,i,q[i],y);
}
while(count<0)
{
qp=(ques*)malloc(sizeof(ques)*5);
qp[0].x=q[0].x+q[1].x;
qp[0].y=q[0].y+q[1].y;
qp[0].x=q[0].x+q[1].x+qp[2].x;
qp[0].y=q[0].y+q[1].y+qp[2].y;
qp[2].x=q[2].x+q[1].x;
qp[2].y=q[2].y+q[1].y;
for(i=0;i<3;i++)
{
printf("q[%d].x=%lf,q[%d].y=%lf\n",i,qp[i],x,i,qp[i],y);
q[i].x=qp[i].x;
q[i].y=qp[i].y;
}
count++;
}
return 0;
}
>>905 この内容だと、qp自身の初期化はどこで行うべきでしょうか
最初のループの前に qp = q; とでもやるんだな
909 :
903 :2005/06/25(土) 19:51:06
あああーーーもう、本当に俺は・・・。 cinとcoutで>>と<<の区別が付かない。 うまい覚え方ってないかな?自分の中ではこれが壁だ。 後はif文でどう使えばうまくいけるのかとかあるけど、本格的に迷っているのは>>と<<の区別。 これさえうまくいけば後はうまくいけると思う。
>>910 矢印だと思えばいいだろ。
//文字列aaaをcoutに送る
cout << "aaa";
//cinの内容をxに送る
cin >> x;
//うはwwwwwwうんこwwwww
"aaa" >> cout;
オーバーロードの悪い見本だから、覚えないほうがよい。
cinだとかcoutだとか、マジでつかわねー マニュピレータでごちゃごちゃやんの、ウゼエんだよ printfでぜんぜん困ってない まあsprintfよりはstrstream、なのか?という気はせんでもないが MFCユーザとかだと、みなCString#Format()だろうな
なんで、 CString::CString( const char*,...) static CString CString::Format( const char *, ...) みたいなのが無いんだろう……
そんな貴方にboost::format
>>915 それそれ。もうstrstreamなんていらないね。
それ以上にlexical_castで十分なことも多い。
× strstream ○ stringstream
jet_stream_attack(int gaia, int mash, int ortega);
920 :
デフォルトの名無しさん :2005/06/26(日) 00:49:14
unsigned int *tmp = abc->def; cout << tmp << endl; これで0x19と出るが unsigned int *tmp = abc->def; cout << *tmp << endl; これだとセグメンテーション違反と言われます。 これはどんな原因が考えられますか? 0x19からsizeof(unsigned int)分のデータの中に不正なデータがあるということでしょうか? でも数値として解釈して出力するだけだからどんなビット列でも良いはずだし・・・
>>920 表示されたエラーメッセージの意味ぐらい調べような。
そりゃ、0x19番地のメモリを読み出そうとするわけだから 保護機能がちゃんと働くOSなら、エラーになって強制停止させられるでしょうな
>>914 っ[ AnsiString& AnsiString::sprintf(const char* format, ...) ]
C言語初めて一週間ぐらいの初心者ですが、フリーでお勧めのエディタなどありますか? 現在はTeraPadというソフトを使っているのですが、若干使いづらいので。
フリーなのにあれで不満言うとか、贅沢すぎ
notepadで十分
>>925 そういう質問するときは「若干使いづらいので」と思っている理由を明確にする。
それが出来ないなら、窓の杜やVectorで一覧当たるのと得られる情報は変わらない。
プログラマならemacsかvi。
それで満足できないなら、どんなフリーのエディタを使っても満足できないと思う。
プログラマならemacsかvi。 プログラマならemacsかvi。 プログラマならemacsかvi。 プログラマならemacsかvi。 プログラマならemacsかvi。 プログラマならemacsかvi。 プログラマならemacsかvi。 プログラマならemacsかvi。
notepadに毛の生えたようなneditもry
マジレスしておこうか。 emacs系ならxyzzyが手頃。vi系ならviviかな。 Windowsらしいインターフェースがいいなら桜エディタとかPeggyかな。
質問があります。共用体の初期化で困っています。 int main() { union { char ch; int i; }; return 0; } こういう共用体があったときに、 ch = 0; i = 0; というように全部の値を初期化する必要があるのですか? それとも ch = 0; と書くだけで、よりサイズが大きなメンバも一緒に初期化してくれるのでしょうか?
>>932 union HOGE
{
char ch;
int i;
};
int main()
{
HOGE hoge;
memset(&hoge, 0, sizeof(HOGE));
return 0;
}
int main() { union { char ch; int i; } HOGE; memset(&hoge, 0, sizeof(hoge)); return 0; }
>>933-934 レスありがとうございます。
なるほどsizeof してからmemset()するべきですか。
そのように実装します、助かりました〜。
>>935 浮動小数点数とかポインタとか入れたときは memset() じゃぁダメ(かもしれない)。
0初期化するだけなんだから問題無いだろ
>>934 オマエそんな宣言してないhogeを操作しようとしてるソースを書くんじゃねぇ
>>937 浮動小数点数とかポインタとかを memset で 0 埋めしても
0 で初期化したことにはならない(かもしれない)。
int main() { union { char ch; int i; } hoge = {0}; return 0; }
>>936 932です、もう少し質問させて下さい。
union HOGE
{
char ch;
int i;
float f;
};
int main()
{
HOGE hoge;
memset(&hoge, 0, sizeof(HOGE));
//判定
if(hoge.f == 0) printf("初期化されたよ \n");
return 0;
}
こういうように書いても判定がうまく行かない(場合がある)ということでしょうか?
もしそうなら初期化に依存したソースは書かない方がよさげですね。
浮動小数まで考慮したら、もはや単純な記述では無理だな。共用体だし。 それぞれの型に合わせた初期化関数を用意しなけりゃならんだろ。
整数と浮動小数をunionするもんじゃねぇな
ていうか union HOGE { char ch[sizeof(int)]; int i; }; じゃなくて大丈夫なの?
何が?
>>941 IEEE754では0.0fが0x00000000になることが保証されていますが?
NULLは?
>>945 プログラミング言語CおよびC++では保証されていない。
NULLは保証されてないよ。 組込み系では0にジャンプするとリセットしたりするからな。 IEEEの話はあくまでそれを採用してるプロセッサの上での話しだが、 いまさら標準でない(IBM形式とか)の為に騒ぐ必要もなかろう。
>>948 この流れで、IEEEが「標準」であるかのような言い方は感心できんな。
>>947 CおよびC++で754以外の浮動小数点を扱ってる処理系とプロセッサを挙げよ。
現存するもので。
保証されていないのは確かだが、保証されることを期待して実装する訳ではないし、
保証されることが目的でもない。
実質的な標準を軸にして判断するのが、妥当だとは思わないか?
数学者と工学者の違いだな。
>>950 そんな処理系もプロセッサも知らないんで、挙げられないよ。
でもそれは言語での保証が無いこととはまったく関係ないよ。
あんたが言語としての保証を必要としないのはわかった。
でもそれは言語での保証が無いこととは関係ないよ。
(あんたがC/C++標準委員会のコアメンバーでもなければね。)
>>952 は保証を軸にしてて、漏れは実質的標準を軸にして話してた訳か。
ちょっと不毛だった。
ただな、言語での保証が無いこととは関係ないが、実装には関係する。
浮動小数点に限らず、規定されていない範囲のことがな。
漏れはそういう視点から話してた訳。
ここはプログラミング言語C/C++のスレでございます
>>943 unionが何なのか知らんだろオマエ
>>951 このスレは機種依存OKだから、標準が外れていることを指摘しつつも
現実的な回答をするのが筋だろうな。つまり、数学者的な思考を提示
しつつも工学者的な選択枝を提供する、と。だから、
>>945 と
>>947 は
反発しあう必要もなく、両方の意見を聞いて、結局どうするべきかは
質問者が決めればいい。
>>954 はぁ…?
知ってるからこそビット幅合わせないで
一体どんな目的に使うのか謎なんだけど
>>956 char と int を重ねるってだけでも十分意味を成す場面があるだろう。
自分の知っている特定用途以外想像できないのを偉そうに言うなよ。
>>958 大抵うまくいくだろうが、一応規格外だ。
こういうのも見るけど、規格外なんだよな。
union {
struct { float v[3]; } vec;
struct { float x, y, z; } elem;
};
>>959 何が言いたいのかわからんな。
&vec.v[1] == &elem.y が保証されてないって話か?
char と int を重ねたいだけの話には関係ないんじゃない?
961 :
デフォルトの名無しさん :2005/06/26(日) 17:10:29
呼び出された関数内では、呼び出し元のローカル変数を参照することってできないんですか? もちろん引数は使わないで。 下記のようなことがしたいのですが…… void sub_func() { int x=x_main; } void main_func() { int x_main=255; sub_func(); }
>>960 >959は、きっと自分だけしか知らないノウハウを基準に>958を解釈しているんだよ。
>>961 それができるのならローカル変数の意味がなくなってしまう。
どうしても引き数で渡すのがいやなら外部で定義するかC++ならクラスを利用しろ。
>>961 無理
グローバル変数を経由するとかすればできるけど
つうかそんな事できたらグローバル変数とかわらんだろ
そういう変態機能がEmacs Lispにあったような・・・ なんじゃこりゃーって感じだった
関数内でスタックをごにょごにょすればできるやもしれん 環境依存だけど
そこでファイルスコープですよ。
いやC/C++では出来ませんでいいだろ。
そこでlongjmp
>959 union 使って↓な使い方することがあるんだよ。 つまり、union 内の型の間で変換はせず、サイズ節約のために使う。 そして >958 を読んでその意味を噛み締めてくれ。 typedef strcut { enum { CHAR, INT, FLOAT, STRING } tag; union { char c; int n; float f; char *str; } data; } VARIANT; void func(VARIANT v) { switch(v.tag) { case CHAR: printf("%c", v.c); break; case INT: printf("%d", v.n); break; } }
971 :
970 :2005/06/26(日) 18:03:03
えらそうなこと書いておきながら凡ミス。 v.c じゃなくて v.data.c、v.n じゃなくて v.data.n だな。 自分でやるときには無名共用体を使うから間違えた。
5桁のフィールドに対応した値 unsigned x = 15 があって、 std::vector<char> v に対して '0' '0' '0' '1' '5' の順で push_back() したいとき (またはそれと等価な結果を得たいとき) エレガントな方法は?
>>973 size_t const end = v.size();
v.resize(end + 5 + 1);
sprintf(&v[end], "%05u", x);
v.resize(end + 5);
>>970 で?それと、char c[sizeof(int)]となんの関係があると?
976 :
959 :2005/06/26(日) 21:06:38
>>970 いや、別に、ごく一般的なunionの用法なんですが・・・。
975と被るが、それとchar c[sizeof(int)]と何の関係があるの?
てっきりintをバイト単位でアクセスできることかと思ってたんだが。
それとも3バイト埋めることが合理的という事?
多分970と959は畑が違うから相容れ無いはず。 970はLPARAM WPARAMなどを扱うWin系 959はWin以外の何かの畑の人とみた
興味で訊くんですが、unionの他の使い方ってどんなのがあるんでしょう?
>>943 の例はただのキャストで置き換え可能なケースが多い気も
ワード境界に整列するようにアロケートしたいときとかに使うぐらいかな
malloc()の実装とかだと、さらにdoubleとかもメンバに入れるよな
>>970 の例が、一番典型的なunionの使い方だと思う
型フィールド付+メモリ節約
まあ、C++なら邪悪とされるスタイルだが
970マダー?
981 :
975 :2005/06/26(日) 21:28:28
>>977 俺ぁ激しくWinだが、char c[sizeof(int)]なんてやんない
まぁWinsockにも使われている手法だから環境を限定させれば悪くは無い。
> C++なら邪悪とされる のはなんで?
>>983 型フィールドみたいなものを使うぐらいなら継承を使え
というのがBjarne Stroustrup様の有難い教えです
コンストラクタとかデストラクタとか
素直にクラス+多態しろって事じゃないの
>>983 オブジェクトにして渡した方がいいって話とかじゃないかな、switchいらんし。
先の例ではメンバが増えると、caseも増える。
>>983 型で決められたメソッドを敢えて場合分けの嵐にする設計が美しくない。
というかC++の設計思想に反する。
そうか、トンくす
次スレ立てられなかった。
関数のポインタの有効な使用方法ってどんなのがありますか? 入門書にのっている例文で有効そうなのは見つかりませんでした そこからは見えない関数を渡してあげる以外に有効な方法ありますでしょうか?
qsort
ありとあらゆる種類のコールバック
ファンクションテーブルによるイベントディスパッチ
要するにテンプレートメソッドパターン
997 :
992 :2005/06/26(日) 22:37:38
勉強になります。ありがとうございました
次スレマダー?チンチン
#include <iostream> int main() { std::cerr << "1000" << std::endl; return 0; }
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。