1 :
デフォルトの名無しさん :
2012/11/17(土) 19:35:38.95
2 :
デフォルトの名無しさん :2012/11/17(土) 19:36:12.95
< `∀´> ニダー
3 :
デフォルトの名無しさん :2012/11/17(土) 19:36:45.88
/* NOTREACHED */
4 :
デフォルトの名無しさん :2012/11/17(土) 19:37:19.37
/* FALLTHROUGH */
5 :
デフォルトの名無しさん :2012/11/17(土) 19:37:50.94
ここまでテンプレ
>>
http://toro.2ch.net/test/read.cgi/tech/1350461655/989 前スレの変数定義を含むヘッダファイルのincludeだけど、ヘッダの内容を変更してもいいならこれで通るんじゃない?
@DEV.hの内容を変更して上書きするプログラムを作成、DEV.h更新毎に実行する。処理内容は、
int data[] = {0, 1, 2};
みたいな行を、以下に展開する(#if追加、externの分岐)。
#ifndef DEV_H_INCLUDED
int data[] = {0, 1, 2};
#else
extern int data[];
#endif
AA〜C.cのいずれか1つ
#include "DEV.h"
Bそれ以外
#define DEV_H_INCLUDED
#include "DEV.h"
>>6 毎度毎度やってらんねって話だからどうだろう
ヘッダいじっていいなら削除すればいいだろ
そりゃヘッダ直して良いならなんでもありだろ ビルドスクリプトに組み込むもよし
10 :
6 :2012/11/17(土) 20:33:43.63
>>7-8 いやさ、これだと差分探してBにもCにもコピペするっていう手間は省けるじゃん。
DEV.hが更新されたら置換exeをダブルクリックするだけよくて、A〜Cが毎回の変更されることもないし。
ヘッダ内での定義を削除するだけだと、ヘッダ内の変数名はそのままdataで初期値がこっそり変更されてた場合、
A〜Cのいずれかに変更後のdataの定義を反映させないといけなくなるし見落とすかもだし。
>>9 989!どうなんやコラ!! 変更してもいい感じですか?
正しい対応は前スレの921 ↓とても邪道な対応法(ネタ) #ifdef DEFINE_DATA static int data_[]; #define data *data = data_; static int data_ #else #define data *data; static int data_ #endif #include "DEV.h" #undef data Qzはレス禁止。再利用も禁止。アイデアの盗用禁止。
× 正しい対応は前スレの921 ● 正しい対応は前スレの991
13 :
デフォルトの名無しさん :2012/11/17(土) 21:37:46.81
C言語でプリコンパイルチューナーを作っているんですが ()の付け忘れとかに;が付け忘れていたら自動的に付けてくれるように したいのですがどうすればいいでしょうか? for()と printf()の場合 for()の後ろには;はつけないですがprintf()の後ろには;を付けます。
hogehoge() + 1 みたいな数式で発狂しそうだな。
15 :
989 :2012/11/17(土) 21:40:16.19
皆様アドバイスありがとうございます。 DEV.hの修正は問題ありませんが、 頻繁に変更されのるのでその都度、DEV.hに修正を加えるのではあれば、 コピペが面倒という目的からずれてしまうので・・・ 990様のアドバイス通り、ラッパを作成して一つのファイルのみしか インクルードしない様に修正したいと思います。 メーカに文句も言いますがいつ修正されるか分かりませんので。 ありがとうございました。
16 :
デフォルトの名無しさん :2012/11/17(土) 21:41:09.23
>>14 ツールとして無いですかね?
制御式の所を丸括弧にしたり、配列の括弧を波括弧にしたり
する間違いが多くて....
デバッグメントしてると時間がかかりすぎて
>>16 補完機能やスニペット、フォーマッタのあるIDE使えばいいよ。eclipseとかVC++とか。
C言語というよりプログラミングの話なのですが良いでしょか。 よく似た処理を行う関数が2つあります。処理の8割は同じコードになります。 しかし2つの関数の引数は一部違っています。例えばこのように。 FuncA( int a, char *s); FuncB( int a, int b , int c); この場合どうコーディングするのがベターでしょうか。理由も教えて下さい。 (1)処理の同じ部分は無視して、全く別々に関数をふたつ作る。 (2)処理の同じ部分を切り出してみっつめの関数を作り、ふたつの関数から呼び出すようにする。 (3)ひとつの関数を作って、引数にフラグを追加して、関数の内部で処理を分ける。 (4)その他に良い案があれば
19 :
デフォルトの名無しさん :2012/11/17(土) 21:53:02.36
c言語でオーバーロード的な事を実装したらいいんじゃないか?
そもそもヘッダファイルに実体を吐く時点でツール側の設計が おかしいんだけど、組み込みの世界は割とそういうのがある。
ハード屋が書いてる?
23 :
デフォルトの名無しさん :2012/11/17(土) 22:09:09.96
C言語で3次元配列ってどうしたらいい?
1次元配列が3重になってるだけだから。 int a[10][10][10]; とかすればいい。
ハード屋ソフト屋は関係ないんじゃね? 能力が低いとか別の理由だよ
もしかしたら使うほうがヘボなだけで 何かマクロ定義すりゃいいだけになってる可能性もある
結論としては
>>25 だけど、ツール作ってるのがソフト専業ではない
ハード屋だからっていうのは確かにありそうな話。
多数のファイルから参照するヘッダをどう作るべきかという基本を
知らないんでしょう。
28 :
デフォルトの名無しさん :2012/11/17(土) 22:14:17.03
ヘッダファイルの利点がよく分からない
c#のsystem.diagnostics.debug.writeline()に相当する関数はありますか?
fprintf(stderr,"msg");
int *p; int* p; これってアスタリスクの位置が違うだけで、意味同じですよね どっちに書くかは人の好みってことで
32 :
デフォルトの名無しさん :2012/11/17(土) 23:40:59.78
ハード屋がドライバを書き ソフト屋がドライバから逃げ回りwww
ハード屋の設計ミスなのにソフト屋が尻拭いさせられる
このコードって安全 かつ ポインタの使い方は正しいですか? int *memoryPointer; int MEMORY_SIZE = 1024; memoryPointer = (int*)calloc(MEMORY_SIZE, sizeof(int)); for (int i = 0; i < MEMORY_SIZE; i++) { *(memoryPointer + i) = i; } for (int i = 0; i < MEMORY_SIZE; i++) { std::cout << "アドレス:" << memoryPointer << " 値:" << *memoryPointer << std::endl; memoryPointer++; }
>>34 malloc とかで確保したアドレスは大事に取っておいたほうが free するときに困らない
C++つかうなら、メモリはnew, delete
>>34 個人的には
> for (int i = 0; i < MEMORY_SIZE; i++) {
> *(memoryPointer + i) = i;
> }
↓
for (int i = 0; i < MEMORY_SIZE; i++) {
memoryPointer[i] = i;
}
の方がしっくり来る。
>38 mallocでも良い 必要に応じて使い分ける
>>34 個人的には
> for (int i = 0; i < MEMORY_SIZE; i++) {
> *(memoryPointer + i) = i;
> }
↓
for (int i = 0; i < MEMORY_SIZE; i++) {
*memoryPointer++ = i;
}
memoryPointer -= MEMORY_SIZE;
の方がしっくり来る。
あと全領域どっちみち初期化するならcallocは時間の無駄じゃないかな。
テキストファイル内の各単語の出現回数を出力するプログラムを組みたいんですが codepad.org/S50sUd2z 出現する単語を縦に書き並べてアルファベット順にソートして、出力するプログラムです この隣り合った行の単語同士でstrcmpして、値が0になれば頻度数wrdfreqを加算、そうでなければ前の単語wrdを一旦出力、頻度数の加算を最後にしてwrd, wrdfreqを初期化、という方針を考えています (忍法帖リセット食らったみたいでリンクできません)
ポインタにインデックスつけてアクセスするのとポインタ自体を インクリメントするのは結果は同じでも意味は全然違うぞ。
続/き/で/す さ/く/ら/が/咲/い/て/ま/す/よ/。/食/ら/う/の/で/対/策/し/て/ま/す 2/つ/目/の/p/r/i/n/t/f/ま/で/大/丈/夫/で/すが/、/そ/の/先/S/e/g/m/e/n/t/a/t/i/o/n f/a/u/l/t/に/な/っ/て/い/ま/す ポ/イ/ン/タ/は/ま/だ勉/強/途/中で/す こ/の/場/合/は/ど/う/す/れ/ばい/いで/すか テ/キ/ス/ト/は/こ/れ/を/標/準/入/力/し/て/く/だ/さ/い d/b/./t/t//Y/r/A/0/M/8/C/Y
>>45 意味が違っても結果が同じならいいじゃないか。
プログラマは詩人ではない。工作屋だ。
>>45 >>47 実行速度も変わるケースが多いから
速度が影響するシステムなら
書き方にも意識してプログラミングすべき
49 :
34 :2012/11/18(日) 09:36:29.68
お前らレスありがとう
>>35 ,
>>38 std::cout使っているけど、めっちゃC言語の勉強してる
C言語初心者にオススメの書籍を教えてください
神の誕生
はじめてのC
関数ポインタの配列の長さを知りたいんですが、C#だとこんな感じです var l = new List<Action<string>>(); l.Add(new Action<string>(m => {})); System.Diagnostics.Debug.WriteLine(l.Count); Cだとこれでいいんですか? void (*func[])(const char*) = {printMsg, printMsg2}; int size = sizeof(func) / sizeof(printMsg);
char msg[] = "msg"; msgの値は変更することが出来ないんですよね? だから、msg++とかが出来ない。 const char *msg = "msg"; こっちは、msg++;ができます。これは、msg = hellw;は出来ないけど、msgに保持しているアドレスは 上書き可能ってことですか?
>>17 Sublime Text 2 も結構いい。
>>54 配列として宣言されたmsgはリテラル(アドレス値)だから
変更できない。msgのアドレスから保持している文字列は
変更可能だけど。
ポインタ変数として宣言された*msgはmsgというポインタ変数に
"msg"という「コンパイラがどこかに定義した文字列」のアドレス
を代入している。msgがポインタ変数だから増減もできる。
msg[]の場合
msg 'm'
msg+1 's'
msg+2 'g'
*msgの場合
msg = 0x????????
0x???????? 'm'
0x????????+1 's'
0x????????+2 'g'
ということ。
>>56 あとconstと配列とポインタに関する認識が根本的に間違ってる。
エキスパートCプログラミングを買って100回読破せよ。
>53 int size = sizeof(func) / sizeof(func[0]);
C言語に限らずかもしれないですけど、コンパイルされてCPUが分かる命令コード 01のならびに変換されると言いますよね。もちろんターゲットCPUが違えば変換コード も違うのでx86系とPowerPC系のコードが違うのは分かるんですが、じゃ、同じx86系 で動くWindowsとLinuxの場合、なんでプログラムが互換じゃないんでしょうか。 このときOSは何の役割をやっているのですか?
>>59 OSはABI(レジスタに積む/スタックに積む)やファンクションコール(int 21h/int 0x80h)やバイナリフォーマット(COFF/ELF)を規定する。
OSによってABIやファンクションコールやバイナリフォーマットが違う。
アプリケーションって命令コードだけでできてるんじゃないんだよ。
>>60 そうすると、OS+CPUの組を指定して生成されるコードは
OSのAPIのコード+ターゲットCPUのコードということなんでしょうか。
OSつうかローダだろ
OSっていうのはフレームワークを提供するだけだから たとえマシンコードが同じでも違うフレームワーク用の プログラムは動かない。 そういうこと。
>>61 Cに関して言えばライブラリである程度隠蔽されるから直接ファンクションコールを叩くようなコードを生成することはまずない。
バイナリフォーマットとABIの問題が大きい。
しかし、バイナリレベルでの互換性を確保したところで
次は利用できるライブラリやデバイスの差異という壁が立ちはだかることになる。
directxやwinapiはwindowsでしか使えないみたいな。
>>59 OSが許せば
システムコールやWinXXAPI使わなければ
互換ですよ
VMとかで試せば判る
66 :
デフォルトの名無しさん :2012/11/18(日) 18:02:38.79
codepadでファイル入出力がしたい場合どうすれば?
67 :
デフォルトの名無しさん :2012/11/18(日) 19:06:34.20
http://codepad.org/about Paranoia
When your app is remote code execution, you have to expect security problems.
Rather than rely on just the chroot and ptrace supervisor, I've taken some additional precautions:
The supervisor processes run on virtual machines, which are firewalled such that
they are incapable of making outgoing connections.
The machines that run the virtual machines are also heavily firewalled,
and restored from their source images periodically.
あるところでnewしたポインタに後にアクセスすると、中身が変わっていたりセグフォが起きます こういう現象は何が問題なんでしょうか? newでなくmallocでも同じです クラスメンバ float* p; クラスメンバ関数 void fun1(){ p=new float[num] //略 } void fun2(){ //pの要素にアクセスすると中身が変わってる //pの先頭アドレスも変わってる }
内容が変わるのはどこかで書き換えるようなことしてるから アドレスが変わるのはreallocなりしたからだろ
>>68 これだけではわからん
症状が再現する最小のコードをcodepadに上げて実行してみてくれ
スタックぶっ壊してpが書き換わってるに一票
書かれてない部分のコードに問題があるな
static float*p0,**p1; void fun2(){ flaot*p; *p1=&p; p=p0=malloc(x); … ポインタ操作; assert(*p0==**p1); …}
バグは本人が関係無いと思っている場所にこそ在る
static関数はprivateなので、ヘッダファイルに書かないのが一般的なのでしょうか?
うん、一般的だよ
ポインタ/配列は色々とコードを書かないとよくわかない事が分かった。 高級言語では気にしなくていいメモリ管理がここまで面倒だとは... とりあえず、色々とメモリ破壊してC言語覚えていくしかないのかー
>>73 > flaot*p;
> *p1=&p; p=p0=malloc(x);
↓
> float*p;
> p=p0=malloc(x); *p1=&p;
順序が逆では?
80 :
79 :2012/11/18(日) 23:05:37.29
81 :
68 :2012/11/18(日) 23:19:50.33
68です レスしてくださった方々ありがとうございました これから見直してみます
>>78 うん。本をパラパラめくって見ているだけではわからない。
実践的な意味のあるコードを書き、動作を確認して初めてわかる。
よく入門書にある、下のようなコードはダメだ。
これを見てふーんとわかるのなら既に入門者ではない。
int a, *b;
a = 10;
b = &a;
printf("%d\n",*b);
ダメな理由がわからないorz
ではそのコードを入門者にも分かるように説明してください 入門編に相応しいような解説を付けてください
自分で紙に書きながらCPUの動作をトレースしないと ポインタはわかんないよ。
>>83 この例題で納得しているようではダメということだろう
そういうことか・・・日本語勉強してきます
>>83 ,84
誤解しないで欲しい。
ダメというのは、これはアプリとして無意味なコードであるということだ。
上級者は無意味であるとわかるから、ふーんで済ませられる。
しかし入門者はこのコードに深い意味があるものと思い、理解しようと試みる。
ところが意味のないコードだから、「こんな面倒くさいことせずに
そのままaを使えばいいじゃないか」という疑念が湧き、理解にならない。
これでは入門書としてダメだ。
ポインタには、ポインタが活躍できる場面というものがある。
それを示す有用なコードを見せて、ポインタはこういう動作をするから
こんな用途に使えるんですよ、と教えるのが入門書の役目だろう。
で、入門書に最適、つまり有用でそれなりに短く しかも入門者に理解させる用をも兼ね備えた そのコードの実例は
swap だろうな
>>88 >アプリとして無意味なコード
そんなこと言ったらテキストにのってるコードすべてがそうだわ。
とりあえず、
>>82 で使い方覚えて、さらっとCの文法を終わらせて
文字列と配列とポインタとか、リスト構造とかそういうのでだんだん
深くなれていけばいい。
>92 躁鬱
個人的にはデータ構造やらアルゴリズムやらよりも前に、原始的なアセンブラでも使って、 動いてるプログラムのイメージを持つことがけっこう大事だと思う。Cをやるなら。 もっと高級な言語なら今時そんなイメージはいらんと思うけど。
>>95 CASLとかやればいい。シミュレータもあるし。ワードマシンというところは
目をつむって。ただ、CPUとかレジスタとメモリのやり取りとかわかったところ
でポインタとかがわかるかとか言えば別。概念的にわかっても表記がgdgd
だから。
K&Rにあった void strcpy ( char *s, char *t ) { while ( *s++ = *t++ ) ; } の書き方とかいまだに推奨されてんの?
そもそもstrcpyはオワコン strncpyかstrncpy_s という話はともかく >97 は書き方としてはアリだよ
>>97 whileやforの条件式中に処理を詰め込むのは
行儀が悪いという人もいる。
while ( (*s++ = *t++) != '\0' ){} が推奨
>>97 代入式!代入式!ってファビョっちゃう人もいる
終端文字との比較なんていらんだろ while((*s++=*d++)){} で十分じゃねーの?
strcpyの戻り値がインクリメントされる前のsだったら嬉しかったのに
なんで?
strcat のことなら同意
107 :
デフォルトの名無しさん :2012/11/19(月) 15:20:28.15
質問お願いします scanfでの複数入力について 3つ以上の場合 scanf("%d,%lf,%lf",&num,&weight,&height) という形で良いのでしょうか scanf("%d,%lf%lf",&num,&weight,&height) では駄目ですか? 解説お願いします
>>107 どういう入力フォーマットにするかで話が変わってくる。
1)scanf("%d,%lf,%lf",&num,&weight,&height)
2)scanf("%d,%lf%lf",&num,&weight,&height)
2')scanf("%d%lf%lf",&num,&weight,&height)
フォーマット文字列のカンマ有無が質問の中心と思うので、2'で話をすると
入力が 3, 2.1, 5.2 などカンマ区切りなら1)
入力が 3 2.1 5.2 などホワイトスペース区切りなら2)
うんこだね
>>103 s と d は逆のほうがいいな
変数の意味的に
わろた
C言語 ポインタ完全制覇」p100 #include <stdio.h> void hello ( void ) { fprintf ( stderr, "hello!\n" ); } void func ( void ) { void *buf[10]; static int i; for ( i = 0; i < 100; i++ ){ buf[i] = hello; } } int main ( void ) { int buf[1000]; func(); return 0; } 凶悪なサンプルコードとしてあげられているのですが、どこら辺が凶悪なのかわかりません。 ご教示願います。
funcの中でvoid *buf[10];で宣言して、すぐ下のforで10を超えて100まで書き込んでいる。 main内での宣言がfuncで見られるわけないし、変数のスコープの解説だとしても、 なんか意味不明だな。 その本読んだことないけど「凶悪なサンプルコード」とかいう用語使ってる本は大抵クソ。
func 内で配列を突破して書き込んでるのが凶悪な部分? <><><><> func のリターンアドレスをぶっこわして 結果的に関数 hello にさし換え コンパイルし実行すると なぜか hello! と表示される ようなコンパイラがあるかどうかは知らん
スタック上書きで、呼んでないはずのhello()が呼ばれ得ることを示したかったんでないの。
バッファオーバーフローの説明のためだけのプログラムに、「凶悪」ってアホだよね セキュリティホールの原理っぽいあたりが「凶悪」なのかも 環境になるべく依存しないように、無理して作った感じ
hello!が出力される環境って例えば何があるの? うちのVC++2010とcodepadとideoneでは何も出力されんかった
ちょっと試してくる!
>>118 Cygwinのgcc環境だと出たな。
$./a.exe
hello!
.........
........
........
hello!
Segmentation fault (core dumped)
もしかしてこういう事をしようとしてるのか?読み込み専用セグメントに書き込もうとして OSエラーで停止したぞ void hello(void) { fprintf(stderr, "hello!\n"); } void func(void) { void *buf[100]; static int i; for (i = 0; i < 100; i++) buf[i] = hello; ((void (*)(void))buf)(); } int main(void) { int buf[1000]; func(); return 0; }
>>120 最適化オプション-O1 -O2 -O3をつけると出なくなるな。
>121 ((void (*)(void))buf[0])();
>>122 mainのbufがなくなるからということ?
>124
なんでhello関数が呼ばれてしまうん?
どのコードのこと?
funcが10個分のvoid*配列bufしかもってないのに、100個分書き込むと、 funcのリターンアドレスを格納してたスタック領域まで helloの先頭アドレスを書き込んじゃうので、 リターンしたとたんにhelloに飛ぶ。
>>129 スタックを上書きしてしまっているから。
まぁ、詳しく知りたければアセンブラとスタックについて調べればいいよ。
尚、呼ばれない場合に考えられるのは次のようなケース。
・最適化により、関数がインライン展開されてしまってcallされなくなる。
・そもそも呼び出し元をスタックに退避しないタイプのCPU。
・コードスタックとデータスタックが分離されている環境。
VC++2008 で最適化なし /Od でコンパイルしたけど 何も出ない
mainのreturnをreturn buf[0];にでもすると?
#include <stdio.h> void hello(void) { fprintf(stderr, "hello!\n"); } void func(void) { void *buf[1]; buf[2] = hello; } int main(int ac, char **av) { func(); return 0; } これで出たわ main にある int buf[1000]; も伊達じゃないんだな
>>125 gccの最適化によってfuncのメモリに書き込む動作自体が無意味なものとして省略される。
>>136 > main にある int buf[1000]; も伊達じゃないんだな
main 呼び出し元のスタックを汚さないように細工しているつもりかなぁ と思われる
※ スタックはデータ・プログラムで共通
※ ローカル変数は戻りスタックより若いアドレスに配置するモデル
func() の動作では 呼び出し前後でスタックが合わない
(hello の呼び出しが CALL ではなく偽装JMP で、 hello の最後の RET が浮遊する
>> main にある int buf[1000]; も伊達じゃないんだな >main 呼び出し元のスタックを汚さないように というよりも main の int buf[1000]; が無いときは buf[] に 100 回アクセスする途中でエラーが出て func() の return まで行かないみたい (VC++の場合)
STACKセグメントを越えてアクセスすることになるからそこで保護違反だろうね
malloc()したメモリを*pointに入れます。でも、もっとメモリが欲しくなった時ってどうするんですか? *point + 必要な領域を再度OSに割り当ててもらうのは、無駄な気がするのですが
セグメントという単語を聞くと16bit x86の悪夢を思い出す。
>>141 realloc()
運がよければ確保した領域を拡張してくれる。実装依存。
運が悪いと新しい領域を確保してまるごとコピーされる。
144 :
デフォルトの名無しさん :2012/11/20(火) 21:11:51.76
配列内の要素を左に1つずつずらしながら値を取得したいんですが うまくいきません。 char s[] = "today"; int i,j; for(i=0,j=1;i<strlen(s);i++,j++){ printf("%s\n",s); s[i]=s[j]; } どなたかご教示ください
>>144 インデックスアクセスでは解決できない理由は何ですか?
ずらすことに意味はありますか?
どうなったら、「うまくいった」といえるの?
147 :
デフォルトの名無しさん :2012/11/20(火) 21:20:28.47
>>145 インデックスアクセスとは・・・?
配列内で2文字の文字列を検索するような物を作りたいと思ってます
検索するのにどうしてずらすひつようがあるのか
ポインタ1個挟んだら? char *p = s; for (i=0; i<strlen(s); i++) { printf("%s\n", p); p++; } (s の指してる先は変わってない&書き換えてない) p の指し先を 文字列の先頭から末尾へむかって順に送ってくと p から読み出せる文字列は あたかも先頭の1文字を削っていったかのごとく読み出せる
>>144 char s[] = "today";
int i, j;
for (j = strlen(s); j > 0; j--) {
printf("%s\n", s);
for (i = 0; i < strlen(s) - 1; i++) {
s[i] = s[i + 1];
}
s[i] = '\0';
}
こんなのは?
151 :
デフォルトの名無しさん :2012/11/20(火) 21:45:02.73
>>147 char str[] = "何か書く";
char search[2] = "検索したい文字列"
int i;
for (i = 0 ; i < strlen(str) - 1 ; i++)
if (str[i] == search[0] && str[i+1] == search[1])
printf("Exist.");
こういうことか?
検索したいなら strstr(); 使えば…
strstrを実装するというお題なのか、検索したいだけなのか
154 :
デフォルトの名無しさん :2012/11/20(火) 21:51:01.25
みなさんありがとうございます 参考にさせていただきます。 strstr();も使った方法も考えてみます。
いえいえ
野菜しエスパーがたくさんいるんだなぁ みつを
157 :
デフォルトの名無しさん :2012/11/21(水) 16:53:07.44
ちょっと分からないので教えて下さい C言語でスレッド勉強しているんですが a=sin(1) b=sin(2)とする。 a=a+b; (1) b=b+a; (2) という処理を(1)(2)の順番で記述した場合 順次実行なら明らにa=3 b=5ですが 同時の場合はどうですか? 分からないのが同時といっても 完全にaとbの組のクローンを二つつくって(1)と(2)で実行する 場合(1)=3 (2)=3となりますが お互いのa bを参照しながら 同時に実行なら速度(1)/sと(2)/s違いによって 結果は変わると思うのですが "同時"といった場合クローンなのでしょうか?どうですか?
わからんぞ 全然わからんぞ
>>157 まず質問の趣旨を正確に伝える日本語力から養ってくれ。
エスパーとしては、スレッドだと、 同時なのかちょっと同時なのか全然同時じゃないのか、 どれもあり得るということだ。 あと、a=a+b が一つの処理じゃなくて、 aを読む bを読む 足す aに書く の4段階なのだ。 b=b+a も4つに分解されて、あらゆる順序の組合せで動きうるのだ。
マルチコアなら完全同時も桶 っつーかsin()はスレッドセーフじゃねーぞゴルァ
鼻からニャルラトホテプ星人が出た
C言語の問題です int i; int a[2]; a[0] = 5; a[1] = 5; i = 0; a[i] = ++i; このときa[0]とa[1]の値をそれぞれ答えなさい
a[0] = 5; a[1] = 1;
++と--をイディオム的なところ以外で使うやつはチームにいらん
コンパイル通るといいな 〜 なんか動いた まで
http://www.st.rim.or.jp/~phinloda/cqa/cqa7.html Q 【a[i] = i++;】
配列に0から始まる整数の値を入れたい。次のコードはなぜうまく動かないか。
int a[10];
int i = 0;
while (i < 10)
a[i] = i++;
A
i++ という式を実行すると、 i の値が変化します。このような振る舞いのことを副作用と呼びます。ある変数に 対して副作用が生じるような式においては、他の箇所でその変数を参照すること はできません。その結果は未定義とされています。
この式の場合、 i は i++ の他に、配列 a の要素を指定するために参照されているため、その結果は未定義となるのです。
K&Rの記述を読むと、上の結果は不定であると解釈できるような記述があり ますが、ANSI Cの規格では、不定ではなく未定義の扱いとすることになっています。
(参考 comp.lang.c FAQ 3.1)
>未定義の コードを実行した結果「鼻から悪魔が飛び出しても仕様に反しない」というjoke が流行したことがありました。
ブードゥーマジックかよ
171 :
デフォルトの名無しさん :2012/11/21(水) 21:43:34.20
#include <stdio.h> #include <math.h> #include <stdlib.h> #include <time.h> int main(void) { int i,ii,n=100000; double x,y,z,sum=0.0,zsum=0.0,ans; double za[100000]={0}; srand((unsigned int)time(0)); for(i=0;i<n;i++){ x=-1.+2.0*(rand()/((double)RAND_MAX+1.0f)); // -1 <= x <= 1 y=-1.+2.0*(rand()/((double)RAND_MAX+1.0f)); // -1 <= y <= 1 z=2.0*(rand()/((double)RAND_MAX+1.0f)); for(ii=0;ii<2000;ii++){ if(0.001*ii<=z && z<0.001*(ii+1)){ if(x*x+y*y<=1.0-(0.0005*ii)){ sum=sum+1.0; za[ii]=z; } } } } for(i=0;i<100000;i++){ zsum=zsum+za[i]; } ans=zsum/sum; printf("%f %f %f\n",sum,zsum,ans); return 0; } 正しい値が出てきません お願いします
173 :
デフォルトの名無しさん :2012/11/21(水) 23:27:49.58
ポインタについてわかりやすく解説してるサイト知らない? わかりやすさに個人差はあるけれど... 「ここわかりやすかったな」とか「ここ勉強になったな」とか
下手な説明して混乱させるサイトより、K&R2でもきっちり読めばいいと思うよ
未だにあんなの読んでる人いるの?
その「あんなの」も読みこなせなかったの?
どんな型だろうとポインタが4バイトの変数(32bitの場合)だと理解してから急速に理解が速まったな
>>173 ポインタの宣言と利用でつまづいているのか、配列とポインタあたりなのか、
ポインタの引数がどうとか、ポインタの複雑な読みなのかどこかで違うだろ
ポインタでつまづく奴の気持ちがわからん
ポインタの文法がおかしいと思わない奴は知性が足りてない
どうおかしいか知性的によろ
>>171 > if(x*x+y*y<=1.0-(0.0005*ii)){
> sum=sum+1.0;
> za[ii]=z;
> }
↓
> if(x*x+y*y<=(1.0-(0.0005*ii))*(1.0-(0.0005*ii))){
> sum=sum+1.0;
> za[i]=z;
> }
じゃないのかな?
違ったらごめんね。
ポインタの概念を理解する事と文法は無関係 文法が気に入らないなら他の言語使うとか作るとかすればいい
>>183 char (*(*x[3])())[5];
なにがなんだかわかりまへん
数日前にC言語を始めたばかりで、参考例を片っ端から打ち込んでいるのですが double a =3.14159265 と宣言し printf("%5.100f",a); という文を作ると結果が3.141となるらしいのですが 自分の場合は3.14159265000000000000000... と、なぜか文字幅ではなく精度で処理されてしまいます 何か間違っている点があるのでしょうかorz 使用ツールはVS2010です
printf("%5f",a);
printf("%.5f",a);
190 :
デフォルトの名無しさん :2012/11/22(木) 00:53:09.09
>>178 宣言と利用のほうですね...。
正確に言えば利用がよくわかりません。
>>186 printf("%5.100f",a);
printf("%5.10f",a);
printf("%5.5f",a);
printf("%5.2f",a);
printf("%5f",a);
最初はいろいろ大変と思うが、いろいろ試してみるといいと思うんだよな。
こういう例に限らず。本で読んだのと自分の理解が違うかもしれないし。
特に最初は。
193 :
デフォルトの名無しさん :2012/11/22(木) 01:01:31.79
javaが難しくて辛すぎる 全体を把握しなくて良いC言語と対立しすぎ 単純に考えるという事が通用しない
javaなんて構造体の中にプログラムもいっしょに書くだけだし たいして難しくないぞ。最初は最低限の文法に絞って覚える のが何をやるにも早道だと思う。
195 :
デフォルトの名無しさん :2012/11/22(木) 01:11:58.13
bcpad使ってるんだけどコンパイルして実行しようとするとコンパイルは出来るんだけど ファイルを実行する段階で「○○は動作を終了しました」ってでて実行できない...... windows7 64bitでいいC言語学習に適したソフトとコンパイラって何かある?
>>190 int a;
int *b;
a = 10;
b = &a;
printf("%d\n",*b);
とりあえずこういうのは理解しているんだよな?
テキストに書いてあるような箱に●→|__|とかも含めて。
だったら今は「ふーん」そういうのもあるんだ、という理解でいいような気がする。
例えを使っていろいろ言ってもドツボにはまるだけ。先に行った方がいい。
(メモリとCPUとか命令の実行とかそういうハードの知識もいれてほしいが)
構造体まで終わって、自分でも関数を作ってみたり、ポインタと文字列とか配列とか
そういう課題などにあたるとまた取り組み方が違ってくる。
後はここの 15.ポインタ変数の仕組み とか
ttp://9cguide.appspot.com/
>>197 問題が発生したため、プログラムが正しく動作しなくなりました。
プログラムは閉じられ、解決策がある場合はwindowsから通知されます。
って出てくる
実行終わって終了したわけじゃなく問題が起こって実行できてないって感じ
200 :
デフォルトの名無しさん :2012/11/22(木) 01:20:20.68
プログラミング出来る人がハードウェアやると一切理解できないって 本当なのかな
出典は?
>>200 普通のアプリケーション作っている人が組込みのCとか
シーケンサとかやるとわけわからんと言うのはよく聞く。
>>195 bcpadってBorland C++ Compiler だよね。
Windows7なら普通に「Microsoft Visual Studio Express」でい良いんじゃないかな。
30日以上使う場合、Microsoftに登録が必要みたいだけど、終始無償。
あと、プログラムの異常は
ttp://ideone.com/ あたりにコード貼って、そのリンクを教えてくれたら誰か原因を教えてくれるかも知れない。
205 :
デフォルトの名無しさん :2012/11/22(木) 01:48:45.72
Microsoft Visual Studio Expressってなんか使い方よく分かんないんだよね 4つあるうちのC#とC++とbasicどれに.cフォルダ読み込ませてもコンパイルしてくれないし 普通に白紙に書き書きしてコンパイル→実行みたいな動作のやり方がすごい掴みにくくい......
勉強なら、bcpadでいいと思うけど、VSで1行づつステップ実行しながら変数や メモリの値の変化を確認してみるとCの理解が早まる。 まあ、コード内にprintf仕込んで値表示させるならbcpadでも何でも。。 それより、落ちるコード見ないとアドバイスも何もできないな。
C言語最近始めたけどif文覚えるとものすごい楽しいな
ifを使わずに分岐できるようになるともっと楽しいよ
switch case のことか?
大学の授業で明解C言語入門編やってる。面白い。
望洋はクソ
馬鹿には無理
213 :
デフォルトの名無しさん :2012/11/22(木) 07:34:40.36
Cでどう書くの?
>>316 polymorphism なんかもそうだね
Cで一番深いのはswitchだな。あと可変長マクロ。
#include <stdio.h> typedef int (*MAGNIFY)(int, int); int one_parameter(int dummy, int b) { return 100*b; } int two_parameters(int a, int b) { return a*b; } int main(void) { int i; MAGNIFY f[3]; f[0] = one_parameter; f[1] = one_parameter; f[2] = two_parameters; for(i = 0; i < 3; i++) { printf("%d\n", f[i](200, 5) ); } return 0; }
関数ポインタの配列ね。 ついでに再帰使って、forも排除してみて。
int main(int ac, char **av) { int i; MAGNIFY f[] = {one_parameter,one_parameter,two_parameters}; if(ac<2){ main(5, av); }else if(ac > 2){ printf("%d\n", f[5 - ac](200, 5) ); main(ac - 1); } return 0; }
if 使ってんじゃん。
222 :
デフォルトの名無しさん :2012/11/22(木) 11:35:24.46
突っ込み所はそこか?
君たち }else と if( と ){ にはスペースを空けるんだ コードは人に楽に読んでもらえなきゃだめだ わかったね お兄さんとの約束だ
再帰なのか?これは?
IOCCCに出てそうなネタだね
>>225 相互再帰
227 :
デフォルトの名無しさん :2012/11/22(木) 11:59:19.42
よく無事に終了してるな。
これができると何だって言うの
関数ポインタの配列で分岐できるね
ここって一昨日始めたやつでも質問していいの?(´・ω・`)
>>230 全然OK
俺は明日からはじめようとしているぐらい
>>231 ありがとう!
多分馬鹿馬鹿しいと思うけど教えて下さい
#include <stdio.h>
int main(void)
{
printf("%d\n",10/3);
}
答え:最後に return 0; をつける。
しまった return 0;着けるの忘れた(´Д` ) #include <stdio.h> int main(void) { printf("%d\n",10 / 3); return 0; } これ実行しても3にならない(´;ω;`) Visual C++2010使ってる
%1f
gcc 3.4.5 だと お望み通りに 10 になる
>>235 ありがとう(^з^)-☆
「%1f」?
「%f」とは違うのかな
∧,,∧
( `・ω・)
/ ∽ | うーん…
しー-J
%dって切り捨てで表示されるんじゃなかったけ?
後、演算子との間はスペースいれといた方がいいの?(´・ω・`)
>>236 おかしいな(´・_・`)
GCC使いやすいですか?
普通に3になるよ コンパイルし直したら?
fなら printf("%f\n",10/3); printf("%f\n",10.0/3.0); の両方を試す
>>239 >>240 コンパイル出来ました!
ありがとうございます!
♪∧,,∧
♪∧,,∧・ ω・)
∧,,∧・ ω・) )っ
(・ ω・) )っ__フ
(っ )っ__フ(_/彡
( __フ(_/彡
(_/彡♪
いったいなにをどうしたんだ
>>242 一回全部消して書き直しました(`・ω´・)
なんでコンパイル出来なかったか分からない
出来るか出来ないかで教えていただきたいのですが 例えば for文で (■■■■) ■を四つ表示一連の下りを作ったとして このループ自体を (■■■■) (■■■■) (■■■■) のように三回ループできますか? これは所謂二重ループですか?
>>244 for i = 1 to 4
for j = 1 to 4
処理
next j
next i
で2重ループは可能
next の次の i とか j は省略可
jniでロードされたモジュールが、自分自身の絶対パスを取得する方法ってありますか?
>>246 いつも見てるVB系のスレと勘違いしました。
for(;;){
println("ごめん");
}
いいんだよ
すいませんCです。
許す
252 :
デフォルトの名無しさん :2012/11/22(木) 21:31:38.02
htmlってC言語組み込み可能? ニコ動で見たんだがhtmlにはjavascriptや32apiは組み込み 可能らしい
入門者どころじゃねぇ騒ぎの質問者を久々に見た
254 :
デフォルトの名無しさん :2012/11/22(木) 21:39:24.03
何が?w ホームページ作ってて あ?ここC言語使えねーかなって 思ったりしないのか?
ンだから scriptの中に書かれる言語はなんでもいいだろ 中身を解釈して実行してんのはブラウザだ だからブラウザ用に Cスクリプトを実行する為のプラグイン作れよ
>>256 そもそもCスクリプトというものが存在しない
258 :
デフォルトの名無しさん :2012/11/22(木) 21:53:30.51
ニコニコ御馴染みのテトリス動画では forとか使ってたけどこれは 何言語なの?Cじゃないのか? javascript? forがある言語は C C++ java 以外知らないぞ
何かの心理テストなのだろうか
こういう人のことを「おめでたい」って表現するんだろうなぁ。
試される回答者たち
ただのガキでしょう。
cscript cscript /? Windows 2000のコマンドプロンプト(Windows XPは、Version 5.7) D:\work>cscript Microsoft (R) Windows Script Host Version 5.6 Copyright (C) Microsoft Corporation 1996-2001. All rights reserved. 使い方 : CScript scriptname.extension [オプション...] [引数...] オプション : //B バッチ モード : スクリプトのエラーおよびプロンプトを非表示にする //D アクティブ デバッグを使用可能にする //E:engine スクリプト実行時にエンジンを使用する //H:CScript 既定のスクリプト ホストを CScript.exe に変更する //H:WScript 既定のスクリプト ホストを WScript.exe に変更する (既定値) //I 対話モード (既定値、//B と逆の動作) //Job:xxxx WSF ジョブを実行する //Logo ロゴを表示する (既定値) //Nologo ロゴを表示しない : 実行時に見出しを表示しない //S このユーザーの現在のコマンド ライン オプションを保存する //T:nn 秒単位のタイムアウト時間 : スクリプトを実行できる時間の最大値 //X デバッガでスクリプトを実行する //U コンソールからリダイレクトされた I/O に Unicode を使用する
264 :
デフォルトの名無しさん :2012/11/22(木) 23:13:52.64
C言語を学んでいる少年がある日HTMLに出会いました C言語使えるんじゃね?とふと疑問に思う事の何がいけないのでしょう?
>>264 別にいけなくはないけど
forなんてほとんどの言語にあるよ
C言語しか使えない人はそう思うかもしれないが
言語はたくさんあって適材適所で使われるもの
267 :
デフォルトの名無しさん :2012/11/23(金) 00:57:33.86
calの出力を受け取って整形だけだろjk
こんなの読めねぇ、勘弁してくれ int ( *func[5])(char *)
270 :
デフォルトの名無しさん :2012/11/23(金) 04:50:40.64
char * をひとつ引数にとり int を返す関数へのポインタの配列(要素数5)
main関数の**argvのからくりがわからず、 数年悩み続けていて先に進めません char **argvとは、コマンドライン一番目の文字列の先頭アドレスを持つ メモリのアドレスを持つ変数の宣言だというのはわかるのですが、 二番目以降の文字列のアドレスは誰が持っているんですか?
入力>hoge.exe hage piyo (0000)hoge.exe\0hage\0piyo\0 (0100)argv(0000)(0008)(000d) (0100)argv[0]->内容(0000) (0104)argv[1]->内容(0008) (0108)argv[2]->内容(000d) ()内はアドレス 大雑把にこんなイメージ 誰がプログラム引数を積む作業をやるかといえば CランタイムライブラリのmainCRTStartup関数など その他さまざまな初期化を行ってからmain(int argc, char *argv[])を呼ぶ
0080からはじめてれば100点あげれたのに
>>271 >二番目以降の文字列のアドレスは誰が持っているんですか?
難しく考えることはなく、argvが持っている。
コマンドラインで
$hoge arg1 arg2 arg3 arg4
と入力された場合には
const int argc = 5;
char *argv[argc] = {"hoge", "arg1","arg2","arg3","arg4"};
という風に宣言されているイメージ
275 :
デフォルトの名無しさん :2012/11/23(金) 10:53:53.10
Λ_Λ \\
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >_Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>274
その宣言が判ってないんだろ
#include <stdio.h> int main(int argc, char const * argv[]) { printf("argc value = %d¥n", argc); for (int i = 0; i < argc; ++i) { printf("argv[%d] address, value = %p, %s¥n", i, argv + i, argv[i]); } return 0; } // 実行結果 // ./a.out arg1 arg2 arg3 arg4 // argc value = 5 // argv[0] address, value = 0x7fff5fbff998, ./a.out // argv[1] address, value = 0x7fff5fbff9a0, arg1 // argv[2] address, value = 0x7fff5fbff9a8, arg2 // argv[3] address, value = 0x7fff5fbff9b0, arg3 // argv[4] address, value = 0x7fff5fbff9b8, arg4
ttp://codepad.org/yioNtAX7 C:\tmp>test hoge hage piyo
&argc=[0012FF70]
&argv=[0012FF74]
argc=[4]
argv=[00392AD0]
&argv[0]=[00392AD0]
argv[0]=[00392AE4][test]
&argv[1]=[00392AD4]
argv[1]=[00392AE9][hoge]
&argv[2]=[00392AD8]
argv[2]=[00392AEE][hage]
&argv[3]=[00392ADC]
argv[3]=[00392AF3][piyo]
>>277 隙間が開いてるんだね
alignmentでもされてるのかな
隙間って?
ttp://codepad.org/FcvXKVPk C:\tmp>test hoge hage piyo
argc A=[0012FF70] V=[4]
argv A=[0012FF74] V=[00392AD0]
argv[0] A=[00392AD0] V=[00392AE4][test]
argv[1] A=[00392AD4] V=[00392AE9][hoge]
argv[2] A=[00392AD8] V=[00392AEE][hage]
argv[3] A=[00392ADC] V=[00392AF3][piyo]
argv[4] A=[00392AE0] V=[00000000][(null)]
64bitだから詰まってんじゃね
ん、ちょっと待って 何と何の隙間?
ttp://codepad.org/FYYKi5wk C:\tmp>test hoge hage piyo
00392AD0: e4. 2a* 399 00. e9. 2a* 399 00. ee. 2a* 399 00. f3. 2a* 399 00.
00392AE0: 00. 00. 00. 00. 74t 65e 73s 74t 00. 68h 6fo 67g 65e 00. 68h 61a
00392AF0: 67g 65e 00. 70p 69i 79y 6fo 00.
ファイルのサイズを調べるにはどうするのが良いですか?
fseek等でカレントポジションがファイル終端にある時fgetpos
stat, fstat
_fseeki64(fp, 0, SEEK_END); fgetpos(fp, &pos); _fseeki64(fp, 0, SEEK_SET);
#include <sys/types.h> #include <sys/stat.h> ... _stati64 st; _stati64(filename, &st); _i64toa_s(st.st_size, buf, sizeof(buf), 10);
みんなCのことよく知ってるのに童貞なのか
>287- できました ありがとうございました
fseekを使う方法はダメな場合もある
で そのダメな場合て
投機的実行
>>279 >>282 あなたは2次元配列とポインタ配列の区別がついてないよ。
char a[2][3];
char *a[3];
がどう違うか考えてみて。2次元配列は稠密だけど、ポインタ配列はそうとは限らない。
ポインタ配列はアバズレ
追記でfopenしてfgetpos
それ日付変わるからやばくね
何の日付?
303 :
デフォルトの名無しさん :2012/11/23(金) 16:47:54.75
#include <stdio.h> int main(void) { FILE *fp; char *fname = "test.txt"; int c,i,count=0; fp = fopen( fname, "r" ); if( fp == NULL ){ printf( "%sファイルが開けません\n", fname ); return -1; } for(i=1;i<=17;i++){ c=fgetc(fp); if(c==1){ count++; } printf( "%c", c ); } fclose( fp ); printf("CANDIDATES1 = %d\n", count); return 0; } ファイルの中の1をカウントしたいのですが、どこをかえたらよいでしょうか
if(c=='1')
305 :
デフォルトの名無しさん :2012/11/23(金) 17:14:57.72
いえいえ
307 :
デフォルトの名無しさん :2012/11/23(金) 21:25:40.76
下の条件式で countの中の数を比べているのですがcountx=0は除くことはできますか?? if(count<5 && count2<5 && count3<5){ //---例えばcount2が0だった場合 countとcount3のみで比べるーーー// for (i = 0; i < 3; i++) { for (j = i + 1; j < 4; j++) { if (tei[i] < tei[j]) { t = tei[i]; tei[i] = tei[j]; tei[j] = t; } } } } また投票制度のプログラミングで候補者1、2、3ファイルの中12233 などのような候補者があらかじめ3人と分かっているときはできるのですが 3人以上というように候補者が不明の場合どうしたらよいでしょうかm
int hoge[2][3]; と書いたらhoge[2]が3つあるような気がしますが、なんで実際は 逆なんでしょう
>>308 □□
□□
□□
2 が 3 個?
3 が 2 個?
>>308 hoge
↓
□□・・・・・・実データのアドレスが入っている
↓↓
↓ ̄ ̄↓
□□□ □□□・・・実データが入っている
312 :
デフォルトの名無しさん :2012/11/23(金) 22:44:12.40
ポカミスと思いきや深刻だなw
>>313 バカだな。ならび順からいって
int hoge[2][3]; は □□|□□|□□
だろう
添字演算子のくっ付き方は確かにわかり辛いからな でもそれはないだろ
>>313 313が正しいな。
#include <stdio.h>
int main(){
int a[2][3];
for (int i = 0; i < 2; ++i)
for (int j = 0; j < 3; ++j)
printf("%d %d %p¥n", i, j, &a[i][j]);
return 0;
}
実行結果:
0 0 0x7fff5fbffb30
0 1 0x7fff5fbffb34
0 2 0x7fff5fbffb38
1 0 0x7fff5fbffb3c
1 1 0x7fff5fbffb40
1 2 0x7fff5fbffb44
BASICやFORTRANが314
>314のように誤解したままの糞ソースはよく見かける それでも「たまたま動く」プログラムは書けるが メモリアクセス順が飛び飛びになるので ベクトル演算や先読みパイプライン処理や SSEと組み合わせて使うときに失敗する糞
int a[2][3]; と宣言されても a[0][5] でアクセス出来る。 ただしこれは、 a[1][2] に対して行われる。
立派な雑誌の特集でも堂々と間違える。 それがポインタの恐ろしさ。
>>321 のように多言語では[][]を→に読んだのものもあるのに
C言語では[][]を←に読む実装にしたのはなんで?
>325 二次元配列はない ポインタの優先順位順に解釈されてるだけ 他の言語と比べて同じじゃないといけないとこだわるのはなぜ?
>>314 宣言:int hoge[3][5];
式:hoge[2][3]
式の中では配列はポインタに読み替えられる。式:hoge[2][3] は
*( hoge + 2 )[3] に、そして
*( *( hoge +2 ) + 3 ) に等しい
と
>>313 のページの著書に書いてあった。
>>328 ()が一組足りない
( *( hoge + i ) )[j] は *( ( *( hoge + i ) ) + j ) に等しい
だった。
>>325 マクロを使えば前者のように実装することも可能。
int hoge[width * height] 確保して hoge[y * width + x] or hoge[x * height + y] するなりすればよろしい
最初から読んでないのか、揚げ足取りたいだけなのか、論点ずらしたいのか知らんがアフォ丸出し。
ffmpegのソースの中で #if defined(__GNUC__) && !defined(__INTEL_COMPILER) && !defined(__clang__) # define av_uninit(x) x=x #else # define av_uninit(x) x #endif という定義があり。下のように使用しています func() { int av_uninit(some_var); } 展開されると int some_var = some_var; になりますが、これはどういう意味でしょう?
some_var が define されたマクロだった場合 2回パスすることでちゃんと展開してくれるようになる
詳しい方のみ回答願います。
マクロって、 #define N 10 とやると、 for ( i = 0; i < N; i++ ){ ・・・ のNだけじゃなくて、NUMとか変数名に使っていたらNUMのNも置換されるの?
スペースで区切られていたらそうだね
質問者ではないが
>>333 ,334の回答がよく理解できてないんだけど
どういうこと?
コード見る限りGNU拡張の何かってことだよね
>>334 はワカランチンなので無視すべし。
int some_var = some_var;
は、GNUCの拡張で未初期化変数の使用の警告を出さなくするお呪い。
341 :
339 :2012/11/24(土) 13:13:16.71
なるほど意図はわかりました ありがとう! しかし、どうしても未初期化のまま変数を使いたいケースってどんなケースなんだろう ffmpegのソースとやらを読んでみよう
342 :
デフォルトの名無しさん :2012/11/24(土) 15:18:53.99
一次元配列で配列の数をPCに積んでいるメモリの上限(16GB)まで使いたいんだけどどうすればいいんですか? 動的確保(malloc)しても配列のサイズが2GBくらいになると、配列への代入文の行で実行ファイルが強制的に終了してしまいます 環境はWindowsのVC++なんですが、16GBの配列を扱うにはどうすればいいでしょうか
64bitで(
>>343 64bitコンパイラを使用すれば確保できますか?
今は64bitWin7で32bitコンパイラを使用しているんですが・・・・
しかし32bitでも使用出来るメモリは4GBですよね、なので4GBまで扱えるはずなんですが
unsigned にしてないとか
32bit版Windowsで使用可能なメモリは1プロセスあたり2GBまで boot.iniにオプションつけても3GBまで
ってOSは64bitだったか
cygwin64が現れてほしいと思うこのごろ
349 :
デフォルトの名無しさん :2012/11/24(土) 16:17:47.93
>>345 それでは負の数を表現できませんよね?負の数も扱うのでunsignedはつけれないんです。
>>347 やはり2GBまでですか、そこを何とか出来ませんかね。OS変える以外で
自分でメモリ管理すれば?
64bit版Windowsでも32bitプロセスが扱えるのは2GBまでだろ
何のためにサイズ用変数で負の数を扱うんだ?
353 :
デフォルトの名無しさん :2012/11/24(土) 17:01:22.13
>>342 #include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *a;
a = malloc(17179869184);
a[17179869183] = 'z';
printf("%p\n", &a[17179869183]);
printf("%c\n", a[17179869183]);
return 0;
}
Z:\>cl 342.c
Microsoft(R) C/C++ Optimizing Compiler Version 16.00.40219.01 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
342.c
Microsoft (R) Incremental Linker Version 10.00.40219.01
Copyright (C) Microsoft Corporation. All rights reserved.
/out:342.exe
342.obj
Z:\>342
000000053FC8003F
z
354 :
こ :2012/11/24(土) 17:46:58.04
ファイルから文字を読み込む際に一文字ずつの読み込みを一行目で 一端おわらせ、それをまた2行目から一文字ずつ読み込む方法をおしえてくださいm 、ファイルの文字数はわかりません
355 :
デフォルトの名無しさん :2012/11/24(土) 17:51:18.56
メモリの構造を考える時 一本の直線を考えるのか 平面を考えるのかどっちですか? どんな構造してるのか分からなくて
>>354 #include <stdio.h>
int main(){
int i;
char buf[1000], c;
FILE *fp;
fp = fopen("c354-2.c", "r");
while (fgets(buf, 1000, fp) != NULL) { /*get 1 line*/
for (i = 0; buf[i]; ++i) {
c = buf[i];/*get 1 character*/
printf("%c", c);
}
}
return 0;
}
358 :
こ :2012/11/24(土) 18:07:25.39
359 :
デフォルトの名無しさん :2012/11/24(土) 20:02:35.05
C言語って知的障害者でも理解できるほど単純なんだよな
361 :
デフォルトの名無しさん :2012/11/24(土) 20:13:07.97
頭にセンサー装置付けてそれでC言語解読してる C言語はひとつのファイルを大画面にしてみればいいから センサーかざせばいいだけ ソースファイル複数必要なjavaやperならそうはいかんだろ
C だって複数ファイルで構成することもできるんだけれども
できるけど、あえてする必要はないだろ。 Javaはソース分割必須だからな。
364 :
デフォルトの名無しさん :2012/11/24(土) 20:22:00.45
C言語考えた人達って複雑な思考ができない人だと思う(笑)
Javaでも必須じゃないよ
>>364 よう単細胞
今日も頑張って無性生殖にはげんでくれ
複雑にすると多人数で開発する時に問題が起きるから 複雑さの回避=ソース分割という流れになった。
ところでperって何?
369 :
デフォルトの名無しさん :2012/11/24(土) 20:32:41.44
とりあえず英語のコード書いといたらかしこく見えるキリッ それがC言語(笑) 簡単なことを大げさにしてるだけ(笑)
ソースファイルを分けるのは再利用目的がきっかけかと思ってた。
>>364 マルチが失敗したからユニな考え方にしたんだ
>>349 あんた、プログラミングに向いてないってゆーか
人間的に...バカだと思う
>>342 こいつも同じか(笑笑笑)
設計者、だれだ? オメーか?(笑笑笑)
322123132 131312313 213231221 CANDIDATES= 3 VOTES=9 ファイルの中身が上のような状態で(行列は例) 行数と列の数がわからない場合ファイルを読み込み数字のみを2次元配列に 格納するには(最後の3と9はいれません) どのようにしたらいいのでしょうか おしえてくださいorz
>>378 スルースキルは重要。
会社でもにちゃんでも。
オブジェクト指向プログラミングばかりしてきたんで、 クラスが無いこの言語ではどうやってプログラミングするかよくわかん そりゃー、構造体 + 関数で最終的にはオブジェクト指向みたいになるんだと思うんだけどね 実際プログラムをしようと思っても、コードが頭に浮かんで来ないのよね
へえ、こっちはまったく逆でどうやってクラスという表現に組み込めばいいのかしばらく悩みましたね。
383 :
382 :2012/11/24(土) 21:50:34.52
例えばよくある二分木を(ライブラリの支援なしに)一から表現しようとした場合、例えばjavaならどうする?c#ならどうする? 結構悩みましたしいまでも実は自信がない。
全部クラスに入れなきゃいけないから定数とか逆に不便 staticクラスとかそこまでするんだったらクラス外に作らせろよ
385 :
381 :2012/11/24(土) 22:25:46.80
>>382 自分だったらget/set + 計算用メソッド + privateなフィールドのクラスを作ると思う。
できるだけメソッドはprivateにして、必要に応じてインターフェイスとか作っちゃう
だけど、C言語だと2分木を実装するにしてもイメージが沸かない
VB6使っていた時も、正直クラスがなかったのでよくわからなかった。
>>384 >定数とか逆に不便
うん、ここら辺はどうにかして欲しいよね。
>staticクラスとかそこまでするんだったらクラス外に作らせろよ
クラスベースの言語の場合、データはすべてクラスに管理させるべきだと思うな
クラスの外に書いた場合スコープの問題(メモリリーク)とか、すでにあるクラス連携、誰が管理するのか等の問題が発生する予感がする
386 :
デフォルトの名無しさん :2012/11/24(土) 22:28:49.21
>>381 いや、せっかく頭に浮かんできているコードを
おまえがただ感情的に拒否しているだけだ
やってることは同じ、そこにこそ「わざわざ C」の意味がある
やってることは同じ、そこにこそ「わざわざアセンブラ」の意味があるように
やってることは同じ、そこにこそ「わざわざハード」の意味があるように
ひとつ下のレイアを理解する出発点はそこなんだよ
387 :
382 :2012/11/24(土) 22:34:03.88
>>385 各ノード(例のデータ+右+左のまとまりね)はどうする?
>>386 OOからCに来た方の視点は非常に興味深い。自分はまだOOがよくわかっていないだけになおさら。
>>377 格納領域をmallocで確保
1行の長さでVOTESの9を決定
行数でCANDIDATESの3を決定
二次元配列を使わない
>>381 1つのクラスの中に全部メソッド書く感じ
>>382 Cのファイル分割の単位がクラスの基本的な粒度に近いね
>>377 >322123132
>131312313
>213231221
この例だと、数字をどう区切ればいいの?
322123132
-> 3,2,2,1,2,3,1,3,2
-> 322,123,132
とか?
391 :
342 :2012/11/24(土) 22:42:25.15
392 :
デフォルトの名無しさん :2012/11/24(土) 22:44:18.22
初歩的な質問ですがお願いします fseek(stdin, 0L, SEEK_END) の0Lって何でしょうか? お願いします。
0Lはlong型であることを示す接尾辞Lで明示した0
>>393 なるほど!
ありがとうございます
ランダムアクセスは難しいですね
ランダムアクセス関係ない Cの基本的な文法だよ
>>395 すみません、それはわかっています
ついでに、ランダムアクセスも難しいですねという意味でした
すみません
>>388 ありがとうございますっmallocしらべてみます
>>390 すみません
3,2,2,1,2,3,1,3,2
です
398 :
デフォルトの名無しさん :2012/11/24(土) 22:52:02.97
DirectXの関数をCソースで使いたいんだけどどんな環境? WindowsならDirectXの関数は使えるはずなんだけど とりあえずグラフィック扱いたい どんな環境があるから教えてくれ 本に載ってない
399 :
デフォルトの名無しさん :2012/11/24(土) 22:57:55.72
文法だけ教えて環境は教えませんwwwwwwww っていう本が多いよな意地悪だ
401 :
381 :2012/11/24(土) 23:06:55.25
>>387 この位だったらあんまり意味ないけど、とりあえず2つクラスを作って様子を見てみる。
public class Node { /* データ、前のノード、次のノード */ } //interfaceも必要に応じて作る
public class NodeDataset { /*Nodeのインスタンスを保持、追加、検索など行う */ } //interfaceも必要に応じて作る
NodeDatasetをnewして2分岐を安全に管理できるようにするなー。ごめん、ダメダメな回答かも
>>386 厳しいなー。今までやった事ないC言語勉強して、わけわかんなくなってる。
そういう
>>386 経験ない?
>>389 なんか、データの管理が大変そうですね。
C言語は誰がデータを管理しているのかわからないから、難しいな
データは儂が管理しとる。
403 :
382 :2012/11/24(土) 23:18:44.16
>>401 いやクラスの方からのコメントはありがたい。私もその考え方にほうほうのていでたどりついた。
で、その class Node のメソッドはほとんど static ということでいい?
クラスに相当する構造体を作れ あとはそれを第一引数にする関数群を書けばJava厨でも安心だ!
406 :
381 :2012/11/24(土) 23:44:02.74
>>403 class Nodeにはstaticメソッド使っちゃだめ。
class Nodeの/* データ、前のノード、次のノード */ はインスタンス変数で宣言されているから、
メソッドもインスタンス変数にアクセスするためにインスタンスメソッドにしなくちゃいけない。
サブクラスとか作った時にstaticだとポリモーフィズムができないので、拡張性をに乏しい。
スレッド使った時に意味もなくstaticにすると、データの安全性など考えることが増える。
newしてインスタンスa、bを作るとメモリ上に別々に領域が確保されるので、どんな操作をしてももう片方に影響がでないのもstatic使わないメリットです。。
スレ違いになるので、この話はここまでにしませんか?
>>404 お前優しいな、頑張るよ
windowsプログラミングをしたいのですが、時間はどの構造体を使うのがベストなのでしょうか? time_tとか汎用的な感じでよさそうなんですけが
昔見たソースで構造体の中に関数ポインタを持たせて 無理やりクラスもどきにして使ってるのがあったな。
testにはsetTest()で値をセットしているのに、mainからtestの中身を参照できるんですか? testにセットしている1はsetTest()が終わった段階で、メモリから削除されると思うのですが int test; void setTest() { test = 1; } int main() { setTest(); printf("%d",test); }
411 :
382 :2012/11/25(日) 00:19:13.22
>>406 了解しました。
ヒントありがとうございました。これはまだ考察がたりないか。
>>409 testは、mainの{}の外にある(グローバル)から参照できる。
↓別の例でこれは駄目。参照できない。
#include <stdio.h>
int main()
{
{int x=123;}
printf("%d¥n", x);
}
413 :
デフォルトの名無しさん :2012/11/25(日) 00:52:33.84
C言語にもIMEパッドみたいなのあるの? いちいちinclude<stdio.h>とか打つの 面倒臭くてたまらんのだが?
その程度を打つのが面倒なら、C言語に手を出さないほうがいいよ
単語:include<stdio.h> よみ:いst
417 :
デフォルトの名無しさん :2012/11/25(日) 01:52:59.53
いやいや補助機能くらいあるエディタあるでしょうw 関数作ったらプロトタイプ宣言も自動でしてくれたり使わない変数消したら 宣言も消えるような機能とかないかな
スタジオHとかだじゃれで言ってた人を思い出した。
>>413 プログラミング用Editor使えば?
個人的には、Sublime Text 2、Emacs、vimはよく使う。
IDEならそれこそ色々とある。
>>413 定型句を登録できるエディタも多いよ。
探してみなよ。
emacsとかvimてオナニーだよな 使いにくいし効率悪い
どうせ設定書かずにデフォルトの状態で使ってんだろ
課題終わらん ここで聞くレベルでもないオワタ
viでイナフ
viってことはUNIX系OS環境にしてgccでやってるってこと?
vimが効率悪いとかアホすぎwwwwww 秀丸とかいう日本製の糞エディタでも使ってんの科wwwwv そんな糞エディタは世界中で日本人しか使ってませんよwwwww
そりゃそうだろうな
>>412 レスありがとう
グローバル変数はヒープに積まれるのですか?
>>427 vimってプログラミングするには効率悪いよね
あの人達はeclipseとかvs使ったことないのかな
インテリセンスの機能以外の全てがvimの方が上回っていると思うね インテリセンスにしてもJavaやC#ならまだしもC言語ならvimの補完で十分 プロvi使いの編集スピードを目にしたらそんなこといえなくなる
へぇ そう思うんだ
>>431 そのインテリセンスが一番大切なんだって
あとの機能はどうでもいい
インテリセンスなんて邪魔なだけ。 プロは全て手で打つ。脳と手を直結させて 魂を込めて打ち込むことこそ、最高のデバッグなんだ。
>>434 クラス名・変数名とか全部覚えている時点で、大した規模じゃないから
初歩的な質問ですいません。 このコードなんで、落ちるんですか? struct Hellow { char *msg; }; struct Hellow* h; h->msg = "hellow";
struct Hellowの実態がない
Hellow* hは単なるポインタであってHellowの実体がない
・読点の位置がおかしい ・Hellow
まあ確かに実体を確保していないから、なんだけど、 実際の動作としては ポインタhがどこも指していない(おそらく0またはとんでもないアドレス) 不定なアドレスhが指すメンバーにアクセスした瞬間セグメンテーションフォルト といったところだろうね。
442 :
436 :2012/11/25(日) 10:23:03.04
レスありがとうございます。 構造体の場合は、mallocするしかインスタンスを確保できないのですか?
struct Hellow h;
444 :
デフォルトの名無しさん :2012/11/25(日) 10:30:30.70
>>427 日本人による日本人のためのエディタを外人が使わないのは当たり前だろ
おまえこそ日本人のためのサイトに来てる時点で言動不一致だろうが
そんなに日本が嫌いなら共産党独裁国にでも帰化したらどうだ
それで徴兵にでも呼ばれれば祖国とは何かをイヤでも憶えることになるだろう
>>446 楽しそう
わしも組み込みCやってみたいけど敷居が高そうでなかなか手が動かないよ
VIMで書いたプロジェクトはMAKEとか入ってるから難解でチーム全員が難なく扱えるとは限らない その点VSを使えばソリューションファイルをダブルクリックするだけで良いのでチーム開発に向いている
Linux環境でソリューションをダブルクリックしても何も起きませんけど
Makefileもろくに書けないのが混ざってる時点で、そんなチーム終わってるよ むしろ足切りの意味で推奨できる
Makeみたいなビルドツールを全く使わずに作ってるものってあるの? windows限定のプロジェクトならまああるのか
MAKEがすでに老人のオナニーであり チームの足を引っ張る要因になってることを知らないのか
私は牌尊で美流度します 名句より可読性が高く、必要なら名句より精密な制御が可能であり、記述量も名句と大差が無いからです
関数名や変数名に漢字を使えるCコンパイラってありますか? いちいち英語の名称を考えるのが面倒で。
今どきMakeはなぁ configureとかも含めホント死滅してほしいけど、なかなかなくならない
>>455 代わりあるんですか?
Makeがなかったらどうやってコンパイルするんですか?
configureがなかったら何がMakefile作るのですか?
依存関係チェックだってやってくれるんですよ
make自体はコンパイラじゃねぇから
牌尊を使いなさい さすれば道は開けるでしょう
ある日、山田君(仮名)は自分のプログラムのデバッグをしていた。 ところが、いくらソースを直してプログラムを実行してみても、ちっともバグが潰れないのである。 あれ、何でCLに-cオプション付けてるの? そう、山田君(仮名)はMAKEを使っていなかったために、バチが当たったのである (「いくらコンパイルしても実行ファイルが更新されていなかった事件」)。
別にビルドツールがmakeだろうとVSだろうとどうでもいいけど
>>448 みたいなビルドツールを使えない人がいるチームは開発自体に向いてない
テスト実施部隊にでもなっておいて
まぁここはbjam使うという事でひとつ
実際、makeに執着してるとこなんて未だにあるの?
C をやるからには、単純化した概念でもいいからコンパイルとは?リンクとは?オブジェクトファイルとは?くらいは把握しておかないと。 (n)make にしても仕組みがわかればどうということはない。vs も裏ではこれらが走っているという気がするのだが。 お子様ランチじゃないんだし。
>>457 でもmakeってコンパイルを自動でやってくれるんでしょ
いちいち
gcc -o hoge -L/lib:/usr/lib hoge.c
とかいうのを何百回打ってられない
ほかにいい自動化ツールあるの?
牌尊ってググったけどヒットせず
アホみたいな造語使ってるやつは例外なく無能だからノイズとしてスルー
unixベースでツールのビルドからのインストールといったら configure make make install だからなあ
未だにimakeから脱却できない・・・ 個人的に使うには楽なんだよな、imake
世の中のOSなんてほとんどUnix系だし Windowsは異端
>>468 最新のハッカーの意見は、やっぱりWindowsw。
組み込み競技会場は製作者、視聴者みんな仲良しなのに・・・ここはケンカぱっかねw
>>470 そうなのか。
そのWindowswってOS、俺知らなかったわ。
組み込み入門したいんですがどんなハードを買えばいいんですか?
>>469 世の中でUnixじゃないパソコンOSってwindows以外なんかあるの?
Be/Amiga/MonaOSとかはメジャーじゃないから、そんなのはどうでもいいんだけど
MS-DOSとOS/2
DOSはOSじゃないよ。
CP/Mっていうのもあったな。
makeつかうならautotoolsだな。
お前ら、重箱の箱を突っつくようなOSが好きなんだな
ロボット掃除機の掃除パターンのプログラミングなんか面白そうなんだが USB接続できてSDK公開してるメーカーなんて無いよな ツカモトエイムとかCCPみたいな安いとこが出してたら即買いなんだが
パラメータが配列なのはムダなコピーが発生するので、普通使わないんでしょうか?
コピーが発生しません
>>482 ポインタで渡してしまうと副作用を持ってしまうので、プログラムの安全性は落ちる。
つconst
落ちたらどうだってんだ
487 :
482 :2012/11/25(日) 15:20:18.23
コピー発生しないんですかー。 それじゃ、なんでfunc()とmainでsizeof(intArray)/sizeof(intArray[0])の処理結果が違うんですか? void func(int intArray[]){ printf("%d", sizeof(intArray)/sizeof(intArray[0])); } int main() { int intArray[] = {1, 2, 3, 4}; printf("%d", sizeof(intArray) / sizeof(intArray[0])); func(intArray); }
488 :
482 :2012/11/25(日) 15:22:45.37
>>484 もしかして、constつけていないから安全性が落ちるってことですか?
うーん、javaとかc#だと引数にポインタがセットされるじゃないですか。
その考えで行っちゃうと、java/c#は安全じゃない言語ってことになりませんか
>>487 func側は配列のサイズ知らないからな。
これで結果同じだろ。 void func(int intArray[]){ printf("%d\n", intArray); } int main() { int intArray[] = {1, 2, 3, 4}; printf("%d\n", intArray); func(intArray); }
#include <stdio.h> void func(int intArray[]){ printf("%p\n", intArray); } int main() { int intArray[] = {1, 2, 3, 4}; printf("%p\n", intArray); func(intArray); }
>>488 Cの仕様では、配列はコピーされない。
また、巨大配列をその都度コピーしていると、無駄が大きい。
しかし実際には、関数で処理したい配列は、サイズも次元も色々ある。
そこで、関数に渡せるものは、”配列の先頭アドレス”と仕様で決めた。
因みに、以下の2つは同等。
void aaa(int a[]){/* do something */}
void aaa(int*a) {/* do something */}
494 :
482 :2012/11/25(日) 16:10:34.09
レスありがとうございます。 func側は配列のサイズ知らない。何故ならば、関数に渡せるのは先頭のアドレスだけだから。 ってことですね。 int main() { int i[] = {1, 2, 3, 4}; printf("%d\n", sizeof(i) / sizeof(int)); ←それじゃこの場合は、main()が配列iの最後のアドレスを知っているってことですか?
main内で定義してるからそりゃ知ってる 仮にmainがiを main(int i[])として外部から受け取った場合サイズはわからない
496 :
482 :2012/11/25(日) 16:19:08.36
>>495 つまり、最後のアドレスはOSが知っているんですね
大体理解したと思います。
C言語入門サイトはC言語の入門じゃなくて、プログラミング入門なんで
調べるの面倒ですねー
>>482 昔のCでは
・関数の引数として構造体を渡すことができなかった
ので、
・関数に構造体の内容を渡したいときは、構造体のポインタをわたしていた。
最近(といっても20年前)のCでは引数に構造体を渡せるようになった。
配列もそうなってもよかった、というのはひとつの考え方だが、過去のしがらみからできなかったのだろう。
・配列名に[]演算子がつかない配列名のみの場合は配列の先頭へのポインタ(アドレス)を示す、という奴がどうにもならない。
思想として複合的なオブジェクトをそのまま渡すのは
>>482 も感じている理由のとおりで、やらない、のが根底にあるかもしれない。
以上根拠のない推論。
>>497 >最近(といっても20年前)のCでは引数に構造体を渡せるようになった。
Cの歴史から見て、構造体を直接渡せるようになったのが「最近」と言うのは我田引水過ぎる。
引数で構造体を渡すのにCライブラリの補助が必要だからな
なんとなくANSI前後っていう感覚ではあるw
>>500 そうそうそれそれもう忘れた
>>498 語感として「最近」が不適切なら「ある時期から」にしておこうか
C覚えた頃は引数の書き方なんかも違ってたんだもんなー
何でC++に統合しないんだろうね?
何で統合すんだよ?
>>499 そういう処理系もあるが、不要な処理系もあるぞ。
個人的にはもう統合されちゃって欲しいな。
一応C++はCのスーパーセットという事になってるから統合とか必要ないだろ というか統合って何すんのよ
細かい違いを合わせてくれって事だろ。
普通にCのコード書いてC++コンパイラでコンパイルすればええやん
CはなんでCUIの勉強しんとあかんのや GUIだけの勉強じゃだめなんか?
GUIなんぞ書かなくていいなら書きたくないわ。
言語関係なく勉強しとけよ・・・
>>511 GUIは言語標準のライブラリだけじゃ手が出ないだろ。
なぜこれがシンタックスエラーとなるのですか? const int MAX_INDEX = 5; int array_tes[MAX_INDEX];
俺のコンパイラは許してくれた。
>>516 配列の境界は定数式じゃないといけないけど、
Cだとconstは定数式じゃないから。
C++だと定数式になる。
CとC++の違いの一つ。
>>519 thx
あなた、めちゃC言語詳しいね
それじゃ、define使えってことですねー
これは良い良スレ
clang で -std=c89 -Wall つけても怒られない
-pedantic つけたらようやく説教してくれた
C言語やっていて不思議に思うんだけど、なんでヘッダファイルってあるのかな *.cからヘッダファイルって作れる気もするんだけど プログラムをメモリ上に展開する際に関数も読み込まれるけど、それに関係しているのかな。 どちらにせよ、ちょっと面倒ですね。ORACLEのpackage書いてるみたい。
*.cに全部の情報が書かれてるわけでもないから自動生成は無理な気がする。
別にヘッダ読まずに int printf(const char *, ...); #define TRUE 1 とかゴリゴリ書いてもいいんだよ
別に*.cファイルをインクルードしてもいいんだよ
ソースファイルを分割してプロトタイプ宣言をヘッダに記述する、っていうのは そもそもの#includeの目的じゃなくて、後天的に完成された文化と伝統。 C自身はそんなものデザインしてない。
>>526 全て書かれてなければコンパイルできませんが。
Javaはインターフェース情報を.javaから生成するでしょ。
.hと.cで同一情報を重複管理するのはソフトウエア工学の原則に反する。
>>530 構造体のレイアウトとかヘッダにしか書いてないじゃん。
321 213 123 のテキストファイルから任意の行と列を読み出して2次元配列に格納するプログラムをつくったのですが 結果が0000000000になります。どうしたら正しく表示されるか教えてください。おねがいします orz int main() { FILE *fp; char *fname ="test.txt"; int c; double** matrix; int size_x, size_y; /* size_x 行 size_y 列 */ int i,j; scanf("%d%d", &size_x, &size_y); fp = fopen( fname, "r" ); if( fp == NULL ){ printf( "%sファイルが開けません\n", fname ); return -1;
>>532 }
//while( (c = fgetc( fp )) != EOF ){
// printf( "%c", c ); }
/* 左辺と = で 3. の青い矢印を生成*/
matrix = (double**)malloc(sizeof(double*)*size_x);
if (matrix==NULL) exit(1); /* 正常にmallocできたかどうかのチェック*/
/* このループで 4. 以降の処理 */
for (i=0 ; i < size_x ; i++) {
matrix[i] = (double*)malloc(sizeof(double)*size_y);
if (matrix[i]==NULL) exit(1); }
while( (c = fgetc( fp )) != EOF ){
for (i=0 ; i < size_x ; i++) {
for (j=0 ; j < size_y ; j++) {
matrix[i][j]=c;
printf("%d",matrix[i][j]);
} } }
for (i=0 ; i < size_x ; i++) {
free(matrix[i]); }
free(matrix);
exit(0);fclose(fp);
return 0;
}
>>530 分割コンパイルというやつだ。
ひとつのプロジェクトを構築するに際して複数のソースコードをコンパイル、生成したモジュールをリンク(結合)する方法がある。
>>533 他にも突っ込みどころだらけだけれど、改行が欲しければputchar('\n')かprintf("\n")で改行しておけ。
>>533 取り敢えず、"{"は行末に、"}"はインデントを除いた行頭に書くこと。
特に、"}"を1行に複数並べるのは学習中は避けるべき。
それと、一一鬱陶しいからcodepadかideoneに貼ってくれ。
>>530 >.hと.cで同一情報を重複管理するのはソフトウエア工学の原則に反する。
常識的コーディングでは重複して書かないでしょ。
.hは他の.cに公開するインターフェイスを書くことになるので、普通は宣言のみを書く。
.cには実体を書くことになる。.hに実体を書いてしまうとコンフリクトするし。
>>531 >構造体のレイアウトとかヘッダにしか書いてないじゃん。
私はよく構造体の中身を隠蔽するために、タグ宣言だけヘッダに置いたりするけどね。
>>537 > 常識的コーディングでは重複して書かないでしょ。
プロトタイプ宣言と実体のこと言ってるんでしょ。
>>531 コンパイラはコンパイル時に全部知ってる。コンパイラがインターフェースファイルを生成すればいい。
JavaやC#はそういう仕組み。
>>537 はQzだろう。外しっぷりが同一。
そしてCにもモジュールシステムを!と検討するという流れは昔から
>>516 gcc version 4.2.1 で
gcc a.c -pedantic -O2 -Wall
OKだった。
>>539 Cだとヘッダ読まないと全部知れないだろ。
Cはコンパイラのルールとしてincludeしないと存在を知らないように してしまっただけ。文句はK&Rに言え。 さらに言うと、includeは単に「外部参照を仮定する」だけなので、 同一名のグローバルシンボルが仮にあったとしても宣言通りである という保証はない。
java や c# のそういうところは、あれだ、コンパイラというよりはインタプリタだね 名前がみつからなかったらランタイムで止まるんでは?
>>533 http://codepad.org/P8kxOU27 問題点を挙げた。思い出しながら書いたので漏れがあるかも。
・読み込むデータ=int、格納領域=double。不一致。
たぶん「ポインタで2次元配列は…、ダブルポインタか。double**っと」みたいな流れかな。
・出力が0になるのはdouble型変数の値を%d指定してるから。この場合は「"%c ", (int)matrix[i][j]」がいいと思う。
・1文字読み込む毎にmatrix配列の全領域を読み込んだ文字で上書きしてる。1文字ごとにforしちゃいかん。
・ファイルから読み込む文字には\r\nがあるのを考慮してない。テキストモードだと0x0aがmatrixに格納されてしまう。
・ファイルの読み込みはX軸が先なので、matrixの確保も[x][y]ではなく、[y][x]にした方が自然(ループ処理的な意味で)。
今回はそのまま使ってみた。
>>541 >>取り敢えず、"{"は行末に、"}"はインデントを除いた行頭に書くこと。
ホワイトスミスやGNUを含めて、大抵のスタイルは上記を満たすぞ。
上記を満たさない比較的メジャーなコーディングスタイルはPico位かな。
一行野郎を含めて、初学者向きじゃないと思う。
549 :
デフォルトの名無しさん :2012/11/25(日) 23:19:54.82
>>545 逆に include しなくても知っているようだと
グローバル空間の汚染が即座に詰む
むしろ K&R は include を渋っていて
某オッサンのすごい剣幕に押し切られたのが # 系の起源
# 俺的には関数がデフォで extern なのが誤っていると今でも思っている
>>535 はい、ありがろうございますm
できればそのいろいろのほうもつっこんでくれるとありがたいです
>>536 すみませんでした行がおおすぎるといわれたので変に行をへらすようにしていました
以後codepadをつかいます。
>>547 すみません、いまみつけました、
わざわざすみません、ありがとうございますOTZ
>>424 自力で終わらせた後に気付いたけど
ありがとう
554 :
537 :2012/11/26(月) 08:40:44.45
>>539 >コンパイラはコンパイル時に全部知ってる。
コンパイルはユニット単位で実施されるので、他モジュールのインターフェイスまではわかりません。
プロトタイプ宣言が見えない場合に警告されるのはこれが原因。
>コンパイラがインターフェースファイルを生成すればいい。
C言語的にはユニットより上位の概念(VSなんかで言うプロジェクトとかソリューションとか)が無いから無理。
コンパイルだってワンパスで実施するようになっているので、おっしゃることの実現はまず無いでしょう。
もっと言えばプリプロセッサはC言語の範疇外とも言えますし、、、。
念のため
>>537 はQzではないです。
>>554 モジュールが参照できるようなインターフェースをコンパイラが生成すればいい。
他のモジュールの情報が必要な場合は、他のモジュールがコンパイルされたときに
インターフェースが生成されているので、それをインポートすればいい。
ところがCではインターフェースを手作業で.hに記述している。単なる手抜き。
>>555 入門編の質問スレで薀蓄を垂れるのは如何なものか。
高邁な思想に基づくのであれば規格スレでやればよろしかろ。
# と思ったら規格スレ自体はPart134が落ちて以来放置なのかな?w
>>555 そういうのはCじゃなくて、もっと高級な言語でやればいいんじゃないの?
CPPよりもっと高級で洗練された言語をカリカリに最適化されたバイナリ吐き出すようには出来ないの?
だから、
>>525 への回答は「コンパイラが手抜きしているから」であって、
>>525 が言い出したような「.cにすべての情報が書かれていないから」ではない。
.cにすべて書く事もできるだろうけど、書かない事もできるだろ。
C++なら、main以外の外部モジュールは全て.hに書けるかな。クラスとして
型宣言は最初に全部しないとだめなんですか? 型宣言 文 型宣言 文 とすると 定義されていない識別子です。 エラーを吐きます 環境は VC++ です。
>>562 古臭いCしか使えない場合は、ブロックの先頭に纏める必要があります。
なので>562の場合、こうなります。
--
void func()
{
型宣言
型宣言
文
文
}
--
或いはこうなります。
--
void func()
{
型宣言
文
{
型宣言
文
}
}
.cならエラーだろ .cppなら通るだろ
>>563 >>564 お早いレスありがとうございます
.cppの時に出なかったのに.cだと出るようになったので気になってました
>>555 >ところがCではインターフェースを手作業で.hに記述している。単なる手抜き。
単なる手抜きと言ってしまえばそのとおりだけど、それがCの基本思想となっている。
とにかくCはコンパイラが簡潔に書けるようになっている。
これがコンパイルの実装が容易であることにつながり、様々な環境で
Cコンパイラが使える背景になっている。
>>557 さんのおっしゃるとおり。
他のソースの関数宣言を自動で参照するとか、 Cの開発された時期を考えればありえない。 JavaとかEclipseとかリソースが余って余って仕方ない今だから出来たこと
ヘッダすら書けない低能がCの仕事をハッタリかまして引き受けて逆切れしてるのか?
getcharって初期化しないと履歴残るんだ 知らなくて困った
scanfも履歴残るんですか?
履歴? 何の話? 端末エミュレータの話ならスレ違いだよ。
572 :
デフォルトの名無しさん :2012/11/26(月) 16:46:39.40
以前の入力を端末が憶えてるってアレね
>>571 言葉を間違えました
履歴ではなく、保持されるです。
演算中の 'char' 型と 'bool' 型の混用は安全ではありません と警告が出るのですが、絶対に避けるべきでしょうか
>>574 そういうふうに質問する人は避けるべき。
何故その警告がでて、無視しても安全なのかわかっている人は、無視してもいいかも。
576 :
デフォルトの名無しさん :2012/11/26(月) 18:11:14.44
どんなコードについて言われたのか知らんが ほぼ間違いなく都市伝説だぜ、それ
>>573 =569
何がどう保持される話なのか判らんから、具体的に頼む。
そもそも「getchar()」と「初期化」がどう関係するのやら。
>>575 ありがとうございます
わかる人間になれるよう勉学に励みます
>>579 #include <stdio.h>
int main(void)
{
char a;
printf("A〜Cまでの整数を入力してください。\n");
a = getchar();
(a==('A'||'B'||'C')) ? printf("正解です。\n") : printf("間違いです。\n");
return 0;
}
釣り乙
> (a==('A'||'B'||'C')) ? printf("正解です。\n") : printf("間違いです。\n"); (a=='A'||a=='B'||a=='C') ? printf("正解です。\n") : printf("間違いです。\n"); じゃねえの?
>>582 (a==('A'||'B'||'C')) ? printf("正解です。\n") : printf("間違いです。\n");
を実行してなかったから間違いに気づかなかった
ありがとう
実行するとかしないとかの問題じゃねーだろw
(a==('A'||'B'||'C'))はまず('A'||'B'||'C')が評価されます。ここは定数なので、常に1
これとaを比較しているので、真偽値とcharを比較してるけど、なんか勘違いしてないか?って警告ですね。
やりたいことは
>>582 だと思う。
あとこの処理を、条件式で書いちゃうのはセンス無いと思う。
素直にif文で書くほうがよい。
>>580 それと、getcharの戻り値の型はintなのでaもcharではなくintにすべき。
プロトタイプだけ抽出するオプションがあったような‥‥‥、bcc32 でしたっけ。
588 :
デフォルトの名無しさん :2012/11/26(月) 19:18:54.04
見るからに3項をとにかく使ってみる練習だろ、センス以前の話として printf((a = getchar()) == 'A' || a == 'B' || a == 'C' ? "正解" : "間違い"), puts("です。");
>>588 こうじゃね?
printf("%sです。\n", (
((a = getchar()) == 'A') ||
(a == 'B') ||
(a == 'C')
) ? "正解" : "間違い");
>>585 センスどうこうは、この流れで関係ないだろ。
三項演算の練習問題だろが。
お前みたいに、他人のコードを見ると反射的に
批評を始める輩がいるから揉めるんだ。
>>585 三項演算子の事を条件式って言ってんの?
('A`||'B'||'C')
>>591 三項演算子は"演算子"なので ? : のこと
三項演算子を使った式 式1 ? 式2 : 式3 全体が"条件式"
>>590 条件式は値を持つことがポイントになるので、条件式を使って題意を満たせとなると、
>>589 のような書き方が良い。
>(a==('A'||'B'||'C')) ? printf("正解です。\n") : printf("間違いです。\n");
はprintf("正解です。\n") もしくは printf("間違いです。\n")の戻り値が評価結果となり、
それを捨てている。これはわざわざわかりにくい書き方をしていると思う。
条件式を使う場合、評価結果の値を使うようなコードが適していると言える。
>>593 ここはコードレビューをするスレじゃないでしょ。
人のコードに横から勝手に良いだの悪いだの批評付けるなっての。
595 :
デフォルトの名無しさん :2012/11/26(月) 21:15:02.72
>>590 わざと揉めることによって何か得ようとしていた節がある
3項はグループ
条件は特定の演算子
そして3項の唯一のメンバ
こっから switch 的な 2< への爆発が見られたら面白いのに
それが配列として実装されるか、クロージャとして実装されるかは知らんが
# 明朝これをみて赤っ恥だろうけど、今はいいんだよ!! おらぁ おらぁ
# スピリッツが今年は物流の名作がそろい踏み幻で、ペルツォフカとレモニナーヤだぜ
古いフラックスの煙が安葉巻よりイケてるんだよ、ちきしょーめ
(a=='A'||a=='B'||a=='C') ? printf("正解です。\n") : printf("間違いです。\n"); 初心者にはこれが一番わかりやすかったです。
それよりも if (a=='A'||a=='B'||a=='C') { printf("正解です。\n"); } else { printf("間違いです。\n"); } と書いたほうがいいと思うよ
>>597 >596って見づらい?
ってかセンスってなんなの?
誰が見てもわかりやすいってのがセンスの定義なの?
定義じゃないよ 一つの基準にはなりうるだろうが
構造体Test.msgはどのようにすれば開放できるのでしょうか? 一括でfreeしたいんですが typedef struct { char* msg; } Test Test *t; t = (Test*)malloc(sizeof(Test)); t->msg = (char*)malloc(sizeof(1024)); //これをどうやってfreeするのか?
exit(0);
2回mallocしたなら2回freeする free(t->msg); free(t);
604 :
601 :2012/11/26(月) 22:17:43.53
>>602 malloc()したあとに、exit()するとmalloc()されたメモリはどのようになるんですか?
メモリはプロセスごとにOSが管理しているので、普通に考えたらヒープまでクリアしてくれそうな気がするんですけど
>>603 回答ありがとうございます。
楽する方法はないってことですね
605 :
デフォルトの名無しさん :2012/11/26(月) 22:18:51.33
変数とパラメータの違いって何ですか? int x,y,t t=boolean; x=2t; y=t^2; 二つの変数に共通する変数はパラーメータですか? 日常では何気なく指標の事をパラメータと呼んでおりますが。 xとかyはパラメータとは言いませんか?
malloc()っていちいちNULLチェックするのめんどいね。 malloc()をラップして、NULLが来たらばassert()/exit()で落としていいかな? assert()をリリースビルドした時に消えますーってツッコミとかはないしで
#define free(a,b) (free(a->b),free(a))
>>607 自分でも言っているように、assert()は無意味だね。
exit()はある意味ありだよ。
実際、そうプログラミングしている市販アプリも少なくないし。
>>598 >全体は条件式じゃないよ
全体が条件式
条件演算子=三項演算子で、条件演算子を使った式が条件式。
611 :
デフォルトの名無しさん :2012/11/26(月) 22:45:22.30
指標はバロメーターだろ。
変数=variable (仮)引数=parameter
i=0;a=matrix[i][j]; for(b=1;b<=candidates_x;b++){ for(j=0;j<=votes_y;j++){ if(a=b){count++;} } printf("candidates%d=%d\n",b,count); count=0; } matrixの左端の縦の1列に格納される値が1の数、2の数を表示させるにはどうすればいいでしょうか
>>605 高校数学では「パラメータ」は「媒介変数」、
>>605 では t がパラメータと呼ぶにふさわしいのですが、プログラミングの世界では正直、まっとうな使い分けとかはないようです。
関数の実引数や仮引数を適当にパラメータと読んでいる感があります。
の前に if(a=b) という謎物体があんぞ
実引数=argument
仮引数と実引数をargumentとparameterで使い分けるのは曖昧だけどね
>>617 あああああああああああああああ
ありがとうございますorz
621 :
614 :2012/11/26(月) 23:36:39.57
>>620 配列
3
2
2
1
なのに
全部0になりましたorz
622 :
614 :2012/11/26(月) 23:38:42.28
>>613 X (仮)引数=parameter
O 仮引数=Dummy argument
O 実引数=Actual argument
>>622 55行目、ループ制御変数を参照している行が何故かループの外にある。
だから、変数はスコープ内に閉じ込めた方がいいのだよ。
なんでmatrixはint**ではなくdouble**なんだ?
それ、もう何度も指摘されているのに直さないんだよな。 やる気ないなら死ねばいいのに。
>>605 >変数とパラメータの違いって何ですか?
変数とパラメータとでは、目的が違う。
パラメータ
→システムの状態変更を指示、または測定結果を得るためのもの。
状態指示は例えば、図形の長さを10cmにするために、xLength=10としたりする。
また、"R"なら右へ行け、"L"なら左へ行けなどの方向を決めたりする。
状態を動的に変えたければ、変数(variable)を使うのが合理的。
目的に依っては、パラメータの値は固定でも良い。
測定結果を得るためには、大抵は変数を使う。
変数
→文字通り、固定の値では不都合な場合に使う。
ついで:
プログラムの複数箇所で同じ値(固定値)を使いたいことがある。(バッファ長とか)
目的から言えば、ソース中に固定値を書いても動くが、メンテナンスしにくくなる。
この回避のために、”変数であるが固定値として使う”やり方が
const int n = 123;
など。
630 :
こ :2012/11/27(火) 01:24:00.87
>>624 ありがとうございます、
if内に入ってないみたいでforのブロック内にいれてみたけど
だめでした、
>>625 すみません、データ型自体あまりわかっていませんでした、なぜprintf("%c ",(int)matrix[i][j])
が%cになるかもよくわかりません
>>629 そうです、苦しんで覚えるC言語のサイト読んでたりした時間もありますが
4日やって自分でできたとこなんて
>>622 のl55〜60ぐらいです、それもできてなかったけど
もうなんにもできねえ、、、、、
631 :
こ :2012/11/27(火) 01:28:09.38
でもc言語勉強してると時間経つのはえぇぇ とおもったら勉強してるんじゃなくて、どうしたらいいか、考えるのが時間経つのが早いのかおやすみなさい
>データ型自体あまりわかっていませんでした 過去形にするなよ。まるで、今はもう判っているみたいじゃないか。
今年の 10 月から C 言語を学習しているものです。 分からないことがあるのでよろしければ教えてください。 コンパイルコマンド(?)の入力のしかたについて ideone.com/9kwdqD よろしくお願い致します。
>>633 何がわからないのかわからない状態だと思うので最低限
必要な情報だけ書いてください。
・使っているCコンパイラ
これがわかればある程度はアドバイスできるはず。
>>633 バックスラッシュは無視して、そのかわりに一行で全部続けて入力するのがわかりやすいと思います。
>>633 肝腎の、example.cの1行目でエラーと言っているのだけれど、その内容は?
問題のコマンド行自体はオプションに対するエラーしか起きていない。
>>633 もしかして、//コメントを使ってないか?
>>633 >/* ペースト時に改行されているとまずいとおもったので改行を取り除くと */
home-2:desktop home$ gcc example.c -ansi -pedantic -Wall -Wextra -Wstrict-prototypes ¥ -Wmissing-prototypes -Wmissing-declarations ¥ -fstrict-aliasing -Werror
¥が余分。
>example.c:1: error: expected identifier or ‘(’ before ‘/’ token
cc1: warnings being treated as errors
>>639 の指摘のように、//コメントを使った時のエラーだね。
>>641 あちこちに同じ事書いてるアラシだから放置。
1<1 1<=1 上記2つの真偽がわかりません 教えてください 理由も添えていただけると幸いです
>>643 アセンブラちっくに説明すると、
「<」は左辺から右辺を引いた結果が負の数であれば真となる。それ以外は偽。
「<=」は左辺から右辺を引いた結果が負の数か、0であれば真となる。それ以外は偽。
>>643 より厳密なことは数学いたに行って聞いたほうがいい
>>644 ありがとうございます
とてもわかりやすいです
これですっきりしました
いえいえ
ぃぇぃぇ
なんか礼儀正しくてワロタww
650 :
デフォルトの名無しさん :2012/11/27(火) 17:18:25.18
乱数の設定について何ですが、 if(argc < 2) { // プログラムの引数が足りない場合 printf("Usage: %s [SEED_NUMBER]\n", argv[0]); exit(1); } else { srand(atoi(argv[1])); } これって一体何をしているんですか?? あと、引数が足りない場合とはどういうことなのでしょうか??
codepadがしかばねのようなんだが、よくあるの?
>>622 がみれにゃいの。
>>650 とあるコマンドを引数なしで動かすと使い方が出るようにしている
UNIXぽさの演出
>>650 randはsrandを実行しないと、実行するたびに同じパターンの乱数を生成するので、
srandに毎回違う値を渡して実行しないとダメ。このへんはrand, srandでggrks。
argcはプログラムを実行した時のコマンドライン引数の個数が格納される。
コマンドラインで
>sample.exe ……………@
と実行すると、argc=1, argv={ "sample.exe" } が格納され、
>sample.exe 12345 ……A
と実行すると、argc=2, argv={ "sample.exe", "12345" } が格納される。
よって、引数がたりない場合(@)は、自身の使用方法を以下のように表示してプログラムを終了(exit)する。
Usage: sample.exe [SEED_NUMBER]
引数が1個以上ある場合(A)は、srandに引数の値(文字列)を数値化したものを渡して乱数を初期化させている。
条件式っていうのは、3項演算子なら?の前の部分、if文ならカッコの中だな。
657 :
デフォルトの名無しさん :2012/11/27(火) 21:03:11.05
C言語のビット論理演算子って不要にもほどがあるだろ アセンブラでもないのに必要ないじゃんww
>>657 お前にはC言語は不要だよ 馬鹿に念仏、必要ないじゃん らくがき帳のウラに得体のしれないらくがきでも書いてろよ
ローコストのPCで早く動かせるコードは価値がある。 世界はローコストPCで溢れている。
#include <stdio.h> int minarray(int data[], int from, int to) { ここを埋める } // int main() { int i; int data[] = {1, 8, -3, -5, 2, -7, 4, 10, 5, 3}; int ans; ans = minarray(data, 0, 9); printf("%d\n", ans); /* -7 */ ans = minarray(data, 6, 9); printf("%d\n", ans); /* 3 */ ans = minarray(data, 0, 2); printf("%d\n", ans); /* -3 */ ans = minarray(data, 2, 3); printf("%d\n", ans); /* -5 */ return 0; } 関数に入った途端意味不明になった from以上to以下の数値を配列から引っ張ってくるという動き なんですがよくわかりません
まだ昨日のif文で議論飛ばしてたのかよ とプログラム上げた本人が言うのもなんだけど
>>660 ちげー
添え字だよ
from to は添え字だよ
その添え字の範囲の中での最少だ
"ちげー"とか”AUTO”って、どこのDQN用語?
>>660 int i, min = data[from];
for ( i = from + 1; i <= to; ++i) {
if (min > data[i])min = data[i];
}
return min;
hoge->hoge(x, y); のような書き方のコードを見たのですが、C言語でこのような書き方はどうやれば出来るのでしょうか 調べるためのキーワードだけでも構いません。 上に書いたのは、うろ覚えで申し訳ないですがよろしくお願いします。
関数ポインタを要素に持つ構造体
アロー演算子
>>664 ありがとうございます。
どうすれば、そういう発想ができるのでしょうか?
場合分けが多いとき、間接コールの方が負荷が少ないからじゃね
>>669 「c言語 配列 最大値」とか「c言語 配列 ソート」とかでggrks
基本的なアルゴリズムは触れておいた方がいいよ。
全部覚えられなくても、こんなやり方があるのかというのを知っているだけでも
発想の元ネタになる(というか、既存の処理を探してコピペで解決できる)
>>669 >>664 はオーソドックスな方法だと思う。
例えば、from=3、to=5の場合、最小値はdata[3]、data[4]、data[5]のどれかになる。
最小値(min)は事前には不明だから、取り敢えずmin=data[3]としてみる。
あとはminとdata[4]を比べて、min>data[4]なら、min=data[4]とする。
次にminとdata[5]を比べて、min>data[5]なら、min=data[5]とする。
つまり、
min=data[3];
if(min>data[4])min=data[4];
if(min>data[5])min=data[5];
だが3,4,5は偶々その値だっただけで、上記のようなソースにすると、他の値の場合に対応出来ない。
そこで変数iを設けて、
for(i=from+1;i<=to;i++){
if(min>data[i])min=data[i];
}
とやる。
C言語に慣れてきたら、『プログラマの数学』などのアルゴリズムの本も読んでみたらいいと思う。
アルゴリズムなんて知らなくても、普通にちょっと頭を使えば
>>664 くらい自分で思いつくだろ
なにその毒にも薬にもならない書き込み
675 :
669 :2012/11/28(水) 21:02:30.84
申し訳ありません、何分文系でアルゴリズム思考などてんで 苦手なもので
>>669 とか、こりゃかなり根深いんじゃねーの?
ここで答えてるヤツの殆どが
Cの教科書の例題とかやってるときに
>>664 とかの方法がパッと思い浮かんだんだろ きっと
教科書とかのステップ通りにやっていって
順当に思いついたんだよ
教科書の著者もそれを期待してる
だからそこに例題をおいとく
それをやる方法の断片は教科書とかに大量に載ってるけど
その方法の思いつき方自体は、教科書とかには載っていない
載せれるわけがねーもん
存在しないから
大なり小なり
この手の発想・着想・思いつきは先天的なモンじゃね?
経験だよ。全ては経験。 実践的な仕事の場で、納期に追われレビューで叩かれして プログラムを組む。それでこそ経験値は上がる。 なんでかって言うと、「実践の場=問題渦巻く場」だからな。 大抵の問題はすぐに一通り経験できてしまう。 全くの素人が入門書やサイトの記事を読んだって ハローワールド以上の経験値は得られないんだよ。
>>676 ,677
教育否定のブラックですね、判ります。
679 :
669 :2012/11/28(水) 21:49:56.26
私がプログラミングの才能がないのはもう自覚しています。 そもそも数学的教養がないので土台無理な話です。 最悪な考えですが、少なくとも単位は取りたいと思っているので 頑張っている次第です。
A〜Fは1ビットで、 a=DA y=EB c=FC てな感じで二進数が3つの変数a,b,cに入ってて 二進数でABCDEFを得るのに、今はこうしてます c<<4&0x20|b<<3&0x10|a<<2&0x8|c<<2&0x4|b<<1&0x2|a&0x1 これより短いか速いコードはありますか?もっとビットが増えるときは?
しとらんだろ
>>679 どんな分野にせよ、人になにかをしてただくために、1から手順を決めていくという場面がくるのではないでしょうか。取扱説明書を作るとか、いずれは人に指示をだすとか。
プログラミングは結局、計算機にしてもらう仕事の手順を定めることですから、これは対象こそ人ではないけれども、いずれ必要とされる能力・技能を今訓練しているということかと。
今ばらばらにならんだトランプをエースからキングまで順番に並べなおすとすれば、その方法を例えば6才の人間に説明するとすれば、どういう説明がいいだろうか?
そう考えるとプログラミングもあながち「文系」向けかもしれませよ。
計算機は、実際のところ計算とは関係ない作業に応用されることの方が多いとおもうのです。
>>680 FEDCBAになってね?
本当に速さを追求したいなら、
FEDCBAとするのをあきらめて、FCEBDAで済ませられないか考えるか、
a, b, c にそれぞれ2ビット入れるんじゃなくて、
a1, a0, b1, b0, c1, c0にそれぞれ1ビット入れることを考える。
こんな小さな素片で議論するより、大局的に何をしたいか示した方がいいよ。
遅そうだな
>>680 (a*68&72|b*34&36|c*17&18)>> 1ドヤァ
>>634-640 遅くなりましたがありがとうございました。
gcc example.c -ansi -pedantic -Wall -Wextra -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -fstrict-aliasing -Werror
で無事コンパイルできました。
下部にでているエラーは推察された通り // をコメントにつかっていることによるものです。
今習っている C は一応「古いもの」で、仕様しているコンパイラは「新しい」C に対応している様で
それを細かく確認する手段のひとつとして知りたかったのです。とても助かりました。ヾ(๑╹◡╹)ノ"
>687ソノ線で行くなら (c*20&36)|(b・・・なんじゃねーの?
690 :
デフォルトの名無しさん :2012/11/29(木) 05:19:24.23
肩痛い
↑放射能のせい
知ってた
ffmpeg関連のプログラミングスレってないの?
うん
あいう,10,かきく,20 ↑のような文字列を %s,%d,%s,%d みたいな感じで分割して変数に入れる関数が あったような気がするんですが思い出せないので教えてください
strtokじゃないやつです追記すいません
fscanfでした自己解決しましたすいません しかもこれファイルからだしなんかいろいろひどい質問でしたごめん
sscanf();もある。 ただし、区切り文字は「,」ではなく半角SPで
区切り文字「,」もできるでしょ
それはどうかな
704 :
547 :2012/11/30(金) 14:39:37.98
>>622 http://ideone.com/SvDNar 前に提示したソースで、matrixjへの格納がx列・y行になってました。すみません。
色々直してソース中にコメント入れてます。
ただ、プログラムの目的・仕様が不明なので(候補者数・投票者数とファイル内容の対応が分からなかった)、頓珍漢な可能性大ですw
一応、入出力の結果は以下の通り、左端の投票数(?)を出しています。
候補者数と投票者数を入力 >4 3
3 2 1
2 1 3
2 1 3
1 2 3
candidates1=1
candidates2=2
candidates3=1
candidates4=0
>>704 以下エスパー。
数字は候補者番号。
1行が投票者1人分の投票データ。
int main(void) { int i = 1; while(i){ printf("整数を入力してください。\n"); scanf("%d",&i); printf("%dが入力されました。\n",i); } printf("繰り返しが終わりました。\n"); return 0; } 条件式は while(i != 0) でも変わらないのであえて省略するとわかりづらいでしょうか
>>706 1.iにtrueが入る処理なら、while(i)
2.iが0以外で処理続行なら、while(i != 0)
706の例は2。
この規模ならどっちでもいいと思いまーす ソース読解力がなくていつも残業してる僕ですらぱっと見でわかりますし。 んで条件式が複雑になったり、条件に使用している要素の変更条件が複雑だったり、whileブロックが1画面越えるようなら分かりやすく書いたほうがいいと重いマース でもこの程度の差分でどっちにしようか迷うなら、分かりやすいほうにしとけばいいと思いまーす
重箱の隅をつつくなら ゼロは整数
711 :
デフォルトの名無しさん :2012/11/30(金) 19:15:37.86
明日朝から月曜朝まで泊まり込みが確定した。鬱だ 今日は早く帰ってきたから早く寝よう
俺も泊まり 仕事はやくなりてーよ
質問です。 gccとmakeで開発しています。C++でなくCの範囲での開発です。 適切な値が代入されないまま、関数ポインタによる呼び出しが行われてしまうのを 回避する方法を探しています。 以下に例を示します。
716 :
715 :2012/12/01(土) 23:10:35.75
struct handlers { void (*handler_1)(int); void (*handler_2)(int, char); // ここに追加(1) }; int main() { struct handlers obj[10]; //構造体メンバを初期化する何らかの処理←ここの修正をし忘れる (*obj[1].handler_1)(1); (*obj[1].handler_2)(1, '2'); // ここに追加(2) }
717 :
715 :2012/12/01(土) 23:12:37.74
問題は、handlers構造体の仕様を変更、特にメンバを追加したときです。 上記のソースコードに、(1)構造体宣言にメンバ(関数ポインタ型)を追加し、 (2)main()内に呼び出し文を追加、 するところまでは良いのですが、ここでプログラマがミスをして、 新たに追加されたメンバを初期化するコードを書き忘れたとします。 コンパイルは成功してしまい、プログラム実行時に異常が発生してしまいます。 追加メンバ分の初期化コードの書き忘れを、C言語の範囲内で、 コンパイラのエラーや警告で検出する方法はないものでしょうか? ただし、プログラム実行時のチェックによる方法は不可とします。
つまりはコンストラクタの代替物がほしいのか?
「構造体の一部の領域を書き換えていないときに、コンパイルエラーを出す方法は無いか」 という質問じゃないか?
720 :
715 :2012/12/01(土) 23:23:16.20
純粋仮想関数をC言語で実現できないか、とも言い換えられるかもです。
実行時チェックがイヤなら、プリプロセッサみたいなので字面を解析するしかないっぺ
722 :
715 :2012/12/01(土) 23:39:32.78
同じマクロを使って、構造体宣言とメンバ初期化関数(コンストラクタ)とを生成する方法を試しましたが 「;」はマクロのパラメータにできたのですが 「,」(コンストラクタの引数リストにしてコンパイラに警告を出させる) は不可で断念しました。他にも初期化子{}を使う方法も試したのですがダメです。 makeでプリプロセッサ通させるという方法はよさげです。 どうもありがとうございました。
構造体の定義とメンバの初期化に必ず専用のマクロを使うみたいに決めておけば、 比較的簡単に初期化忘れをチェックできるような気がする。
わざわざ解析してまで調べたいのか・・・ それなら既存のソース解析ツールとかで引っかからないのかね
725 :
715 :2012/12/02(日) 01:34:30.32
gccのオプション-Wallで有効にならない警告オプションの
-Wmissing-field-initializers
を付ければ
>>722 でダメだったと言っている{}を使う方法で大丈夫そう?な感じです。
void func_1(int); //どこかで定義
void func_2(int, char); //どこかで定義
struct handlers org = { func_1, func_2 }; //←構造体にメンバを追加すると警告。-Wallだけだとパス
...
obj[1] = org;
いろいろアドバイスありがとうです。
・構造体の全てのメンバーにハンドラーを設定する という関数を作れば引数としてハンドラーが必要になるから 代入忘れはなくなるんじゃないの?
という関数に引数追加するのを忘れたり、関数の中で代入し忘れたりするからダメだろ。w 構造体の定義からその関数を自動生成するなら可能だが。
ものすごく原始的で頭の悪い方法をとってるようにしか見えない。 そもそもハンドラーってダイナミックに差し替えるようなものか? 初期化処理で一気に設定して終わりみたいな性格のものだと 思うんだけど。
729 :
デフォルトの名無しさん :2012/12/02(日) 10:17:18.12
>>729 C言語の問題じゃないなぁ。データ構造もよく判らんし、もっと汎用のスレでやりたいことをきちんと説明してみてはどうだろう。
そういうの 小町山やらfour forsでやったことあるな
int array[X][Y]; とかして、右括弧なら array[x][y]++;、左括弧なら array[x][y]--; とすれば良いのでは?
というわけで超ヒント 群になる 単位減は何もカッコをつけないE
>>727 引数忘れたらコンパイルエラーになるし、関数の定義は一度しかやらないから
そこだけ気をつければいい。
リスクは発生確率と一緒に考えないとね。
まあ、ごちゃごちゃ言う前に単体テストをしっかりやれば済む話だと思うが…
>>728 それは、案件次第。
>>729 ”(”と”)”の組み合わせ全てから、矛盾する(数がアンバランス、途中で右括弧が多すぎる)ものを除外。
>>734 あほ、構造体の関数ポインタメンバーが追加になるたびに修正が発生する。
その時の修正漏れを検出するのが目的だ。お題を理解できないバカは引退しろ。
738 :
685 :2012/12/02(日) 12:30:05.09
while(){い for(b=1;b<=a;b++){ for(){if(){}} else{ for(){ while(){}}あ} if(){} } といった文であの中にはいるといに戻りたいんですができるでしょうか? 戻りかたをおしえてください
739 :
デフォルトの名無しさん :2012/12/02(日) 12:31:14.17
741 :
デフォルトの名無しさん :2012/12/02(日) 12:36:47.71
ちゃんと改行しろや 見づらすぎる
742 :
740 :2012/12/02(日) 12:42:43.46
>>738 括弧の対応があっていないな。
continue;は撤回だ。
それと、「あ」「い」とかやめてくれないかな。
> といった文であの中にはいるといに戻りたいんですができるでしょうか?
だと文章と混じって頭で分解する無駄な手間がある
「☆」「★」とか、いかにもコードに使わない目印にしてほしい。
何様だ 質問をくれてやってるんだからありがたく頂戴しろ 文句ばっかり垂れやがってカスが
質問が不完全です。 訂正してか再度よろしくお願いします。
笑えるw
goto; を使えばどこにでもジャンプできるさ
Yes! We can fly!
余談だけど、以下の例。 int main() { int i; for (i = 0; i < 10; i++) { LOOP:; if (i < 100) { //continue; goto LOOP; } } } この場合、 ・continue だ i++ が行われる (10回でループを抜ける) ・goto を使うと i++ が行われない (無限ループ) ので、注意
× > ・continue だ i++ が行われる (10回でループを抜ける) ○ > ・continue だと i++ が行われる (10回でループを抜ける)
case a of 1 : begin 文 End; case b of 1: begin end; でなぜか定数式が必要ですと言われるのですが、、、
これ何だろ vbに似てるけど違うしな
>>747 in other words, ... Fly me to the moon !
いあなわああぁあああいらああああゔゅうううううぅ
>>752 知ってる言語の中だと Pascal に近いけど、まあスレ違いだな。
あ〜あ
これからC言語を勉強しようと思ってるんですが、有効な勉強法や覚えるコツなどオススメなものがあったら教えていただきたいですm(__)m
>>757 構文覚えたらなんでもいいからたくさん作れ
>>757 Cを学ぶ強い動機がない人が
独学をしても三日で挫折する。
大学の情報工学関連の学部に入ってみなさい。
死ぬ思いをして4年間課題をこなせば嫌でも身につくよ。
無謀かどうかは本人次第だから、なんとも言いがたいけど、 何でまた 27歳にもなってCなんかにかかわろうと思ったんだ?
>>763 転職したくてねー。
今は全く畑違いの仕事してるんだけど、プログラム関係の仕事でどうしても入社したい会社があるから20代のうちに勉強しとこうかと思って。
未経験歓迎な求人だけど、ある程度下地くらいはあった方がいいよね?
俺は17だたつた10ねんしか違わない
そうなると話は別だ 書くなら今すぐ書けそうでないなら帰れ
だからこれから休日・休憩時間・通勤時間・就寝前フルに使って猛勉強するつもりだ。 ちなみに工業高校卒業したときのポケコン(シャープP-850S)が家にあるんだけど、あれってC言語書けたりするの?
>>738 @そもそもループが多重になるような記述は避ける
(意味のある関数を作って分ける、縦に並べて処理するなど。せいぜい2ループまで)
Aループの構造を変更し、条件一致=ループの繰り返しではなく
条件一致=関数終了(return)となるように工夫する(可能であれば)
Bどうしてもというなら↓みたいにするしかない
int loop = 0;
while(){
for(){
while(){
if(a==1){
loopbreak = 1;
break;
}
}
if (loopbreak) {
break;
}
}
}
みんなgotoとか使ってるの?
>>764 javaからがいいんでない?
Cを仕事で使う機会って最近は限られてるよ。
組み込み、unix、ios(objective-c)他なんかあるかね・・・
javaならオブジェクト指向プログラミングの基礎にもなるし、他の言語に通ずるとこ多いから
771 :
770 :2012/12/02(日) 16:18:19.82
>>764 あと未経験歓迎なら勉強する前にすぐ行ったほうがいいと思うよ
若いうちというのは将来を買われるもんだから、見込みがあれば雇ってもらえる
年をとったら何をしてきたってのが重要視されるから「勉強してました」ってのはきついと思う
どっかで経験つんどかないとね
goto避けて見苦しくなるくらいならgotoつかって素直に書くは
多重ループの脱出とエラー処理にのみ使ってよいと決まっている
774 :
768 :2012/12/02(日) 16:48:47.85
マジかよこれからそうするわ
>>764 う〜ん、ちょっとマジレスすると、プログラマーって儲からないよ。
あと、プログラムは学生さんでも環境そろえるのは容易だから、
その手の会社に来るような人は若いうちからやってることが多い。
なので、下地の量にかなり差があると覚悟していた方がいい。
また、C言語を学ぶのは
>>762 が言うようにそんなに難しくない
けど、プログラミングにおいて言語の知識はそんなに重要じゃない。
それ以外の設計書などを書くための文章力や、どういうものを作
るかを知るための会話力、作りたいものを論理的に構成する能力
等が重要。
そういう覚悟が出来ているなら、頑張って欲しい。
言語とかの疑問なら、ここで質問すれば何とかなると思う。
>>767 ポケコンでやるのはお勧めしない。
新聞広告に載ってる DELL とかの PC とか、中古のPCでいいから
PC でやるべき。能率が全然違う。
時間は買えるなら買ったほうがいいことが多い 趣味なら寄り道もアリだが
http://codepad.org/xshbtSpI for(c=0;c<m;c++){
printf("zyogai[%d]=%d\n",c,zyogai[c]);}
for(c=0;c<m;c++){
for(j=0;j<retu;j++){
for(i=0;i<gyo;i++){
while(matrix[i][j]==zyogai[c]){
for(j=j+1;j<retu;j++){
matrix[i][j-1]=matrix[i][j];}}
}}}
matrix[i][j]の全ての要素からzyogai[c]に格納された全ての値を削除
したいのですがどうすればいいでしょうか・・・
>>777 2重ループで全部比較して、trueだったら削除するとか
あとは、なんか配列の中に同じ物があったらーって関数があった気がする
>>777 どうでもいいけど { } の閉じ方がLispみたいだな
>>777 汚すぎる
他人に見せて良いコードじゃねえ
……これまでの流れからいって 社会学部の人が卒論か何かで投票の数理解析をやっている、 そう思いたい いろいろツッコミどころがあるけど 一番の問題は この手の初心者に与えるべき適当な教科書の欠如だ そしてそもそもCでやるべきなのか、 そのあたりの判断も、初心者だからできる訳もない これはかなり珍しい事例で、 高度な初心者がプログラミングをやるとどうなるか、 それがわかった 対処法としては教科書読むか教えてもらうしかない 教科書読むなら一冊読んだ後に 学校やらの図書館で入門と銘打ってるのを5冊ほど同時に読め それを三週間ほどでやる
782 :
768 :2012/12/02(日) 20:22:40.82
C/C++の宿題片付けますスレに持っていった方がいいんじゃないか? 自分でやるにしても基本くらいは押さえないとね 質問するにもせめて読みやすくして欲しいね
784 :
デフォルトの名無しさん :2012/12/02(日) 22:23:47.38
とりあえず、 全部終わったらやさしく学べるC言語入門 基礎から数値計算入門まで とかいうのおわらせよう。。いろいろな勉強の中でプログラミング が一番時間が経つのを早く感じる程持続できるということを知ったし 遅すぎるOTZいつもなにもかも遅い、
適性があればあっという間に追いつくさ 逆に何年かけてもダメな人もいる
いるね
趣味ならタイムリミットは死ぬまでだよ!
データの先頭から5〜10バイトの範囲を別の変数にコピーする、みたいなことができる関数ってありますか?
memcpy()
memcpyってコピー元の範囲指定ってできなくない?
なにをおっしゃってるの?
「コピー元の範囲」という考え方がそもそも間違い。 コピー元開始アドレス、コピー先開始アドレス、コピー範囲 あるのはこれだけ。
>>788 memcpy(別の変数, データの先頭 + 5, 10 - 5 + 1)
実はビットと勘違いをしているとか。エスパーしてみる。
>>794 別の変数 |= (データの先頭 >> 5) & ((1 << (10 - 5 + 1)) - 1)
include<stdio.h> int main(void) { int data[10]; int i; int d; int sum=0; printf("数値を10個入力してください\n"); for(i=0;i<10;i++) { scanf("%d",data[i]); } for(d=0;d<10;d++) { sum=data[d]+sum; } printf("%d",sum); return 0; } すいません、何故これで合計が出ないのか教えてください。 10個配列に入力した分の合計がでません、エラーがでます
#とスペースかも
すいません#はコピーミスでしたが 自己解決しました。
>>796 sum=data[d]+sum;
は
sum += data[d];
とした方がカッコいい
そもそもカウンタのdは必要ない
配列に入れる必要もないが、まあ題意なのだろう
va_listを配列に変換するにはどうすればよいですか?
va_arg
本で以下のコードを見たのだけど whileでこんな文法成り立つの? カンマ演算子って何でもありで恐すぎ>< while (ch = getchar(), isdigit(ch))
なんで本に書いてあることが成り立つかどうかなんて疑問がもてるの?
sizeof(array) / sizeof(int) なんで、これで配列の長さが分かるんですか? 配列arrayは最後のアドレスを持っていないのに
>>808 配列を宣言すれば、コンパイラはその配列の長さ(大きさ)を知っています。sizeof(array)をコンパイラが解釈(評価)する時点で、その大きさをきめうちにできます。
http://ideone.com/Olruu8 プログラム実行時に配列の大きさが計算されるわけではありません。
811 :
808 :2012/12/04(火) 22:33:50.16
>>810 レスありがとうございます。
>配列を宣言すれば、コンパイラはその配列の長さ(大きさ)を知っています。
つまり、シンタックスシュガー程度に考えていればいいということでしょうか?
コンパイル時にサイズが決まっていない配列でもうまくいくよ まぁ、実行時にその配列がどう宣言されたか覚えておけばいいだけの話だけど
> コンパイル時にサイズが決まっていない配列 ってどんなの?
C99のアレか
そうアレ こんなの void foo(int s) { int a[s]; printf("%d\n", sizeof(a)); }
いったいどんな実装なんだろう‥‥‥
そら実行時に求めるしかないでしょ。
ANSI Cだとコンパイル時にサイズが決まったものしかsizeofできない リンク時ではなくコンパイル時なので、配列が違うファイルにあるときに extern a[]; a_size = sizeof(a); みたいなこともできない
それはC99でも出来ないのでは。
>>811 もしかして、Cでは配列名=配列の先頭要素のアドレスだから
配列全体のサイズが求まるのはおかしいって話?
それに対しては、sizeofに配列名を渡した時は例外だという回答になる。
専用要素ではなく、配列全体のバイト数が計算される。
コード上の記述がコンパイル時に意味をなすのか実行時に意味をなすのか、 それを判断すれば難しいことはない。 ANSI C(? C99は知らない)だと char a[1000]; でsizeof(a)は1000という即値に変換されてコンパイルされる (と俺は解釈している)
>>806 そういう書き方もできるけど例としてそんなのを出す本は焼き払うべき。
>>822 それはどうか?
むしろ while () が特異であんまり活用できないことのほうが多いような気が。
ループ継続条件をワンステップでかけずに、最悪 for(;;) { ... if () break; } になってしまうことも多々あるのでは?
,演算子はわかりにくい。特に関数引数のセパレーターと誤視しやすい。
>>806 だったら
while (isdigit(ch = getchar()))
の方がまだまし。
今時isdigitがマクロな処理系なんて生き残ってない。
引数に副作用のある式を書く男の人って……
>>823 whileが特異って?forとどう違うの?
>>825 副作用のある式を,でつなげるより「マシ」って事だ文脈読もうな。
> 副作用のある式を,でつなげるより「マシ」って事だ文脈読もうな。 カンマにそれ以外の用途はないから
評価順序が不定だったりマクロかどうかわからない引数に 副作用のある式を書く習慣はつけさせない方がいいよ。 それより、評価順序を明示できる , を使うべき。 もちろん、「文」の文脈なら ; でつなげばいいよ。
>>824 >今時isdigitがマクロな処理系なんて生き残ってない。
普通にあるんじゃね?
>>828 ああ、そのとおりだな。副作用のある代入式としてくれ。
>>839 ANSI Cではfunctionであることが要求されてるけど。
カンマでつなげたり引数を文にするくらいなら、無限ループをifでbreakするほうがマシだろ
isdigitが関数であることが確実だとしても、 その習慣をもってると他でつまづくよ
手近のgccだとこんな風になってた #define isdigit(c) __isctype((c), _ISdigit) #define __isctype(c, type) ((*__ctype_b_loc ())[(int) (c)] & (unsigned short int) type) 最終的に関数呼び出しにはなってるだろって言うならその通りだけど。
誰にでも平易に理解できるコードに書き直すのが大前提だろう。
分かりやすいのが一番。やっぱりカンマ方式が無難だろうな
カンマで括弧の中に詰め込むんじゃなくて、同じロジックで 1行ずつ処理する形にできる。while(){}でやろうとしているが do-whileに書き直しても良いし方法なんざいくらでもある。 何でもかんでもごちゃごちゃと詰め込むのはCの悪癖だな。
コードゴルフでもやんない限り使わなくていいね
ソケット通信のプログラムで、pthreadを用いて送信スレッドを作ってデータを送っています writeで送信をしている途中でフラグが立ったらスレッドをサスペンドさせ、降りたらレジュームするようにしたいのですが どのようにしたらいいでしょうか?
条件変数でも使うんじゃね?
プロトコルは相手あってのものだから、どういうシーケンスで 送信途中の停止と再開を扱うかによって実装が変わる。
そういう話なの?
誰がフラグの上げ下げするの?
帯域が限られている回線で、今送信しているデータよりも優先して送信されるべきデータが発生した場合に 一旦送信スレッドをサスペンドさせ、優先データを送り終えたあとに再びレジュームするような仕様にしたいです フラグの上げ下げは、スレッドを生成する元の関数内で行おうと考えています
OOB使うの?
そのフラグ見てればいいんじゃないの?
10〜20の間という条件式を書く時は、 tmp >= 10 && tmp <= 20 10 <= tmp && tmp <= 20 のどっちがいいですか? 自分は下の方が好きなのですが、今読んでる本だと上の書き方なのでそっちがいいのかなと
オレは下のほう
基本は変数が左だけど、範囲だと例外的に下にしちゃうかな 要は、パっと見てわかりやすい方を選ぶべき
数学の授業で 10 ≦ tmp ≦ 20 って書くだろう。 下のほうがなじんでいるだろう。
851 :
847 :2012/12/05(水) 21:45:35.20
いや、 その「今読んでる本」の著者のような上司についてしまったら、上のように書くべきだ。
その上司の机にリーダブルコードを置いてみる
定数が左
ねーよ
tmp >= 10 && tmp <= 20 ↓ 「tmpは10以上 かつ tmpは20以下」 こちらの方が分かりやすいと感じる人がいたとしても、 否定は出来ないね。
そいつはそう信じてそう書けばいいんじゃね? 結局読みやすいかどうかはみんなに読んでもらうのでなければ信念でしかないから。
書き方に一貫性があればいいよ。読んでいるうちに慣れるから。 場所によって tmp >= 10 だったり 10 <= tmp だったりすると、 読み手の頭の無駄な切り替えが発生する。
if(i==2)と書くべきところを、 if(i=2)と間違っても気付きにくいので、 if(2==i) としておけば、 if(2=i) <--- コンパイルエラーでミスを見つけやすい というのを昔見た。
それは役に立たないと結論が出てるからやめた方がいい
いまどきのコンパイラはif (i = 2)と書けばwarning出すだろ
>>861 これでwarning出るオプション有る?
#include <stdio.h>
int main()
{
int i;
if ((i=2))
printf("ok¥n");
return 0;
}
>>862 それってコンパイラ黙らせるための意図的なコードじゃん。
バグが意図したバグだけで構成されてりゃ ここまで苦労はしねーよaho ちょっとていのう無能のオメェーは黙ってろよ あまりにもアフォすぎてヘドが飛び出る まったくの害悪だから発言すんあks
わあ、火病った
警告: 真偽値として使われる代入のまわりでは、丸括弧の使用をお勧めします [-Wparentheses]
テスト
寒いなあ
本気でアプリを作るなら、C++を使わないと行けないこの現実 M$さんもっと頑張って、C#で作れるようにしておくれよ .NETもJavaでやろうと思っても、結局クラスが無いの
>>869 甘えすぎじゃね?
Cなんてクラスどころか
ゴミクズみたいなライブラリしか付いてこないのに
何でも作れるじゃないか。
>>870 GTKとかQtのようなライブラリを使いたいわけであってね
C#で作ってもDLLImportとか使うはめになるでしょ。高級言語使っているからテンション下がるんだよね
あぁー結局C++の力に頼らなきゃダメなのかーって
それにさ、C#で作られているメジャーなアプリなんてあるの?少なくとも俺は知らないな
いや作ろうと思えば作れるんだよ。プログラムで飯食ってるわけだし
お前がC#で メジャーになるようなアプリを作ればいいじゃねぇか
C#は最近のLinux界ではそこそこ使われてるんじゃないの? GTK#なんてのもあるみたいじゃないの。
もう聞くしかないので教えてください。 a年b月からc年d月までの日数を求めるという課題が出たのですが もう八方塞がりでできません。 うるう年を判定する関数は出来ました。 またa年b月とc年d月の日数を返す関数も出来ました。 ここまで出来たのですが あとはどうすればいいのでしょうか
出来上がったコードをどっかに丸揚げして さらにここに丸投げするのが正しいです つまりあなたはコード丸あげを除いて 正しい道を選択しています ですので、あなたには輝かしい未来がまっているでしょう
でしょうね
>>875 うるう年とか日数とか要らない。
a年b月1日0時0分0秒とc年d月1日0時0分0秒の時刻(time_t)を取得して、差をとって、日数に変換すれば求まる。
フツーtime_tにして差分を24*60*60で割るっしょ 銀行系で中間日を求めるのに足して2で割ったらオーバーフローして2038年問題が発生したけど
改行が多くて書き込めないので諦めます
>>871 そんなもんに頼らず全部Cで書きなよ。
GUIだってCで書けるだろ。
人間、楽しようとしたら際限が無いぞ。
すいません、time tを使うのですか? 授業でも教わったことがないので 参考までに実際に書いていただけないでしょうか?
time_tを知ったということは あなたの人生のステージを一段階あがたということです さあ あとは書くだけです おそれずにその一歩を踏み出しましょう
課題としては自作関数を用いてだったのですが time tとか使っていいのでしょうかね
ならプログラミングもやめて全部電子回路で半田ごてしろよ
はぁ、もういいです、すいませでした。
>>875 time_tなんてほとんどC言語やったことない俺でも知ってるよー
コンピュータやっている人の中ではめちゃ有名な型だから
sizeof(arrray) / sizeof(int)とsizeof(pointer) / sizeof(int*)は何が違うのと質問したのですが、ようやくわかったようなー sizeof(array)←配列はスタックに積まれるので、一番最後のアドレスが分かる。 引数に配列を渡すとポインタとして扱われるので、最後がどこだかわからなくなってしまう。 だから、基本的には宣言した関数でしか長さを知ることができない。 sizeof(pointer)←ポインタは自体はスックに積まれる、インスタンスはヒープ・スタックのどっちにあるかわからない。 最後のアドレスがわからないから、ポインタは長さを知ることができない。 コンパイルした時にコンパイラがサイズを知っているって言ってたけど、それだけじゃわからんかった
すいませ……【名】コイツラに聞いたオレがヴァカでした、の意。罵倒の際に用いられる。
中途半端なオレオレ解釈乙
892 :
デフォルトの名無しさん :2012/12/06(木) 22:50:45.85
fprintf()するとファイルが白紙になるんです。 理由は何が考えられるでしょうか? fprintf(fp,"%d",1); ってするとテキストファイルが空になってます...
>>892 テキストエディタじゃなくて、バイナリエディタで開いてみて
fclose()してないんじゃね
896 :
デフォルトの名無しさん :2012/12/06(木) 22:55:24.41
>>894 ありがとうございます。
/*
cat -n 1.txt
>x
*/
FILE *fp;
fp=fopen("1.txt","w")
fprintf(fp,"%d\n",1);
これですかね。
897 :
デフォルトの名無しさん :2012/12/06(木) 23:00:19.62
他にもファイルポインタあるからそれとの兼ね合いで何か エラーしてるかもしれません。すいませんちょっと考えます。
>>896 コンパイルできない
↓
現象再現どころじゃねーよ
899 :
デフォルトの名無しさん :2012/12/06(木) 23:10:05.52
>>898 すいません。forの所で添え字じゃなくて定数を
fprintfしてました。初歩的なミスでした.....
900 :
デフォルトの名無しさん :2012/12/06(木) 23:13:04.35
舌足らずですいません。 for(i=0; i<=j; i++) { fprintf(fp,"%d",a[j]); } こういう事です。 すいませんでした。
fp = fopen("a.txt", "wt"); fprintf(fp, "1\n"); fclose(fp); … fp = fopen("a.txt", "wt"); fclose(fp); とやれば、消える。 追記したいなら、 fp = fopen("a.txt", "wt"); fprintf(fp, "1\n"); fclose(fp); … fp = fopen("a.txt", "at"); fprintf(fp, "2\n"); fclose(fp); とすればいい。
903 :
900 :2012/12/07(金) 01:20:46.09
一応解決したんですが fp1=fopen("onaji.txt","r"); fp2=fopen("onaji.txt","w"); これは何故だめなのでしょうか? おかしいですか?同時に同じファイルを違うモードで参照するという。
読み書きをしたいなら、"r+" か "w+" か "a+" を使って開き、1個のファイルポインタで行う
905 :
900 :2012/12/07(金) 01:31:48.67
>>904 ありがとうございます。
rの後ろについてる+とかって必要ですか?
無くても組めるんですが。
組めてねーじゃんw
>>905 "b" で開くバイナリモードなら、データ長指定だからこちらでも把握しやすいけど、
テキストを扱うんだったら "+" で開いてやりくりするのはオススメしない、というか、
俺は頭が混乱する。
どこに書かれるか分からんとか、長い文字列を書くと次の行が潰されるとか、色々面倒だ。
一気にメモリ上に読んで、メモリ上で加工して、一気に書き出すようにした方が確実。
データサイズが巨大なら、ファイルを分割して扱う設計にすれば良い。
お前の好みなんて誰も興味ない
興味ないね
クラウド乙
やめなよ
定番。 -- モード ファイルがないとき ファイルがあるとき "r" 読み専用 エラー 開く "w" 書き専用 作成 空にする "a" 追記専用 作成 開く "r+" 読み書き エラー 開く "w+" 読み書き 作成 空にする "a+" 追記と読み 作成 開く -- "t"を付加するとテキストモード、"b"を付加するとバイナリモード。 尚、読みと書きを切り替えるにはfseek(), fsetpos()などが必要。
ungetc()
うんこしたいよ〜
>>912 tでテキストモードって使う奴いるの?
互換性下げるだけの不要な代物だと思うが
そうか?
何の意味があるのかと
意味がないのはそれに何の意味も価値も見出せることのない お前の首から上の有機物の集合体すなわちゴミそのもののことだ
ゴミがしゃべったあああああああああああああああああ
>>915 "t"はMSだけかな?
テキストの"+"だと
001
002
003
の「001」の場所で「xxxx」と書くと
xxxx
02
003
ってなってしまう。
バイナリだったら良いんだけど、テキストは良くわからんわ。
>>919 実際意味ないだろ
どうしてもWindowsでしか動かないコード書きたいなら、
fopen使わずCreateFileでも使えよバカ
>>922 お
まだ首から上がしゃべくってんのか
さっさと黙れよks
お前は不愉快だw
ゴミがしゃべったあああああああああああああああああ
926 :
デフォルトの名無しさん :2012/12/07(金) 21:02:14.78
fscanfでn行二列のtxtファイルを読み込みたいのですが >cat tango.txt book off town work good bye moutain coffee ↑これを読み込んで 二次元配列char str[10][2]に読み込むと book offtown town workgood good byemoutain moutain coffee となってしまいます。 何故こうなるのでしょう? scanfやstrtokで試してるんですが いずれもこうなります。
なぜそうなるって そうプログラムしてるからだろ ソースくらい上げろよ
929 :
デフォルトの名無しさん :2012/12/07(金) 21:33:00.20
>>927 それが原因でした...
ありがとうございます。
要素数が少なくて読み込めなかった。
930 :
デフォルトの名無しさん :2012/12/07(金) 21:53:37.41
fscanfとかしたら 読み込んだ文字列に空白や改行記号が入ってないかめっちゃ不安だったけど a[start]は先頭文字 a[end]は終了文字だった 結構使いやすいように出来てるんだなぁ
なにこのゴミ板
ゴミ一名様入りましたー
割り付け記憶域期間難い(使いどきが) これって実際使うのか? ググってもあまり出てこないし 割り付け記憶域期間って好きなときに作ったり消せたりするのが美点なの?
mallocなしで書くって、組み込みとかではあるみたいだけど自分で書いたことはないなぁ (せいぜい数十行の練習用コードは除く) 処理を全部mainに書いちゃうとか、ポインタわからないからグローバル変数使いまくっちゃうとか、 必要なメモリのサイズ分からないから常に最大のサイズで配列宣言しちゃうとか、そういう人?
スタティック領域を「グローバル変数」としか捉えられない素人には無理だろうけど 再入可能の必要を見極め排除する技量があれば ヒープメモリに触らず大規模コードを組上げるのも不可能じゃないよ
関数はmainの外にも書いてます ポインタもわかります >必要なメモリのサイズ分からないから常に最大のサイズで配列宣言しちゃう 多分そうです 配列はこれだけあれば十分だろ的に宣言してます つい最近cをやり始めたのですが参考書を読んでたら割り付け記憶域期間が出てきて‥ いままで割り付け記憶域期間を使わなくても困ったこととかがなかったから 一体どういう時に使うんだろうと悩んでるのです メモリを気にしたり、実際にソフトを作るようになったら使うようになるんですかね?
>>933 勘違いしていると思う。
割り付け記憶域っていうのはmallocなどの動的確保した領域を
指している言葉で、「期間」というのは確保したメモリの寿命のこと。
メモリの寿命は確保手段や用途によって違う。
いつ必要になっていつ不要になって、どのタイミングで解放するか
などなど、そういうことを考え始めると割り付け記憶域に対する期間
をどう設計するか考える必要が出てくる。
ちなみに「こんだけ取っておけば十分だろー」という取り方だと プログラムの規模が一定を超えたところから破綻し始める。
まだ参考書の問題○○〜 とかなんでメモリとか意識したことなかったです… 今から意識しておきます
>>937 「記憶域期間(storage duration)」ってC言語の用語だよ。
うん、それがどうかした?
それを知らないと「割り付け記憶域」と「期間」というトンチンカンなところで ぶった切ることになる。
ぷぅ
ぶった切ったからってとんちんかんでも何でもない
storage durationて、一般的にいうところのスコープとエクステントのエクステントの事?
自動変数の寿命は宣言されてからブロックを抜けるまでの間とか そういったことじゃないの。
自動記憶域期間・・・ブロックの開始から終了まで 静的記憶域期間・・・プログラムの開始から終了まで 割り付け記憶域期間・・・malloc等からfreeまで
rand()関数においては32768まで発生させられますが、 1024000までは発生させたいです。 何かいい方法はないでしょうか? temp = (rand()%1000) * (rand()%1000) 上記でどうだろうか、と考えたのですが、 上記の方法だと乱数が値が偏るような気がします。
へえ
各桁を0〜9の乱数で出して それを文字列的につなぎ合わせりゃいいんじゃねーの
> Prnglibは、64ビットシステム用に設計された擬似乱数生成ライブラリです。
いえいえ
でも
>>953 とかスゲェ遅そうだし
ホントに乱数になんの?
うん
でも、0-1024000とかの値域に合わせるには再度加工が必要だけどね。 だから、>950の方針が無難かな。
OSSのアプリはgccが必須? VisualStudio大好きなんだけど makeはよく失敗するのでmakeは使いたくないなー
>950の方法だと頻度に最大0.1%の差があるよね。 それでも良ければって条件付きなら使用可だね。 もちろんrand()自身の頻度の差がそれ以下の場合だけど。
>>961 君は君の環境で良いものを作ることに専念すれば良い。
良いものだったら
他人が勝手に他の環境向けにビルドして配布してくれるよ。
(rand() * (RANDMAX+1) + rand()) % 1024000 ま、これが一番お手軽だろうね 正確性を求めるなら乱数系を作るしか
RANDMAXが32767の環境ではrand() * (RANDMAX+1) + rand()は0〜1,073,741,823が得られる 最大値を1,024,000で割ると1048.576となり、頻度が1048と1049の差が生じる よって1048*1,024,000(=1,073,152,000)以上の値は再抽選とすれば一応公平にはなる
966 :
デフォルトの名無しさん :2012/12/09(日) 17:02:37.58
10進を指定コードの長さで左詰めで2進にするプログラムどうしたらいいですか? 考えてるんですが全然作れなくて。 char buffer[100]; int 34; を10bit2進→ [0000100010] を8bit2進→ [00100010] buffer[100]に左詰めで格納 strcpy strcmp strstrとか一杯あるけど使えそうなのがないっていう... とにかく困ってます。
> 10bit2進→ [0000100010] この文字列 0000100010 とかを bufferに左から詰めるのか?
>>966 void hoge(char buffer[], int num, int bit)
{
int i;
for(i=0;i<bit;i++)
{
buffer[i]=((num>>(???))&1)+'0';
}
buffer[bit]='\0';
}
969 :
デフォルトの名無しさん :2012/12/09(日) 17:08:35.10
>>967 そうです。
buffer[0]からbudder[strlen(10)]
bufer[0]からbuffer[strlen(8)]
ということですね。左=0です。
970 :
デフォルトの名無しさん :2012/12/09(日) 17:14:54.01
>>968 どうもです。
parse error before '?' token
warning: trigraph ??) ignored, use -trigraphs to enable
こんなエラーが出たのですが..
972 :
デフォルトの名無しさん :2012/12/09(日) 17:20:50.96
>>971 iですか?
何か知らないけどできましたw
ありがとうございます。文字列関数一切使わなくていいんですね。
973 :
デフォルトの名無しさん :2012/12/09(日) 17:23:39.04
iじゃなかった... ?3つって意味がありますか?
>>970 #include <stdio.h>
/*
数値 num を bit の指定ビット幅だけ buffer[] に左詰めで格納する
*/
void hoge(char buffer[], int num, int bit)
{
int i;
for(i = 0;i < bit;i++)
{
buffer[i]=((num >> i) & 1)+'0';
}
buffer[bit]='\0';
}
int main(int argc, char *argv[])
{
char buf[64];
int i;
for(i = 0;i < 64;i++)
{
buf[i] = 0;
}
hoge(buf, 78, 10);
printf(buf);
return0;
}
975 :
デフォルトの名無しさん :2012/12/09(日) 17:43:31.35
あぁ日本語難しいwそういうことか ビットを"左"から箱に"左詰め"するって意味です。 右から箱に左に詰めてるw
つまりビットで反転した文字列を作成するってこと?
977 :
デフォルトの名無しさん :2012/12/09(日) 17:50:39.82
数値として確認できる状態であればいいです だから 2が000010じゃなくて010000だったら困りますね..
英単語をテキストファイルから読み込んで表示するプログラムを作っているのですが、 下のようにテキストファイルの中身を、単語の個数と単語で構成しています。 3 dog cat monkey 例えばゲームだとセーブデータやマップデータなど、 どのような感じでファイルの中身を定義していくのでしょうか。 ファイルの定義の仕方や定石をまとめたような書籍があれば教えて下さい。 よろしくお願いします。
今使ってるフォーマットで良いじゃん。 不必要に複雑なフォーマット使ってもしょうがない。
データの持ち方はデータの性質で決まってくるから その都度考えるしかないんじゃないかな。
例えば config ini などと検索してみると、ヒントが出る
そのぐらい自分で考えることだろw 野球のサインについて勉強したいので参考書籍を教えてくださいって言ってるようなもんだぞw
あ
どなたか次スレお願いします
>>977 文字列反転関数
void strrev(char *d)
{
int i;
int len = strlen(d);
char tmp;
for (i = len / 2 - 1; i >= 0; i--) {
tmp = d[i];
d[i] = d[len - i - 1];
d[len - i - 1] = tmp;
}
}
これは、"1234"を"4321"に変換する
副作用かっこわるい
988 :
デフォルトの名無しさん :2012/12/09(日) 22:18:30.42
>>986 ありがとうございます!
というかitoa関数ってものを発見したんですが
使えない...
cygwinですがこれって入ってないんでしょうか?
>>978 sourceforgeのゲームカテゴリからコード落としてきて、中身を読む。
書籍なんて読むな。イラナイ。本当にイラナイ。コードから読み取れ。
ゲームプログラマのコードって汚いからなあ フラグとかよく分からない変数が大量にあって デザインパターンデザインパターンしたコードのアクションゲームソースどこかにありませんか?
991 :
デフォルトの名無しさん :2012/12/09(日) 22:28:22.33
ゲームプログラムするなら複数でやったほうがいいと思う。 効率が全然違う。
>>988 あるやん
3.4.4/std/c/stdlib.d:char* itoa(int, char*, int);
>>990 デザパタならUMLのモデリングツールに多用されてるよ
ゲームは知らん。100〜200個ぐらい落としてきて、ヨサゲなコードでも自分で探せ
>>990 C言語以外のほうがキレイにかけるっしょ
よそへ探しに行ったら?
>>990 おまえみたいなのが無菌室で働けると思うな
996 :
990 :2012/12/09(日) 22:35:37.42
わろたw
997 :
デフォルトの名無しさん :2012/12/09(日) 22:36:39.81
>>992 ありますかー
無いんですが...
cygwinのバージョンふるいのかなぁ
今どきはC++で書くだろ
無政府主義のバナナ連中がテロを起こし、 c++コンパイラが用意できないマイナーOSへquakeを移植しろって話かもしれない
じゃあ次スレでも立てるか
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。