1read 100read
2012年08月プログラム13: C言語なら俺に聞け(入門編)Part 110 (939) TOP カテ一覧 スレ一覧 2ch元 削除依頼
C言語なら俺に聞け(入門編)Part 110 (939)
VB.NET質問スレ(Part39) (543)
[Java]JBuilder5[Java] (782)
MFC、Win32++を超えるライブラリを作るスレ (950)
Ruby 初心者スレッド Part 50 (726)
2 part forth (665)

C言語なら俺に聞け(入門編)Part 110


1 :2012/11/17 〜 最終レス :2012/12/08
C言語の入門者向け解説スレッドです。
★前スレ
C言語なら俺に聞け(入門編)Part 109
http://toro.2ch.net/test/read.cgi/tech/1350461655/
★過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
★教えて欲しいのではなく宿題を丸投げしたいだけなら
  ↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 159代目
http://toro.2ch.net/test/read.cgi/tech/1342966104/
★C++言語については避けてください。C++対応明記スレへどうぞ。
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること。
  # サイズが大きい場合はアップローダ等を利用してください。
http://codepad.org/
http://ideone.com/
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

2 :
< `∀´> ニダー

3 :
/* NOTREACHED */

4 :
/* FALLTHROUGH */

5 :
ここまでテンプレ

6 :
>>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"

7 :
>>6
毎度毎度やってらんねって話だからどうだろう

8 :
ヘッダいじっていいなら削除すればいいだろ

9 :
そりゃヘッダ直して良いならなんでもありだろ
ビルドスクリプトに組み込むもよし

10 :
>>7-8
いやさ、これだと差分探してBにもCにもコピペするっていう手間は省けるじゃん。
DEV.hが更新されたら置換exeをダブルクリックするだけよくて、A〜Cが毎回の変更されることもないし。
ヘッダ内での定義を削除するだけだと、ヘッダ内の変数名はそのままdataで初期値がこっそり変更されてた場合、
A〜Cのいずれかに変更後のdataの定義を反映させないといけなくなるし見落とすかもだし。
>>9
989!どうなんやコラ!!  変更してもいい感じですか?

11 :
正しい対応は前スレの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はレス禁止。再利用も禁止。アイデアの盗用禁止。

12 :
× 正しい対応は前スレの921
● 正しい対応は前スレの991

13 :
C言語でプリコンパイルチューナーを作っているんですが
()の付け忘れとかに;が付け忘れていたら自動的に付けてくれるように
したいのですがどうすればいいでしょうか?
for()と
printf()の場合
for()の後ろには;はつけないですがprintf()の後ろには;を付けます。

14 :
hogehoge() + 1 みたいな数式で発狂しそうだな。

15 :
皆様アドバイスありがとうございます。
DEV.hの修正は問題ありませんが、
頻繁に変更されのるのでその都度、DEV.hに修正を加えるのではあれば、
コピペが面倒という目的からずれてしまうので・・・
990様のアドバイス通り、ラッパを作成して一つのファイルのみしか
インクルードしない様に修正したいと思います。
メーカに文句も言いますがいつ修正されるか分かりませんので。
ありがとうございました。

16 :
>>14
ツールとして無いですかね?
制御式の所を丸括弧にしたり、配列の括弧を波括弧にしたり
する間違いが多くて....
デバッグメントしてると時間がかかりすぎて

17 :
>>16
補完機能やスニペット、フォーマッタのあるIDE使えばいいよ。eclipseとかVC++とか。

18 :
C言語というよりプログラミングの話なのですが良いでしょか。
よく似た処理を行う関数が2つあります。処理の8割は同じコードになります。
しかし2つの関数の引数は一部違っています。例えばこのように。
FuncA( int a, char *s); FuncB( int a, int b , int c);
この場合どうコーディングするのがベターでしょうか。理由も教えて下さい。
(1)処理の同じ部分は無視して、全く別々に関数をふたつ作る。
(2)処理の同じ部分を切り出してみっつめの関数を作り、ふたつの関数から呼び出すようにする。
(3)ひとつの関数を作って、引数にフラグを追加して、関数の内部で処理を分ける。
(4)その他に良い案があれば

19 :
c言語でオーバーロード的な事を実装したらいいんじゃないか?

20 :
>>18
2か3で

21 :
そもそもヘッダファイルに実体を吐く時点でツール側の設計が
おかしいんだけど、組み込みの世界は割とそういうのがある。

22 :
ハード屋が書いてる?

23 :
C言語で3次元配列ってどうしたらいい?

24 :
1次元配列が3重になってるだけだから。
int a[10][10][10];
とかすればいい。

25 :
ハード屋ソフト屋は関係ないんじゃね?
能力が低いとか別の理由だよ

26 :
もしかしたら使うほうがヘボなだけで
何かマクロ定義すりゃいいだけになってる可能性もある

27 :
結論としては>>25だけど、ツール作ってるのがソフト専業ではない
ハード屋だからっていうのは確かにありそうな話。
多数のファイルから参照するヘッダをどう作るべきかという基本を
知らないんでしょう。

28 :
ヘッダファイルの利点がよく分からない

29 :
c#のsystem.diagnostics.debug.writeline()に相当する関数はありますか?

30 :
fprintf(stderr,"msg");

31 :
int *p;
int* p;
これってアスタリスクの位置が違うだけで、意味同じですよね
どっちに書くかは人の好みってことで

32 :
ハード屋がドライバを書き
ソフト屋がドライバから逃げ回りwww

33 :
ハード屋の設計ミスなのにソフト屋が尻拭いさせられる

34 :
このコードって安全 かつ ポインタの使い方は正しいですか?
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++;
}

35 :
>>34
スレ違い。それC++でしょ。

36 :
>>34
malloc とかで確保したアドレスは大事に取っておいたほうが free するときに困らない

37 :
>>31
はい

38 :
C++つかうなら、メモリはnew, delete

39 :
>>36
http://toro.2ch.net/test/read.cgi/tech/1352812333/

40 :
>>39
あなたはおバカさんですよね?

41 :
>>34
個人的には
> for (int i = 0; i < MEMORY_SIZE; i++) {
>     *(memoryPointer + i) = i;
> }
 ↓
for (int i = 0; i < MEMORY_SIZE; i++) {
  memoryPointer[i] = i;
}
の方がしっくり来る。

42 :
>38
mallocでも良い
必要に応じて使い分ける

43 :
>>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は時間の無駄じゃないかな。

44 :
テキストファイル内の各単語の出現回数を出力するプログラムを組みたいんですが
codepad.org/S50sUd2z
出現する単語を縦に書き並べてアルファベット順にソートして、出力するプログラムです
この隣り合った行の単語同士でstrcmpして、値が0になれば頻度数wrdfreqを加算、そうでなければ前の単語wrdを一旦出力、頻度数の加算を最後にしてwrd, wrdfreqを初期化、という方針を考えています
(忍法帖リセット食らったみたいでリンクできません)

45 :
ポインタにインデックスつけてアクセスするのとポインタ自体を
インクリメントするのは結果は同じでも意味は全然違うぞ。

46 :
続/き/で/す
さ/く/ら/が/咲/い/て/ま/す/よ/。/食/ら/う/の/で/対/策/し/て/ま/す
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

47 :
>>45
意味が違っても結果が同じならいいじゃないか。
プログラマは詩人ではない。工作屋だ。

48 :
>>45 >>47
実行速度も変わるケースが多いから
速度が影響するシステムなら
書き方にも意識してプログラミングすべき

49 :
お前らレスありがとう
>>35, >>38
std::cout使っているけど、めっちゃC言語の勉強してる

50 :
C言語初心者にオススメの書籍を教えてください

51 :
神の誕生

52 :
はじめてのC

53 :
関数ポインタの配列の長さを知りたいんですが、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);

54 :
char msg[] = "msg";
msgの値は変更することが出来ないんですよね?
だから、msg++とかが出来ない。
const char *msg = "msg";
こっちは、msg++;ができます。これは、msg = hellw;は出来ないけど、msgに保持しているアドレスは
上書き可能ってことですか?

55 :
>>17
Sublime Text 2 も結構いい。

56 :
>>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'
ということ。

57 :
>>56
あとconstと配列とポインタに関する認識が根本的に間違ってる。
エキスパートCプログラミングを買って100回読破せよ。

58 :
>53
int size = sizeof(func) / sizeof(func[0]);

59 :
C言語に限らずかもしれないですけど、コンパイルされてCPUが分かる命令コード
01のならびに変換されると言いますよね。もちろんターゲットCPUが違えば変換コード
も違うのでx86系とPowerPC系のコードが違うのは分かるんですが、じゃ、同じx86系
で動くWindowsとLinuxの場合、なんでプログラムが互換じゃないんでしょうか。
このときOSは何の役割をやっているのですか?

60 :
>>59
OSはABI(レジスタに積む/スタックに積む)やファンクションコール(int 21h/int 0x80h)やバイナリフォーマット(COFF/ELF)を規定する。
OSによってABIやファンクションコールやバイナリフォーマットが違う。
アプリケーションって命令コードだけでできてるんじゃないんだよ。

61 :
>>60
そうすると、OS+CPUの組を指定して生成されるコードは
OSのAPIのコード+ターゲットCPUのコードということなんでしょうか。

62 :
OSつうかローダだろ

63 :
OSっていうのはフレームワークを提供するだけだから
たとえマシンコードが同じでも違うフレームワーク用の
プログラムは動かない。
そういうこと。

64 :
>>61
Cに関して言えばライブラリである程度隠蔽されるから直接ファンクションコールを叩くようなコードを生成することはまずない。
バイナリフォーマットとABIの問題が大きい。
しかし、バイナリレベルでの互換性を確保したところで
次は利用できるライブラリやデバイスの差異という壁が立ちはだかることになる。
directxやwinapiはwindowsでしか使えないみたいな。

65 :
>>59
OSが許せば
システムコールやWinXXAPI使わなければ
互換ですよ
VMとかで試せば判る

66 :
codepadでファイル入出力がしたい場合どうすれば?

67 :
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.

68 :
あるところでnewしたポインタに後にアクセスすると、中身が変わっていたりセグフォが起きます
こういう現象は何が問題なんでしょうか?
newでなくmallocでも同じです
クラスメンバ
float* p;
クラスメンバ関数
void fun1(){
p=new float[num]
//略
}
void fun2(){
//pの要素にアクセスすると中身が変わってる
//pの先頭アドレスも変わってる
}

69 :
内容が変わるのはどこかで書き換えるようなことしてるから
アドレスが変わるのはreallocなりしたからだろ

70 :
>>68
これだけではわからん
症状が再現する最小のコードをcodepadに上げて実行してみてくれ

71 :
スタックぶっ壊してpが書き換わってるに一票

72 :
書かれてない部分のコードに問題があるな

73 :
static float*p0,**p1;
void fun2(){
flaot*p;
*p1=&p; p=p0=malloc(x);
… ポインタ操作; assert(*p0==**p1); …}

74 :
バグは本人が関係無いと思っている場所にこそ在る

75 :
static関数はprivateなので、ヘッダファイルに書かないのが一般的なのでしょうか?

76 :
うん、一般的だよ

77 :
>>76
thx

78 :
ポインタ/配列は色々とコードを書かないとよくわかない事が分かった。
高級言語では気にしなくていいメモリ管理がここまで面倒だとは...
とりあえず、色々とメモリ破壊してC言語覚えていくしかないのかー

79 :
>>73
> flaot*p;
> *p1=&p; p=p0=malloc(x);
   ↓
> float*p;
> p=p0=malloc(x); *p1=&p;
順序が逆では?

80 :
失敬。勘違いしたorz >>79は間違い

81 :
68です
レスしてくださった方々ありがとうございました
これから見直してみます

82 :
>>78
うん。本をパラパラめくって見ているだけではわからない。
実践的な意味のあるコードを書き、動作を確認して初めてわかる。
よく入門書にある、下のようなコードはダメだ。
これを見てふーんとわかるのなら既に入門者ではない。
int a, *b;
a = 10;
b = &a;
printf("%d\n",*b);

83 :
ダメな理由がわからないorz

84 :
ではそのコードを入門者にも分かるように説明してください
入門編に相応しいような解説を付けてください

85 :
自分で紙に書きながらCPUの動作をトレースしないと
ポインタはわかんないよ。

86 :
>>83
この例題で納得しているようではダメということだろう

87 :
そういうことか・・・日本語勉強してきます

88 :
>>83,84
誤解しないで欲しい。
ダメというのは、これはアプリとして無意味なコードであるということだ。
上級者は無意味であるとわかるから、ふーんで済ませられる。
しかし入門者はこのコードに深い意味があるものと思い、理解しようと試みる。
ところが意味のないコードだから、「こんな面倒くさいことせずに
そのままaを使えばいいじゃないか」という疑念が湧き、理解にならない。
これでは入門書としてダメだ。
ポインタには、ポインタが活躍できる場面というものがある。
それを示す有用なコードを見せて、ポインタはこういう動作をするから
こんな用途に使えるんですよ、と教えるのが入門書の役目だろう。

89 :
で、入門書に最適、つまり有用でそれなりに短く
しかも入門者に理解させる用をも兼ね備えた
そのコードの実例は

90 :
swap だろうな

91 :
>>88
>アプリとして無意味なコード
そんなこと言ったらテキストにのってるコードすべてがそうだわ。
とりあえず、>>82で使い方覚えて、さらっとCの文法を終わらせて
文字列と配列とポインタとか、リスト構造とかそういうのでだんだん
深くなれていけばいい。

92 :
ポインタの活躍例
ttp://ideone.com/soUTSo

93 :
>>88
正論
>>89
構造体でlinkedlist

94 :
>92
躁鬱

95 :
個人的にはデータ構造やらアルゴリズムやらよりも前に、原始的なアセンブラでも使って、
動いてるプログラムのイメージを持つことがけっこう大事だと思う。Cをやるなら。
もっと高級な言語なら今時そんなイメージはいらんと思うけど。

96 :
>>95
CASLとかやればいい。シミュレータもあるし。ワードマシンというところは
目をつむって。ただ、CPUとかレジスタとメモリのやり取りとかわかったところ
でポインタとかがわかるかとか言えば別。概念的にわかっても表記がgdgd
だから。

97 :
K&Rにあった
void strcpy ( char *s, char *t )
{
while ( *s++ = *t++ )
;
}
の書き方とかいまだに推奨されてんの?

98 :
http://9cguide.appspot.com/c_kandr.html
どっかで見たと思ったらここだった

99 :
そもそもstrcpyはオワコン
strncpyかstrncpy_s
という話はともかく
>97 は書き方としてはアリだよ

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼
プログラム板 自治スレッド Part5 (850)
Mathematicaプログラミング 質問箱 その1 (339)
【C++】 DirectX初心者質問スレ Part37 【C】 (463)
【O3D】HTML5用 3D API WebGL 【Canvas:3D】 (479)
TypeScript part1 (303)
Mathematicaプログラミング 質問箱 その1 (339)
--log9.info------------------
☆羊毛から作るハンドメイドフェルト☆スレ Part6 (375)
【1月1日限定】おみくじはここでやれ (515)
【【消しゴムスタンプ】】 8個目 (582)
【挑戦】IDに数字が出たら競い合うスレ54 (857)
【錺】装身具制作【彫金】Part 15 (811)
【自称】ビーズ作家さんの話しようよ 3【美魔女】 (607)
日暮里繊維問屋街P5 (758)
洋裁質問スレ【総合】 part18 (249)
【フリマ】作ったものを販売してる人16【委託】 (567)
レザクラ初心者の質問に親切に答えるスレ ★2 (456)
【大人用】立体裁断型紙屋6【ネット通販】 (950)
  * スノードーム * スノーグローブ *   (269)
マフラー (652)
毛糸 ヾ(o゚ω゚o)ノ゙ プニプニ!プニプニ! (390)
手作りイベント総合スレ【ホビーショー】 2 (847)
◇◆石粉粘土・紙粘土総合スレ◆◇ (923)
--log55.com------------------
【まゆけーき・さきやち】新年 鬼形獣スレ【えいかもうるみもくたかも、饕餮も?】
物凄い勢いでMinecraftの質問に答えるスレ69
【Android/iOS/Win10/XboxOne/Switch/PS4】Minecraft Part37
【PC】Minecraft MOD総合.0.25.10
遊戯王デュエルリンクス1191ターン目
【ジェネレイド】属性種族混合デッキスレ3【プランキッズ】
【テンプレ必読】遊戯王のオリジナルカードを考えよう☆123
【ブルーアイズ】青眼の白龍を語るスレ48