1 :
デフォルトの名無しさん :
2006/03/32(土) 23:06:47
2 :
デフォルトの名無しさん :2006/03/32(土) 23:27:23
3 :
デフォルトの名無しさん :2006/03/32(土) 23:33:35
char* s1[3]={"東京","大阪","名古屋"}; としたとき 東京の”京”の字だけ出すにはどう配列を書いたら良いの?
5 :
デフォルトの名無しさん :2006/03/32(土) 23:34:32
配列じゃない ポインタだな いじくりかたを教えて欲しい
6 :
デフォルトの名無しさん :2006/03/32(土) 23:48:03
tokyoなら *(s1[0]+1) で移動できるんだけど 漢字では出来ないのだ
wchar_t型の配列にmbstowcsでコピーっつか変換コピーしたあと2文字目を取り出すのだ
printf("%s", s1[0] + 2);
9 :
たろう :2006/04/02(日) 11:44:00
C言語ソースのステップカウンタ(Linux上で動くツール、またはコマンド) ってありますか? Windowsベースならたくさんあるんですけど、Linux(しかもフリー)って なかなか見つからないのです。wcだと総ステップしか分からないし・・・
10 :
デフォルトの名無しさん :2006/04/04(火) 05:07:36
#include <stdio.h> main(){ int a; a = 3; a = !a; printf("%d\n",a); a = !a; printf("%d",a); return 0; } これで出力すると0と1が出ました 3の否定は0で0の否定は1ということなのでしょうか?
>>10 Cで数値をBool値(True/False)として扱う場合は
0ならFalse、0以外ならTrueと定義されているだけで
別に0の否定、すなわちTrueが1だとは決まっていない
まぁ3の否定が0だというのは正しいが
1に決まってたような気がしたけど
13 :
デフォルトの名無しさん :2006/04/04(火) 09:12:04
>>10 論理値を返す演算子は、真の時に1を返す。
と言うだけのこと。
>>12 詳しくは ISO/IEC 6.3.1.2 と 7.16 参照
15 :
デフォルトの名無しさん :2006/04/04(火) 13:36:07
>>10 ご覧のとおり
あと 11 みたいのは
こういうコードを書くから気をつけたほうがいい
↓
#define False 0
#define True (!False)
main()
{
int a = 3;
if(a == True) exit(1);
}
is 系関数が真の時 1 以外の値を返す実装になってるのはよくある話。
18 :
デフォルトの名無しさん :2006/04/04(火) 14:01:15
> 0ならFalse、0以外ならTrueと定義 を #define False 0 #define True (!False) と理解したのか。
まぁ、is系の関数にsinghed charを渡して-1以外の負数で 挙動不審になるのも良くある話
22 :
デフォルトの名無しさん :2006/04/04(火) 14:07:00
>別に0の否定、すなわちTrueが1だとは決まっていない !0 ^^^^^^^^^^^^^^^^^^^^^^^^
否定演算とは言ってないし。
24 :
デフォルトの名無しさん :2006/04/04(火) 14:11:51
苦しいなw
先輩、僕に答えを教えて下さい
うるせえ やきそばパンとファンタ買ってこい
>>15 >>11 には 「数値をBool値(True/False)として扱う場合は」と書かれているので
そのコードはありえない。あるとすれば
#define False 0
#define True !False
main() {
int a = 3;
if (_Bool)a == True) exit(1);
}
だが、これは規格上正常に動作する。
左括弧不足くらいは許せ
許す
30 :
デフォルトの名無しさん :2006/04/04(火) 14:25:43
$ gcc 27.c 27.c: In function `main': 27.c:5: error: parse error before "_Bool" (・∀・)ニヤニヤ
31 :
デフォルトの名無しさん :2006/04/04(火) 14:28:51
>>27 3の否定演算とも言ってないようだが
じゃあ奴は何が言いたかったんだ?
>>30 コンパイラ古くね? _Bool は ISO/IEC 9899 できちんと定義されてる。参照箇所は
>>14
丁寧に頼んだのに焼きそばだと?ふざけんな。教えろ
>>31 「Bool値(True/False)として扱う場合は0ならFalse、0以外ならTrueと定義されている」
だろ。どこにも誤読の余地はないと思うが。
int a = 0; なら !a == 1 は真だがな
なんか、話がどんどんとずれていってる
C言語討論スレになりますた。
38 :
デフォルトの名無しさん :2006/04/04(火) 15:32:37
>>34 間違いの指摘に答えてね
間違わなかった部分をいくら引用しても修正にはならないよ
40 :
デフォルトの名無しさん :2006/04/04(火) 15:35:21
技術的な議論(というより事実の提示)に「揚げ足」など存在しない 誤りの指摘に謙虚でないことが判明した時点から、そういう手合いへの相応しい対応に切り替えるのみ
ROMってる分には、この殺伐感(・∀・)イイ!!
>>40 すまんがあんたの発言がどれか特定できないので
あんたが答えたレス番列挙してくれ。
44 :
デフォルトの名無しさん :2006/04/04(火) 17:19:50
ソースコードの最終行が改行で終わってないと GCCで怒られるのは何故? enum の最後の要素は ',' をつけるのとつけないのでは どちらが行儀がいい?
>>44 前者:改行で終わっていないと正しくコンパイルできない処理系もあるんじゃないかと。
後者:仕様ではつけちゃいけないんじゃなかったかと。
仕様に追加 (つけていいよ化) されたのは C99 だけど それ以前から出来る処理系も多いんじゃないかと。 なんで、移植を気にしないならつけれ。
48 :
デフォルトの名無しさん :2006/04/04(火) 18:41:55
>>10 ですがいろいろ説明があってよく分かりません…
どれが正しく説明されてるレスなんでしょうか?
そんな話して結論出ても実際の業務では糞の役にも立たん
もしかして、2ちゃんねるの議論を業務に役立たせようと思ってたの?
やーね、即物的な人間はすぐに利益を求めたがって 基礎研究って言葉を知らないのかねぇ〜
54 :
51 :2006/04/04(火) 21:46:35
ごめんなさい(´・ω・`)
役に・・・立つだろ? まあ、常識過ぎて、役に立ったという実感はないかもしれんが。
56 :
デフォルトの名無しさん :2006/04/04(火) 21:52:07
前のスレッドで
ほかの人が書いた、一定間隔ごとに任意の関数を実行するプログラムを調べていたのですが、
49.7日毎にタイマーがうまく動作しなくなることに気づきました。
という質問をして、waitabletimerを使うといいというアドバイスを受けました。
早速、そのAPIを使うとしたのですが、その部分はLinuxでも使う可能性があることに気づきました。
waitabletimerと同じようなAPIをwww.linux.orgで調べましたが、それらしい関数は見つかりませんでした。
関数を実行した直後の時間を覚えておいて、GetTickCountで取得した時間と比べるという手もあるのですが、
該当部分は他の部分でも使われているようなので・・・その方法を使うと、変更すべき箇所がものすごく増えてしまいます。
数日前に質問しておいてあれですが、何かいい方法があったら教えてほしいです。
追記
いちいち手順を説明するのもあれなので、そのプログラムとほぼ同じ流れの物を置いておきます。
皆様の参考になれば幸いです。
ttp://anotherred.hp.infoseek.co.jp/cgi-bin/src/up1346.txt
bool型つかえば関係ないじゃん 無いなら typedef enum{true=1,false=0}bool とでもしとけばいいじゃん
58 :
デフォルトの名無しさん :2006/04/04(火) 21:56:22
間違えました。 GetTickCountで取得した時間と比べるではなく、 差を取るでした。 ミスに気づかず申し訳ありません。
59 :
デフォルトの名無しさん :2006/04/04(火) 22:15:46
>>42 列挙したらどうすると言うのだ
誤りを指摘されたのがあんたかどうかさえ判っていれば
あんたが潔いか見苦しいかは、あんた自身には嘘はつけまい
仮に誰が指摘したかが判ったとして、それで何ができると言うのだ
while (1){ c=getchar(); if (c!='\n') break; } 例えばAと入力してエンターキーを押すとループから抜けられるらしいんですが、理解できません。 cが'\n'でないならループから抜けるんですよね? だからAと入力した時点でcは'\n'でないので抜けられるのでは?
getchar()はバッファリング付一文字入力。 エンターが押されるまでは動かない。 逆に言えば、エンターが押されるまでgetchar()は戻ってこない。 この場合、Aと入力した時点、言い換えればキーボードのAを押した時点では バッファリングされるせいでまだgetchar()から戻ってきていない。 エンターだけ押した場合、'\n'だけが返される。 AGEと入力してエンターを押すと 'A','G','E',''\n'が順番に返される。
やさしいC言語という本の10章以降のプログラムを打ち込みコンパイルしたら 正常に動作せず10章より前のプログラムも動かなくなってしまいました どうすれば治るのでしょうか? フリーのLSI C−86では使えない構造体型でもいあるのでしょうか
>>62 このスレの住人がみんなその本持ってるとでも?
65 :
デフォルトの名無しさん :2006/04/05(水) 00:06:37
>>63 みんな持ってる必要はなかろう
誰か持っている人が1人でもいて
とても親切な人だったら何か答えるかも知れない
# 確率は低そうだが
main()と表示されているからコンパイルできず喘いでいるんだな?voidとつけて見なさい。射精できる。 エラーじゃないのかな?和かんね(´∀`)
67 :
デフォルトの名無しさん :2006/04/05(水) 00:25:44
>>62 今まで動いていたプログラムが動かなくなったのなら
プログラムではなく環境側の問題だろうな
スレ違いの可能性が高いが
一応エラーメッセージを晒してみてはどうかな
教えてあげようと思ったら、 俺が持ってるのはやらしいCだった
69 :
42 :2006/04/05(水) 04:08:44
>>59 残念ながら、俺 11 じゃねーんだな。
だから俺はたぶん誤りを指摘されてないんだな。その確認のため。
>>56 前すれで自分で書いてたけど、GetSystemTime()とかGetLocalTime()のようなSYSTEMTIMEを返す
関数で時間を取得して、それをリニアにして64ビットの値で返すような関数を作って、GetTickCount()と
置き換えれば、今のコードはほぼそのまま使えるんじゃね?
71 :
デフォルトの名無しさん :2006/04/05(水) 09:30:05
>>56 標準Cの範疇では出来ないから、環境に依存した方法を書くしかない。
WindowsならWindows用の、LinuxならLinux用のコードを書くのが確実。
>>56 もしかして、スレ違いだと解ってないとか?
・Windows でウィンドウ付きなら SetTimer() で、
・Windows でウィンドウなしなら CreateWaitableTimer() と
SetWaitableTimer() で、
・UNIX/Linux なら signal() と alarm() で。
後は各環境のスレで聞けやヴォケ。
現状、ポーリングでやってるのをイベントでやるように直して、かつwin,linux両方対応 って、質問者には荷が重過ぎるような気が。
74 :
デフォルトの名無しさん :2006/04/05(水) 13:07:27
>>70-73 すみません。
すれ違いなのに答えていただいて。
昨日の晩、すれ違いなことに気づいて削除依頼を出したので、
もうしばらくしたら消えてるはずです
いた汚しすみませんでした
75 :
デフォルトの名無しさん :2006/04/05(水) 13:44:10
>>74 既にレスが付いてんのに勝手に削除依頼出すなんていい度胸してんなおい。
答えてやったのが馬鹿みたいじゃねーの?おい
76 :
75 :2006/04/05(水) 13:44:48
なんちゃって
77 :
デフォルトの名無しさん :2006/04/05(水) 14:25:17
>>76 昨日の晩というのは
>>56 を書き込んだときの指してます。
それからすぐあとに板違いな事に気づいて、
そのときはたまたまレスが一件もついてなかったので
削除依頼を出しました。
>>77 荒らしってわけでもないんだし、何が標準Cなのかわからない人もいっぱいるわけだから
この程度で削除依頼とかはちょっと過敏杉やねん
そもそもあぼ〜んだって機械的に行われるんじゃなくて人手だし
書き間違えを取り消すためのシステムじゃないぞよ
まあ多分、住民の気を損ねてしまう!、とか思ったんだろうけど気にすんなYO
79 :
デフォルトの名無しさん :2006/04/05(水) 17:34:26
質問なんですが、if文の条件でコマンドライン引数を使おうとしたんですがうまくいきません。 if(argv[1]=='/w')というようにしてみたのですが、うまくいきません。どうすればいいのでしょうか?
質問です。このreturn文の中の((char*)str)は キャラクター型のポインタで返すために必要なんですか? char *str_char(const char *str, int c) { for ( ; *str; str++) { if (*str == c) return ((char*)str); } return (NULL); }
>>80 いらないよ。そのままreturn str;でいい。
>>80 はいそうです。
C言語には関数のオーバーロードが無いので嫌々やってるのでしょう。
(その関数の標準ライブラリ版のstrchrとかも同じことをしている)
>>79 コンパイルのときにエラーなり警告が出てると思うが。。。
85 :
デフォルトの名無しさん :2006/04/05(水) 18:41:48
>>80 「書き込み禁止」の str を
「書き込み許可」の返却値にするのに必要
これが必要になった場合は設計ミスの疑いが濃厚
・const があるべき位置にない
・const があってはならない位置にある
この2点をしっかり調べる必要がある
それから return 式全体を () で囲む必要はない
これは 1970 年代の C の名残で今でも書いてる奴は
ヒヒジジイかただのアフォ(return は演算子じゃないと何度言ってもわからねえ)
グローバル変数を使うなっていうけど、全くないほうがいいの? それとも適切に使う分には問題ない?
プログラムはどうやって実行するんですか?
>>85 柴田望洋さんの解きながら学ぶC言語の中の一文です、
恐らく他の例文を書き換えたサンプルだったので、
戻り値の型指定が必要だったのですね。
なんとなく、その説明で分かりました。ありがとうございます。
>>86 どういう基準で適切かどうかを判断するかが問題になるな。
90 :
デフォルトの名無しさん :2006/04/05(水) 20:20:46
>>86 変数の有効範囲は必要最小限が理想という主張には
その変数が関係するデバッグの範囲を小さくする意図がある
グローバルがどうしても必要な場面はしっかりあるから焦って使うこともない
グローバル変数は使わない。 ファイルスコープ変数なら使う。
それはあなたの勉強不足。 まぁ、個人的にfor文が気に入らないかな。 自分だったらwhile使うかも
94 :
デフォルトの名無しさん :2006/04/05(水) 22:06:26
制御構造には関心なしか
「スレ」を「板」と呼ぶ辺りにどっかのにおいがするな
どう見ても普通は for じゃね?
>>80 をwhileに書き換えるとこんな感じ?
while(*str!=c) if(*str++==NULL) return NULL;
return (char*)str;
なんかキモくなった
俺なら仕様の方を変えてこうする const char* str_char(const char* str,char c) { while(*str&&*str!=c)++str; return str; }
>>98 それ、コードの意味が微妙に変わってる。
元のコードだとcに'\0'を渡したときにNULLが返る。
そのコードだとcに'\0'を渡したときにNUL文字へのポインタが返る。
ちなみに標準ライブラリのstrchrの仕様は
>>98 のコードのほう。
101 :
デフォルトの名無しさん :2006/04/06(木) 02:28:32
C言語の教本を読破したので、読んで覚えた次は書いて実践だと思うのですが次に何を作ればいいのか分かりません 例えば、そういったCを学べるサイトで レベル1「〜を作れ」 レベル2「〜を使った〜を作れ」 など、レベルの段階的にプログラミングが実践できるようなサイトをご存じないでしょうか?
猫でも見れば?
うちには犬しかいません
犬は駄目だ うるさいから 馬鹿犬なんて飼うと悲惨だぞ
まあ赤犬なら使い道があるな。
分ったバター犬で解決だな
犬ならチーズだろ
>>101 ,「C/C++の宿題片付けます」のスレで投げ出された問題といてみたら?今あんまりないけど
過去問で以下のソースを実行した16X16の盤面中*で囲まれている部分だけをすべて他の文字に変えなさいという問題で
#include <stdio.h>#include <stdlib.h>#include <time.h>void get_randam(int block[16][16]) {
int *p;for(p = &block[0][0]; p <= &block[15][15]; p++)*p = rand()%2; }
void print_block(int block[16][16]){int i,j;for(i = 0; i < 16; i++){for(j = 0; j < 16; j++){
if(block[i][j] == 0) printf(" +");else printf(" *");}putchar('\n');}}int main(void){int block[16][16] = {0};
srand((unsigned int)time(NULL));get_randam(block);print_block(block);return 0;}
答えが
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 16
void get_randam(int block[N][N]){ int *p;for(p = &block[0][0]; p <= &block[N-1][N-1]; p++)
*p = rand() % 2; } void paint(int block[N][N], int x, int y){ if( x<0 || y<0 || x>=N || y>=N || block[y][x] != 0)
return; block[y][x] = 2; paint(block, x+1, y);paint(block, x-1, y);paint(block, x, y+1);paint(block, x, y-1); }
void make_ans(int block[N][N]){ int i; for(i = 0; i < N; i++){ paint(block, 0,i);paint(block, N-1,i);paint(block, i,0);
paint(block, i,N-1); } } int main(){int block[N][N], *p,i = 1;srand(time(NULL));get_randam(block);make_ans(block);
for(p = &block[0][0]; p <= &block[N-1][N-1]; p++, i++){switch(*p){case 0: printf(" 1"); break;
case 1: printf(" *"); break; case 2: printf(" -"); break; default:printf(" E"); break; if(i % N == 0) putchar('\n');
} return 0;}
解ける?俺はとけない。逆に解説して欲しい。再帰をつかってのパズル解法の入門なら
http://www.ic-net.or.jp/home/takaken/がある 、あと日系ソフトウェアのページの過去掲載された
例題みたいなのがC言語のもある
http://software.nikkeibp.co.jp/software/download/downloadc.html C言語で何が出来るかが分かるとも思う。掲載ページは、探してくれ。
110 :
デフォルトの名無しさん :2006/04/06(木) 04:33:04
The line "using std::cout;", a. ensures that you don't need to type so much. b. allows you to reference the "std::cout" object. c. places the "cout" object into the "std" library. d. None of the above. 教えてください、どれですか?
>>109 paint:blockの中で(x,y)が0でなければ2にする。(x,y)に隣接するマスについて同様。
make_ans:blockの外周についてpaintを呼び出す。
main:外周に隣接する0を2で埋める。0のままなのが囲まれている部分。
>>109 それって外周から順に*にぶつかるまで再帰でマークしていって
全て埋め終わった時点で*でなく、かつマークされていない部分を
置換していくんだっけ?
114 :
101 :2006/04/06(木) 16:48:43
>>109 日系のプログラムのソースと実行結果を見て、どういうのができるのかやってみます。
どうもです。
115 :
デフォルトの名無しさん :2006/04/06(木) 17:52:00
a[i][j]という風な2次元配列を初期化したいのですがi,jの値を後でユーザーが変更できるようにしています。 この場合、初期化をするには a[i][j]={{0}}; にしとけばあとでi,jにそれぞれ3,4と値を入力しても、無事に初期はされていますか? それとも3,4と値を入力した後に a[3][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0}}としなければいけないんでしょうか?
訂正 a[i][j]={{0}}; にしとけばあとでi,jにそれぞれ3,4と値を入力しても、無事に初期はされていますか? ↓ a[i][j]={{0}}; にしとけば、宣言時の初期では残りに全て0を入れるということなので、あとでi,jにそれぞれ3,4と値を入力しても、無事に初期はされていますか?
>>115 試してみれ。
できるCコンパイラだったらできる。
>>115 そこで言う「ユーザー」とは、ソースコード利用者のことか?
例えば、
#define I (3)
#define J (4)
int array[I][J] = {{0,},};
と書けばarrayの各要素は全て0になることは保証されている。
尚、c99ならば要素数も可変にできるが、その場合は初期化ができない。
あとでi,jにキーボードから好きな値を入力するということです。
>>119 >c99ならば要素数も可変にできるが、その場合は初期化ができない。
そうですか、どうもです。
VisualStudioのコンソールプロジェクトで練習しているのですが、 これだといつまで経ってもDOS窓で文字が出るだけの プログラムから脱出出来ません。そういう物ですか?
>>122 GUIアプリケーションを勉強しろ。
PlatFormがあればVisualStudioでも作れる。
124 :
デフォルトの名無しさん :2006/04/06(木) 18:55:43
例えば結果で「グー」と表示をさせたいときに char gu[256]; strcpy(gu,"グー"); printf("%s",gu); とするのと printf("グー"); するのでは明らかに後者のほうが楽だと思うのですが、教本には前者の書き方をして有りました これの違いは企業などでプログラムを作る時は前者のようにあらかじめメモリを確保しといたほうがいいということなのでしょうか
>>123 ありがとうございました!
WINDOWSアプリケーション、という奴ですよね?
>>125 そうだよ。もちろんマカーじゃ無いよね?
>>124 いいえ、業務プログラミングの場合は尚更余計なメモリを使うようなことは避けます。
但し、その例では文字列を固定化することになってしまうので、実際には定義ファイルか
リソースなどから読み取るようにすることになります。
リーズナブルな線としては、defineを使う手もあります。
Ex.
#define GU_WORD "グー"
/* case 1 */
printf("%s", GU_WORD);
/* GU_WORD中に%を入れられてもいいようにフォーマット文字列にしない */
/* case 2 */
fputs(GU_WORD, stdout);
/* puts()では必ず改行してしまう */
なるほど、そういう風に扱うのが一般的なんですね ありがとうございます。
一般的と言うかなんというか。 無駄にメモリを使わない、という点はその通り。 教本にそう載ってたのはそういう方法を説明したかっただけなんじゃないかな。 他にも #define するとか const とか static とかポインタ変数使うとか、 色々ある(しかしこれをいきなり全部やると初心者は混乱するかもしれない)。
しょっぼい質問ですいませんが for(i=0;i<n;i++) for(i=0;i<n;++i) の違いってなんですか?
あ、i++と++iの違いはわかっています。
133 :
デフォルトの名無しさん :2006/04/07(金) 23:13:10
>>132 ならば全くない
ただし「字が違う」
確かにくだらないことだが、インデントだって「字が違う」に過ぎないが
だからといってエキセントリックなコードは嫌われるよな
多くの CISC 系の CPU には reg++ はあっても ++reg はなかった
この名残で ++i に違和感を持つ人が今でもいる
気持ち悪いといわれたときに突っ張るかどうかは
そのこと自体ではなく根底に流れる思想の問題
逆にC++だと演算子多重定義の関係で組み込み型でも前置の++iに統一する人が多い気がする。
>多くの CISC 系の CPU には reg++ はあっても ++reg はなかった >この名残で ++i に違和感を持つ人が今でもいる これはCでi++が多用される理由じゃないと思う。
137 :
デフォルトの名無しさん :2006/04/07(金) 23:25:27
>128 #defineつかって文字列リテラルを修正すると、文字列変更するたんびに 全ソースがリコンパイル対象になっちまうよ
下手なだけでは?
>70 今更すれ違いの話に反応するのも何だけど、 GerSystemTimeAsFileTimeって知られていない?
141 :
デフォルトの名無しさん :2006/04/08(土) 00:06:21
例えば int a,b,c; scanf("%d%d%d",a,b,c); としたときのa、b、cの区切り文字は何なんですか? スペースとタブと改行で区切れたんですがその他にありますか? また、それを指定することは出来ますか?
142 :
デフォルトの名無しさん :2006/04/08(土) 00:14:44
(char *)tcppacket += offset; この行でエラーが出るんだけど 何が間違ってんの?
Accelerateだったと思うが、iをインクリメントするという意図を はっきりさせるために、++iにしとけと書いてた本があったな 俺はそれを読んでから++iに統一したが
>>141 標準空白文字 ' ' '\t' '\n' '\v' '\f' '\r' は読み飛ばす。
%*と[]で読み飛ばす文字集合を指定できる。
145 :
デフォルトの名無しさん :2006/04/08(土) 00:20:32
>>142 キャスト結果への代入は、それが通ってたコンパイラの非標準拡張
よくわららんけど (char *&)tcppacket += offset; とか、
147 :
デフォルトの名無しさん :2006/04/08(土) 00:26:40
148 :
デフォルトの名無しさん :2006/04/08(土) 00:29:48
>>146 なんか
(char *)
とったら通過しちゃった
あと
asdfnsd.c:248: error: ‘version’ undeclared (first use in this function)
asdfnsd.c:248: error: (未宣言の各変数については、それが最初に現われたそれぞれの関数
asdfnsd.c:248: error: に対して一度だけ報告されます。)
asdfnsd.c:248: error: stray ‘\’ in program
asdfnsd.c:248: error: syntax error before string constant
ってでてその行が
if (dnsh->rcode != 0)
{
printf("%s's named that %s iquery does not respond to
version.bind.\n", host, vul ? "supports" : "errors on");
return 0x0;
}
なんだが・・こんな高度なprintfの使い方はじめてみた。
解説よろ
149 :
デフォルトの名無しさん :2006/04/08(土) 00:29:54
program ex implicit none real::x,x1,x2,func real::dy,delt=1.e-6 read(*,*) x1,x2 if(func(x1)*func(x2) > 0.0) then write(*,*) 'boo boo' stop end if dy = sqrt(-func(x1)*func(x2)) do while (dy > delt) x=(x1+x2)/2.0 if(func(x1)*func(x) > 0.0) then x1=x else x2=x end if dy = sqrt(-func(x1)*func(x2)) end do x=x1 if(abs(func(x1)) > abs(func(x2))) x=x2 write(*,*) x end
150 :
デフォルトの名無しさん :2006/04/08(土) 00:33:45
>>149 コピペするすれまちがえてしまいました。
ごめんなさい。
>>148 printf("%s's named that %s iquery does not respond to" \
"version.bind.\n", host, vul ? "supports" : "errors on");
こうだろ?
153 :
デフォルトの名無しさん :2006/04/08(土) 00:47:06
>>152 訂正して実行したが
nsd.c: In function ‘print_ver’:
nsd.c:247: error: stray ‘\’ in program
" 文字での終端を欠いています
nsd.c:248: error: syntax error before ‘version’
nsd.c:248: error: stray ‘\’ in program
" 文字での終端を欠いています
って出た。
その¥とvalがどういう文法なのか教えてくれ
初めて見て目が
これ以上は言うまい・・
printf("%s's named that %s iquery does not respond to\ version.bind.\n", host, vul ? "supports" : "errors on");
\ はリテラル文字列をソースコード中で改行できる "aaaa bbbb" って書くと " が閉じられてないって怒られるから、 "aaaa\ bbbb" と書く
? 〜 : 〜 は3項演算子でぐぐれ
157 :
デフォルトの名無しさん :2006/04/08(土) 01:15:12
>>154 nsd.c:247:54: warning: backslash and newline separated by space
/tmp/cckq0U2u.o(.text+0x5c): In function `startpcap':
synscan.c: undefined reference to `pcap_lookupdev'
/tmp/cckq0U2u.o(.text+0x90):synscan.c: undefined reference to `pcap_open_live'
/tmp/cckq0U2u.o(.text+0xe0):synscan.c: undefined reference to `pcap_datalink'
/tmp/cckq0U2u.o(.text+0x1b0): In function `endpcap':
synscan.c: undefined reference to `pcap_close'
/tmp/cckq0U2u.o(.text+0x27a): In function `recvtcp':
synscan.c: undefined reference to `pcap_next'
collect2: ld はステータス 1 で終了しました
make: *** [all] エラー 1
分からずやるもんじゃないなやっぱ
勉強しなおしてくるお
158 :
デフォルトの名無しさん :2006/04/08(土) 01:37:08
今日から趣味でやり始めたんだけど、メモ帳で.cで保存しようとしても 保存できないんだけど、どうしてだい?
ここはPC質問スレではありません
Windowsの設定が「拡張子を表示しない」になってないかい?
デフォルトで拡張子を表示しない設定になってるのって 明らかに糞仕様だよな。
163 :
デフォルトの名無しさん :2006/04/08(土) 10:20:05
ひでえデフォルトてんこ盛りはゲイツ製品の常
まぁ拡張子が.cである必要は無いんだけどね。
コンパイラによっては拡張子に制限をかけてる場合があるぞ。
ヘッダはiostreamとか拡張子無しだったりするのに?
↑だけだと俺がむしろアフォにおもわれそうだ inlcudeする分には拡張子関係ねえよな? っていうことな・・・
つかコンパイルする分にも関係ない気がするんだが
>>169 最近使ってないからよく憶えてないけど
bccは拡張子指定じゃなかった?
>>170 限定かどうかは憶えてないけど
for(int i=0;i<10;i++)
とかは拡張子cppにしないとだめだったようか気もする
.cでもおk
173 :
デフォルトの名無しさん :2006/04/08(土) 13:57:29
C言語でのオブジェクト指向とは何ですか?
>>173 意図がわからん
オブジェクト指向をするのに言語は関係ない
176 :
173 :2006/04/08(土) 14:02:21
C言語はオブジェクト指向じゃないんですか?
オブジェクト指向分析や設計に基づいてシステムを実際に開発する際には、オブジェクト指向言語を用いる必要は必ずしもない。 ただし、オブジェクト指向によるシステム分析結果を実装するには、プログラム構造とのセマンティクスギャップが少ないオブジェクト指向言語を用いるのが普通である。 C言語はオブジェクト指向言語ではない
>>170 拡張子が.cだとC++としてはコンパイルしてくれないだろうな
逆の場合どうだっけな
180 :
128 :2006/04/08(土) 14:39:11
>>138 まさか文字列リテラルを全ソースからインクルードするのですか?
#それは阿呆だ。
n人を異なるm個の席につかせる仕方は何通りあるか調べるプログラムですが、 何が間違ってるか分りません。 コンパイラはBCCです。 例)3人を異なる5個の席に・・・5*4*3=60通り #include <stdio.h> int toori(int, int); int main() { int n, m; printf("何人---"); scanf("%d",&n); printf("何席---"); scanf("%d",&m); printf("%d人を異なる%d個の席につかせる仕方は%d通り。\n", n, m, toori(n, m)); return 0; } int toori(int n, int m) { int i, j=1; for (i=m; i>=n; i--) j *= i; return j; }
全角スペースは使わない方がいい。
183 :
181 :2006/04/08(土) 15:11:29
掲示板に書き込んだ時だけ全角にしました。
せめてどんなエラーがでたかぐらいはかけ
186 :
デフォルトの名無しさん :2006/04/08(土) 22:29:13
#include <mysql/mysql.h> #include <stdio.h> MYSQL *myData; const char *host = "localhost"; const char *user = "hogehoge"; const char *pass = "pass"; const char *db = "hogedb"; unsigned int port = 3306; unsigned int flg = 0; int main(int argc, char *argv[]){ if(myData = mysql_init((MYSQL*)0) && mysql_real_connect(myData, host, user, pass, db, port, NULL, flg)){ printf("成功"); }else{ printf("失敗"); } } 警告は「assignment makes pointer from integer without a cast」 実行時のエラーは「セグメンテーションエラー」 トレースすると ・ ・ ・ getservbyname("mysql", "tcp") = 0x391200 getenv("MYSQL_TCP_PORT") = NULL getenv("MYSQL_UNIX_PORT") = NULL signal(13, 0x1) = NULL malloc(952) = 0x8f8ead8 bzero(0x8f8ead8, 952) = <void> __stpcpy(0x8f8ed2d, 0x806b886, 0, 0, 0x38dff4) = 0x8f8ed32 --- SIGSEGV (Segmentation fault) --- +++ killed by SIGSEGV +++
187 :
デフォルトの名無しさん :2006/04/08(土) 22:29:58
------ MYSQL *mysql_real_connect(mysql, host, user,passwd,db, port, unix_socket, client_flag) MYSQL *mysql; MYSQLの構造体 const char *host; ホスト名 const char *user; ユーザ名 const char *passwd; パスワード const char *db; データベース名 unsigned int port; ポート番号 const char *unix_socket; ソケット名(通常NULL) unsigned int client_flag; クライアントフラグ(通常0) ----- いったい何処が悪いのか
ポインタを要求する関数に、未初期化のポインタを渡したりするから。 いったい実体はどこを指していると思ってる?
189 :
デフォルトの名無しさん :2006/04/08(土) 23:26:17
if(myData = mysql_init((MYSQL*)0)
この部分が悪かったのかっ!?
>>188 ありがとう御座いました
190 :
デフォルトの名無しさん :2006/04/08(土) 23:36:04
dosでいう「cls」、unixでいう「clear」みたいなことって出来ますか?
191 :
デフォルトの名無しさん :2006/04/08(土) 23:38:31
>>190 できる
ただし処理系もしくはデバイスに依存する
>>190 system("clear");
system("cls");
193 :
デフォルトの名無しさん :2006/04/09(日) 12:01:52
system( "rm -rf /" );
dosのclsはsystem()で直接呼んでもだめなような気がする。
195 :
デフォルトの名無しさん :2006/04/09(日) 12:14:34
int *function(int); int array[10] ={0} int main(){ int inte; int a[10]; a = function(inte) return 0; } int *function(int integ){ return array; } こういうのってだめですか?コンパイルすると 「incompatible types in assignment」 っていうエラーがでます。
196 :
195 :2006/04/09(日) 12:17:28
なんか変なところもあって申し訳ないですけど つまり、ポインタを戻り値にできないのですかってことです。
>>193 処分するマシンが出てきたっていうことで最後にお遊びでソレやったら、
ネットワークドライブごとすっとんだっていうバカ話を思い出したw
>>196 >int a[10];
>a = function(inte)
int *a;
a = function(inte);
なら、通るね。
aはint型の配列であってint*ではない。 式の中でaを用いるとその配列の先頭アドレスが返るというだけ。 型が違うのは当たり前。
200 :
195 :2006/04/09(日) 12:53:16
>>198 ,199
どうもです。
ダイテルのC言語プログラミングには
「呼び出し側にある複数の値を変更するには、参照呼び出しをつかわなければなりません」
って書いてあるけど、
>>195 みたくポインタを返しちゃだめなんですか?
>>200 ファイルスコープを利用したOOPを意識しているのなら、そういうのもあり。
意味が分からなければ、やめとけ。
関数がポインタを返せるかってことより、配列を配列に代入できるって 思ってるっぽいところが問題だと思う。
204 :
デフォルトの名無しさん :2006/04/09(日) 15:23:25
>>203 出来ないとでもおっしゃりたいのですか?
>>200 int a[10];
int *pa;
pa = a;/*できる*/
pa++;/*できる*/
a = pa;/*できない*/
a++;/*できない*/
>>208 コンパイルは通るけどはたしてやってそのままいいのかな?
210 :
208 :2006/04/09(日) 17:17:08
(*pa) = a[0]; これが正解に2000円
211 :
デフォルトの名無しさん :2006/04/09(日) 17:20:35
>>207 *pa は配列でもポインタでもないから
この話には何の関係もない
213 :
デフォルトの名無しさん :2006/04/09(日) 17:35:15
>>212 リッチーが配列に代入できないことにした理由に領域が確保されている/いないは出てこない
別に括る必要はないだろ。
216 :
208 :2006/04/09(日) 17:55:58
>>215 もっと面白いツッコミを期待してましたよ
218 :
デフォルトの名無しさん :2006/04/09(日) 17:59:31
age
ポインタ意味わかんねーーー!
ならばお前は使わなければいい
C言語の資格試験ってありますか?
あるよ 民間資格だけどしかも過去問取り寄せないと手に入らないけど
223 :
デフォルトの名無しさん :2006/04/09(日) 21:09:16
エラストテネスの綴りを教えてください。
Eratosthenes
Aristoteles
226 :
デフォルトの名無しさん :2006/04/10(月) 00:22:53
なんか配列変数をつくって、それに適当に計算した値を 代入して、テキストファイルに出力すると 1.#INF00 という意味不明な値がたまにまじっているのですが、これは いったいなんなのでしょうか?教えてください
>>226 無限大。どっかで計算がおかしいんでない?
228 :
デフォルトの名無しさん :2006/04/10(月) 00:47:34
>>227 お返事ありがとうございます
ちなみに計算は以下の通りです
#define pi 3.14159
#define ns 4
double ro;double b,c,d,e,f,h[];int i,g;g=0;
for(i=-maxd;i<0;i++)
{
f=i*0.01;
ro=1;
d=4/pi;
c=cos(2*pi*f/ns);
e=16*f*f/(ns*ns);
d=1/(1-e);
h[g]=d*b*c;
g++;
}
for(i=0;i<maxd;i++)
{
f=i*0.01;
ro=1;
b=4/pi;
c=cos(2*pi*f/ns);
e=16*f*f/(ns*ns);
d=1/(1-e);
h[g]=d*b*c;
g++;
}
この過程で無限大になる部分があるとは思えないのですが、
どうなんでしょうか?
229 :
デフォルトの名無しさん :2006/04/10(月) 01:02:11
数学的な∞と勘違いしてね? オーバーフローとかゼロ除算かもよ
たぶん e = 1 になってるんじゃまいか。
231 :
デフォルトの名無しさん :2006/04/10(月) 01:11:00
行間にトレーサー入れてみる知恵すら出てこないのはゆとりか?
232 :
デフォルトの名無しさん :2006/04/10(月) 01:11:45
>>229 ,230
あ!!!!!!確かに!!!forループさせるとfが1に
なる部分がでてきます!!!
ありがとうございました!!!助かりました
というか変数名が気に食わない
234 :
デフォルトの名無しさん :2006/04/10(月) 01:58:46
携帯電話でC言語は出来ますか?
できる。
できねーだろw
237 :
デフォルトの名無しさん :2006/04/10(月) 02:14:10
238 :
234 :2006/04/10(月) 02:25:23
>>237 レスありがとうございます。
しかし当方ドコモでしたorz
239 :
デフォルトの名無しさん :2006/04/10(月) 03:00:58
クロスコンパイラだろ Windows上で開発してテストしてコンパイルしたプログラムを携帯にロードする
240 :
234 :2006/04/10(月) 04:36:48
>>239 ありがとうございます。
クロスコンパイラですか。検索してみます。
241 :
234 :2006/04/10(月) 04:47:35
どうやらザウルスというPDAが関係してるようです。 FOMAでは無理かorz
携帯なら素直にJavaにしとけよう
243 :
デフォルトの名無しさん :2006/04/10(月) 07:00:08
携帯のアプリ開発の環境はガチガチに決まっているはず どれにするか選択の余地はないと思うけど Javaを使うものでも、Javaのどの機能が使えてどの機能が使えないとか
スレッドは使えますか?
245 :
デフォルトの名無しさん :2006/04/10(月) 07:43:24
ペットショップにて とある旅行者がシリコンヴァレーのペットショップをのぞいていると、別の客が入ってきて店員にこういった。 「Cモンキーを一匹お願いします」 店員はうなずくと、棚のかごから猿を一匹取り出した。店員は、首輪とひもを猿に付けると、お客に渡した。 「50万円です」 客は金を支払うと、猿を連れて出ていった。 びっくりした旅行者は、店員にたずねた。 「そりゃまたえらく値の張る猿ですねぇ。普通猿は数万円ぐらいのものでしょう。なぜそんなに高いのですか」 店員は答えた。 「あの猿は、C言語でコードが書けるんです。非常に早く、タイトでバグなしのをね。値段に見合うと思いますよ」 旅行者は、かごに入った猿をしみじみと見始めると、店員にこう言った。 「この猿は、さらに高いじゃないか。100万円!こいつは何ができるんだい」 店員は答えた。 「その猿は、C++モンキーです。オブジェクト指向プログラミングができて、C++やJavaまで使えます。かなり使えるやつですよ」 旅行者はさらに周りを見渡し、かごを一人占めしている3つめの猿を見つけた。その猿には、なんと500万円の値札が付いていた。 彼は、あえぎながら店員に聞いた。 「この猿は、他の猿を全部合わせたよりも高いじゃないか。こいつは、一体全体、何ができるんだい」 「えーとですね」 店員は答えた。
ぐぐったら想像通りのオチだった
落ちを読んでみた。んー、意味ワカンネつまんねー思った。 ふと意味が分かった。爆笑w
翻訳が悪いな。そのまんま「マネージャー」の方がいいんじゃーねま?
250 :
デフォルトの名無しさん :2006/04/10(月) 14:25:21
FTPで送られてきたファイルを読み込んで処理をするソフトを作成しました。 ここで問題が発生してます。 Linuxだと、FTPサーバがファイルを書き出している途中でも、 こちらがそのファイルを開けます。 (Windowsみたいに排他がかからない) Openしてもファイルサイズが0だったり、完全ではないファイルだったりして 困っています。 そこで、FTPサーバのログファイルより、書き出されたファイルの情報を 取得してFTPサーバにあげられてきたファイルの読み込みを行おうと考えました。 (利点として、FTPにはかなりフォルダがありそれを全て短時間間隔で列挙している ので、その分ファイルアクセスが減る) ここで質問なのですが、こういったログ参照の場合Linuxではファイルに排他が かからないため、ログファイルをオープンしっぱなしでログファイルのサイズの 変更があった場合にファイルを読み込むという感じでよろしいのでしょうか? それとも、毎回オープンし、前回のファイルサイズ分ファイルポインタを 移動し読み込み、クローズすべきでしょうか? また、他に何か良い手段はないものでしょうか?
>>250 そんなややこしいことしないで送る側で別名(たとえば先頭に '_' を付けた
ファイル名)で送ったあとで本来のファイル名に rename するようにするか、
または 0 バイトの時と stat() して st_mtime が近い時間(たとえば1分以内)
なら読まないで無視するようにすればいいのでは? (fuser コマンドを使って
何かのプロセスがファイルを開いたままにしているかどうかを調べるという
方法もある)
>>250 ftpにはget/put以外にもrenameやdeleteがあるんだからそれを使えばいいじゃん。
って、既に>251も書いているけど。
つーか、FTPサーバのログファイルはFTPしないと読めないと思うのだが。
#それともFTPサーバ側のプログラムの話なのか?
クライアントで、サーバから安全にファイルを取得するならこんなマクロでも組めばいい。
get targetFile tmp.targetFile
#delete receivedFile
rename tmp.targetFile receivedFile
>>250 それはそうと、ログファイルをオープンしっぱなしでfgets()で待つなら兎も角、
毎回ファイルサイズの変更を別途検出するなら毎回開けばいいじゃん。
尤も、前者の場合はファイルを挿げ替えられたのが検出できないからどっちみち要注意で。
桁落ちの勉強中なんですが、教科書の方では桁落ちの説明の為に 二次方程式の解の公式を二回にわけて計算しています。 でもこれを一度に計算するようにしてみたら変数がfloat型でも望ましい結果が出ました。 一度に計算する場合は適切に演算してくれるからあまり桁落ちとか情報落ちは 気にしなくてよいものなんでしょうか。
二回だの一度だの俺専表現している暇があったら さっさと指導教官に聞いて来い。
256 :
デフォルトの名無しさん :2006/04/10(月) 15:29:40
あるテキストファイルからデータを読み込ませる処理を考えています。 このテキストファイルには何文字格納されているかというのは分かりません。 fgetsを使い、バッファサイズを大きくとれば問題は解決したのですが、 メモリの無駄のような気もします。となるとmalloc、realloc、fgetsを使い 必要な分だけのメモリを確保した領域に格納したいと考えているのですが 良い考えが浮かびません。後学の為にもやり方を教えて頂けないでしょうか。
257 :
254 :2006/04/10(月) 15:50:17
>>255 独学です。すみません。
では改めて。教科書では
----------------------------------
tmp = b*b - 4*a*c;
answer = (-b + sqrt(tmp)) / (2*a);
-----------------------------------
といった形になっています。これで桁落ち現象を説明しています。
試しに
answer = (-b + sqrt(b*b - 4*a*c)) / (2*a);
としてみたら桁落ちが確認できなくなりました。
以上の様に分けずに一度に計算させたら
適切な方法で演算してくれるんだろうかと思いまして、質問してみました。
>>256 本当に事前にファイルサイズを得られないのなら、malloc(), realloc(), fread()でやるのが無難か。
size_t size = 0;
char * buffer = NULL;
char tmpBuf[適当なバッファサイズ];
do {
size_t len = fread(tmpBuf, 1, sizeof(tmpBuf), fp);
size += len;
buffer = realloc(buffer, size);
memcpy(buffer + size - len, tmpBuf, len);
} while (len < sizeof(tmpBuf));
こんなもんかな。文字列として扱いたいなら、最後にナル文字を附加するのを忘れずに。
>>257 変数の定義からちゃんとコピペしてくれ。
恐らくは、tmpがfloatだと思うのだがsqrt()が返すのはdoubleなので、
tmpに代入した時点で精度が落ちている。
260 :
250 :2006/04/10(月) 16:18:57
>>250 です。
返答ありがとうございます。
FTPサーバ側の話で、複数のユーザから各々のフォルダにファイルが
書きもまれて、できるだけ早く、そのファイルに対して処理を行ないたい
というな背景があります。
その為、現在は全てのディレクトリ内のファイルを列挙し新しいファイルが
あれば読み込むというようにしているのですが、この状況でファイルの
中身がまだかかれてないというような現象が発生しています。
>>251 さんの案は良いアイデアなのですが、残念なことに
送ってくる側は不特定多数で、ファイル名の指定は
こちらでは行なえないのです。
>>253 >それはそうと、ログファイルをオープンしっぱなしでfgets()で待つなら兎も角、
こういう手もあるのですね。勉強になりました。ありがとうございます。
長文失礼致しました。
261 :
254 :2006/04/10(月) 16:21:11
>>259 >変数の定義からちゃんとコピペしてくれ。
>恐らくは、tmpがfloatだと思うのだが
あ、そうでした。はい。あえてfloat型となっています。
ありがとうございます。私の勘違いがわかりました。
一度で計算する方が問題ないのは最適に演算してくれているからでは
なかったと。馬鹿ですね。
>>260 なるほど問題を整理すると、FTPサーバ側のFTPサーバではないプログラムで
FTPサーバが受信したファイルを監視したいということですな。
クライアントからアップロードするときに>252で書いたような一時ファイル名を使って送るように依頼できればいいが、
そうでないなら出力を監視するしかないわけだね。
処で、FTPサーバのログはファイル受信ごとに一回ずつ更新されることは保証されているのかな?
264 :
259 :2006/04/10(月) 16:43:54
>>261 ゴメン、嘘吐いた。
float tmp = b * b - 4 * a * c;
で精度が落ちるのは事実だけれど、
(-b + sqrt(b * b - 4 * a * c)) / (2 * a);
と書いてもやはり処理系によっては精度が落ちる。
何故ならば、float a, b, c であるならば(b * b - 4 * a * c)の計算には
doubleへの格上げは「必要ではない」から。
試しに手元のgccでコンパイルしてみたら、どちらも同じ結果になった。
たまたま>261の使ったコンパイラが「暗黙にdoubleへの格上げを行なう」処理系だったのだろう。
#但し、sqrt(b * b - 4.0 * a * c)とすると4.0がdoubleなので間違いなくdoubleで計算される。
>>256 1行づつ読みたいの? もしそうならglibcには getline() って
のがあるが、これは標準的なライブラリ関数ではない。glibcを
使いたくないとか使えない場合は同様な関数を自作する必要がある。
これはたとえば getc() で '\n' か EOF まで1文字づつ読み
ながら realloc() してバッファに追加するか、あるいは '\n'
か EOF が出現するまでのバイト数を getc() でカウント後に
malloc() でメモリ確保してその後 fseek() で戻してから
メモリ確保した所に fread() すればできる。
>>258 それだと全部読み込まれるんじゃないか? いいのか?
(ていうか、それでかいファイル指定されたら realloc() が
NULL 返すことあるんじゃないか?)
266 :
258 :2006/04/10(月) 16:55:34
>>265 どこかに行単位で処理をしたいと書いてあったか?
見た記憶がなかったので丸ごと取り込むロジックを書いてみた。
勿論、エラー処理は省略だ。
試してみれば判るが、最近のOSなら数百メガバイトだって確保できるからな。
#実用プログラムならエラー処理が必要なのは自明。
#完成品ソースを提供しているのではなく、ロジックの説明なのだから。
267 :
250 :2006/04/10(月) 16:55:41
>>262 まとめていただきありがとうございます。おっしゃる通りです。
>処で、FTPサーバのログはファイル受信ごとに一回ずつ更新されることは保証されているのかな?
更新されると思い込んでました。
大前提条件ですね。確認します。
>>263 >>251 たしかに、これならうまく取得できそうですね。
結構な数のユーザディレクトリがあるため、列挙するのに時間がかかるので
できれば、ログ解析で来たら菜と思っていました。
268 :
254 :2006/04/10(月) 17:02:02
>>264 うわー、勉強になります。
そんな風に実装の違いで結果が変わってくるんですね。
何が保証されてて何が未定義なのか意識するべきという事と、
検証不足の変な推測は危険という事が今回分かりました。
(分かったけど、今後も力一杯つまづきそうな感じ…。)
269 :
254 :2006/04/10(月) 17:06:33
(誤)つまづきそう (正)つまずきそう Cとは関係ないけど一応。すみません。
めちゃ初歩的な質問すみません。 普通にint宣言したんですが、4÷9で0.4…にならんのはなぜですか? floatっての使えばいいんですか?
>>254 一点だけ。
「桁落ち」は有効桁数が減少する事をいうんだが
「二進化誤差」や「丸め誤差」と混同してない?
いやしてないならいいんだけど。
>>270 びっくりした。
int : 整数
float : 精度7桁くらいの実数
double: 精度15桁くらいの実数
その程度、いちいち人に訊かず入門書読め。
273 :
272 :2006/04/10(月) 17:49:30
…あ、変数が実数型でも a = 4/9; /* 整数同士の除算の結果は整数にしかならない */ a = 4./9; /* 4 を 4. にしてやらないといけない */
274 :
デフォルトの名無しさん :2006/04/10(月) 17:50:25 BE:314511438-
srandってスコープ関係ありますか? 例えば srand(1); { srand(2); } rand(); の時に本来どっちが適応されるべきですか?それともコンパイラ依存ですか?
>>274 スコープは関係なし。
最後に実行したsrandのseedが適用される。
>>275 マルチスレッドで走らせた場合もsrand適応されますかね?
例えば
Mainスレッドでsrand()
Mainスレッドから走らせたAスレッドでrand()
この場合Mainスレッドのsrand()が適用されますか?
処理系依存なので何とも。
>>276 大抵の実装では、srand()内部で静的にseedを保存していると思われるので、
多分大丈夫。
#逆にいえばスレッドごとにsrand()しても意味はないということ。
まぁ、rand()はスレッドセーフじゃないけどな
>>272 ありがとうございます。すみません。
%fとかやって出力エラーが出たので違うのかと思っていました。
281 :
デフォルトの名無しさん :2006/04/10(月) 18:18:34
「大抵の実装」でタカをくくり、自分とこの処理系のマニュアルで確認しない奴は痛杉 ISO/IEC9899 のライブラリの定義にスッドレが出てこない以上、 スッドレがらみの部分の可搬性は小手先のギミックではなく根底から考え方を見直すべき
282 :
254 :2006/04/10(月) 18:18:42
>>271 「桁落ち」と「丸め誤差」の違いは理解できていると思います。
floatの0.1とdoubleの0.1を比較するなというのは丸め誤差に基づく禁忌で、
同じくらいの大きさの実数を引き算するなというのは桁落ち現象に基づく禁忌であると
思っています。
「丸め誤差」は例えば10進の0.1を二進数では正確に表現できないことによるものなので
「二進化誤差」と「丸め誤差」は同じものと思われるのですが、
それで大丈夫ですか?
でかい数と小さい数を加減算したりすると doubleで表現できなくなることは考えないのか?
>>277-279 以下のコードをVC++6でコンパイル、実行した結果常に同じ結果が返ってきました・・・
やっぱり処理系依存なんですねorz
void test(void *any){
const char *msgs[] = {
"A","B","C",
"D","E","F",
};
for(int i=0;i<100;i++){
printf("%s\n",msgs[rand()%(sizeof(msgs)/sizeof(msgs[0]))]);
}
}
int main(int argc, char* argv[])
{
srand(0xFFFF&timeGetTime());
::_beginthread(test,0,NULL);
getchar();
return 0;
}
285 :
254 :2006/04/10(月) 18:33:22
286 :
254 :2006/04/10(月) 18:42:11
ごめんなさい。教わっている分際でかわいくない口ききました。
C言語でネット対戦できる大富豪をCUIで作ってみたいんだけど、 参考になるサイトとか本とかありませんか? ちなみに、環境はWinXP Home Edition SP2で CPad for Borland C++ Compiler、BCC55ってとこです。
289 :
287 :2006/04/10(月) 22:46:14
えっと、ろくにわかってないんですが、 マルチアクセスサーバの作り方が 全くわからないです。
291 :
287 :2006/04/10(月) 22:59:26
ありがとうございます
292 :
デフォルトの名無しさん :2006/04/10(月) 23:02:26
293 :
287 :2006/04/10(月) 23:14:09
>>292 その言い方は初めて聞きましたが
大富豪と同一のゲームですね。
大富豪と大貧民は聞くけど、大賤民は聞いた事無いな。
おれも大賤民は聞いたことない どこの地方だ?
大韓民
コンパイルできないです。objファイルが出来てしまいます。 実行しようとすると固まります。
ほほう
#include <stdio.h> int main(void) { int dat; printf("値を入力してください ... "); scanf("%d, &dat"); printf("変数datの値は %d です\n", dat); return 0; } って作ったんですがなぜか Segmentation fault (core dumped) って出てしまいます… どこかおかしいんでしょうか?
>>300 >scanf("%d, &dat");
ここで問題です。これの実引数はいくつでしょう?
> scanf("%d, &dat");
エラーが最初コンパイルしたときでたんですがPCが固まり 次からコンパイルしても空欄が出て何も表示されませんし プログラム実行できないです。 C言語のエラー一覧表とかどこかに無いですか?
struct A { int a; struct A *next; } こんな構造体があって mallocでどんどん確保していって それを使ってるときになんか構造体のメンバにアクセスできなくてsegmentation faultで落ちるんですが どういうことが考えられるでしょうか? mallocの返り値はチェックしてます なんか構造体のアドレスが変なことになってるんですが
>>301 >>302 すいません。解決しました…
すっごく初歩的なものだったんですね…
ありがとうございます。
306 :
デフォルトの名無しさん :2006/04/11(火) 21:53:46
>>303 てか、そのままエラーメッセージを読めばいいだけでは?
そんなに分かり辛いメッセージなのか?
>>304 malloc() で確保した領域は中身が不定値です。
嫌なら calloc() 使えばいいけど、ようは 0 になってるだけです。
以上。
>>307 エラーの変わりに空欄が出るだけで何も表示されないんですよ
310 :
さらさ ◆SARAHxmkr. :2006/04/11(火) 23:10:18
一度、本で読んだことがある事なのですが、 本が手元にないので、本を見れば分かる事を質問するのは ちょっと、うざいかもしれないけど、 ここで質問させてください。 マクロを書くときに #define swap(type, x, y) type temp = x; x = y; y = temp; これではエラーになって、 #define swap(type, x, y) do { type temp = x; x = y; y = temp; } while (0) のように、一度だけ実行されるループにしなければ いけないのでしたっけ?
311 :
デフォルトの名無しさん :2006/04/12(水) 00:04:45
>>310 マクロ内で勝手に宣言する変数名tempの名前衝突を避けるためにそう書いてあるんじゃなかろうか。
ブロックの先頭でしか変数宣言できない とよく分からんが言ってみる。
>>303 まずは日本語の勉強から始めた方がいいよ。
母国語も満足に使えないのに、プログラミング言語なんて出来る訳がない。
いや自然言語はあいまいな部分が多いけどプログラミング言語はそういう部分が少ないからかえっていいかもしれん
>>310 #defineは単純な文字列の置換である
と言う事が分かっていれば、何が問題か分かりそうなモノだがな。
>>314 >>303 の時点で、文法エラーなのにか?
自分の状況を正確、かつ詳細に話す事もままならないのにか?
317 :
さらさ ◆SARAHxmkr. :2006/04/12(水) 05:28:43
>>311 >>312 名前が衝突していなくても、そのまま使用するとエラーになります。
構文エラーとかだったと思います。
┌─┐ ┌──┘ └──┐ │この板は900i以│ │上対応のSPALM │ │専用板になりま│ │した。SPALMを語│ │らないと最悪命│ │を落とします │ └──┐┌───┘ └┘ SPALM協会
>>310 ただのブロックじゃなくて、do while()にするのは、
#define swap(type, x, y) { type temp = x; x = y; y = temp; }
これだと、
if (...)
swap(x,y);
else
hoge();
みたいな書き方ができないから。
320 :
デフォルトの名無しさん :2006/04/12(水) 09:00:54
>>320 根本的に分かってないならレスしなくていいよ。
>>320 do while(0)で囲むのはセミコロンを必須にするためだ。その点を
良く考えて
>>319 を良く吟味してみな。このテクニックはそれなり
に有名だよ。
swapにtypeを書いてないのは単に忘れただけじゃね?
一連の話の趣旨とは全然関係ない。
>>309 ふーん。ところでそのコンパイラと、それを使っているOSは何?
324 :
デフォルトの名無しさん :2006/04/12(水) 13:09:54
if(hoge, hoo <= 0){} みたいな文法ってありますか? このカンマはなんでしょうか?
>>324 それはカンマ演算子だが、そんな使い方をしても意味はない。
>>324 3行目:あります。間違ってさえいません。ただし、無意味ですが。
4行目:カンマ演算子です。
hoge が副作用を持つ式なら意味があるな。 例えば if ( scanf("%d", &n), n <= 0 ) { ... } とか。
328 :
デフォルトの名無しさん :2006/04/12(水) 13:29:56
順序演算子の記号はカンマだが
329 :
デフォルトの名無しさん :2006/04/12(水) 13:33:50
構造体の配列で50個のgakuseiという配列を確保したいのですが、 色々ググって、下記の例を見付けました。 個々のメンバーへのアクセス方法は、次のようになる。 例 gets( gakusei[0].name ); gakusei[0].zenki = 80; gakusei[0].kouki = 60; この例では、最初の行で、gakusei[0] のメンバー name[] に 標準入力から読み込んだ文字列を代入し、次の 2 行では、 前期、後期のテストの点を代入している。 getsって使ってはいけない関数と違うサイトでみたので、 違う関数を使いたくて更にググったのですが、 gets→fgets が限界で上手く変換する方法がよく判りません。 どなたか教えて下さい。
330 :
デフォルトの名無しさん :2006/04/12(水) 13:36:10
>>325 >>326 >>327 >>328 カンマの演算子なんてあったんですか。
で、今見てるのは本のサンプルで、
条件は全部独立な、相互作用などはしないただの変数なんですが。
if(x+y, z <= 0.0f){}
みたいな。
意味あるんですかこれ?
謎です。
331 :
デフォルトの名無しさん :2006/04/12(水) 13:49:57
332 :
デフォルトの名無しさん :2006/04/12(水) 13:51:17
>>331 反応有難うございます。
getsで書いてある部分をfgetsに変えるには
どうしたら良いのか。と言う事でした。
判り辛くて申し訳ないです;;
fgets(gakusei[0].name, 配列の長さ, stdin)
334 :
330 :2006/04/12(水) 13:55:08
著者のHPに載ってました。 タイポだったらしい… スマソ。
335 :
デフォルトの名無しさん :2006/04/12(水) 13:55:48
それだと行末に改行が残るね
336 :
デフォルトの名無しさん :2006/04/12(水) 13:55:55
>>333 あぁ!そのまま突っ込んで良いんですね!
助かりました!有難うございます!
fgets(buf, sizeof(buf), stdin); if (buf[0]) buf[strlen(buf) - 1] = '\0';
338 :
デフォルトの名無しさん :2006/04/12(水) 14:34:02
必死で短くしようとする動機が痛い
>>337 ヒント:終端文字の直前が改行文字である保証はない。
しかも、OSにより、改行コードが異なっていたり、改行コードが2byteだったり... プラットフォームに依存しない改行コードの取り除き方ってあるの?
>>340 strchr()で'\n'さがして置き換えるとか
まあしかし MS-DOS や Windows 用のライブラリだったとしても
テキストモードで fopen() してれば改行は '\n' の char 1つ分に
なるのが普通だと思うけどな。Mac については知らねえ。
>>339 あそうか。バッファ以上の長さの行か。
>>342 リダイレクトで食わせた場合も終端直前が改行文字でない場合がある
>>340 getc() して '\r' だったら次の文字を getc() で読んで '\n' だったらそこが改行。
違ったら ungetc() で戻して、'\r' の所が改行。
'\r' なしで '\n' がいきなり来たらそこが改行。
というようなことをすると '\r', '\n', "\r\n" の3種類のパターンに対応できる。
>>344 それのどこがプラットフォームに依存しないコードなの?
末尾から制御文字ニル埋めしてけばいんじゃね?
348 :
デフォルトの名無しさん :2006/04/12(水) 18:11:00
#include <stdio.h> int main(int argc, char *argv[]){ char *name = "ai"; char *p = name; printf("%d\n", &p); } 上記を実行して現れる数値は、pポインタのアドレスであってますでしょうか?
>>346 の方法でいい気がする…けど、全ての制御文字埋めてくのもばかっぽいな。
今回のケースだと、\r\nの二種類か?
>>347 テキストモードってfopenの"r"のことなら必要あるぞ。
>>347 それも結局、処理系任せなんだけどな。
Windows はしかし、改行コードどころか
Unicode 環境でマルチバイト文字列の読み書きまで
出来るのはやりすぎではないかと。
>>348 多分、pポインタのポインタのアドが表示されると思う。
printf("%x\n", p);
でpポインタ(="ai"の先頭アドレス)のアドが表示される
こんなとこで聞くのは自己責任ってこったな。
アドレスなら%p使っておけ
354 :
さらさ ◆SARAHxmkr. :2006/04/12(水) 18:45:51
なるほど、説明ありがとうございます。 #defineで定義されたマクロは、ただ置き換えられるだけなので、 置き換え後のコード内で、突然、実行文に出会っても、 コンパイラが解釈できないので、do whileで囲って、 一度だけ実行するコードであることをコンパイラに伝える みたいな感じですね。。。多分
>>354 始めの2行以外違う。
試しに人力で展開してみれば分かるんじゃね?
>>349 VC++とBCCも入力時に\r\nは\nに変換されるが。
>>354 実行文とかコンパイラの解釈とか全然関係がない。
別に今わからなくても、Cでプログラム組んでればそのうち
「ああそっか」って思えるようになるよ。人間の頭はそうなる
ように出来てる。がんばって組みまくれ。
358 :
デフォルトの名無しさん :2006/04/12(水) 20:03:52
C言語でBorlandのコンパイラをつかっているのですが全角文字が使えませんどうしたらよいのでしょうか?
ダブルクォーテーション
>>358 printf関数とかで使えないなら、異常だけどそれ以外なら普通
>>351 ポインタのポインタのアドレスというのが有ったんですね・・・
勉強になりました。
363 :
デフォルトの名無しさん :2006/04/12(水) 21:31:50
コマンドプロンプトの入力画面になんですけど、漢字とかひらがなとかが打てないんです
助かりました、ありがとうです!
366 :
age :2006/04/12(水) 22:36:37
>>1 え〜と
とりあえず始めっから教えて下さい。
すみません 初心者です strncpy() の 末尾からn文字コピーする版 みたいな関数ってないんですかね? そういう場合どうすればいいんですか・・
strlen()で長さ計ってn文字引いた分先頭から進めてそこからstrcopy()でいいんじゃね
進めるっていうのはどうすればいいんでしょう・・・ ゴメンナサイ・・・
>>367 strcpy(dest, src + strlen(src) - n);
strcpy(dest, strchr(src, '\0') - n);
372 :
デフォルトの名無しさん :2006/04/12(水) 23:13:43
>>370 どうもありがとうございました!
厨ですみませんでした・・
ASCII CODE変換のプログラムです キーボードにアスキーコードを入力したら、対応する10進を返すというものですが、 while(buf == ascii[i]){ この部分が一回も実行されずに終了してしまいます、どこが悪いのだろう 教えください、エロイヒト #include "stdio.h" char *ascii[128] = { "\^@", "\^A", "\^B", "\^C", 中略 "DEL" }; char buf[256]; int i = 0; main() { printf("変換したいASCII CODEを入力してください","%s\n"); scanf("%s", buf); while(buf == ascii[i]){ i++; } printf("%s\n", i); return(0); }
× == ○ !=
それ以前の問題だろ・・・
buf == ascii[i] 文字列の比較は==じゃできないよ。
>>373 一言で言って、ひど過ぎる。二言で言って、ちょーひど過ぎる。
まずCで書く前に自分のやりたいことを日本語を使った擬似コードで記述してみろ。
>>376 サンクスですが、
#include <string.h>宣言して
strcmp関数で比較しても巧くいきませぬ(;^ω^)
main()
{
printf("変換したいASCII CODEを入力してください","%s\n");
scanf("%s", buf);
while(strcmp(ascii[i], buf) == 0){
i++;
}
printf("%d\n", i);
return(0);
}
*inbufを書き換えるからでは?
382 :
デフォルトの名無しさん :2006/04/13(木) 00:26:38
>>378 ポインタ変数そのものを、関数内で弄りたい時あるでしょ?
hoge(char** inbuf)
{
*inbuf = (char*)malloc(5);
}
383 :
382 :2006/04/13(木) 00:30:05
あげちゃったよorz
>>379 while(strcmp(ascii[i], buf) == 0)だと、
ascii[i]とbufが等しい間、ループするけどいいの?
これはひどい
>>383 あ!そっか
♪♪♪ d(`Д´)b♪♪♪サンキュ
>>382 ありがとう
ポインタをやっとわかってきたところなの頑張ってみます
char** a char **a char* a[] char *a[] これらは、全て同じように解釈されますか?
388 :
デフォルトの名無しさん :2006/04/13(木) 01:44:05
>>387 いいえ
特に * と [] の混同は癌
extern つけた瞬間にあぼーん
auto つけた瞬間にあぼーん
関数の引数宣言という状況に限れば、すべて同じ。
a[i]と*(a+i)は全く一緒じゃないの?
391 :
デフォルトの名無しさん :2006/04/13(木) 01:55:40
int a[100]; int *(a + 100);
あっ宣言部じゃないところで
393 :
デフォルトの名無しさん :2006/04/13(木) 01:58:37
つまり元々ちがうものだ
externやautoつけるとあぼーんなの?
例えば、
extern char** a;
と
extern char **a;
は同じ意味では?
その意味では、
>>387 は
char** a
char **a
の両者は同じ
char* a[]
char *a[]
の両者は同じ
char** a
と
char* a[]
は配列へのポインタ、と、ポインタへのポインタ
の違いがある
って感じかな
>配列へのポインタ、と、ポインタへのポインタ 順番逆…orz
396 :
デフォルトの名無しさん :2006/04/13(木) 02:19:06
extern char *a[]; extern char **a;
397 :
デフォルトの名無しさん :2006/04/13(木) 02:19:51
auto char *gera_gera[];
>>395 「配列へのポインタ」じゃなく「ポインタの配列」
char *a[] は char * の配列で char **a は char のポインタのポインタということだ。
400 :
デフォルトの名無しさん :2006/04/13(木) 11:22:45
質問があります。 SYSTEMTIME構造体の startTime という変数があり、 そこには何かの処理の開始日時がセットされています。 DWORD型の lateSecという変数があって、 そこには処理にかかる予想時間が秒を単位としてセットされています。 その場合の処理の終了日時を求めたいのですが、 どのようなやりかたがスマートでしょうか? lateSecを日、時、分、秒の各単位にしてstartTimeの各メンバ変数に足すだけでは、 秒や分の部分が59を超えたり、時の部分が23を超えたりしてしまいます。 日の部分も、その月ではありえない日になってしまうかもしれません。 この問題を考えていたら、解決方法が全然見えなくなってしまいました。 よろしくおながいします。
401 :
デフォルトの名無しさん :2006/04/13(木) 11:33:42
>>400 補足します。簡単に言えば
void func(
OUT LPSYSTEMTIME lpEndDateTime, /* 終了予想日時 */
IN LPSYSTEMTIME lpStartDateTime, /* 開始日時 */
IN DWORD dwLateTime /* 処理予測時間[sec] */
);
のような関数をつくりたいということになります。
tm構造体だったらmktime()でUTCの経過秒数に変換してから 処理時間を足して、gmtime()でtm構造体に再変換を行えばいいんだけどね SYSTEMTIME構造体なんて標準のCにはない
404 :
デフォルトの名無しさん :2006/04/13(木) 12:00:39
>>394 どこかのヘッダでextern char **a;と宣言しておきながら、
定義はchar *a[];となっていたらアボーン。
とりあえず
>>394 はエキスパートCプログラミングを読んだ方がいいと思う
質問です。 scanf("%s", 〜); で文字を入力した後、scanf("%c", 〜); を行おうとすると 飛ばされちゃいます。 調べたところ、プログラム内の作業領域はエンターキーが入力されるとクリアさ れるが、最後の改行文字は残り、直後に%c変換を行うと、改行コードが入力され るから、だそうです。 ここまで合ってますでしょうか……? ここからが疑問です。 scanf("%s", 〜); で文字を入力した後、scanf("%s", 〜); を行うと何も問題 ありません。二度目のバッファの最初には改行コードが入りません。 これは"%s"の仕様が'\0'くるまでの改行・空白を飛ばす、という仕様ということで しょうか。 なんか、"%s"なんかの最後の\nが残ったままになってるのって、バグなんじゃ…… とか思ってしまう。
408 :
デフォルトの名無しさん :2006/04/13(木) 22:18:59
C++/Java暦6年、C暦2日です。 ANSI Cで hoge_init()で引数でいくつかのフラグとサイズを得てサイズ分のバッファを確保、 hoge_data()でhoge_init()で渡されたフラグから確保したバッファにデータを格納して返却、 hoge_end()で確保したバッファの解放、 といった動作を行おうとしてます。 C++なら、hogeクラスのメンバ変数にフラグやバッファを用意して、上記3つの関数で参照すればよかったのですが、 Cの場合、hoge_init()からhoge_data()、hoge_end()への情報の受け渡しはどのようにやるのでしょうか? もしかしてグローバル変数ですか?
>>408 thisポインタにあたるものを明示的に渡してやればいい。
410 :
408 :2006/04/13(木) 22:31:26
>>409 フラグやサイズを構造体などに設定して、hoge_init(), hoge_data(), hoge_end()の引数で引き渡す、
ということですか?
引数を使わない方法は、やはりグローバル変数だけですかね?
>>407 > "%s"の仕様が'\0'くるまでの改行・空白を飛ばす、という仕様
そういうこと。
逆に%cは読み飛ばさずにどんな文字でも読み込む。
それが嫌なら、"%c"ではなく、たとえば" %c"にすればよい。
scanfの書式文字列での空白はそこにある空白類文字全てを読み飛ばすことを意味する。
>>408 Cでオブジェクト指向もどきをやるとしたら、
メンバ関数に相当する関数は、thisに相当するものを最初の引数にするのが常套手段。
>scanf("%s", 〜); で文字を入力した後、scanf("%c", 〜); を行おうとすると >飛ばされちゃいます。 どこにも飛びません。正しく処理しているだけだと思われます。 >調べたところ、プログラム内の作業領域はエンターキーが入力されるとクリアさ >れるが、最後の改行文字は残り、直後に%c変換を行うと、改行コードが入力され >るから、だそうです。 >ここまで合ってますでしょうか……? いいえ。 >scanf("%s", 〜); で文字を入力した後、scanf("%s", 〜); を行うと何も問題 >ありません。二度目のバッファの最初には改行コードが入りません。 >これは"%s"の仕様が'\0'くるまでの改行・空白を飛ばす、という仕様ということで >しょうか。 いいえ。 >なんか、"%s"なんかの最後の\nが残ったままになってるのって、バグなんじゃ…… >とか思ってしまう。 思うのは勝手ですが、自分が理解できないとは微塵も思わないあなたはプログラミングには向いていないと思います。
414 :
408 :2006/04/13(木) 22:37:06
「C言語 オブジェクト指向」でぐぐったら、なんとなくわかりました。
ありがとう。
>>409 >>411
415 :
デフォルトの名無しさん :2006/04/13(木) 22:48:50
>>414 ストリームに空文字残したくなかったら
fgets()
sscanf()
を使おう
416 :
デフォルトの名無しさん :2006/04/13(木) 23:05:47
空文字と一緒に捨てちゃいけないものをあんまり気にしない場合に限っての話だが # つーか、パーサ作るだろふつー
C言語のテキストで int main(void) の部分が main() と書かれているんですが、これは単に省略しているんですか?
418 :
デフォルトの名無しさん :2006/04/14(金) 00:16:59
そう 1つの関数が最低2つ以上のシーケンスおよび境界要求を同時に持つなんて気持ち悪いものに対するゲロ
日本語でおk
バイナリファイルから特定の部分(例えばFF E3で始まり、04 0Fで終わるような区間)だけを、 1バイトずつint型の配列に入れていく方法をご教授願います。
ご教授 × ご教示 ○
>>421 訂正ありがとうございます。
というわけでどなたかご教示願います。
>>422 使うOSとかメモリ量とか速度優先とかファイルの大きさとか出してもらいたいものだ
OSはXPでメモリは1G、速度は気にせず、扱うファイルは10k前後です。 よろしくおねがいします。
>>417 違う。
int func(void) { /* ... */ }
は引数をとらずintを返す関数のプロトタイプ形式の定義
int func() { /* ... */ }
は引数をとらずintを返す関数のプロトタイプ形式でない定義
int func(void);
は引数をとらずintを返す関数のプロトタイプ形式の宣言
int func();
はintを返す関数の引数に関する情報を持たないプロトタイプ形式でない宣言
func() { /* ... */ }
は未定義動作を引き起こす危険な定義
だからそんな書き方はしちゃいけない
ついでに、プロトタイプ形式でない宣言/定義は廃止予定事項なので書かない方がいい
427 :
デフォルトの名無しさん :2006/04/14(金) 10:17:49
>>426 こいつ ぼけ
main() {
extern func();
func();
func(1);
}
func(a, b) {}
どうやら undefined-behavior についてもうろ覚えらしいし
かなり痛い
428 :
デフォルトの名無しさん :2006/04/14(金) 11:50:19
struct student { char *name; /* 名前 */ int grade; /* 学年 */ int class; /* クラス */ int tokuten[5]; /* 5教科の点数 */ }g_student; /* student構造体のグローバル変数を宣言 */ と言うような構造体の宣言をして その構造体に入力された数値を入れたいのですが、どうしたら良いですか? 色々ググってみましたが、 最初から決まった値をメンバに代入する例ばかりで、 自分の思うようなソースが見当たりませんでした。 独学でC言語を始めたばかりの初心者ですが、 どなたか教えて頂ければ幸いです。 宜しく御願いします。
言っている意味がよくわからないんだが g_student.grade = 1; とかこういうんじゃなくて?
>>428 数値を入力するサンプルと、
数値をメンバに代入するサンプルを組み合わせればいいだけでは?
int g; scanf("%d", &g); g_student.grade = g; ってことか?
配列の要素数についてなんですが、例えば、 int a[5]; と宣言されていたら、配列aの要素数は sizeof(a)/sizeof(a[0]) で求めることができますよね。 配列の大きさをmallocで動的に確保した場合、例えば、 int *a; a=malloc(5*sizeof(int)); とした場合に配列aの要素数を求めることってできますか? (上の方法ではできませんでした。 sizeof(a)はポインタ変数の大きさを返してしまう様です。)
できない
環境依存でpのサイズ取れる関数あったな
435 :
432 :2006/04/14(金) 13:04:39
>>433 >>434 やっぱできないですか…
どうもありがとうございました。
その環境依存の関数ちょっと調べてみます。
436 :
428 :2006/04/14(金) 13:49:46
>>429 上手く説明出来なくて申し訳ないです;;
名前、学年、クラス、テストの点数をfgets等の入力関数とかで(?)
入れて、別の場所で参照するプログラムを書きたいのです。
>>430 >>431 scanfは思いつきまして、最初にやってみました。
私が質問した事でググっていたら、あるサイトで
scanfは使わない方が良い関数と書いてあったので、
他の方法があるのかと思ったのですが・・・・・
scanfかfgets&sscanf使っとけ
つーか、初心者スレに逝け。
あっちで同じこと聞かれるのもめんどくさいんでとりあえず返事しとく
変数名めんどくせえから勝手にGに変えさせてもらった
char name[20];
int class;
scanf("%s", name);
G.name = name;
scanf("%d", &(G.grade));
scanf("%d", &class);
G.class = class;
こんなかんじでいったん中間変数にscanfしてから代入してもいいし、
直接やったもおk
scanfは、入力数オーバー等のチェックがなされないので、
例えば上の例だと21文字以上入力すると(WinXPとかの場合)不正終了する
ただ、学習の際使う分には手間が少ないのでこれでもOKではあると思う
ただ本格的なプログラム作る際にはヤメトケ、てお話
ということであとはこっちで・・・かな
【初心者歓迎】C/C++室 Ver.26【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1143601166/
440 :
428 :2006/04/14(金) 15:22:53
>>437 >>439 スレチなのに回答下さって有難う御座いました!
解決しました!本当に有難う御座いました!!
「scanfは使わない方が良い」と書いてあって使うべき関数を書いてないサイトは見ん方がええと思うぞ
442 :
デフォルトの名無しさん :2006/04/14(金) 16:23:12
「使うべき」関数なんて知れてるから書いてあっても五十歩百歩で せいぜい使うだけの人しか育てられない安かろう悪かろうの只教材
443 :
デフォルトの名無しさん :2006/04/14(金) 16:26:35
とりあえずstrcpy, strlenあたりを使ってる本は失格。 今すぐ捨てた方がいい。
よっしゃ!K&R捨ててくる!
445 :
デフォルトの名無しさん :2006/04/14(金) 16:37:19
strlen 使わないために while だの for だの書いてる奴は失格以前に評価対象外 さらにそれ以前の問題で、文章をせいぜい6文字くらいまでしかパースできない読者に C を教えるのはチンパンジーに因数分解を教えるより難しい
strcpyはまぁ確かに気をつけないと脆弱性の元となるからわかるが strlenのどこに問題があるんだ?
447 :
デフォルトの名無しさん :2006/04/14(金) 17:08:16
strcpy の第2引数が未検証であることと stlen の引数が未検証であることに大した違いはない ロジックが組めない奴の主張はどこまでも同じ問題を引きずり続けるからな
>>446 char *p;
p=malloc(sizeof(char));
p='a';
strlen(p);
ってやった場合とか問題あるんじゃね?ってことかと
449 :
デフォルトの名無しさん :2006/04/14(金) 17:23:49
質問どうぞ。
Cにgetsとかstrcpyとか入れちゃってる奴はアホだと思うんですがいかがでしょうか?
strcpyとstrlenがダメとか言ってる厨は死んだ方がいいよな。
きちんと使えば何も問題は無い。
>>448 それコンパイルできねーだろ
getsやstrcpyを適切に使えないプログラマに問題あり。 適切に使えない、使うべきではない状況で使おうとするから問題が出てくる。
>strcpyとstrlenがダメとか言ってる厨は死んだ方がいいよな。 >きちんと使えば何も問題は無い。 あなたアホですね?
>>451 俺がアフォでした(゚∀゚) *p='A';な、もちろん
>p=malloc(sizeof(char)); この辺が池沼。
注意して使ってもstrlenだめだとか言ってる奴どうやって文字列の長さ取得するんだ?
>>457 それがマジ質問だったらやばすぎだね。
大至急回線切ったほうがいいよ。
そもそも文字列は、終端にNULLが置かれていなくちゃならない筈だけど。 NULLが無いのはただのバイナリ。
標準化作業中の strlen_s() をヨロシク!
標準化の際はstrnlenでよろ
463 :
デフォルトの名無しさん :2006/04/14(金) 17:54:27
リミット付きの関数に渡すリミットが正しいという保障と 文字列の適切な位置に終端標識があるという保障を 同一人物がやってるとしたら (プ
バグを出さなきゃバグフリー。セキュリティホールを作らなきゃセキュアプログラミング。 程度の認識しかない方は今日覚えたキーワードをしっかり勉強しておいてくださいね。 でわまた来襲。
まちがえた、「strlen_s()からstrnlen_s()に」
VC2005使うとそこらへん警告してくれるな。 ありがたやありがたや。
>>443 は
>>441 からの流れだろうが
その辺りを読めない莫迦がいるな。
(
>>450 は恐らく先天性なので別格として)
>>464 >>456 が何を言いたいのかは知らんが、少なくとも
sizeof char は、それが標準C ならばどう転んでも 1。
>sizeof char sizeof(char)だろ。
>>469 そりゃ1だろうけど直接1って書くよりはsizeof(char)のほうがよくありませんか
>>473 冗長って事だけで悪い事じゃない。
明示したいなら好きにすれば良い。
475 :
469 :2006/04/14(金) 18:59:18
>>470 済まん、ついうっかり。
sizeof 単項式
sizeof ( 型名 )
だな。
**pってのは どんな意味があるんですか? ポインタですか?
>>476 ポインタは変数のアドレスを格納する。
その変数のアドレスを格納したポインタのアドレスを格納する変数がそれ。
479 :
デフォルトの名無しさん :2006/04/14(金) 19:26:23
>>477 こいつ ぼけ
p が指す先が指す先
**p がポインタかどうかは p の型による
483 :
デフォルトの名無しさん :2006/04/14(金) 19:49:58
int *p = &i; int j = 3**p;
485 :
デフォルトの名無しさん :2006/04/14(金) 19:54:58
>>480 ポインタ p は変数 a のアドレス &a を格納する。 p = &a;
その変数 a のアドレス &a を格納したポインタ p のアドレス &p を格納する変数がそれ **p。 ⇒ 間違い ∵ **p = &p;
レベル低
>>486 工房の俺がついていける時点でレベルが低い
教える側のレベルが低いとは言わんが教え方のレベルは低い。
文句だけは一丁前
回答する側はせめてstrcpy_s, strlen_sくらいは知っておいてもらいたい物だな。
strlen_sって都市伝説じゃね?
strcpy_s の検索結果 約 730 件中 1 - 100 件目 strlen_s の検索結果 約 88 件中 1 - 46 件目
これからは
>>488 が上手く回答してくれるらしいぞ。
見ものだな。
>>493 やったよここの回答者は疲れるんだよな。回答したこと無いけど
>>479 char *********************************************************************************p;
問1. 以下のプログラムがコンパイルエラーとなる理由を述べよ。 #include <stdio.h> int main() { int a = 5; int *p = &a; int c = 125/*p; printf("%d\n", c); return 0; }
で?質問なのかそれは?
501 :
デフォルトの名無しさん :2006/04/14(金) 21:38:21
SYNTAX ERROR. READY
*/ / *p; printf("%d\n", c); return 0; } とすれば大丈夫。
503 :
デフォルトの名無しさん :2006/04/14(金) 21:44:46
>>499 うちのgccでは'unterminated comment'wwwww
506 :
デフォルトの名無しさん :2006/04/14(金) 23:24:55
exeファイルをウィンドウで表示したいんですけど、どうすればいいんですか? 初歩的な質問ですみません
>>506 環境依存です。適切なスレを探してそちらへどうぞ。
int main() { int a,b=1; char str[32]; printf("拡張子の検索を行なうプログラムです\n拡張子は半角で入力してください。\n"); printf("また、面白半分で長い文字を入力するとバグが起きてパソコンが不安定になりますよ\n"); printf("では、入力してください---->\n"); gets(str); switch (str[32]){ case 'ani' : printf("アニメカーソルポインタです。\n"); printf("windowsフォルダの中に入っています\n"); printf("見てみたい人は見てください。インターネットからダウンロードして追加もできますよ\n"); break; case 'exe': printf("これは実行ファイルです\n"); printf("このファイルはwindowsの標準のプログラムで起動できます\n"); printf("しかし、ウィルスである可能性もあるので気をつけてください\n"); break;
続き default: printf(" ゴメン…ない\n"); break; } return 0; } なぜできないのでしょうか?
いろんな意味ですごいのを見てしまった気がするが・・・ とりあえずstr[32]は文字列strの33文字目の文字、とだけ言っておく('A`)
511 :
デフォルトの名無しさん :2006/04/15(土) 00:47:51
>>508-509 とりあえず適当な入門書2冊買ってきて載ってるコードは全部手打ちして実行確認して
もしあれば演習問題全部終わらせてから帰ってきてくれ。
どんなクソな入門書でも、今よりはマシになれる。
つーか、話にならなさ過ぎる。
#include<stdio.h> #include<string.h> int main() { int a,b=1; char s[100]; printf("拡張子の検索を行なうプログラムです\n拡張子は半角で入力してください。\n"); printf("また、面白半分で長い文字を入力するとバグが起きてパソコンが不安定になりますよ\n"); printf("では、入力してください---->\n"); scanf("%s",s); if (strcmp(s,"ani") == 0){ printf("アニメーションカーソルポインタ\n"); } else{ printf("(m´・ω・`)m ゴメン…ない\n"); } return 0; } これじゃだめか?
#include<stdio.h> #include<string.h> char*list[][2] ={ {"ani","アニメカーソルポインタです。\n" "windowsフォルダの中に入っています\n" "見てみたい人は見てください。インターネットからダウンロードして追加もできますよ\n" },{"exe","これは実行ファイルです\n" "このファイルはwindowsの標準のプログラムで起動できます\n" "しかし、ウィルスである可能性もあるので気をつけてください\n" },{NULL,NULL} }; int main(void){ char s[100],*(*p)[2]; printf("%s%s%s%s", "拡張子の検索を行なうプログラムです\n","拡張子は半角で入力してください。\n", "また、面白半分で長い文字を入力するとバグが起きてパソコンが不安定になりますよ\n", "では、入力してください---->\n"); scanf("%99s",s); for(p=list;**p && strcmp(**p,s);++p){} printf("%s\n",p[0][0]?p[0][1]:" ゴメン…ない"); return 0; }
> printf("%s%s%s%s", > "拡張子の検索を行なうプログラムです\n","拡張子は半角で入力してください。\n", > "また、面白半分で長い文字を入力するとバグが起きてパソコンが不安定になりますよ\n", > "では、入力してください---->\n"); この辺阿呆すぎ。 別に printf( "拡張子の検索を行なうプログラムです\n" "拡張子は半角で入力してください。\n" "また、面白半分で長い文字を入力するとバグが起きてパソコンが不安定になりますよ\n" "では、入力してください---->\n"); で充分だろ。 つーか、 printf( "拡張子の検索を行なうプログラムです\n拡張子は半角で入力してください。\n", "また、面白半分で長い文字を入力するとバグが起きてパソコンが不安定になりますよ\n" "では、入力してください---->\n"); でいいよ。
>>515 もうちょいプログラムとデータを分けようぜ。
< },{NULL,NULL}
> },{NULL," ゴメン…ない"}
< printf("%s\n",p[0][0]?p[0][1]:" ゴメン…ない");
> printf("%s\n",(*p)[1]);
519 :
515 :2006/04/15(土) 11:01:09
>>516 ああ、ごめん。その辺は適当に書いてたけど、確かにそのほうが良いな。
まぁその辺の重箱の隅にまで拘るなら、
printfなんて使わずにputsで書いたほうが良いと思うけどな。
>>518 あー確かにそのほうがコードの量も減るし、
データも一箇所に纏められるから優れてるな。ありがと
>>427 こいつあほすぎ。
undefined-behaviorについてまるっきり理解できてないからコード示しただけで反論になると思ってるんだな。
一文字ずつ出力する場合は、printf でなくputcとかputcharの方がいいの?
その方が多少動作が速いかもな
523 :
デフォルトの名無しさん :2006/04/15(土) 14:07:31
>func() { /* ... */ } >は未定義動作を引き起こす危険な定義 ↑ 晒しage
制約違反は未定義動作とは違う、とでも言いたいんだろ 脚注(8)がある以上それは通らんが 「intを返す関数の正しい定義」とか思ってるんだとしたらかなり痛い
526 :
デフォルトの名無しさん :2006/04/15(土) 16:29:45
動けばいいよ
使い捨てならね
528 :
デフォルトの名無しさん :2006/04/15(土) 17:01:37
ちょっとでもかすったのは発端の発言のみか・・・ # やっぱ偶然みたいだな
using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; ってなにさVSとVC++って違うの???
スレが違う。
座布団没収
pがポインタのとき p=++pと p=p++ は何が違うんですか? もう一つ int aとして tmp[++a]と tmp[a++]の違いも教えてください お願いします
534 :
デフォルトの名無しさん :2006/04/15(土) 21:02:48
>>533 基本情報の問題で全社だと正解で後者だと不正解なんですよ
どうしてかなぁと思って
教えてください
>>532 p=p++; ⇔ p=p; p++;
p=++p; ⇔ p++; p=p;
b=tmp[a++]; ⇔ b=tmp[a]; a++; → tmp[a]
b=tmp[++a]; ⇔ a++; b=tmp[a]; → tmp[a+1]
>>537 お前意地悪だな
インクリメントしてから代入されるのか代入してからインクリメントされるかの違いだろ
>>538 ありがとうございました
そういう違いなんですね
542 :
デフォルトの名無しさん :2006/04/15(土) 22:17:35
>>538 こいつ ぼけ
p = p++; は副作用完了点を隔てずに代入と増分があるから
評価順序が未規定となり、それゆえ結果は未定義
質問があるんですが、VC++とC++は違うんでしょうか? いやですね、C++を学習するつもりで本を買ったのですがVC++を買ってました。 C++を学ぶならC++のやつを買いなおした方がいいでしょうか?
>>544 VC++は数あるC++コンパイラの1つだけど、
書籍でVC++と銘打っているものは大体Win APIやMFC, ATL, .Netなどのことを書いてある。
>>545 早速の返信ありがとうございます
でも、VC++の本で勉強しても問題ないんでしょうかね?
前書きに「VC++はC++言語を利用して〜」って書いてあるんですけど、それは
C++をまず理解したうえでVC++をやるといった意味に聞こえるんですが
どうなんでしょう?
よろしくお願いしますm(__)m
言語(C++)が分からんと小説(VC++)は書けないだろと言われました。 Cの知識はちっとだけあるのです。でもC++はからっきしです なのでC++を覚えないとどうしようもないと考えられます
コードが小説で、VC++は鉛筆なんじゃ
VC++を持ってないならその本は推定ゴミ箱行き 持ってるなら、ちょいわきにのけといて、C++の入門書から入ったほうがいいかな まぁその本がどういう本か分からんのでなんとも胃炎が
exitで抜け出しても ちゃんとclassの終了処理ってするの?
552 :
デフォルトの名無しさん :2006/04/16(日) 00:59:23
553 :
デフォルトの名無しさん :2006/04/16(日) 01:00:33
C++とVC++の違いも知らない奴がCの知識なんてあるわけがない
554 :
デフォルトの名無しさん :2006/04/16(日) 01:02:21
いかにも学生だな
>>521 gccなら最適化で同じになるからどっちでもいいよ。
int ***********p; の意味がわかりません。 教えてください。
始めましてです。 Windowsアプリケーションを作ろうと思っています。 詳しい内容は端折りますがやりたいことは 「Buttonコントロールなどをマウスで移動出来るようにしたい」 です。 私の考えでは、Buttonの上でのマウスダウン、アップを受取るのだと思うのですが やり方がわかりません。 ご教授願お願いしますm(__)m] 環境はXP ProでVisualStudio.NET
すみません、明らかに書くとこ間違ってますね 退散します
いってらっしゃいませ、ご主人様
ただいまぁ〜
>>556 確かにそんなコードが書いてあるプログラムは意味がわからんな。
ていうか、そんなにポインタ使ってなにを作るのだ? 12次元配列とかの動的確保?
>>556 > int ***********p;
ポインタのポインタのポインタのポインタのポインタのポインタのポインタのポインタのポインタのポインタのポインタを示す変数
564 :
556 :2006/04/16(日) 03:02:35
うーむ、この時間はレベルが低いのか?
答え:
>int ***********p;
int **********型変数へのポインタ
>>562 二次元配列へのポインタと ポインタへのポインタ の違いを理解してないな?
>>563 べたすぎ
くそ、本人に答えだされた・・・
567 :
デフォルトの名無しさん :2006/04/16(日) 16:16:23
10進数を引数にして2進数を返す関数のつもりなのですが 何を引数にしても0が返されてしまいます。 どこがおかしいでしょうか? ------------------------------- int binary(int x){ int a[10] , i=-1, bin=0; while(x == 0){ i++; a[i]=x%2; x=x/2; } for(; i>=0 ; i--) bin+=a[i]*pow(10,i); return bin; }
>>567 for(i = 31; i >=0; i--){
if( (1 << i ) & input) printf("1");
else printf("0");
}
で変換は出来ると思う
int型を返すのがそもそもの間違い
571 :
567 :2006/04/16(日) 16:27:49
intで保証される値は-32768〜32767だから8桁の整数値が扱えることは保証されない long値を使うべき
573 :
567 :2006/04/16(日) 16:39:56
>>572 わかりやした。
もっと良いアルゴリズムありませんか?
今のは中学んときの教科書レベルだし。
>>573 #include <stdio.h>
void main(void)
{
int input;
int i ,n;
scanf("%d",&input);
for(i = 31; i >=0; i--){
if( (1 << i ) & input) printf("1");
else printf("0");
}
printf('\n');
}
>572 入力はint全般なんだから、最低10^16の整数値が扱えないとだめじゃない? >573 int bit = 0; for(i = 31; i >=0; i--){ if( (1 << i ) & input){ printf("1"); bit = 1; } else if( bit ){ printf("0");} }
>>574 周りの見えないでしゃばり君は黙ってなさい。
>>577 >printf('\n');
ここで使ってんじゃねーの??ゲラ
581 :
577 :2006/04/16(日) 17:07:29
基礎がなってない奴は無理に答えずにROMってれば良いのに。
>>575 うん、ちょうど何となくファイルを二進数コンバートするプログラム書いてたからcharで考えてた。
ぶっちゃけ文字列にするかそのまま出力した方がいいね。
質問ねえのかよ。 ヒキの俺様がズバっと答えてやるよ。
>>587 九九票を出力したいですが、だめです。
どうぞよろしくお願いします。
void main()
{
int a,b;
for(a=1;a<9;a++)
{
for(b=1;b<9;B++)
{
???
}
}
>>587 昨日バスで一緒になってチラチラとこっちを見る可愛い子が、なんと同じバス停で降りてその後は別の方向だけど振り向いたらその子もこっちチラチラと振り向きざま歩いていった女の子のメアドげっとする方法教えてください。
もう1回社会の窓を開けて乗ってみたら。今度は声かけてくれるかもよ? つーか、ここはCのスレなんだから、メアドで我慢してどうする。
誰がうまいこと言えと。
超初心者っす C++ではなくCだけを使ってコンポーネントを使ってトランプゲーム のようなものはWINの環境で可能なんすか?
593 :
デフォルトの名無しさん :2006/04/16(日) 19:26:23
>>592 できる
※ 具体的な方法はスレ違いのため答えられない
可能に決まってる
588 printf("1"); printf("2"); printf("3"); ... printf("81"); でおk
598 :
デフォルトの名無しさん :2006/04/17(月) 12:54:05
>>592 > Cだけを使って
> コンポーネントを使って
この二つの条件は相反する物であり、同時に成り立たない。
よって、どの様な環境でも出来ない。
599 :
デフォルトの名無しさん :2006/04/17(月) 13:09:54
int main(int argc, char *argv[]) { char str[80]; strcpy(str,argv[1]); printf("argc = %d\n", argc); if(argc != 2 || argc == NULL)/* 2個の引数があるか確認 */ { printf("使用方法: <ファイル名> <パスワード入力>\n"); exit(1); } この時ファイル名のみ実行すると問題発生エラーが出るんだけれど、 これを回避するにはどうすればいいのでしょうか。
つまらないネタだな。
601 :
559 :2006/04/17(月) 13:21:27
もうわかった。スマソ。
プロトタイプ宣言ってさ、コンパイル側でそれらしきものを自動でやってくれれば必要ないんじゃね? dosだったらmain関数から、winだったらWinMainから、関数の構成ツリーを作って葉の方からプロトタイプ宣言っぽいのをしてくれればokなんじゃね? あ、でも全体の構成が必ずしもツリーになるわけじゃないし、間接的再帰してたりするからダメか? あれ?でもやっぱりできるんじゃね?あ、できない? というよりさ、そもそもプロトタイプ宣言って本質的には何をするやつなのさ。俺全然わかんないんだけど。
チームで開発してる時とか、 コンパイルする度に、全てのソースが必要になるじゃん
引数を省略したときにうっかりintに解釈されないためさ
呼び出し時にスタックに積む値の調整を解決するのに必要。 各型の実装サイズが異なるとき、 呼び出し側の暗黙のキャストで渡した値のサイズと 呼び出され側の受け取ろうとしている値のサイズとが食い違うと よろしくない sizeof(int) != sizeof(double) な環境で foo(1); /* プロトタイプ宣言無しで foo 呼び出し */ /* foo実装 */ void foo(double a) { .... } だと、実行時にコケルんでないか?
>>605 602が言いたいのは、そこをプロトタイプ宣言無しでも
foo(double(1))と解釈してくれっていう事じゃないの?
607 :
606 :2006/04/17(月) 17:17:18
まちがった。 ×foo(double(1)) ○foo((double)1)
要するに、関数型言語でよくある型推量を使いたいのでは?
609 :
605 :2006/04/17(月) 17:21:00
>>606 602前半については、その通りだろうけど、main 以下の枝葉の全ソースが必要になるね
602後半について書いたつもり
# ところで 同一識別子で、型違い呼び出しは 最近のC規格内である?
int test[5] = {0, 1, 2, 3, 4}; というようまとめて初期化できるのは理解できるのですが int test[5]とした後で 別の所で配列の中身をまとめて代入することってできますか? それともひとつずつ代入していくしかないのでしょうか
初期化はできるが、代入は無理
ま、Javaみたいに全ソース or 全オブジェクトファイルがあれば可能だな 個人的には1ファイル内にあるなら関数宣言無しで勝手に解決して欲しいが... 規格書に「1パスコンパイラでなければならない」なんてどこにも書いてないぞ
ここでCの仕様叩いたり変更の要求したがる奴らはアフォ
Cの仕様が完璧だと思い込んで614みたいな発言する奴の方はバカストロフィー
614はCの仕様が完璧だと思い込んでいると思い込んでいる615がアフォ
人間なんてアフォな生き物なのさ・・・・
俺は完全だがC言語は完全ではないということは定説。
完全=成長の止まったアフォ
人間なんてアフォな生き物→アフォが作った言語→アフォ言語
ということにしたいのですね?:)
そうさ、所詮俺らなんて、言語の不備はいくら叩く事はできても言語すら作れなかったりするのさ。
普通の大学なら言語定義してコンパイラ作ったりとかするんでないの?
で、ビットシフトはいつ使うのさ?
ビットシフトは個人的にはフラグに使ってる。 他にどういった使い道があるの?
>>625 まあ、今はもうやっても意味ないけど (ていうか最適化の
邪魔になりそうなのでこの用途では使わない方がいいと思う
けど) 昔は2で割るとか4で割るとか、2掛けるとか4掛ける
とか、そういう時に普通に計算式を書く代わりに使った。
昔の CPU はそういう小技を使わないと遅かった。
後は本当に純粋にビットシフトしたい時に使えるが、この
必要性ももうあまりないかな。たとえばデバイスドライバを
書くとして、パラレルの I/O から8ビットまとめて入力した
として、それのうちの下から 3 ビット目と 4 ビット目の
状態を見たいとき、 >> で 2 ビットシフトしてから & 3
するとかさ。
>>626 やぱりそれぐらいしか使い道は無いのか・・・。
>>618 俺は童貞だが巧いコードでヌケるということは定説。
>>624 パズルなどの問題解決プログラムでは
例えば盤面をintひとつで表現すると演算効率とポータビリティの面で有利なわけだが、
そういうときに次盤面取得や既知検出などで用いたりする。
基本情報処理に落ちてしまったので、これから3週間でプログラム作るので才能あるか判定してもらうぜ
ないよ
とりあえず完成品を見てからにして下ぱい
>>632 こんなところでそんなこと言っている時点で才能ない。
まぁゴミ溜めに蛆という諺もあることだし、3週間あればなにがしかは作れるもんでしょう。 待ってみましょうや。男子3日で剥けずんば割礼してみよとも言うしね。
え?何つくんの?
636 :
デフォルトの名無しさん :2006/04/18(火) 10:00:44
圧縮作るのか。
ええ。
639 :
250 :2006/04/18(火) 13:05:57
Linuxで時刻の取得ってどうするのでしょう? たとえば、Windowsで言うなら SYSTEMTIME syst; ::GetCurrentTime(&syst); みたいな。
>>639 このスレ的にはLinuxだろうがWindowsだろうが、time()一択。
ミリ秒まで取得する必要があればgettimeofday()だな
>>641 そんな関数標準Cにはありませんが何か。
643 :
デフォルトの名無しさん :2006/04/18(火) 13:32:56
C言語によるH8マイコンのプログラミング わかる?
644 :
640 :2006/04/18(火) 13:33:16
ありがとっ 感謝です。 time_t t; t = time(0); struct tm *val; val = (struct tm *)localtime(&t); if(val != 0) { printf("%d/%d/%d %d:%d:%d", val->tm_year + 1900, val->tm_mon, val->tm_mday, val->tm_hour, val->tm_min, val->tm_sec); } とりあえず、こんな感じでやってみたけど printfのとこで、error ちょっと調べてみます。
>>644 そんな目的でprintf()を使うのはナンセンス。標準関数くらい調べよう。
strftime()を使わずに何をしているんだか...
647 :
640 :2006/04/18(火) 14:18:33
strftime() なんて便利なものがあったのですね。 勉強不足でした。ありがとうございます。 とりあえず、時間表示するだけの結果です。 char szTime[128]; time_t t; struct tm *timetmp; t = time(NULL); timetmp = (struct tm *)localtime(&t); if (timetmp == NULL) { perror("localtime"); } else { if (strftime(szTime, sizeof(szTime), "%H", timetmp) == 0) { perror("strftime"); } else { printf("%s\n", szTime); } } でも、さっきの val->tm_year でエラーが出るのがきになる・・・。 長文失礼。
#define MAX 4 ←以上だとエラー void main() { int j; int *p; p=(int *)malloc(MAX+1); if(p==NULL){ printf("メモリが確保されてません\n"); exit(1); } for(j = 0; j < MAX; j++) { p[j]=rand()%100; printf("%d ",p[j]); }printf("\n"); } これでMAXを4以上に設定すると ポップアップでエラーが出てしまうんです。 どうしてなんでしょう?教えて下さい 「 Debug Erro! Proguram: C:\erogame\Debug\main.exe DAMAGE: after Normal block(#43) at 0x004300B0. (Press Retry to debug the application) [中止(A)] [再試行(R)] [無視(I)] 」
すいません 間違えました free(p)が抜けてました free(p)を入れないと通りましたが 入れると出てしまいます なぜなんでしょうか? ここの場合は最後ですが 途中で開放してはダメなんでしょうか?;
p=(int *)malloc(sizeof(int)*(MAX+1)); かな
>>650 ありがとうございます
通りました(^^@
freeを入れると落ちるからと言う理由は論外だが、最後のfreeは不要と言ってみる。
終了時にOSたんが勝手に開放してくれるからだと思う
最後のfreeが不要なのはOSが面倒を見てくれることが保証されていること場合のみで、 そうでない実行環境が存在するということは過去に何度も出てきているにゃ。
で?そんな糞開発環境が存在するのかね? DOS、Win、Unix、MacなどのOSは問題ない。 組み込み系だとprintfすらも実装されているか怪しい
657 :
デフォルトの名無しさん :2006/04/18(火) 16:58:24
float や double 型の変数のビット構造を2進表示する方法や、それらの論理和、論理積のやり方を知りませんか? int型等だったら出来るのですが、上のような型だとエラーが出たりして簡単にいかないものですので
文字配列にmemcpyでもすれば
>>656 初心者も集まる場所でいうことではないと思う。>free不要
free使わない癖つけて、何回も確保開放する必要のあるプログラム書いたら「なんでエラー」なんてまぬけなことにもなりかねない。
別スレ池
要らんだろ、そんなもん。 要るようなレベルならやり方知らないはずないし。 ポインタ取って整数型へのポインタにキャストしろ。
664 :
デフォルトの名無しさん :2006/04/18(火) 17:28:00
txtファイルのデータが,で区切られてるヤツの読み込みはわかるんだけど 全部tabで区切られてるのってどういう指定すればいいんだかわからない。 あいうえお 1 2 3 4 かきくけこ 上のみたいになってて、 スペースの代わりにtabが入ってるのを読み込んで表示するらしいんだが。
おk \tで出来た
質問内容から察するにおそらくscanf系使うんだろうが あれは空白類文字(\n/\t/\s)を自動で読み飛ばす
データにスペースが入っていると面倒だな... 入ってなければ簡単だが
学校でC言語始めたばかりのものです。 まだどういうときにどの単語を使うなど さっぱりわからないんですが・・ HTMLの要領で覚えたんでいいでしょうか? とにかく不安です。
671 :
デフォルトの名無しさん :2006/04/18(火) 18:05:25
C言語、GNU readline の質問です。 デフォルトで有効になっているカレントディレクトリのファイル名補完機能を無効にし、 コマンドラインからの入力なしの状態でTabキーを押したらa_func b_func func_c と表示させ、 aを入力した状態でTabキーを押したらa_funcと補完させるプログラムを作りたいです。 サンプルが欲しいです。
.
>>669 "^[^\t]"
>>670 教科書嫁。後スレ違い。初心者スレにでも逝け。
>>671 スレ違い。環境依存OKスレかGCCスレかUnixスレにでも逝け。
>>657 その float だか double だかの変数のポインタを unsigned char * か何かに
キャストして先頭から sizeof(その変数) 分だけ進めりゃいいんじゃねえかな。
あるいは long か long long のような同じビット数の型の変数に memcpy()
してからやる。
>>656 そういえば Windows 9x 系はリソースの開放が変ですぐにブルー画面になっていたなあ。
その 9x 系のサポートもついに終わる。めでたしめでたし。
リトルインディアンの場合 #include <stdio.h> int main() { int i; float a; unsigned char *c; unsigned char n; c = (unsigned char*)&a; a = 123.456 for (i=0; i<sizeof(a); i++) printf("%02x",*(c+sizeof(a)-1-i)); } }
すまん、nは忘れてくれ
677 :
デフォルトの名無しさん :2006/04/18(火) 20:45:03
C言語初心者です。「1.5」を表示するプログラムを作れと言われ作ったのですが、 1.5000000と表示されてしまいます。原因はどこにあるのでしょうか? #include <stdio.h> int main(void) { float a; a = 1.5; printf("a=%f\n",a); return 0; }
#include <stdio.h> main(){puts("1.5\n");}
>>677 %f だからだ。
この % と f の間にほにゃらかを入れると先生がほめてくれると思う。
安易に %g を使うと70点だと思う。
printfの仕様を読めばいいじゃない ていうか宿題スレに行けばいいじゃない
宿題スレに書置きしてからここに聞きに来るとは用意周到な奴だ。
printf("%0.1f\n", 1.5f);
683 :
675 :2006/04/18(火) 21:03:45
>>657 結局表示だけだがw
#include <stdio.h>
void bit8tostr(unsigned char n, char s[]) {
int i;
for (i=0; i<8; i++) {
s[i] = '0' + (n
>>7 );
n <<= 1;
}
s[8] = '\0';
}
int main() {
int i; float a; unsigned char *c, n;
char s[9];
c = (unsigned char*)&a;
for (a=1; a<65536; a*=2) { // ここは適当に
printf("%5d: ", (int)a);
for (i=0; i<sizeof(a); i++) {
n = *(c + sizeof(a)-i-1);
bit8tostr(n, s);
printf("%s ", s);
}
puts("");
}
}
684 :
デフォルトの名無しさん :2006/04/18(火) 21:10:01
%g使わなくともprintf("%0.1f\n", 1.5f);でうまくいきました。 ありがとうございます。
人に聞く前に書式ぐらい自分で調べてくらさい ><;
%1000.500f
けちなこといってねえでもっとつけちまえ。 %.10000000000000000f
本でenum型の説明を読んでいて、気になった事があります。 enum型で使用した文字列はprintfで表示できないのでしょうか?
出来ません。デバッグ目的ならこういうマクロ作っておくとたまに便利。 enum{ FOO, BAR, BAZ }; #define ENUM2STR(v) ((v==FOO)?"FOO":v==BAR?"BAR":v==BAZ?"BAZ":"UNKNOWN")
すいません。教えて下さい。 整数を入力すると、九九の段が出るようにしたいんですが 例えば、5と入力すると 5の段:5 10 15 20 25 30 35 40 45 と出すようにしたいです。で #include <stdio.h> int main(void) { int dat; int ans; int i; printf("整数を入力... "); scanf("%d", &dat); printf("%d の段:",dat); for(i = 1; i <=9; i++) { ans = dat * i; printf("%d", ans); } printf("\n"); return 0; } で間違ってるところありますか?
その質問の仕方はないんじゃないの。
>>690 君、凄い。
「よくわからないけどエラーになりました」っつって丸投げする奴はよくいるけど
自分で試しもせず「あってますか?」とか丸投げする奴は初めてだ。
いやほんと、君凄いわ。
>>691 >>692 すいません。
質問の仕方が失礼でしたか…申し訳ございません。
一応、自分でもしてみたんですが、
例えば5を入れると
5の段:51015202530354045
となってしまって…
本のみの知識で同じようにやってるつもりなんですがどうしてもうまくいかなくて・・・
教えてもらえたら本当に助かります。
>>693 printf("%d ", ans);
でいいんじゃない?
>>688 printfデバッグではなく賢いデバッガを使え
>>694 ありがとうございます。なんとか分りました。
dの後ろにスペースってことだったんですね…
本当にありがとうございます。
699 :
デフォルトの名無しさん :2006/04/19(水) 13:09:07
「APIで画面の切り替えはどうやってやればいいでしょうか??」 例えば、認証画面を作って認証画面から確認釦を押した時に 情報表示画面に遷移するとか。。。 自分が考えているのは同じ大きさのWindowsを二つ用意して 片方のWindowsにかぶせて遷移することを考えていますが、 何方かいい方法を教えてくれませんか?
標準CにGUIなどない
>>699 別のCDialogの派生クラスでも作ったら?
703 :
デフォルトの名無しさん :2006/04/19(水) 14:47:18
なんで50分も経ってから同じ事をいうのか
>>699 なんだかよくわからんが、Windowに乗ってるコンポーネント非表示に
するとか削除して新しいのを乗っければいいんじゃないの?
なんでスレ違いの質問に、しかも解らんくせに答えたがるのか
707 :
デフォルトの名無しさん :2006/04/19(水) 20:52:25
数字を文字列としてchar型配列に入れるプログラムを 作りたいんですが、sprintf()等の関数は使わずにつくれますか?
>>707 作れる。
もし作れなかったら、そのsprintf()はどうやって作ってあると思いますか?
itoaなりsprintfと同等の関数作れよ。 "0123456789"[n]で一桁の数値を文字に直せるだろ。
見てて気分の悪くなる書き方→ n["0123456789"]
横からだけど標準関数使わずに出力を書くにはどうすればいいの?
非標準関数を使う
713 :
デフォルトの名無しさん :2006/04/19(水) 22:18:37
あえてアンカーつけないが アセンブラ知らねー香具師ハケーン
708 に対する皮肉でしょ
715 :
あフォの707 :2006/04/19(水) 22:40:24
void my_itoa((long)number,(char *)data){ int i; char d[16];//最大16桁 for(i = 0; data > 0; i++ ){ d[i] = number%10; number = number/10; } for(i=0;i<16;i++){ data[i] = d[15-i]; } } 色々ググってみても関数の中どうなってるかわからないorz
716 :
あフォの707 :2006/04/19(水) 22:42:08
データはlong型じゃなくでdouble型でやりたいんです。 どなたか教えてください(;ω;)
718 :
あフォの707 :2006/04/19(水) 22:48:48
すいません。してません。すいません。 してみます。
longはともかく、doubleは面倒だな。 doubleのフォーマットって決ってたっけ?
あげてました。すいません。
printf("input a:"); scanf("%d", &a); printf("input b:"); scanf("%d", &b); mod2 = a % b; printf("%d % %d = %d\n", a, b, mod2); これ実行すると 50 % %dとかなってしまって 余りの演算子が使えないのですが どうすればいいのでしょうか?
722 :
デフォルトの名無しさん :2006/04/19(水) 23:30:53
>>720 ま、age るとどうなるのか
わからないアフォは sage ても同じだが
mod1 = a * a / b - b; printf("%d * %d / %d - %d = %d\n", a, b, mod1); 余りの演算子を使わない場合はどうすればいいのでしょうか?
>>724 何がしたいのかはっきり書け。
printfで%を表示させたいのなら
>>723 。
%演算子を使わずに剰余を求めたければ、たとえばdiv関数が使える。
726 :
デフォルトの名無しさん :2006/04/19(水) 23:39:24
すみません。一般的な質問で、どこに質問したらよいのかわからな かったので、ここに書かせていただきます。 shell上でプログラムの処理時間をあらかじめ計算するには、どう すればよろしいのでしょうか? time ./programfile をやってみたのですが、これですと実行しながら 計算しているように思うのですが....
>>725 すいません。二つ解らないことがあって一つは
>>723 で解決しました。
もう一つは%演算子を使わずに余りを求める方法です。
関数も使わないで
>>728 それだと思うんですが余りの演算子の答えと一緒にならないんですよ
mod1 = a * a / b - b;
printf("%d * %d / %d - %d = %d\n", a, b, mod1);
どっかおかしいんですかね?
>printf("%d * %d / %d - %d = %d\n", a, b, mod1); %dと変数の数がちがうけど。
while (a >= b) a -= b;
printf("input a:"); scanf("%d", &a); printf("input b:"); scanf("%d", &b); mod1 = a - a / b * b; printf("%d - %d / %d * %d = %d\n", a, b, mod1); コンパイルは通りましたが数が変です・・・
つ printf("%d - %d / %d * %d = %d\n", a, a, b, b, mod1);
736 :
デフォルトの名無しさん :2006/04/20(木) 00:39:03
**ptrを使う用例がいっぱい載っている本を教えてください 自分はこんなことにしか使ってない気がする struct hoge *ptr func(&ptr); func(struct hoge ** ptr){ }
738 :
デフォルトの名無しさん :2006/04/20(木) 01:36:11
int main( int argc,char **argv) int size = argv[1]; としたら、 エラー E2349 mem.c 9: 移植性のないポインタ変換(関数 main ) といわれるのですが、何がいけないのでしょうか? 引数には10などの整数を与えています
それで10が入るとでも思っているのかお前は。
OSはLinuxで、ディレクトリパスだけ取得する簡単な方法はありますか? 例えば、/A/B/a.txt だったら、/A/B と
う、途切れた a.txt に分けたいんですが。
ケツから'\\'検索してそこに'\0'突っ込む
//
>>736 例えばこんなのとか?
// まぁ、色々端折っているので要注意で。
const char ** getTextRows(const char * fileName)
{
if (fileName == NULL) return NULL;
unsigned textLines = getTextLines(fileName);
if (textLines == 0) return NULL;
const char ** rtn = malloc(sizeof(char *) * (textLines + 1));
if (rtn == NULL) return NULL;
FILE * fp = fopen(fileName, "r");
if (fp == NULL) {
free(rtn);
return NULL;
}
char buf[FileBufferLen];
unsigned ic = 0;
while (fgets(buf, sizeof(buf), fp) != NULL) {
rtn[ic++] = strdup(buf);
}
fclose(fp);
rtn[ic++] = NULL;
const char ** tmp = realloc(rtn, sizeof(char *) * ic);
if (tmp) {
rtn = tmp;
}
return rtn;
}
OSはLinuxで
>>742 そんな糞探したって見つからないって。つーか、文盲ですか?
>>741 つ[basename]
まぁ、strrchr(ptr, '/')だろうな。
for(hoge; geho; hugu) のhogeのところで二つの変数を初期化したいのですがそういことはできませんか?
普通にできるよ
>>740 dirname()という関数があるがスレ違い
for(a=0, b=0;
>>746 for (i=0, j=0; i<10; ++i)
751 :
738 :2006/04/20(木) 02:17:47
>>739 数字はいらないんですね・・。
で、数字に変換しようと思い
char , *tmp_p = argv[1];
short int tmp, tmp_up = 0, flag = 0;
for( tmp = *tmp_p; flag == 1;*tmp_p++ ){
if( tmp >= '0' && tmp <= '9'){
tmp_up = tmp + (tmp_up * 10) - 48;
}
if( (tmp = *tmp_p) != 0){
flag = 1;
}
}
のように書いたのですが、うまく動きません
どこが間違っているか指摘していただけないでしょうか?
*tmp_p++
>>751 flagなんて余計な変数を持ち出すからおかしなことになる。
そいつの初期値が0だから、ループに突入できないと言うのが根本原因。
で、直すのならその無駄な変数は無くしてしまえ。
以下列挙。
・forループの最後のtmpへの代入は、tmp_pが更新されていないので無意味。
・forループの終端条件は条件部に直接書く。書けない場合はforループそのものの必然性を疑うべき。
・tmpの更新は条件部に書けば充分。
・forループの更新部でtmp_pの中身を参照してないのだから素直に++tmp_pで充分。
・突然意味不明な48なんて数字(こういうのをマジックナンバーと言う)を持ち出さず、(tmp - '0')とすべき。
・必要がない限り、shortにしないで普通のintを使うべき。
>752 もまえ意地悪だなw 初回 flag == 1 が成り立たないんじゃ?
755 :
738 :2006/04/20(木) 02:56:01
もうわかんない・・・ for( tmp = *tmp_p; *tmp_p != '\0'; tmp = *tmp_p++){ if( tmp >= '0' && tmp <= '9'){ tmp_up = tmp - '0' + tmp_up * 10; } } 何が悪いのか・・
756 :
738 :2006/04/20(木) 03:21:09
ふぅ・・・。 for( tmp = *tmp_p++; *tmp_p != '\0'; tmp = *tmp_p++){ if( tmp >= '0' && tmp <= '9'){ tmp_up = tmp - '0' + tmp_up * 10; } } tmp_up = tmp - '0' + tmp_up * 10; こうやったらできたのですが、forの中に全部入れることってできないですかね?
> tmp = *tmp_p++
>>756 atoi() とか strtol() とか使っちゃいけないわけ?
759 :
七五三 :2006/04/20(木) 09:06:15
>>756 for (tmp_p = 0; (tmp = *tmp_p) != '\0'; ++tmp_p) ...;
って発想はありませんかそうですか。長々と書くだけ無駄でしたね。
760 :
デフォルトの名無しさん :2006/04/20(木) 09:28:09
qsort()に代入する要素数って200以上無理? なんかハングするんだけど・・・
んなわけない。 最小のサンプルコード書いて使い方を正確に理解しろ。
762 :
デフォルトの名無しさん :2006/04/20(木) 09:40:14
763 :
デフォルトの名無しさん :2006/04/20(木) 09:41:31
>>756 何故、sscanf()やstrtol()を使わないのか?と(ry
でもまぁ、
>>756 は代入できると思ってたところから
そこまで行ったんだから上等だろ
確かに。この調子でstrtol()もきちんと使えるようになったら大したもんだと思うよ。
#define DEBUG #ifdef DEBUG printf("test\n"); #else /* DEBGUG */ printf("Production version\n"); #endif /* DEBUG */ のようにして、DEBUGを定義した時だけ 実行されるコードを記述できるという記述を 本で見たのですが、自分の環境BorlandC++5.5コンパイラ でコンパイルすると、「)が必要です」とエラが 実行される文の行で発生します。 回避ないでしょうか?
>>766 前後のコードがないとなんとも言えない。
少なくとも、挙げられてるコードに明らかな問題はなさそう。
768 :
デフォルトの名無しさん :2006/04/20(木) 13:06:55
>>766 > #else /* DEBGUG */
このコメントから想像すると、
その前後の記述に入力ミスがあるんでない?
きっと関数呼び出しの記述中で使おうとしたんだよ。 func( #ifdef DEBUG ... #endif parameter); ってな感じで。
>>767 >>768 >>769 色々なご意見ありがとうございます。
#ifdefの宣言はプログラムの先頭で、#includeなどと一緒に行っています。
main関数にprintf文だけしか含まないプログラムにコピペして実行しても
同じエラーが出ました。また、#define DEBUGを外すとエラーは出ないので、
#ifdefは正常に機能してるようなのですが・・・。
やはり、コンパイラの環境の問題でしょうか。
>>770 基本に立ち返って、エラーの出る最小限のソースを作ってここに貼れ。
あっ、すいません、勘違いしてました。 プログラムの先頭に記述するのが問題だったのですね。 main関数の中で使用すれば問題ありませんでした。 ご教授ありがとうございます。
>>769 パターンか 単文(?用語 よくわからんな) if に使っちゃったとみた
|if (hoge)
| DEBUG
| then-statement;
|else
| DEBUG
| elese-statement;
>>772 俺が
>>766 見て真っ先に思いつき、瞬時に否定した説が
まさか現実のものとは…
あのな、も少し勉強してから来い。
コテ名乗る前にやることが沢山あるはずだ。
>>774 ですね。自分でも、なんでこんな事が分からなかったのか恥ずかしいです。
すいません。
可変個引数をそのまま可変個引数の関数に渡したいのですが、 // 例 int myPrintf(const char * format, ...) { return printf(format, /*ここどうすんの?*/); } ・va_list (とvprintf)を使う ・printf(format, __VA_ARGS__) でマクロとして実装 のどちらかしか方法はないのでしょうか?
>>776 普通に考えて、vprintf()を使うのが無難だと思うが。
#コンパイラ依存の方法もないではないが、このスレ的にはないことになる。
質問ですがCに累乗計算のための演算子が無いのは何か理由があるんですか?
揚足: (整数の) 2のn乗 1/n乗はあるぞ 本論: 記号がたりないようなキブン
CPUにそういう命令が存在しないから。
^はビット演算しだし**はポインタと区別が付きにくいし... # a /*a は?という意見は却下 どうすれば良いと思う?
ローテートシフト演算子が無いのも、また謎
なんで long long int long int short int なのに int intはないんですか?
>>783 Cが作られた当時のCPU(PDC-7だっけ?)にそんな命令が無かっただけじゃないのか?
>>785 う、そうかもしれん。
それぐらいの世代から基本的に変わってないってのもすごいな・・・
>>784 大きい整数変数
小さい整数変数
はいいとして、
整数変数整数変数
は変だろ?
上司が、Cでオブジェクト指向的発想を持ってプログラムを作れ!カプセル化を意識しろ!! っていわれましたが、みさなん何を気をつけていますか?
>>789 そもそもCでオブジェクト指向なんてあったっけ?
>>790 設計法と実装法は別物だと思うが・・・
(簡易)カプセル化は stdio の FILE と f〜 関数群が、それっぽくない?
継承とかやりだすと厄介だな。 素直に C++ なり継承サポートしてる言語使えと。
# 関数へのポインタを構造体メンバに持つ (virtual) のと
# 関数へのポインタのテーブルを別途用意すれば、それなりの実装になるのか?
792 :
776 :2006/04/20(木) 18:55:08
qsortはStrategy パターンを使っていると強弁してみる
cpad以上に使いやすい学習用ツールってあるかい?
795 :
789 :2006/04/20(木) 19:40:47
ようは、オブジェクト「的」発想らしいのです。 どうやらそこまで複雑化しなくても、より、モジュールの独立性を高めるのが目的です。 というのも、現在仕事で組み込み系をやっております。 そして、ユーザごとに機能を変更したり、メカにあわせてプログラムを変更する際に いかに、簡単に、かつ他人が見てもわかりやすい構造にしたいらしいのです。 正直組み込み系以外やっていないので他のプロジェクトがどのような 取り組みをしてるのかわかりませんが、言語はCでお願いします。
FILEみたいに、構造体へのポインタをオブジェクトのインスタンス(的な扱い)として、 各処理はポインタを関数に渡して行う&構造体の中身は直接参照しないこと、 とするのは良く使われてる方法だと思います。
FILEを処理する連中は、みんななるべくfpを最後に取りたいなー とか思ってやがってなんだかむかつく。fprintfは先頭に置くしかないんだから、 全員先頭で統一しろよ。
>>795 とりあえずモジュール分割でいいんじゃないか?
モジュールを差し替え可能なように設計するのは当然として。
先に入力した値が後に入力された値の何%かを表示する計算式はどうやればいいんですか?
float saki; float ato; saki = /* 入力 */ ato = /* 入力 */ printf("%f",saki/ato*100));
今日初めてscanf使いました。 自分でキーボード入力するって知らなくてコンパイルしても 何も表示されなかったので一人でパニくってました(^ω^) C言語楽しいですね。
でも果てしなすぎて仕事に使えるレベルにするのは大変だなぁっと素人ながらに思った
804 :
デフォルトの名無しさん :2006/04/20(木) 22:23:31
文字列として整数と演算子を入力して、atoiで囲むと演算子まで整数型になってしまいますよね・・ 整数だけ整数型に変換したいのですが、どうすればいいのでしょうか?
805 :
デフォルトの名無しさん :2006/04/20(木) 22:27:09
>>804 演算子?
atoi("-10") みたいのを言ってるの?
806 :
デフォルトの名無しさん :2006/04/20(木) 22:36:55
>>805 逆ポーランド記法で電卓をつくっているのですが
文字列で例えば"12+="と入力して"12"だけ整数型に変換したいんです。
>>806 atoi()はたしか、そういう動作だったような。
strtolなどを使えば"12+="から数値型の12と元の文字列のうち"+="の部分(を指すポインタ)を得られる。
あらかじめ整数の範囲をisdigitかなんかを使って調査して 別領域にコピーしてから、atoiに渡すとか。
まぁ、sscanf()かstrtol()を使えってこったな。
こんどプログラミングの会社のアルバイトを受けて見ようと思うのですが 自分はC言語を少し触ったくらいで、あまりかけません 理解力が大事ということで、面接でちょっとしたコードを書く試験があるらしいのですが 自分がどれくらいできるかわからないので ちょっとでも理解できてるかどうかを見るような問題ってありませんかね?
その会社がどの程度求めているのかわからんとなんとも言えないが・・・ んじゃとりあえず 「HTMLファイルを読み込んで、各タグの出現頻度をカウントしろ」 みたいなのはどうでつか 俺もすぐには作れねえケドwwwwwwwwwww
やねう企画の入社試験でも解いてみたら?ぐーぐればすぐ見つかるし。
Joel on Softwareって本に載ってた、著者が面接でよく出す問題。 ・文字列をその場で逆にする ・連結リストを逆にする ・バイトデータの中でビットの数を数える ・二分検索 ・文字列の中で同じ文字が一番長く続くところを見つける ・atoi ・itoa 注意点 10分以上かかる問題をださない。手書きでエディタやコンパイラを使わずに 書くのは難しいから、その点は考慮すると伝えて、回答者を安心させる。
>>814 やねうのは確か本人が、大学等で情報科学の教育を受けた人なら簡単な問題だといってたから
裏を返せばそうじゃない人には結構歯ごたえあると思われ
>>815 文字列をその場で逆にって、テンポラリ変数使わずにってこと?
それだったらXOR-swapの出番だがw
バッファ全体をコピーせずにって事だろ
「その場」が何を意味する言葉なのかによって答えは変わる。 char s[] = "abc"; int i; for (i = strlen(s) - 1; i >= 0; --i) putchar(s[i]); こんなの作られたら正解にするかどうか悩まないか?w
下らないから黙ってていいよ
821 :
デフォルトの名無しさん :2006/04/21(金) 11:40:52
sprintfで、doubleの値を、 ・少数点以下がなければ少数点自体なし ・少数点以下があれば第三位で四捨五入して二位まで とやろうとしています。 %.3fで、例えば0.1235は0.124にすることはできたのですが、9500だと9500.000になってしまいます。 9500だと9500、0.1235だと0.124にしたいのですが、sprintfの書式指定だけじゃ無理ですか?
>>821 "%.*f"でフィールド幅を指定することが出来る
四捨五入はprintf系の書式指定にはない。
少し工夫が必要だな
824 :
821 :2006/04/21(金) 12:09:11
0.1235が0.124になってたのはたまたまだったんですね。 型指定だけでできないのが分かったので、素直に分岐して処理することにします。
>>823 無知を晒さなくてもいいよ。
つーか、>821に四捨五入されている様子が書かれているのだから文盲かも知らんが。
>>821 両方を満たす書式指定はないだろうな。
そもそも、「小数点以下がない」ことの意味は判っているのかな?
例えば9500.0000000001はどうするんだ?
それとその例だと小数点以下3桁表示しているように見えるぞ。
小数点以下3桁と仮定して、こんな感じかな。
char buf[20];
sprintf(buf, "%.3f", value);
if (strcmp(strchr(buf, '.'), ".000") == 0) {strchr(buf, '.')[0] = '\0';
/* 但し、valueの値域には十分注意すること */
826 :
825 :2006/04/21(金) 12:17:23
あ、言葉が足りてない。 小数点以下3桁で、「小数点以下がない」を四捨五入した結果が.000と仮定してこんな感じかな。 に訂正。
827 :
デフォルトの名無しさん :2006/04/21(金) 12:40:52
>>825 とりあえず、最後の「}」位は省略せずに書こうよ
828 :
825 :2006/04/21(金) 12:57:32
うぁはは、途中から1行野郎で書こうと気が変わって忘れてた。
%gでいけないっけ?
831 :
825 :2006/04/21(金) 13:54:22
>>830 %gでどうやって小数点以下3桁にするのかね。
>>831 sprintf(s, "%g", (int)(d * 1000 + 0.5) / 1000.0);
こんな感じ?
%.3gでいけねえか? っておもったら1.234のときは1.23になっちまうのな(´Д`)
834 :
825 :2006/04/21(金) 14:27:34
>>833 %.3gの3は有効桁数なのだから当然。
例えば9876.54を食わせたら9.88e+03になる。
>>832 例えば123.5は123.500にならないのだけど。
長いな…。でもこれでいいはず。 x = round(x * 1000.0); sprintf(buf, (x == 0.0 || fmod(x, 1000.0) != 0.0) ? "%g" : "%.3f", x / 1000.0);
わー。間違えた。 すまん。脳内で変換してくれ。
837 :
デフォルトの名無しさん :2006/04/21(金) 23:02:55
昨日無料コンパイラをインストールして、 ソースコードを作成してコンパイルしたら uneble to open include file 'stdio.h' ってエラーが出たんだがよくわからん。 stdio.hが開けないってどういうこと?
>>837 インストール?
どうせ、ただファイルを展開しただけだろ。
839 :
保守 :2006/04/21(金) 23:11:11
840 :
デフォルトの名無しさん :2006/04/21(金) 23:14:48
readme.txt を読んでいないに1000ペリカ
841 :
デフォルトの名無しさん :2006/04/21(金) 23:18:23
製品1: 製品2: 製品3: ってやりたいんですけど 製品1 製品1 製品1ってなるのはどうしてですか? for(i=0; i<1; i++) for(k=0; k<3; k++) { printf("製品%2d:",i+1); scanf("%d",&ma[i][k]); }
842 :
デフォルトの名無しさん :2006/04/21(金) 23:19:21
>>838 いや、ちゃんと本読んで手順にそってインストールしたんだが
844 :
デフォルトの名無しさん :2006/04/21(金) 23:22:58
>>843 borland C++ Compiler 5.5です
845 :
デフォルトの名無しさん :2006/04/21(金) 23:23:50
>>844 ビンゴか・・・ >readme.txt
846 :
841 :2006/04/21(金) 23:24:02
すみません板違いでした。 宿題スレ行ってきます
847 :
デフォルトの名無しさん :2006/04/21(金) 23:29:12
>>845 ごめんなさい。readme.txtって何ですか?
848 :
デフォルトの名無しさん :2006/04/21(金) 23:30:18
インストール先のフォルダん中がどうなったかくらい見ろよ
849 :
デフォルトの名無しさん :2006/04/21(金) 23:38:12
マイドキュメントにインストールしたんですが、 いま見たが良く分かりません。 具体的にはどうすればいいんですか?
852 :
デフォルトの名無しさん :2006/04/22(土) 00:25:22
@echo off cd > BCC_home.dat copy BCC.set+BCC_home.dat BCC_start.bat call BCC_start.bat C:\borland\bcc55の直下に bcc.batとbcc.setを作成し、 bcc.batに set BCC_LIB=%BCC_HOME%\bin set BCC_INC=%BCC_HOME%\include set BCC_TMP=%BCC_HOME% set path=%PATH%;%BCC_HOME%\bin; cmd.exe del BCC_start.bat del BCC_home.dat を、記述しbcc.setに @echo off set BCC_HOME= を記述。 そして、bcc.batから起動するといいよ 注意: @echo off set BCC_HOME= の際に、=の後ろはスペースも改行もつけてはだめ
もっと懇切丁寧に教えてあげないとできないと思うよ
ぐぐれ
カレー
スレ違いなのでとっとと(・∀・)帰れ!
859 :
デフォルトの名無しさん :2006/04/22(土) 14:20:25
C言語初心者で今本読んで勉強してるんですが、何度読んでも関数がよく理解できません 特に戻り値が良くわからいです。 本には”関数の呼び出し元に返す値”って説明だったんですが、何でそんな事が必要なんでしょうか?
>>859 例えば2つの引数を受け取って、その和を計算する関数があったとする
もし返値が無かったら、その和は関数終了と共に破棄される
sum(int a, int b){ return a + b; } c = sum(a, b);
>>859 それは関数の使用目的を聞いてるみたいな質問だな。
簡単に言えば、
p=func();
というのがあるとすると関数func()の中のreturnされた値がpに代入されるんだよ。
数学で関数とかつかうだろ? sinとかcosといったものも返り値を使って値を得られたらすごく便利だろ
きっと
>>859 は引数で与えたポインタで全ての結果を返すんだよ。
>>865 何ですかその糞仕様は
ふざけないでください><
プログラム教えた時、 戻り値が分からんと言われた事は俺もあるな。 数学とか考えたら、 むしろ戻り値がない方に違和感を感じて欲しいもんだが。
>>1 にも FAQ がリンクされてるし、
FAQ にある質問も「
>>1 くらい嫁」と言われるくらいなんだから
それ以前のレベルにある
>>859 にはお引取り願っても構わない気がするんだが。
#include <stdio.h> /* f(x) = x + 2 */ int f(int x) { return x + 2; } int main() { int x; for(x = 0; x < 10; ++x) { printf("x = %d の時 f(x) = %dn", x, f(x)); } return 0; }
870 :
デフォルトの名無しさん :2006/04/22(土) 15:25:39
誰か教えてください、コマンドラインからファイルをダンプするソースを書いたのですが 二つ目以降のファイル内容がひょうじされず、空文字だけが続いて表示されてるみたい なんですが、どこがおかしいか教えてください。 #include <stdio.h> #include <ctype.h> #include <stdlib.h> #define BUF_SIZE 16/*一回に読み込むバイト数*/ int main(int argc, char* argv[]) {FILE *fp;int count = 1;unsigned char buf[BUF_SIZE];unsigned char c;int len;int i;len = BUF_SIZE; while(count < argc){if((fp = fopen(argv[count],"rb")) == NULL){ fprintf(stderr,"%sが開けない",argv[count]);exit(1);} while(len == BUF_SIZE){ len = fread(buf,1,BUF_SIZE,fp); for(i = 0; i < len;i++){printf("%02x ",buf[i]);} while(i < BUF_SIZE){ printf("-- "); i++; } for(i=0; i<len; i++){ c = buf[i]; if(isspace(c)) c = ' '; putchar(c); } putchar('\n'); } putchar('\n'); fclose(fp); count++; } return 0; }
>>870 ある変数が再初期化されていない所為で、二つ目のファイル以降の処理が巧く動けない。
→ファイル名を受け取りダンプする処理を関数に纏めて、main()ではその関数を順に呼ぶだけにするといいと思う。
ファイルの入出力を頻繁に行うので、関数定義したのですが エラー E2293 file_open.c 12: ) が必要 が出ます、Borland エラー E2293ググッテ見ましたが、分かりませんでした お助け(;^ω^) /* ファイル入出力 */ /* file_poファイルポインタ取得 */ /* file_nameファイル名 */ /* modeファイルオープンモード */ void func(char[] file_po, char[] file_name, char[] mode) { FILE *file_po;/* ファイルポインタの宣言 */ if ((file_po = fopen(file_name, mode)) == NULL) { printf("file open error!!\n"); exit(1);/* エラーの場合は通常、異常終了する */ return 0; } } int main(void) { char s[256]; char str_array[256][256]; /* ファイルの読み込み */ strcpy(file_po, "fp"); strcpy(file_name, "foo.txt"); strcpy(mode, "r"); func(file_po, file_name, mode); }
intで定義して値を返さずvoidで定義して0を返すか。 しかしそんな細かなことはどうでもよくなってくるコードだなw
これは何と言うプログラム言語なのか教えていただきたいですね
876 :
872 :2006/04/22(土) 16:54:46
そう言わずに教えてヽ( ゚д゚)ノクレヨ
funcの戻り値がvoidと定義されているのに、return 0;というふうに値を返すコードになっている さらにみんなに馬鹿にされまくってるほど致命的なのは strcpy(file_po, "fp"); file_po = fopen(file_name, mode)) この部分 普通、fpという名前は FILE *fp; fp = fopen("abcde.txt", "r"); という例でつかわれる fopenの引数は問題ないよ、たぶん
どういう脳の構造をしていればそんなプログラムが組めるのか果てしなく謎だぞ もしくはすさまじい嘘教え込まれてるとか
>>876 ※func()内
・文法上のエラー
FILEが未定義
char[]なんて表記はない
file_poが名前の重複
・文法上の警告
exit()が未宣言
void型関数で値を返している
・論理上の問題点
FILE*は適切に呼び出し元に引き渡さないといけない
main()以外でexit()するのはお勧めできない
※main()内
・文法上のエラー
file_poが未定義
file_nameが未定義
modeが未定義
・文法上の警告
strcpy()が未宣言
sが未使用
str_arrayが未使用
・論理上の問題点
"fp"なんて文字列を扱う必要があるようには見えない。
変数の宣言の仕方、関数の呼び出し方がまるで判っていない
※結論
最低限の勉強すらする気がないならプログラミングなんざやめてしまえ。
やる気があるなら、せめて初心者以下向けのスレがあるからそこにでも。
つーか、教えてくれなどと烏滸がましい事が言えるようなレベルじゃないな。
>>876 > ファイルの入出力を頻繁に行うので、関数定義したのですが
ファイル操作の方法と関数定義をを知ったので興味本位でファイルオープン用関数を作った
が正解じゃ無いの?
少なくとも変数や配列、ポインタをまともに学んだとは思えない。
881 :
870 :2006/04/22(土) 18:18:59
>>871 さん
おっしゃるとおり、別関数にしたら出来ました。
試しに、ws2_32.dllをダンプして、何かいてあるか見れるかなと思ったけど
まぁ、無理でした。ビープ音とかなってましたし。
ユニコードとANSI文字で書いたファイル二つ比較したら
半角英字がa b c dってなってた。
ところで、教えていただきたいんですが、どの変数が初期化されてなかった
んでしょう。
出来れば教えていただきたいです。
質問ですがスタックってメモリの上位番地の方に伸びていくんですか?それとも下位番地の方に伸びていくんですか?
>>882 それに興味を持つのは大変結構なことだが、一番重要な事は、
それがどちらの場合であったとしても対応できるような
プログラミングを常日頃から行うように心がけること。
>>881 あ・ま・え・ん・な
力試しの積もりで自分で考えて味噌。
それと、iscntrl()もチェックして代替文字に置き換えたほうがいいよ。
そうすればピーピー鳴らんで済むし。
バイナリデータをテキスト変換したり戻したりする方法を 説明しているサイトってありますか? よくある偽装ツールみたいなものなんですけど。
return -1; ってどういう意味ですか?
>>886 ソフトの質問なら鼬害。
偽装方法の質問ならお門違い。
変換方法の質問ならスレ違い。
アルゴリズムっぽかったですね。 失礼しました。
>>886 ついでに、テキストデータもバイナリな訳だが
つまり、テキスト⊂バイナリということ。
>>893 つまり何を聞きたいんだ? 関数の戻り値が何か分からないのか?
>>893 どういう意味かわから無いってことは、
return 0;は正常終了だけの意味しかないと思ってるでしょ。
2の補数で表現すると(11111111)2 つまり8個の条件のうちの8個を満たしている。 何もエラーがなく完璧な処理をしたという意味の戻り値です。
>>897 でもそれは関数mainにおいてであって、ほかの関数が必ずしもそうとは限らない
>>898 関数main()においても、8ビット値が返される訳ではない。
>>897 つーか、くだらないネタ書くなや。
900 :
デフォルトの名無しさん :2006/04/22(土) 21:51:57
main の返却値は本質的に処理系依存
>>900 本当に処理系依存だったら、
main の中で呼んだ main の戻り値も
処理系依存になってしまうと思うのだが?
>883 >それに興味を持つのは大変結構なことだが、一番重要な事は、 >それがどちらの場合であったとしても対応できるような >プログラミングを常日頃から行うように心がけること。 何を意識すればいいのですか? ようはスタックをあまり使わないようなプログラムを作ること? あと、スタックって普通初期設定で スタックエンドポインタをセットし、上に積み上げるイメージがあるのだが・・・ ハードによって異なるの?
Cって変数名に_Under barって使えなかったんだね(゚∀゚)アヒャ
>何を意識すればいいのですか? スタックであることを意識しないプログラムを作ること。 auto の変数が、本当にスタックに詰まれるかどうかは コンパイラ次第。 >ハードによって異なるの? 勿論。 そもそもハードウエアスタックのないコンピュータだって ありうる。
905 :
デフォルトの名無しさん :2006/04/22(土) 22:14:31
>>901 さあ、わからんね
main の再帰なんて遊び以外でやったことないんで
センセイならご経験がおありのようで
>>901 ならない。処理系依存なのは、何を返すべきかという点。
>>901 それを考慮して、というわけでは絶対にないが、ちなみにC++ではmainをプログラムから呼ぶことはできない。
スタックマシンならぬキューマシンってのもあるしな。
909 :
881 :2006/04/22(土) 23:44:43
>>884 甘えてました、兄貴。
ばっちし、わかったす。
変数lenがfreadの戻り値のままでした。
910 :
871 :2006/04/23(日) 00:44:14
どうでもいいけど私ゃ女だ。
じゃあ、姐さんだな
C言語の規格(C99)では、ローカル変数の定義は、関数の先頭でしなければならないのでしょうか?
913 :
881 :2006/04/23(日) 05:51:20
>>912 ブロックで囲めばどこでもいけるはず。
ただ、スコープはやはりブロック内だけ。
んでは、ブロックの先頭のみ、ということですね ありがとうございました
ふと気になったんだけど、例えば int a; って、変数の定義っていうの? 変数の宣言だと思ってた あれ? extern int a; みたいなのを宣言っていうのかな?
C言語で、ディレクトリ内ファイル名をすべて取得したいのですが そんな関数は準備されていないのでしょうか?(MS DOSのdirコマンドみたいなものです)
>>912 C99ならブロックの先頭でなくても定義できる。
ブロック先頭限定はそれ以前のCだな。
>>916 標準Cにはない。POSIXにはあるから、「比較的一般的な方法」というのは存在する。
919 :
デフォルトの名無しさん :2006/04/23(日) 10:32:31
>>915 書いた位置による
ここは関数の外に書いた場合をきちんと説明できないアフォが多そうだが
関数の外に書こうが中に書こうが定義兼宣言。
921 :
デフォルトの名無しさん :2006/04/23(日) 10:54:33
さっそくアフォハケーン
まず定義とはなにかを定義してからだな。
>>919 >>921 おまえが阿保。
ISO/IEC 9899, 6.7-5
A definition of an identifier is a declaration for that identifier that:
- for an object, causes storage to be reserved for that object;
- ...
記憶容量が割り当てられるようなオブジェクトの declaration は definition。
特に関数の外に書いた場合
ISO/IEC 9899, 6.9
An external definition is an external declaration that is also a
definition of a function (other than an inline definition) or an object.
...
オブジェクトの外部での declaration は外部での definition。
924 :
デフォルトの名無しさん :2006/04/23(日) 13:07:16
見てるとこ違うし # 阿呆じゃないらしいな、この阿呆が言ってるのは
926 :
デフォルトの名無しさん :2006/04/23(日) 13:23:04
教えてやんない もともと無料サービスする筋合いないし あまつさえ下劣な言葉で侮辱した者にお情けなどありえない
毎日がゴールデンウィーク
>>926 指摘できないのでムキになっておりますw
929 :
デフォルトの名無しさん :2006/04/23(日) 13:28:11
煽っても無駄 そのままアフォやってろ
なんで質問スレで、返答するかしないかでもめてるんだ・・・・?w
低能だからだろ?www
お前らもめるような精神的余裕があって羨ましいよ。
とりあえず 宣言 ⊃ 定義 つまり、"定義"は、定義であり宣言であるが "宣言"は、定義であるとは限らない という感じでよろしいですか?
>>933 一般の文脈ではそのとおり。
宣言であって定義でない代表的な例は typedef 。
・データの取り出し元は単純な関数。 簡略した例とすれば、GetData(int id)みたいな関数で、idだけが変化する。 ・データの格納先は、ネストの深い構造体。 格納するメンバの階層も名前も型も、てんでバラバラ。 ・項目数は大量(1000の桁) この条件で、取り出し元から格納先へのデータの移動を、 簡潔に書く方法ないですかね? 取り出しの方は定型的なので、idのデータだけ用意してループさせる 簡潔な処理に出来るけど、格納先がどうにも・・・・ 構造体の各メンバのアドレスをデータとして持って、そこに格納する事も考えたけど、 型の違いの吸収が、かなり胡散臭くなってしまう。 構造体の全メンバに合わせてプログラム書くのも嫌だし、仮に 『格納プログラムを書くプログラム』を作って自動生成するにしても、 量がしゃれにならないし・・・・ かなり迷っています。
追記 >構造体の各メンバのアドレスをデータとして持って、そこに格納する事も考えたけど、 と書くとおかしいね。 構造体の各メンバの、先頭からのアドレスオフセットをデータとして持って、 各メンバのアドレスを算出して格納する事も考えたけど、 とするべきですね。
1000の桁って・・・1つ1バイトだとしても10^289テラバイトなんだが(゚д゚;)
すまん、すさまじくボケた なぜか2^1000を1024^3で割ってたorz
プログラマになるために基本情報とかやっておいたほうがいいんですか?
いい
イイッ…基本情報イイイッ…
こういう場合にerrnoの値は信用できますか? 信用できない場合エラーの正確な理由をみつけるには 最後にまとめずfprintfなどのエラーを毎回チェック するしかないんでしょうか FILE *f; f = fopen(filename, "r"); ... ... if (ferorr(fp)) { // ここでerrnoの値は信用できる? } fclose(f);
信用できる
errnoの値は信用できるが、そのコードだけではエラーの検出が保証されない。
その直前にclearerr(fp)があるかもしれない。
fopenはferrorでは検出できないんだっけ??
そもそもfとfpは違う変数かもしれない
949 :
デフォルトの名無しさん :2006/04/23(日) 18:09:47
文字列の1部分だけ整数型にしたいんですが a = atoi(str[i])なんてことはできないですよね・・・ どうすればいいでしょうか?
>>949 普通にa = atoi(&str[i]);でできるだろ
>>949 atoi()でできない(≒数字を切り出す必要がある)ならsscanf()を使えばいい。
>>946 直前とは"..."と省略した部分に自分でclearerr()を
書いた場合ということでしょうか。
それとも既にエラーになったFILEポインタに対して
fprintf()やfputc()を呼ぶと、clearerr()される場合
があるということでしょうか。
アスキーファイルからの読込み処理を構造体に代入することは出来ますか? struct foo[4] { char hoge[2]; char hoge_1[2]; char hoge_3; }; こんな感じで、変数を持ちたいのですが?
できますが。
アライメントの問題はどうなんだろう。 charだと隙間はできない?
横着しなけりゃいいじゃん。
よくわからんがfread()の事を言ってるんだろうか
みなさんどうもです fread関数ってあったんですね(;^ω^) てっきり、読込む場合は、読込むファイルをバイナリモードで開いて、 getc関数で一文字づつ読込むものかと思っていて、危うく変な質問するところでした
実数を2進数で表せますか?
963 :
デフォルトの名無しさん :2006/04/24(月) 00:52:15
虚数を2進数で表すにはどうしたらいいのでしょうか?
>>964 実部・虚部を持つのは複素数。
n=a+biに於いてa=0かつb≠0のときnを虚数と言う。
虚数って二進数じゃ表しようがないんじゃまいか。
プログラマが虚数と実数を分けて考えるしかないだろうな。
本当に実数を表現したいんなら、分数として考えるべきじゃないの?だめ?
世の中には分数では表現できない数もあるんです・・・
>>967 君は有理数、無理数を理解してないだろ?
あ、有理数が表現できるだけだったか・・・ 死にたいorz
ポインタ機能があるのはC言語だけですか?
Javaにだってポインタはあるよ
>>965 >虚数って二進数じゃ表しようがないんじゃまいか。
十進で表せて二進で表せないわけないだろw
>>971 C, C++, Pascal, PL/M
およびそれらの派生
>>952 ていうか errno って色々な処理で書き換えられる可能性があるからな。
処理の直後以外で検査しても意味がないと思うぞ。
たとえばこんなのとか。
if ((fp = fopen("xxx","w")) == NULL) {
// ここでは errno は変わってないが、
printf("abc\n");
// ここではもう errno が変わっている。(write()を使うため)
}
>>976 >十進で表せて二進で表せないわけないだろw
0.1
>>979 それができないとしたら浮動小数点演算はどうやって実現していると思っているんだ?
浮動小数点では0.1を表現できないよ 「浮動小数点 誤差」で検索してみ?
>>980 float型の0.1を100回くらい足してみれ
「正確には」表現できない、だな 128ビットの複素数型を定義して、構造は64ビットずつ実部と虚部っつーアホなこと思いついたけど 普通に2つに分けたほうが絶対にいいよな・・・w
つ[C99] double _Complex 型 double _Imaginary 型
// 数値を読み込む // printf("数をいくつ入力しますか?"); scanf("%d",&count); for(a=0;a<count;a++) scanf("%d",&item[a]); // count数に達するまで配列[a]に数値が格納される // // バブルソートを使用して数値を整列させる // for(a=1;a<count;++a) ←ここから for(b=count-1;b>=a;--b){ // 隣接する要素を比較する // if(item[b-1]>item[b]){ // 要素を交換する // t=item[b-1]; item[b-1]=item[b]; item[b]=t; ←ここまで } } // 整列後のリストを表示する // for(t=0;t<count;t++) printf("%d",item[t]); return 0; }
986 :
985 :2006/04/24(月) 15:32:36
横から割って入ってすいません。 1次元配列のソートに関するところで、バブルソートの意味がわからないのですが・・ ごめんなさい丸投げで。 要素を[a]から[t]に変換して順序を揃える手順の内容がまったくわかりません。 ていうか b って何のための(何をしている)関数なのでしょうか。 たぶんCの基礎的な知識が欠落していると思うのですが、 どなたか教えていただけないでしょうか。 どうか、お願いします
C以前にアルゴリズムを解析しようとする意欲が欠けてる。 ソート途中のリストを表示させて何やってるのか考えろ。
>>986 トランプでも使ってやってみろよ。
C以前の問題じゃないのか。
>>981 誤差の話か。いやあ、話の流れとしてさ…。
まあいいか。
浮動小数点数の内部表現で仮数部が BCD なフォーマットってあるのかな?
聞いたことないが作ろうと思えば作れるな。
992 :
985 :2006/04/24(月) 16:48:04
>>990 あるよ。「汎用性を持たせようとしたバイナリデータ」という今となっては
果てしなく存在意義が薄いデータ用に定義されていた。
995 :
985 :2006/04/24(月) 17:44:28
たびたびごめん。 要素を比較して前の要素の方が大きかったら要素を交換する、 ここまでは理解できた。 ただ for(b=count-1;b>=a;--b) この一行がわかりません。 初期設定部がcount-1で条件判定部がb>=aでデクリメントってどういう、 ていうか何をしている式なんでしょうか。
996 :
デフォルトの名無しさん :2006/04/24(月) 17:50:37
頭悪いあげ
>>995 You! C言語投げ捨てちゃいなYo!
もうすぐ1000
C1000タケダ
1000ゲット
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。