トップページ⇒tech
1001コメント309KB

C言語なら俺に聞け(入門編)Part 127 [転載禁止]©5ch.io

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2014/11/25(火) 11:21:27.00ID:/YcGydE4
C言語の入門者向け解説スレッドです。

★前スレ
C言語なら俺に聞け(入門編)Part 126
http://peace.2ch.net/test/read.cgi/tech/1401026150/
★過去スレ
ttp://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++の宿題片付けます 167代目
http://peace.2ch.net/test/read.cgi/tech/1392388003/
★C++言語については避けてください。C++対応明記スレへどうぞ。
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること。
  # サイズが大きい場合はアップローダ等を利用してください。
ttp://codepad.org/
ttp://ideone.com/
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
【重要】
当たり前の事ですが、2chではコピペ荒らしは禁止されています。
0002デフォルトの名無しさん2014/11/25(火) 11:22:07.58ID:/YcGydE4
【重要】
hogeは禁止です。使用しないでください。
万が一hogeが書き込まれても、スルーしてください。
相手にするとあなたも荒らしと同じ扱いになります。
また、hogeはNGワードに追加しておくことが強く推奨されています。
0003デフォルトの名無しさん2014/11/25(火) 11:32:53.13ID:fATWhlU/
やつ
0004デフォルトの名無しさん2014/11/25(火) 17:06:08.54ID:qBXs+9tQ
前スレの959で質問したものです。
全体的な方針は未だ決まらず、ずっと足踏みしたままです。
革新的な方法はあるんですかね?
0005デフォルトの名無しさん2014/11/25(火) 17:39:15.15ID:+auTw7Mt
ぱっと見、j固定でi+なんとかになってるから
配列をi固定でj+なんとかになるようしてみるとか
0006デフォルトの名無しさん2014/11/25(火) 20:48:40.46ID:qBXs+9tQ
>>5
j固定のi+…をi固定のj+…にしても、配列を縦から操るか横から操るかが変わるだけで、速度は変わらないと思うのですが…
読み取り間違っていたらすみません。
0007デフォルトの名無しさん2014/11/25(火) 21:54:19.31ID:+auTw7Mt
そう思うよね普通
t[][]
**t
と等価なのよ
間違ってるかな、自信なし
0008デフォルトの名無しさん2014/11/25(火) 22:54:29.67ID:9LFEcwuR
>>7
大間違い
*t[][n]と等価なのは
(*t)[n]
中途半端な知識で回答しようと思うなよ
混乱を招くだけ
0009デフォルトの名無しさん2014/11/25(火) 22:58:11.14ID:9LFEcwuR
*t[][n]→t[][n]
0010【重要】2014/11/26(水) 00:39:36.20ID:0gGIykAv
>>1-2
hogeの使用が禁止されているのはチョーセン人だけです。
他の人は自由に使って構いません。
0011デフォルトの名無しさん2014/11/26(水) 01:44:43.43ID:iRlPsQJw
foo, bar, bazをつかいます
0012デフォルトの名無しさん2014/11/26(水) 01:49:59.04ID:jGVOTHDh
>>7
ptr[i]==*(ptr+i)==i[ptr]の話するならまだしも
0013デフォルトの名無しさん2014/11/27(木) 19:59:10.69ID:pfdljc1X
http://i.imgur.com/SduT7qR.jpg
http://i.imgur.com/2f8fP3F.jpg
http://i.imgur.com/u0ymg8c.jpg
http://i.imgur.com/LruEssT.png
http://i.imgur.com/AeSQqRT.jpg
http://cisburger.com/up/bnf/6016.jpg
http://up.pangya.tv/src/www_pangya_tv18594.jpg
0014デフォルトの名無しさん2014/11/28(金) 04:53:34.32ID:0dpuLFb4
http://codepad.org/nk8XWfmr
33行目のところでみると、iとlimit[1]のポインタが同じになってしまっています
半端な知識でかいたプログラムなので見づらいと思いますが、何が原因なのか教えてほしいです
cygwinでコンパイルしてます
0015デフォルトの名無しさん2014/11/28(金) 05:29:53.25ID:8rikF3wo
>>14
Cの配列は0スタート。limitはlimit[0]の1要素しか無いからlimit[1]ではその後ろにある領域を参照する。
あとはメモリ上の配置でlimit[0]の次にiが来ていたらその状況になる。
0016デフォルトの名無しさん2014/11/28(金) 17:33:11.80ID:PZv7DUA8
>>11
俺の地元に、foo薬局っていうのが、マジである。
0017142014/11/28(金) 20:31:58.81ID:0dpuLFb4
>>15
すみません、よくわからないです
運が悪いとポインタがかぶることがあるから、
対策としては予期せぬ挙動が起きたらポインタを確認してみて、別の変数を用意する必要があるということですか?
0018デフォルトの名無しさん2014/11/28(金) 20:34:29.97ID:OmZ6QPBS
×運が悪い
△コードが悪い
○頭が悪い
0019デフォルトの名無しさん2014/11/28(金) 20:42:01.51ID:xmPZ52Bn
配列宣言で int a[1]; とやったら 使えるのは a[0] まで
a[1] はやっちゃいけない

int b[5]; ならば b[0] b[1] … b[4] まで



30行目 int i, j, k, limit[1]; ← ここ limit[2] じゃねーの?
0020デフォルトの名無しさん2014/11/28(金) 20:55:26.35ID:il6CeYvF
運が悪いワロタw
0021142014/11/28(金) 20:57:36.51ID:0dpuLFb4
>>19
意味がわかりました
自分がバカだった
ありがとうございました
0022デフォルトの名無しさん2014/11/28(金) 22:29:49.76ID:kQ+KNJmD
typedef struct {
int size;
...
...
int Data[1];
} stData;

とかよくやるけどな。
CGデータとか。

仕事や他人に渡すソースでは絶対にやらないけど。
0023デフォルトの名無しさん2014/11/28(金) 23:10:26.75ID:pzWeG9kv
オヌヌメの入門書教えろください
0024デフォルトの名無しさん2014/11/28(金) 23:24:18.92ID:hZPBmLkW
>>22
どっかのライブラリでも見たことあるわ
0025デフォルトの名無しさん2014/11/29(土) 00:36:18.65ID:pwVAqDB9
不定長構造体はC-FAQにも載っているポピュラーな手法
0026デフォルトの名無しさん2014/11/29(土) 01:42:38.93ID:XzF56UWh
関数にstaticをつける意味はなんでしょうか。
分割コンパイルでいろいろ検索していたら、ほとんどの関数に
staticがついていたもので。
0027デフォルトの名無しさん2014/11/29(土) 01:48:38.62ID:+DvcCbsB
その関数が外部リンケージを持たなくなり、分割した他のコンパイル単位から見えなくなります。
0028デフォルトの名無しさん2014/11/29(土) 01:51:44.59ID:7Wka631z
>>26
別のファイルからその関数を呼び出せなくなる
0029デフォルトの名無しさん2014/11/29(土) 08:13:26.44ID:DwXwq/ki
private
0030デフォルトの名無しさん2014/11/29(土) 08:22:28.03ID:V5TrThEX
>>22
それをスタック上で使うのが神
0031デフォルトの名無しさん2014/11/29(土) 08:33:40.06ID:i2K4iPXr
>>22
それBITMAPヘッダ、ソケットがらみのヘッダにもよくあるから定番
オフセットがずらっと並んで扱いにくいヘッダもあるけどmalloc/free先頭一発でできてコスト低い
0032デフォルトの名無しさん2014/11/29(土) 08:37:01.30ID:i2K4iPXr
staticは場所によって意味変わってくるから嫌らしい
0033デフォルトの名無しさん2014/11/29(土) 09:41:39.38ID:V5TrThEX
え、変わる?
0034デフォルトの名無しさん2014/11/29(土) 10:18:50.61ID:C2AfWzRB
参照範囲のことでもいってるのかな
0035デフォルトの名無しさん2014/11/29(土) 10:30:45.81ID:2LwtSyz2
>>33-34
馬鹿
0036デフォルトの名無しさん2014/11/29(土) 10:50:58.11ID:C2AfWzRB
え、答は?
0037デフォルトの名無しさん2014/11/29(土) 16:01:03.30ID:ZNgLkXk6
C言語における修飾子 static の意味:
・関数内 => auto 変数ではない
・関数外 => extern 変数ではない
0038デフォルトの名無しさん2014/11/29(土) 16:17:00.78ID:FNTRY+e0
>>37
仮引数のとき、 忘れているぞ
0039デフォルトの名無しさん2014/11/30(日) 03:40:49.90ID:E9FsLWG8
プロトタイプ宣言の仮引数はC11からだっけ?
void f(char [static 10]);
こういうのでしょ
0040デフォルトの名無しさん2014/11/30(日) 10:59:05.20ID:f+jZcoRy
C99 からだな
しかし、配列の初期化でこんな書き方ができるようになっていたとは…

int a[] = {
[0] = 1,
[1] = 2,
};
0041デフォルトの名無しさん2014/11/30(日) 11:57:32.38ID:iMnVmoq9
>>40
15年以上も前に発行されたC99の仕様書を読んだこと無い奴が存在する事の方が吃驚だわ。
0042デフォルトの名無しさん2014/11/30(日) 12:01:10.70ID:8yVmTGOV
>>41
自分の常識だけで考えないほうが良いよ
0043デフォルトの名無しさん2014/11/30(日) 13:08:33.61ID:tHR3Cg3X
>>41
for(int i=0;
なんてやってると大抵やり直しだよ
0044デフォルトの名無しさん2014/11/30(日) 13:54:05.43ID:+4cKqP8L
自分で実装するわけでもないのに言語の仕様書読むなんて吃驚だわ
バグだらけのコンパイラをイヤイヤ使わされてパッチあてたりするなら同情するけど
0045デフォルトの名無しさん2014/11/30(日) 15:49:55.43ID:e0aRXJPC
コンパイラは実装しないけど
MISRA-C2004でC90遵守、2012でC99遵守っていうルールがあるから仕様書必須だったわ
そもそも完全に守れてるかどうかなんてわかんねーよ
0046デフォルトの名無しさん2014/11/30(日) 15:59:28.33ID:tHR3Cg3X
>>45
それって>>40みたいなのを必ず使えってわけではなくて、C90準拠のコンパイラでコンパイルできるようにするって話のような気が
0047デフォルトの名無しさん2014/11/30(日) 16:33:52.48ID:e0aRXJPC
規格に書いた機能をすべて必ず使えということではないけど
最低でもC90に準拠している複数のコンパイラでコンパイルする予定のコードだから
仕様の範囲を知って自分でその範囲に抑える必要がある
まあチェッカにも頼るけど
0048デフォルトの名無しさん2014/11/30(日) 19:10:47.37ID:7ch8dIAZ
配列まで勉強したからググりながら15パズル作ってみたんだけど
独学なのでやっちゃいけないこととかしてないかがわからないんですが、
ソースはったらレビューしてもらえますか?
0049デフォルトの名無しさん2014/11/30(日) 19:24:05.28ID:afulJL7A
いいよ
0050デフォルトの名無しさん2014/11/30(日) 19:29:02.38ID:7ch8dIAZ
ありがとうございます
お願いします
http://codepad.org/dWxbJRgl
0051デフォルトの名無しさん2014/11/30(日) 19:41:34.12ID:gdQg8r38
change_pieceのcase文
1〜4じゃなくてenum使って定数にしたほうが分かりやすくないかな
0052デフォルトの名無しさん2014/11/30(日) 19:44:12.82ID:afulJL7A
いいんじゃないか。
文法、記述はおかしくはないと思うが。
アルゴリズム的効率はわからないが。
0053デフォルトの名無しさん2014/11/30(日) 20:04:17.91ID:7ch8dIAZ
>>51
なるほど、こういうことですかね?
http://codepad.org/RORqnnSX

>>52
ありがとうございます。効率はともかく書き方とかが独学じゃよくわからないんで助かります。
0054デフォルトの名無しさん2014/11/30(日) 22:24:50.79ID:e0aRXJPC
>>53
素直なコードで読みやすいと思う
以下気が付いた点

http://codepad.org/5JAJbZn0
12行目:今のままでも問題はないと思うけど、正確には int board[4][4] = {{0}}; だよ

26行目-:getchで取った文字は文字リテラルで書いておいたほうが分かりやすいよ
 特殊キーについても#defineでマクロ定義しておくと後から見てもわかりやすいよ
 ('\0'については0のままにする人もいる 224についてはぱっと何かわからんかった←こういうことになる)

117行目-:範囲チェックは==や!=の1点判定じゃなく <=、<、>=、> の範囲判定で書いたほうが安全
 今は正しく動いてるから問題ないけど、今後の修正など何らかの影響で判定外に一気に値が飛ぶとif文の中に入っちゃう
 (これはもしかしたら組み込みプログラムの話だけかも?)

33行目:これkhbitとgetchじゃなくてgetcharでいいのでは?キーボード押されるまでwhileループが無駄に回ってることになるよね

コンパイルするときに警告(/Wallとか)を出すようにすると以外にミスが分かったりすると
0055デフォルトの名無しさん2014/11/30(日) 22:34:03.01ID:u6EiVfB2
ポインタって使い方は分かるんですけどどういうメリットがあるんですか?
全然分からなくて…
0056デフォルトの名無しさん2014/11/30(日) 23:02:41.21ID:E9FsLWG8
>>55
tmp = board[y][x];
board[y][x] = board[y - 1][x];
board[y - 1][x] = tmp;
ここをポインタを使って関数にすると
void swap(int* a, int* b){
int tmp = *a;
*a = *b;
*b = tmp;
}
swap(&board[y][x], &board[y - 1][x]);
こうやって書けるよ
0057デフォルトの名無しさん2014/11/30(日) 23:07:23.50ID:QFjaV2Jx
>>55
それが分からないうちは使うメリットないよ。
0058デフォルトの名無しさん2014/11/30(日) 23:19:39.57ID:Vcc2HJv9
>>55
例えば関数の引数に
int foo[100]を渡したいときに
このまま渡したら4byte*100で400byte必要だけどポインタ型ならint *で4byteですむわけです
0059デフォルトの名無しさん2014/11/30(日) 23:20:06.63ID:tHR3Cg3X
>>55
めちゃくちゃでかい構造体をいちいちコピーしないでアドレス参照にして使ったりすることがあるけど
下手に参照先書き換えたりすると面倒だし個人でのプログラミングで無理して使うものでもないy
0060デフォルトの名無しさん2014/11/30(日) 23:43:04.58ID:7ch8dIAZ
>>54
おー詳しくありがとうございます
12行目は勘違いしてました
26行目以下文字リテラルで書いてもよかったんですね><
intだし整数しか入ってないから整数じゃないとダメだと思ってました
117行目はforの時は無限ループにって気を付けてましたけどifも同じってことですね
33行目はgetcharだとエンター押さないと反応しないかと思ってググってでてきたkbhit使ってみたんですけど
getcharでもいけるんですか?
コンパイルするときに警告とかあったんですね。コンパイルできたらおkだと思ってましたw
0061デフォルトの名無しさん2014/11/30(日) 23:50:08.20ID:tHR3Cg3X
キーイベント取得の関数の場合は関数の処理が終わるまでwaitするわけじゃないんだな
知らなかったわ
0062デフォルトの名無しさん2014/11/30(日) 23:58:00.98ID:zlEWpLww
>>55
Web系とか、仕事でライブラリ使うようになると、ポインタの理解は必須。
0063デフォルトの名無しさん2014/12/01(月) 00:23:54.15ID:xgDZwfww
>>60
getcharに関してはすみません考え違いでした
その通り(エンター押さないと動かない)ですね
0064デフォルトの名無しさん2014/12/01(月) 19:13:39.72ID:BZNhQbSm
アセンブラ触るとポインタの概念は難しく無いんだけどな。記述にちょっと戸惑うけど。
0065デフォルトの名無しさん2014/12/01(月) 20:29:06.23ID:GlL64rib
「熱血!アセンブラ入門」の出番だな
0066デフォルトの名無しさん2014/12/02(火) 01:12:11.31ID:9M3qnKrA
>>64
基礎をやるならアセンブラ学ぶべきだとは思うけど、
GASは滅べば良いと思う。Intel形式で良いっての…
0067デフォルトの名無しさん2014/12/02(火) 02:35:28.57ID:C370zj97
○ Google Apps Script
GNU ASsembler
0068デフォルトの名無しさん2014/12/02(火) 02:36:08.40ID:Ho4GTHaC
まずはZ80から…
0069デフォルトの名無しさん2014/12/02(火) 04:01:30.16ID:TFHQO0az
今さらアセンブラやらせるとか鬼だな
0070デフォルトの名無しさん2014/12/02(火) 07:50:29.07ID:kCkBuQHW
CASL()笑
資格取得専用(笑)
0071デフォルトの名無しさん2014/12/02(火) 10:39:34.45ID:3rN5XUau
鬼というのは右も左も分からないプログラミング未経験者にCを勧める輩のことだ
0072デフォルトの名無しさん2014/12/02(火) 23:16:59.49ID:FEogy3N+
C言語でΠってどうやって表すんですか

#include <math.h>でM_PI使っても定義がダメみたいで上手くいきません
0073デフォルトの名無しさん2014/12/02(火) 23:56:00.20ID:Ki5Q3RuY
C言語って学習環境にメリットあると思うんだけどな
俺Cから始めたからそう感じる
0074デフォルトの名無しさん2014/12/03(水) 00:04:12.40ID:FsZvPr0V
>>72
#include <stdio.h>

#define _USE_MATH_DEFINES
#include <math.h>


int main(void)
{
printf("%f\n",M_PI);
return 0;
}

http://tessy.org/wiki/index.php?C%2FC%2B%2B%A4%CE%A5%C8%A5%E9%A5%D6%A5%EB%BD%B8
error C2065: 'M_PI' : 定義されていない識別子です。


に書いてあった
0075デフォルトの名無しさん2014/12/03(水) 00:12:44.04ID:0OQ5Ck44
>>73
Unix系OSとgcc?
0076デフォルトの名無しさん2014/12/03(水) 00:23:26.04ID:vA6N0j3d
>>74
gcc だと M_PIl(long double)なんかもあるね

/* The above constants are not adequate for computation using `long double's.
Therefore we provide as an extension constants with similar names as a
GNU extension. Provide enough digits for the 128-bit IEEE quad. */
#ifdef __USE_GNU
:
# define M_PIl 3.141592653589793238462643383279502884L /* pi */
0077デフォルトの名無しさん2014/12/03(水) 00:25:30.72ID:rw40JVQB
精度が大事なら多倍長。
どんなに桁が入力されていても標準の方ではCPUの精度以下しかでない。
0078デフォルトの名無しさん2014/12/03(水) 03:09:10.83ID:96sMVSIB
>>70
CASLを笑えないよ。
結局、二人の大学院生が作ったLLVMも、
CASLと同じ仮想アセンブラで、
多くの企業が、このアイデアに飛びついた

コンパイルしていったん仮想アセンブラにすれば、
x86,ARMやコア数に関わらず表現できて、
マシン(CPU)を抽象化できる

結局、マシンコードにする前に、
仮想アセンブラという段階が必要だった
0079デフォルトの名無しさん2014/12/03(水) 03:14:35.03ID:/c7/jI5U
やっぱりね
0080デフォルトの名無しさん2014/12/03(水) 12:31:53.65ID:H4iS8HkY
C++コンパイラは、最初の頃はCのコードを吐いていたけど、
結局ネイティブなコードを吐く流れになったからなあ。
LLVMも一過性の産物として終りそうな予感もする。
0081デフォルトの名無しさん2014/12/03(水) 14:59:39.96ID:uc/zSG8G
とりあえずGNU離れをするためのgcc互換コンパイラみたいな感じでもあるしw
0082デフォルトの名無しさん2014/12/03(水) 15:24:07.39ID:VV6MKLd8
GCCが出来なかったコンパイラバックエンドの共有化ができているというのに
0083デフォルトの名無しさん2014/12/03(水) 15:43:24.08ID:/c7/jI5U
やらなかったでは
0084デフォルトの名無しさん2014/12/04(木) 19:13:52.69ID:l5ENkU5P
なぜやらなかったのか
0085デフォルトの名無しさん2014/12/05(金) 03:05:58.97ID:eExr921O
やらないか?
0086デフォルトの名無しさん2014/12/05(金) 03:26:15.72ID:GPLuask+
構造体の要素の初期化についてです。
ググって色々試してみましたが見つけられませんでした。
初歩的な質問ですがよろしくお願いします。

#include <stdio.h>

typedef struct{
       char name[32];
       int score;
       int rank;
} student;

int main(void)
{
   // declaration
       student data[100] = {"A",0,1};


rankを全て1に初期化したいのですが、どのように書けばよいでしょうか。
0087デフォルトの名無しさん2014/12/05(金) 03:40:18.68ID:XeWSE51J
for文で回せばいいんじゃないの?
そういう問題と違うの?
0088デフォルトの名無しさん2014/12/05(金) 04:30:02.90ID:GPLuask+
>>87
そうなんですが、配列なので一変に初期化できる簡単な記述方法があるはずと勝手に思い込んでました。
ないなら回すしかないですかね。
0089デフォルトの名無しさん2014/12/05(金) 04:34:22.69ID:I2Pxrmns
初期化した構造体をつくるプログラムを作ってみたら
0090デフォルトの名無しさん2014/12/05(金) 04:36:27.15ID:I2Pxrmns
ファイルに書き出して、それを使うプログラムの中に埋め込むってことだよ
0091デフォルトの名無しさん2014/12/05(金) 04:51:49.34ID:GPLuask+
>>89
ないなら作るということですね。
今少し考えてみたら自分のレベルではかなり煩雑なプログラムになりそうですが。頭に入れておきます。
0092デフォルトの名無しさん2014/12/05(金) 07:14:39.41ID:qhppKeSp
>>86
構造体って0で初期化するのは簡単なのに
0以外で初期化するのは同じ方法が使えないんだよなあ。
Cの欠陥のような気がする。
0093デフォルトの名無しさん2014/12/05(金) 07:37:48.42ID:k/VkvRDh
配列の初期化処理を言語機能で用意することに懐疑的な勢力が言語提供側に存在するしね
初期化できない言語も普通だったし
0094デフォルトの名無しさん2014/12/05(金) 07:43:35.88ID:5AslDgkv
>>88
{
{"A",0,1},
...
}
というソースコードをプログラムで生成してインクルードする
0095デフォルトの名無しさん2014/12/05(金) 07:52:10.92ID:qhppKeSp
>>93
漢字が多くて漢文に見えたわ
0096デフォルトの名無しさん2014/12/05(金) 10:08:37.33ID:TirrCESl
ゼロ以外での初期化はゼロと同様にはできないんですね。それが分かっただけですごく有難いです。

ライブラリもまだあまり分かっていないので少し調べて>>94さんの方法も試してみます。
0097デフォルトの名無しさん2014/12/05(金) 12:40:57.26ID:GgJystoP
初期化しなければ以前使ったときののゴミが残ってるような事もあるから
ループを回しての初期化の何が悪いのかと?
0098デフォルトの名無しさん2014/12/05(金) 14:02:36.88ID:Fp1NhL2M
>>96
ライブラリじゃなくてスクリプトか何かを書く話では
0099デフォルトの名無しさん2014/12/05(金) 14:22:06.60ID:C9f9MAj6
言語の機構で提供されている初期化を使う vs 早々のタイミングで初期値を代入して使う
0100デフォルトの名無しさん2014/12/05(金) 19:59:19.95ID:GgJystoP
何も考えずに作ってある構造体ではポインタを使わないとアクセスできないようなパッドができて
そこにゴミが入り込むと面倒w
0101デフォルトの名無しさん2014/12/05(金) 20:32:12.92ID:Bj+HikuH
アクセスされないんだったらゴミが入っててもなにも面倒じゃないんじゃない
0102デフォルトの名無しさん2014/12/05(金) 20:37:07.23ID:qhppKeSp
皆さん構造体を使う時は、
まず最初に全てのメンバに初期値を与えて
から使いますか?
0103片山博文MZ次期CEO ◆T6xkBnTXz7B0 2014/12/05(金) 20:48:06.07ID:vHHMkldd
初期化が必要ない場合、その方法だと、ごくわずかに処理が遅くなる。
0104デフォルトの名無しさん2014/12/05(金) 22:44:26.96ID:6IHZ7FtX
構造体の中に結構でかい配列があるかもしれんし、ごくわずかで済むかはわからんぜ
0105デフォルトの名無しさん2014/12/05(金) 23:28:46.02ID:qhppKeSp
構造体などの初期化に掛かる時間が、プログラム全体の性能に影響
するなどという状況がありますか?気にし過ぎのような気もしますが
どうでしょうか?
0106デフォルトの名無しさん2014/12/05(金) 23:35:42.22ID:2e2mCewQ
>>105
静的変数で使うのか自動変数で使うのか?
0107 ◆QZaw55cn4c 2014/12/06(土) 00:20:42.32ID:uyZCaoW8
>>100
そういう嵌りかたはしたことはないな‥int で宣言したところに(手を抜いて) char でガンガン書いていく、とかしているのか?
0108デフォルトの名無しさん2014/12/06(土) 00:57:01.30ID:1t0j5bDz
paddingにゴミが入ると面倒なんて言うのは構造体の比較にmemcmp使う馬鹿だろ
0109デフォルトの名無しさん2014/12/06(土) 01:33:59.97ID:Iv1q4dyj
>>108
パディングにアクセスする状況をすぐに思いつかなかったがそういうことか。たしかにそれは無茶だわw
0110デフォルトの名無しさん2014/12/06(土) 01:39:47.66ID:q7blqefO
memcmpそのものをあまり使ったことないな
memmoveならあるけど
0111デフォルトの名無しさん2014/12/06(土) 02:04:01.39ID:8wEHUWRF
パディングと聞いて 68000 のワードバウンダリを思い出したわ
0112デフォルトの名無しさん2014/12/06(土) 04:46:43.65ID:VdTYGgw3
ここの人達ってC言語をどういう用途に使っているんですか?
Cで開発する仕事は今時ないとか聞きますし
プログラミング始めたばかりでその辺ほとんど知らないのですが
0113デフォルトの名無しさん2014/12/06(土) 04:52:34.43ID:Iv1q4dyj
古いコードのメンテとか組み込みとかはCが結構有るだろうし、
C++は普通に使うだろうけどCの殆どを内包してるから無駄にはならんし。
0114デフォルトの名無しさん2014/12/06(土) 05:12:18.73ID:MJPcf3+h
>>112
Android, iOS, Windows Phone
どれもCのコードが動きます。
つまりそういう事ですしおすし。
0115デフォルトの名無しさん2014/12/06(土) 05:36:24.26ID:VdTYGgw3
>>113
>>114
なるほどー
自分プログラミングをC言語からやり始めて一ヶ月ぐらいなんです
もうあと1週間もしたら入門本が終わるんで、次どうしようかと思ってるんですよね
C言語やってて結構面白いんです
これを適当に入門で終わらすのはもったいないなぁと最近思う事も多くて
趣味でやってるだけなんで、面白いと思う方に進めって話なんですけどね
0116デフォルトの名無しさん2014/12/06(土) 06:43:21.30ID:JJAqNvvU
マイコンキットやってみたら?
最近だとそういう組込み分野が主体だろうし
0117デフォルトの名無しさん2014/12/06(土) 06:43:59.06ID:OjtmnI7n
パッドができるような構造体の作り方の方に問題はあるが、
パッドがあることによる問題がmemcmpしか出てこないのは程度が低いw
0118デフォルトの名無しさん2014/12/06(土) 07:19:37.36ID:ui+tbMEF
作り方に問題?
パディングそのものに問題があるならわざわざコンパイラがそんなもの挿入しないと思うが。
0119デフォルトの名無しさん2014/12/06(土) 07:52:42.28ID:Iv1q4dyj
順番入れ替えてパディング無くせるケースの話じゃね?
0120デフォルトの名無しさん2014/12/06(土) 07:54:04.75ID:oqgMZipo
自動変数?だと不定では(スタックつかうのは)
クリアしてくれる親切なC系コンパイラあるんだ、最近は
0121デフォルトの名無しさん2014/12/06(土) 09:35:11.59ID:thE3a94P
C言語単体で勉強してて何が面白いんだ
0122デフォルトの名無しさん2014/12/06(土) 10:06:01.41ID:oqgMZipo
面白いということは興味があるからで別にいいんでは
面白くもないのにやってる人っているんだ
0123デフォルトの名無しさん2014/12/06(土) 10:13:09.35ID:thE3a94P
C単体じゃ面白くねえなああ
やっぱ少なくも画面が出るプログラムじゃないと
0124デフォルトの名無しさん2014/12/06(土) 10:15:10.65ID:oqgMZipo
表示があるのはデバッグが楽ですからね
画面表示ができないのは苦痛でしょう
0125デフォルトの名無しさん2014/12/06(土) 10:27:23.48ID:thE3a94P
でどんなプログラム書いて面白がってんの
0126デフォルトの名無しさん2014/12/06(土) 10:34:34.36ID:oqgMZipo
最近は、やってないので
で、あなたはどういうことやってるんですか
0127デフォルトの名無しさん2014/12/06(土) 10:41:15.24ID:thE3a94P
GUIのツール、ゲーム、スマホアプリとか
やっぱ画面が出ないと面白くねえわ
0128デフォルトの名無しさん2014/12/06(土) 10:44:16.17ID:oqgMZipo
そうですか、よかったですね
0129デフォルトの名無しさん2014/12/06(土) 11:16:09.02ID:thE3a94P
ああ、お前も頑張れよ
0130デフォルトの名無しさん2014/12/06(土) 11:27:05.62ID:mBfBm6PL
チャットでもやってろ
0131デフォルトの名無しさん2014/12/06(土) 12:12:53.52ID:q7blqefO
ちゃちゃっとちゃちゃが入りました
0132デフォルトの名無しさん2014/12/06(土) 19:50:46.52ID:UehPKPp6
Unix系のコマンドはCUIだよ
Windowsでもそうか
コマンド作りは面白いよね
0133デフォルトの名無しさん2014/12/06(土) 19:52:25.49ID:UehPKPp6
CUIでも中身というか設計がよければ
GUIに移行させるのも楽
0134デフォルトの名無しさん2014/12/06(土) 20:15:46.45ID:1juExYmo
まぁモチベーションの維持は大事だからな
作ってて面白いならそれに越したことはない
0135デフォルトの名無しさん2014/12/06(土) 21:22:11.43ID:X08O570Z
CUIどころかそれもなくひっそりとログはく程度のバックエンドで動くアプリもあるよ
プロクシ、WEBサーバとか
それはそれで面白い
0136デフォルトの名無しさん2014/12/06(土) 22:44:45.27ID:Iv1q4dyj
組み込みに至ってはログ吐くのも一苦労だったりする場合もあるぜ
LチカLチカー!
0137デフォルトの名無しさん2014/12/06(土) 22:48:16.95ID:FWmjRtxd
逆にCでGUIやゲームを作ろうと思わないわな
CならOSやらサーバやらの深い部分をやるのが醍醐味
0138デフォルトの名無しさん2014/12/06(土) 23:37:20.24ID:ui+tbMEF
いまどきCでサーバーはねえな。
0139デフォルトの名無しさん2014/12/07(日) 06:19:08.52ID:7+VBL/CT
スクリプト系だといくつか候補があるけど、深い部分弄ろうとするとCというかC++しか選択肢はないと思う。
拡張命令とかまで範囲にいれると部分的にアセンブラの可能性もあるけど。
0140デフォルトの名無しさん2014/12/07(日) 09:38:23.25ID:bfkTF4nN
深い部分いじる需要って今更あるんか
0141デフォルトの名無しさん2014/12/07(日) 10:27:37.97ID:tjSdQb8Q
ネットワークの低レベルな操作ならありかもしれないが、サーバーでやることじゃないと思う。
0142デフォルトの名無しさん2014/12/08(月) 18:07:07.09ID:uKAnA/Wx
引数について質問です。

function x(int y[]);となってる関数に対して
x(y);
x(y[]);
x(*y);


この3つの呼び出し方に違いはありますか?
0143デフォルトの名無しさん2014/12/08(月) 18:08:07.91ID:uKAnA/Wx
後int型の配列だけこの3つの呼び方ができる気が経験的にするのですが
間違いでしょうか?
例えば文字列型の変数
function x(char y[])の場合は、前述の呼び出し方は無理だと思うのですが…
0144デフォルトの名無しさん2014/12/08(月) 18:18:15.48ID:6pMx0XrP
どこの世界のCだよ
0145デフォルトの名無しさん2014/12/08(月) 18:27:26.51ID:28cVONtB
コンパイルエラーそのまま貼る僕って、かわいい?
0146デフォルトの名無しさん2014/12/08(月) 19:13:10.06ID:scZRRB0A
貼らないよりは、ずっといい。
0147デフォルトの名無しさん2014/12/08(月) 19:36:41.89ID:uKAnA/Wx
間違えました
c[]と送る方法はエラーがでました
何故でしょう?何故宣言のときはint a(int c[])←OK
呼び出し時int a(c[])はダメなのですか?
0148デフォルトの名無しさん2014/12/08(月) 19:46:20.77ID:uKAnA/Wx
後
a(*c);
a(&c);

これもアウトでした
何故でしょう?レポートに理由を書かないとダメなので助けて下さい
0149デフォルトの名無しさん2014/12/08(月) 19:51:01.58ID:mN88JAhq
宣言時には、受け取れる型を書く
呼び出し時には、宣言の型に対応した変数名を書く

/*宣言*/
int a(int c[]);
int d[3];
/*呼び出し*/
a(d);

最初の質問のような呼び出し方の違いを考える前にまずは普通はどう書くかを正しく理解することから
あと想像でいきなり質問せずに実際にコンパイルして動かしてみてから
0150デフォルトの名無しさん2014/12/08(月) 19:52:04.95ID:uKAnA/Wx
これ何故エラーなんだ…

int *f;
*f=123;
printf("%d\n",*f);


int型のポインタ変数fを設定
fの中身*fに123を代入
そして*fを表示…

何故エラー
0151デフォルトの名無しさん2014/12/08(月) 19:53:36.16ID:uKAnA/Wx
>>149
ありがとうございます
決まりでしたんですね
0152デフォルトの名無しさん2014/12/08(月) 19:58:07.57ID:uKAnA/Wx
というか

int *f;
*f=123;だけでエラーです
何故でしょう…
コンパイルエラーじゃなくて実行エラー
0153デフォルトの名無しさん2014/12/08(月) 19:59:00.04ID:uKAnA/Wx
visual studioです

Run-Time Check Failure #3
The variable 'f' is being used without being initialized.

どういうことでしょう?
0154デフォルトの名無しさん2014/12/08(月) 20:00:13.45ID:mN88JAhq
エラー原因を聞きたいときは何がどうエラーになったのか書くこと
コンパイルしたら***というメッセージが出た とか 実行したら***というメッセージが出た とか

なぜ普通の変数ではなくポインタ変数にする必要があるのか
ポインタとは何かの部分をもう一度教科書を読みましょう
0155デフォルトの名無しさん2014/12/08(月) 20:06:35.50ID:uKAnA/Wx
>>154
>>153のエラーです
不気味です
0156デフォルトの名無しさん2014/12/08(月) 20:07:35.92ID:XOsA95NW
>>153
変数fを初期化なしに使っている

って書いてる
0157デフォルトの名無しさん2014/12/08(月) 20:08:33.81ID:uKAnA/Wx
>>156
どうしたらいいでしょう…
nullって書いてるプログラム見たことないんですが
vs仕様なんでしょうか?
0158デフォルトの名無しさん2014/12/08(月) 20:09:37.97ID:uKAnA/Wx
int *f=null;
*f=123;
printf("%d\n",*f);


エラーでました…
0159デフォルトの名無しさん2014/12/08(月) 20:10:26.89ID:mN88JAhq
ポインタとは何なのかの部分をもう一度教科書を読みましょう
0160デフォルトの名無しさん2014/12/08(月) 20:11:54.93ID:XOsA95NW
>>157
int num
int *f=&num
*f=123;
printf("%d\n",*f);

これでレポート出しましょう
0161デフォルトの名無しさん2014/12/08(月) 20:12:05.25ID:uKAnA/Wx
>>159
分かりません
忠実に従いました
0162デフォルトの名無しさん2014/12/08(月) 20:12:38.68ID:uKAnA/Wx
>>160
int x=20;
int *f;
f=&x;
printf("%d\n",x);

エラーでました
0163デフォルトの名無しさん2014/12/08(月) 20:15:45.02ID:mN88JAhq
なら以下のどちらかです
・その教科書が間違っている
・忠実に従えていない

おそらく後者です

>>162
なぜそこは160に忠実に従わないの?
その記述だとエラーはないと思うけど今回は何のエラーがでたの?
0164デフォルトの名無しさん2014/12/08(月) 20:17:10.86ID:uKAnA/Wx
>>163
エラーでませんでした、別のコードでした
ありがとうございます。
char *mojiretsu="abcdefg";
mojiretsu[0]='s';
printf("%s\n",mojiretsu);
これがエラーでした
0165デフォルトの名無しさん2014/12/08(月) 20:18:43.79ID:NHTgNP8I
釣りっぽくなってきた
0166片山博文MZ ◆T6xkBnTXz7B0 2014/12/08(月) 20:19:22.78ID:BjF8LS0B
mojiretsuを配列にすればエラーでーへんでー
0167デフォルトの名無しさん2014/12/08(月) 20:19:38.62ID:mN88JAhq
>>164
>>154

ポインタとは何か言葉で説明しなさい
0168デフォルトの名無しさん2014/12/08(月) 20:21:12.15ID:uKAnA/Wx
>>166
ありがとうございます
ポインタで宣言した文字列は書き換え不可能ってことでしょうか?
0169デフォルトの名無しさん2014/12/08(月) 20:22:26.50ID:zoYbaXod
>>168
そうだよ
0170デフォルトの名無しさん2014/12/08(月) 20:24:56.59ID:3czqE9B9
レポート再提出になったほうが後々の質問者のためになるわな
どうせ専門学校も大学も企業の納期と比べたらぬるいし
0171デフォルトの名無しさん2014/12/08(月) 20:25:31.49ID:BjF8LS0B
const char *なんだなんだな
0172デフォルトの名無しさん2014/12/08(月) 20:49:43.36ID:D71asFH7
ここは入門編で俺に聞けって書いてるのに酷いスレ
0173デフォルトの名無しさん2014/12/08(月) 21:52:43.12ID:3czqE9B9
ポインタ変数に、メモリ領域のアドレスを格納しないで使ってエラー出ますってのは
直すべきことは上で散々言われてるし
0174デフォルトの名無しさん2014/12/08(月) 22:40:32.85ID:R649D88+
ポインタって、言うなれば実メモリへのショートカットみたいなもんだからな
リンク先が存在しないまま使えるわけないだろ、
っていう説明で新人が一発で理解してくれて嬉しかったw
0175デフォルトの名無しさん2014/12/08(月) 22:57:16.47ID:8AFno6T2
>>174
本の目次、って例えよりスマートだね。
0176デフォルトの名無しさん2014/12/08(月) 23:48:42.70ID:gpxOhL3D
>>164
ポインタの場合、text section に置かれるわけか…

.file "main.c"
.section .rodata
.LC0:
.string "abcdefg"

配列の場合は data segment で処理される、と

movl $1684234849, 20(%esp)
movl $6776421, 24(%esp)
movl $0, %eax

1684234849 = 0x64636261
6776421 = 0x676665
0177デフォルトの名無しさん2014/12/09(火) 01:10:17.10ID:VO0UllZT
ポインタの場合というより文字列リテラルの場合だな。
リテラルなのだから変更できないのは当たり前。
char型ポインタ変数はリテラルを指しているだけ。
char型変数の配列の場合はconst宣言しない限り変数なのだから変更できて当然。
添字演算子[]を省いた配列名は、先頭要素のアドレスのエイリアスというだけのこと。
0178デフォルトの名無しさん2014/12/09(火) 01:13:35.50ID:DF/bnstB
char *s="hello,world";
s[5]='\0';
とやって昔怒られたなあ懐かしい
0179デフォルトの名無しさん2014/12/09(火) 01:26:09.99ID:XWJh2+Y4
誰もが通る道
0180デフォルトの名無しさん2014/12/09(火) 01:30:20.83ID:bgh7cIsf
なるほど、では const を付けると、、

const char *mojiretsu="abcdefg";
mojiretsu[0]='s';

error: assignment of read-only location ‘*mojiretsu’

とはいえ、const を付けなくても文字リテラルを変更しようとする
コードはコンパイルエラーにして欲しいな、、、って GCC に
"-Wwrite-strings" ってのがあるな(warningだけど)
0181デフォルトの名無しさん2014/12/09(火) 03:22:38.60ID:/n2i5ymF
>>180
配列の const 宣言
 文字列の内容の変更を禁止する時に使用する
例)
const char mojiretsu[] = "abcdefg";
mojiretsu[0] = 's'; /* error */

ポインタの const 宣言
 文字列そのものの変更を禁止する時に使用する
例)
const char *mojiretsu = "abcdefg";
*mojiretsu = "stuvwxyz"; /* error */
0182デフォルトの名無しさん2014/12/09(火) 04:36:29.09ID:BAVYOY2g
説明がおかしい。
const char * mojiretsuでは、ポインタではなくポイント先がconstに指定されている。
ポインタのconst宣言と言うなら、char * const mojiretsuのように代入不可能なポインタであるべき。
0183デフォルトの名無しさん2014/12/09(火) 06:58:57.09ID:oKuNrEib
例えエラーになるとしても
 *mojiretsu = "stuvwxyz";
はおかしいだろ
リテラルそのものは先頭のアドレスを指すんだから
 mojiretsu = "stuvwxyz";
が正しいんじゃないの
0184デフォルトの名無しさん2014/12/09(火) 07:04:26.65ID:jdnBb/7K
>>181
char const * str = "abc";
char * const str = "abc";
char const * const str = "abc"
の違いを勉強してこい、あと

const char *str は忘れてしまえ
0185デフォルトの名無しさん2014/12/09(火) 08:31:13.11ID:sWX406y7
コンパイラ製作者がそういう風に作ったってだけで
そもそもなんで
const char *mojiretsu="abcdefg";
mojiretsu[0]='s';
をできないようにしてんだ
メモリの無駄遣いを減らすためか
そんなことはプログラマ様に決めさせろよ
コンパイラ製作者ごときが何様だよ
0186デフォルトの名無しさん2014/12/09(火) 08:40:47.84ID:1bWe/VPp
C言語には文字型の変数はあっても文字列型の変数は存在しないから。
言語仕様に文句を言っても仕方ない。
0187デフォルトの名無しさん2014/12/09(火) 08:43:52.09ID:I/JBOiEV
>>185
組み込み系だとROMに割り当てられるから、どうやっても書き換え出来ないけどな
0188デフォルトの名無しさん2014/12/09(火) 08:56:58.83ID:TRbDMUTZ
>>184
なるほど、こう書くと分かり易いもんだね。
const char* やめるわ。
0189デフォルトの名無しさん2014/12/09(火) 09:57:24.17ID:5QxFFfy0
>>185
自分でコンパイラ作ったらいいじゃん。
互換性ないけど。
0190デフォルトの名無しさん2014/12/09(火) 16:38:33.12ID:gS+W/4ly
>>185
アホかと馬鹿かと
0191デフォルトの名無しさん2014/12/09(火) 17:31:47.37ID:ojIhUxyY
char *s="abcdefg";
このabcdefgをxbcdefgに書き換えるにはどうしたらいいですか?
0192デフォルトの名無しさん2014/12/09(火) 17:34:03.40ID:ojIhUxyY
すいません前レスで無理って出てましたね
0193デフォルトの名無しさん2014/12/09(火) 17:35:55.69ID:ojIhUxyY
でも変更はできなくても参照は出来ると思うんですが
可能でしょうか?
sの1番目の文字を
char c;に代入するには?
0194デフォルトの名無しさん2014/12/09(火) 17:38:54.34ID:ojIhUxyY
後コンパイルエラーを理解できるようになるにはどうしたらいいですか?
間違ってないコードも表示されるんですがどういうことでしょう
GCCです
0195デフォルトの名無しさん2014/12/09(火) 17:40:55.32ID:nPE1PwLA
char s[] ="abcdefg";
にしなさい
0196デフォルトの名無しさん2014/12/09(火) 17:42:50.08ID:ojIhUxyY
>>195
配列にするしかないってことですかー
だとしたら変更できないリテラルって何のメリットがあるんですか?
char *s="abcd"という書き方が必要な時ってどんな時なんでしょう?
0197デフォルトの名無しさん2014/12/09(火) 17:48:00.47ID:nPE1PwLA
文字列を使いまわしたいとき
同じ文字列をハードコードしていたら間違えた文字列が紛れ込む可能性がある
0198デフォルトの名無しさん2014/12/09(火) 17:49:48.79ID:ojIhUxyY
>>197
なるほどー、それなら理解できます
0199デフォルトの名無しさん2014/12/09(火) 18:06:13.59ID:i91PBujD
>>194
英語を読む、指摘箇所が間違ってないならそこ以前のコードを疑う
通常は間違ってないコードはコンパイルエラーにならない
中括弧を閉じ忘れたりすると本当のエラー箇所より後の行でエラー指摘になることもある
具体例があるなら書き込めばだれか答えるかもね
0200デフォルトの名無しさん2014/12/09(火) 18:08:49.41ID:sW1xI6XG
すいませんポインタの質問続けてすいません。
関数へのポインタってのがどうしても理解できません。
関数へのっポインタは引数ありの関数ごと参照するって事でしょうか?
つまりf(3,"abcd",2)を参照なのか
それとも、関数の枠組みを参照なのか
どっちなのでしょうか?
0201デフォルトの名無しさん2014/12/09(火) 18:11:48.55ID:sW1xI6XG
http://www.c-lang.org/pointer_function.html
このページで勉強しています。
関数へのポインタを配列で宣言してますが
proverb0〜10までの枠組みを参照してる印象です。

引数ごと参照することってあるんでしょうか?
0202デフォルトの名無しさん2014/12/09(火) 18:14:36.66ID:DF/bnstB
関数だって>>174と理屈は同じ
関数もどっかに実体が存在しててポインタはそれにリンクするだけ
仮にf(3,"abcd",2)を参照なんてやったら関数ではなくその戻り値のポインタにならんか
0203デフォルトの名無しさん2014/12/09(火) 18:17:33.71ID:sW1xI6XG
>>202
そうですよね、関数を実行しまった後を参照してる事になりますもんね。
つまり参照してるのは枠組みって事ですか。
何で関数へのポインタみたいな形で関数を呼び出す必要があるんでしょうか?
面倒臭くないですか?直接関数を呼び出せばいいじゃないですか。
すいませんこれもC言語実習のレポートです。
0204デフォルトの名無しさん2014/12/09(火) 18:19:15.28ID:sW1xI6XG
というか構造体とポインタ理解したらCって理解すること無くならないですか?
他に難しい要素ってあるんだろうか
0205デフォルトの名無しさん2014/12/09(火) 18:19:15.69ID:DF/bnstB
stdlib.hにqsortという関数があるのでそれを書けばレポートは切り抜けられるはずです
0206デフォルトの名無しさん2014/12/09(火) 18:21:33.18ID:2/WMNdES
>>203
状況に応じて、呼びたい関数を変えたい場合に、ポインターを使わないと融通が聞かない。
0207デフォルトの名無しさん2014/12/09(火) 18:22:01.63ID:sW1xI6XG
qsortが関数へのポインタを使用してるってことは書いてありましたね。
qsortが参照してる関数って何なんでしょう…
0208デフォルトの名無しさん2014/12/09(火) 18:22:43.54ID:2/WMNdES
>>204
メモリ管理、例外処理。
0209片山博文MZ ◆T6xkBnTXz7B0 2014/12/09(火) 18:23:53.29ID:/gO7PMz6
ユーザーが指定する比較関数です。
0210デフォルトの名無しさん2014/12/09(火) 18:25:22.32ID:i91PBujD
言語の理解はそりゃあある程度簡単だろうさ
そこから初めてプログラムを作り始めるんだから

道具の使い方を覚えただけじゃ大したことはできない
道具を使って何をするかを考えなきゃいけない
0211デフォルトの名無しさん2014/12/09(火) 18:29:30.09ID:sW1xI6XG
>>206
ポリモーフィズム(java)の考え方ですね
ということは配列以外の使い道じゃ使う意味ないってことですか?

>>208
メモリ管理っていうのはCにはガーべッジコレクションが無いので
する必要無いと思うし、例外処理はCにはtry chatch releaseが無いので
それも必要あるのかと…
すいません初心者なもので
0212デフォルトの名無しさん2014/12/09(火) 18:31:37.87ID:j6toZU++
GCがないからこそ自前で管理しなきゃならんだろうが
0213デフォルトの名無しさん2014/12/09(火) 18:33:20.68ID:i91PBujD
え、ほかの言語は触ったことある人なの・・・?
0214片山博文MZ ◆T6xkBnTXz7B0 2014/12/09(火) 18:35:28.52ID:/gO7PMz6
この業界だと、マルチリンガルは普通だよん
0215デフォルトの名無しさん2014/12/09(火) 18:35:34.68ID:oQKp2wP/
すいません何回もID変えて
>>213
はい、大学で今2年の後期なんでjavaとかもやってますよ
>>212
自前で管理ってのがよくわかりません
フリーソフト使うってことですか?
自分はGCCで標準関数使ってCプログラミングしかやったことないんで
自前とか意味が良くわかりません
0216デフォルトの名無しさん2014/12/09(火) 18:36:31.79ID:bgh7cIsf
malloc/free を使ったことがないのね
0217デフォルトの名無しさん2014/12/09(火) 18:37:07.47ID:j6toZU++
>>215
malloc freeを知らないって
無知ってレベルじゃないな
0218デフォルトの名無しさん2014/12/09(火) 18:39:22.62ID:bgh7cIsf
やっぱり釣りじゃないのか?
0219デフォルトの名無しさん2014/12/09(火) 18:40:50.45ID:j6toZU++
こんなアホな大学生が存在するわけがないな
0220デフォルトの名無しさん2014/12/09(火) 18:42:04.45ID:2/WMNdES
>>211
>ポリモーフィズム(java)の考え方ですね
ポリモーフィズムは、Cの関数callより後に出てきた、”応用”の一つ。

>ということは配列以外の使い道じゃ使う意味ないってことですか?
???
0221デフォルトの名無しさん2014/12/09(火) 18:46:57.87ID:oQKp2wP/
>>217
え???malloc freeってメモリ関係だとは知ってましたが
重要なんですか???
単にopenの後にfreeしたらいいだけで重要なんですか?
0222デフォルトの名無しさん2014/12/09(火) 18:47:24.24ID:2/WMNdES
>>215
(機能が無い=不要)じゃないよ。
初期のJavaはCでの、メモリ管理、ポインター、例外処理の面倒臭さを改善したものとも言える。
0223デフォルトの名無しさん2014/12/09(火) 18:48:02.74ID:oQKp2wP/
>>220
だから配列によって複数の関数を参照する以外の使い道は
関数ポインタは無いって事なのかなと思って
0224片山博文MZ ◆T6xkBnTXz7B0 2014/12/09(火) 18:51:52.82ID:/gO7PMz6
まだ実装の決まっていないユーザー関数を将来呼び出すことができるのも関数ポインターの利点だよん
0225デフォルトの名無しさん2014/12/09(火) 18:52:46.15ID:oQKp2wP/
>>224
プログラム実行時に実装されるってことですか?
ランタイム実装??
0226デフォルトの名無しさん2014/12/09(火) 18:56:27.20ID:2/WMNdES
>>223
配列以外にも、関数へ渡す引数の中身を、関数ポインタとする使い方もある。
Web系みたいな、非同期プログラミングでは重要。
”理解”というのが言語仕様の範囲を指してるなら、この程度分かればいい。
アプリ組みたいからというなら、オブジェクト指向とか、継続とか、関数型を率直に実装してる言語を使えばいい。
それらの言語自体は初期バージョンでは大抵、Cで実装してあったから、「いちからCで実装」も可能だけど、車輪の再発明はおすすめしない。
0227片山博文MZ ◆T6xkBnTXz7B0 2014/12/09(火) 18:56:55.28ID:/gO7PMz6
簡単に言えば「コールバック」という仕組み。関数fの呼び出し側が関数アドレスgを提供して、fが与えられたユーザー関数gを呼び出す。
0228デフォルトの名無しさん2014/12/09(火) 18:58:15.95ID:oQKp2wP/
>>226
関数へ渡す引数の中身を、関数ポインタとする使い方もある。
>>

シグナチャを関数ポインタ????
簡単なコードで示してくれますか?
全く意味不明なんで教えてください
0229デフォルトの名無しさん2014/12/09(火) 18:59:40.55ID:nPE1PwLA
コールバック関数とかあるだろ
0230デフォルトの名無しさん2014/12/09(火) 19:06:26.28ID:77CtVwxR
共有ライブラリからの動的ロードと言えば済んだのに
0231デフォルトの名無しさん2014/12/09(火) 19:10:22.23ID:/t8QN1Fb
標準関数の qsort の引数に渡す関数と
qsort を実装する側のコードの書き具合
0232デフォルトの名無しさん2014/12/09(火) 19:21:27.57ID:d3z79ecB
グローバル変数やstatic変数は、明示的に初期値を記述しない限りは0にされますが、
それ以外にも、std::vector<int> vとして、v.resize( 100 )などとすることで、
0に初期化された要素が100個生成されます。

この、vectorのresizeで0初期化されるのはどういう仕組みなんでしょう??
グローバル変数やstatic変数が0に初期化されるのとは違いますよね?
0233デフォルトの名無しさん2014/12/09(火) 19:25:15.70ID:oQKp2wP/
qsortに渡す引数は配列なのでは!?!?!?
全くわけわからなくなってきたぞww
0234片山博文MZ ◆T6xkBnTXz7B0 2014/12/09(火) 19:26:40.65ID:/gO7PMz6
resizeで増えた部分をforループかmemsetで塗り潰し
0235デフォルトの名無しさん2014/12/09(火) 19:28:24.42ID:oQKp2wP/
http://www.cc.kyoto-su.ac.jp/~yamada/ap/qsort.html
なんだこれwww
全然わからねーwww
比較する方法ってなんだwww
比較する方法は > < = じゃないのか?
0236片山博文MZ ◆T6xkBnTXz7B0 2014/12/09(火) 19:29:41.35ID:/gO7PMz6
>>233
関数ポインターの配列じゃないだろう。頭大丈夫?
0237デフォルトの名無しさん2014/12/09(火) 19:37:55.37ID:i91PBujD
ついに片山さんも投げ始めた

どうみてもCの初心者どころかプログラミング自体の初心者だよなあ
今まで何かプログラム作ったことがあるのかなあ
標準入出力でじゃんけんゲームくらいかなあ

>>235
文字列をqsortする例でも一緒に見てみたら
https://www.google.co.jp/search?q=qsort%20%E6%96%87%E5%AD%97%E5%88%97
0238デフォルトの名無しさん2014/12/09(火) 19:38:53.49ID:Ru2Ys156
*(int *)
なんだこの表現は…
どういうことなんだポインタのアドレス値ってこと?
0239デフォルトの名無しさん2014/12/09(火) 19:40:23.08ID:UeIpgEM5
標準ライブラリは、ソート対象がint型なのかdoublu型なのか、あるいはユーザ定義の構造体データ
なのかあらかじめ知ることは出来ない。
そこで対象に応じて比較関数を定義して、その関数へのポインタをqsort関数に引数として渡すことで
コンパイル時ポリモーフィズムを実現しているのがqsort関数の実装。
0240デフォルトの名無しさん2014/12/09(火) 19:40:49.87ID:/t8QN1Fb
あんまり良い比較関数じゃないな
引き算の結果を大小に代用しちゃいかんケースがあるというのに
※ a > b でも a-b が負になることあるんだぜー
02412322014/12/09(火) 19:44:10.12ID:d3z79ecB
>>234
なるほど、memsetであれば、テンプレート引数型に依らず0埋めできますね。
ありがとうございました。
0242デフォルトの名無しさん2014/12/09(火) 19:46:38.12ID:Ru2Ys156
なんでcompareに戻り値がいるの…
わけわからん、とりあえずコピペでいいか…
なんだ*(int *)って…
0243デフォルトの名無しさん2014/12/09(火) 19:47:16.53ID:i91PBujD
>>240
詳しく知りたい
※のケースが想像つかない
0244デフォルトの名無しさん2014/12/09(火) 19:48:01.54ID:Ru2Ys156
*(int *)
あわかった
これはポインタのポインタだね…
0245デフォルトの名無しさん2014/12/09(火) 19:50:01.17ID:i91PBujD
残念ながら違うよ
(int *)にキャストしてからの間接演算子(*)でポインタの指す先を参照
0246デフォルトの名無しさん2014/12/09(火) 19:50:24.62ID:nPE1PwLA
違う
ポインタの中身見てるだけだ
0247デフォルトの名無しさん2014/12/09(火) 19:51:39.86ID:/t8QN1Fb
>>243
a と b のギャップが INT_MAX を超えるとき、オーバーフローして符号が裏返るねん

a = INT_MAX/2 + 1;  // 符号付整数の範囲
b = -(INT_MAX/2);  // 同じく符号付整数の範囲
だけど a - b は 符号付整数の範囲よりデカイギャップなので あああーーー って
0248デフォルトの名無しさん2014/12/09(火) 19:54:42.01ID:i91PBujD
>>247
なるほど
比較関数は引き算で定義してるのよく見るけど
オーバーフローに気を付けないといかんのね
解説ありがとう
0249デフォルトの名無しさん2014/12/09(火) 19:56:22.69ID:g1fAS7xT
int a = 1;
void* p = &a;
int b = *(int *)p; // b = 1
0250デフォルトの名無しさん2014/12/09(火) 20:00:28.63ID:Ru2Ys156
http://www.bohyoh.com/CandCPP/FAQ/FAQ00047.html

??????????????????????
なんでこっちでは
*a だけでOKなの?シングルポインタなんだろ??
0251デフォルトの名無しさん2014/12/09(火) 20:01:28.19ID:nPE1PwLA
引数をよく見ろ
0252デフォルトの名無しさん2014/12/09(火) 20:08:53.34ID:Ru2Ys156
>>251
voidじゃなくて具体的な型名ならシングルポインタでOKってことかー
規則多いな〜

後比較関数の規則自体を変える事って可能ですか?
0253デフォルトの名無しさん2014/12/09(火) 20:12:36.83ID:Ru2Ys156
なんでstrcmpと比較の規則が逆なんでしょうかね
0254片山博文MZ ◆T6xkBnTXz7B0 2014/12/09(火) 20:15:05.60ID:/gO7PMz6
逆順。

並べ替える方法は主に昇順と降順の二種類ある。
0255デフォルトの名無しさん2014/12/09(火) 20:19:48.10ID:nPE1PwLA
逆じゃないだろ
0256片山博文MZ ◆T6xkBnTXz7B0 2014/12/09(火) 20:22:33.74ID:/gO7PMz6
比較関数により、任意の並べ替え方を定義できる。
たとえば、整数を英語にしたときの文字列の長さで並び替えすることも可能。
0257デフォルトの名無しさん2014/12/09(火) 20:23:27.22ID:/t8QN1Fb
辞書順なんかは単純で良いけど
Windows 7 だかのエクスプローラのファイル名のソートルールが謎い
連続した数字を数値として取り扱ってるのか?真似しようと比較関数考えてたけど
諦めた
0258デフォルトの名無しさん2014/12/09(火) 20:24:05.85ID:Ru2Ys156
>>254
比較関数の規則を逆にできないんですか?
だから

第一引数〇第二引数→降順
第一引数△第二引数→昇順
になってるじゃないですか?

これを
第一引数△第二引数→降順
第一引数〇第二引数→昇順

にできないんですか?
0259片山博文MZ ◆T6xkBnTXz7B0 2014/12/09(火) 20:28:23.67ID:/gO7PMz6
○と△で場合分け
0260デフォルトの名無しさん2014/12/09(火) 20:30:44.71ID:Ru2Ys156
すいません頭悪くて…
0261デフォルトの名無しさん2014/12/09(火) 20:36:38.24ID:Ru2Ys156
>>239
これは
http://www.bohyoh.com/CandCPP/FAQ/FAQ00047.html
比較関数が const int *となってますが
この場合、char型の並べ替えはできないってことですか???
0262片山博文MZ ◆T6xkBnTXz7B0 2014/12/09(火) 20:44:15.55ID:/gO7PMz6
ポインターを型キャストすれば、元の型を無視して自分勝手に読み書きできる。
C言語の欠点であり、長所でもある。
0263デフォルトの名無しさん2014/12/09(火) 20:48:47.79ID:nPE1PwLA
charの配列渡せばできるだろう
0264デフォルトの名無しさん2014/12/09(火) 20:50:34.82ID:Ru2Ys156
>>263
だってconst *intってなってますよ?
キャストエラー起きてできなくないですか?
0265デフォルトの名無しさん2014/12/09(火) 20:52:02.55ID:77CtVwxR
暗黙変換できないというエラーだから明示的変換すればいい
0266片山博文MZ ◆T6xkBnTXz7B0 2014/12/09(火) 20:52:16.04ID:/gO7PMz6
Cのキャストは自由自在。
0267デフォルトの名無しさん2014/12/09(火) 20:52:33.83ID:nPE1PwLA
当たり前だが比較用の関数も変えろよ
0268デフォルトの名無しさん2014/12/09(火) 20:52:58.58ID:Ru2Ys156
>>239
実行時ポリモーフィズムはできないってことですか
0269デフォルトの名無しさん2014/12/09(火) 20:57:01.93ID:/t8QN1Fb
古い C++ コンパイラは Cコード吐いてたから
できないことはないだろう

だが、Cでクラスもどきを書きたくはないな…
0270デフォルトの名無しさん2014/12/09(火) 20:58:32.82ID:cVTgs8S9
>>261
やってはいけない書き方
0271デフォルトの名無しさん2014/12/09(火) 21:08:08.73ID:Ru2Ys156
http://www.g-ishihara.com/c_dt_01.htm

char*とconst char*は違う????
前の書き込みでchar*だとリテラルだから書き換え不可能って書き込み
ありましたけど、書き換え不可能なのはconstつけたときだけ????
char*だと書き換えできるのですか?
0272デフォルトの名無しさん2014/12/09(火) 21:10:22.53ID:nPE1PwLA
ポインタの先による
0273デフォルトの名無しさん2014/12/09(火) 21:12:12.29ID:/t8QN1Fb
文法上で不許可の場合
文法上は一見許可されているように見えて、実は指し先が書き換えを許さない場合
0274デフォルトの名無しさん2014/12/09(火) 21:26:12.03ID:DF/bnstB
qsort提示した手前、一応テストコード書いてみたがあまり使わない関数だから書いててすごく違和感あった
http://codepad.org/dnEJyn4k

>>257
strtolでもつかってみ
aとàが同一視されるから注意
0275デフォルトの名無しさん2014/12/09(火) 21:30:16.06ID:g1fAS7xT
あああ92いいい
あああ235いいい

Windowsのエクスプローラはこういうのもソートするから標準関数とは別物
0276デフォルトの名無しさん2014/12/09(火) 21:31:02.63ID:DF/bnstB
>>274
最後の行はエクスプローラーのソートの話ね
0277デフォルトの名無しさん2014/12/09(火) 21:37:57.37ID:g1fAS7xT
エクスプローラのソート関数はここに出てる

http://peace.2ch.net/test/read.cgi/tech/1408743258/840
840 :デフォルトの名無しさん [sage]:2014/12/05(金) 12:12:49.54 ID:V1LIMZ+K
>>839
StrCmpLogicalW
0278 ◆QZaw55cn4c 2014/12/09(火) 21:42:42.78ID:jdnBb/7K
>>200
質問の意味がわからないが、とりあえず qsort() の使い方を習得することがはやい
qsort() をつかいこなせるように努力しろ
0279 ◆QZaw55cn4c 2014/12/09(火) 21:45:08.84ID:jdnBb/7K
qsort() がわからなければここできけ
俺が答えてやる
0280デフォルトの名無しさん2014/12/09(火) 22:00:52.22ID:Ru2Ys156
http://hunyoi.com/?p=215
面白いww
const完全に理解できたww
これで俺も中級者かな?
0281デフォルトの名無しさん2014/12/09(火) 22:03:47.36ID:Ru2Ys156
今日1日で大分理解できました!
皆さんありがとう!
0282デフォルトの名無しさん2014/12/10(水) 00:58:59.85ID:l/HegTza
文字列の長さを調べるときに

count=0;
while(ptr[x++])
{
count++;
}
として例えば文字列が"ABC"なら3ですが
ptr[3]が-1231241とかじゃなくて
処理系によっては1000000とかの場合
whileを抜けない、またptr[3]にはアクセスできないからエラーになる
可能性もあるし、このようなコードはよくないですか?
0283デフォルトの名無しさん2014/12/10(水) 01:18:18.64ID:l/HegTza
間違えましたすいません
ptr[count++]で
{}内は;だけです。
while(ptr[count++]) ;
こうです。
0284デフォルトの名無しさん2014/12/10(水) 01:29:49.66ID:Ji/TW/nS
>>282,283
文字列終端を’¥0’以外で規定している処理系というのは知らないな。
学習とか、個人用ツールなどの安全な環境で使うときは>>283でオーケー。
ただし、わざとヌル終端していない文字列を送り込むという古典的な攻撃手法があるから、
商用アプリ組むようになる前には、内容チェック(クレンジング)方法を学んだほうがいい。
0285デフォルトの名無しさん2014/12/10(水) 01:49:54.17ID:l/HegTza
>>284
ありがとうございます!
どの処理系も同じなんですね
0286デフォルトの名無しさん2014/12/10(水) 02:32:07.90ID:hVfFOG57
>>282,283
そのコードだと、文字列(char ptr[])が"ABC"なら4が返るんじゃない?
条件式じゃなくてループ内でインクリメントしないと

count=0;
while(ptr[count]) count++;
0287デフォルトの名無しさん2014/12/10(水) 16:29:40.61ID:Y1ZzY1qv
1年C言語勉強してますがfloatとdoubleの違いが未だに分かりません
どういうことでしょうか?
0288デフォルトの名無しさん2014/12/10(水) 16:38:58.90ID:PES5DTVy
器の大きさが違う
有効精度が違う
CPUによって、計算の得意な側がある(こともある)
ちょっとしたことで (暗黙に)double 化してしまう
0289デフォルトの名無しさん2014/12/10(水) 16:43:57.43ID:Y1ZzY1qv
>>288
floatは使わないほうがいいですか?
0290デフォルトの名無しさん2014/12/10(水) 16:47:57.17ID:PES5DTVy
おおよそ double で済ましてるけど
DirectX とかの描画に纏わるもので
浮動小数点を要求してくるようなののインターフェースは float だったりするし
SIMD系のインラインでがりがりっやるぜ も float だし
用途に拠る としか
0291デフォルトの名無しさん2014/12/10(水) 16:49:59.42ID:Y1ZzY1qv
>>290
ありがとうございます
自分で作る分にはdoubleでいいってことですね
0292デフォルトの名無しさん2014/12/10(水) 17:04:51.56ID:L7mQQYSS
doubleは32ビットのレジスタに入らないことが問題になるだけw
0293デフォルトの名無しさん2014/12/10(水) 19:51:34.81ID:9n4pVCzB
そもそもfloat/doubleともになるべく使わずに済ますのが賢明
0294デフォルトの名無しさん2014/12/10(水) 19:54:00.68ID:Y1ZzY1qv
>>293
へぇそうなんですか
でも小数点100以下くらいの精度が必要な計算は自然と
double使う必要って出てくるんじゃないでしょうか?
0295デフォルトの名無しさん2014/12/10(水) 20:20:44.58ID:SCFm5xip
浮動小数点だから
0296デフォルトの名無しさん2014/12/10(水) 20:47:55.28ID:Y1ZzY1qv
doubleやfloatの精度って
1434534.24234とかだと
1から始まると思いますが、

0.0002342123の場合
2から始まるんでしょうか?
3つの0は精度に入らないんでしょうか?
0297デフォルトの名無しさん2014/12/10(水) 20:51:09.89ID:3rJhHXQ+
ttp://ja.wikipedia.org/wiki/浮動小数点数
がんばって読め。
0298デフォルトの名無しさん2014/12/10(水) 21:01:25.55ID:Lctd7lUm
>>294
精度を求めるなら浮動小数点数は使えないな
0299デフォルトの名無しさん2014/12/10(水) 21:16:23.77ID:Fb6UgWfo
小数の有効桁数や精度の話って、中学か高校くらいの理科とか数学で一通り学ぶものじゃないのか?
プログラミングでの浮動小数点以前の問題だろ
0300デフォルトの名無しさん2014/12/10(水) 21:51:33.73ID:tjevTOGi
今Visual C++ Express Edition 使って
C言語の勉強して疑問に思ったんだけど
C言語のコンパイラだとBorland C++ やMinGWって名前のがあるけど
Visual C++ Express EditionはWiki読むと
コンパイラ本体である cl (cl.exe)って言うのがコンパイラの名前になるの?
それとも製品名(でいいのかな?)のVisual C++がコンパイラ名になるの?
0301デフォルトの名無しさん2014/12/10(水) 21:54:33.89ID:hVfFOG57
binary digit では表現できない decimal floating point number があるのサ…
悲しくはないけれどこれ、現実なのよね…
0302デフォルトの名無しさん2014/12/10(水) 22:58:18.78ID:Lctd7lUm
普通に10進の0.1が循環小数になる2進数に精度を求めるのが間違い
0303デフォルトの名無しさん2014/12/11(木) 00:26:01.71ID:EQQRMJIY
>>300
コンパイラという意味では、clでいいかと。

Visual C++というのは、その中からコンパイラやソースエディタやらが使えて
それらを自動的に連携してくれる、統合開発環境。
0304デフォルトの名無しさん2014/12/11(木) 03:06:14.30ID:fOkuaX7a
>>294
浮動小数点の精度は、よく知らないが、
Floatで7桁、Doubleで15桁ほど?
それを指数部分の数で、ずらしているだけ

例えば、1.23456789 を、
100桁右にずらしたり、左にずらしたりするだけで、
精度自体は15桁のまま

だから、1.23456789を100桁左にずらすと、
123567890000000...(100桁) とすごく大きい数になるけど、
その数に1を足せなくなる

最小の刻み単位が、10^85 に大きくなっており、
それより小さい数は無視される(情報落ち)

逆に、1.23456789を100桁右にずらすと、
0.0000000...12356789(100桁) とすごく小さい数になるけど、
そのときの最小の刻み単位は、10^-100 とすごく小さくなる

つまり指数部の数で、刻みの単位を変えているだけで、
精度自体は15桁のまま
0305デフォルトの名無しさん2014/12/11(木) 05:10:11.05ID:SXmyeFPJ
刻みの単位……
0306デフォルトの名無しさん2014/12/11(木) 08:08:01.49ID:7lmTBtjN
二進化十進法
てか、アセンブラの勉強しろ
03073002014/12/11(木) 08:22:32.68ID:iGTamDhq
>>303
ありがとうございます、スッキリしました!
0308デフォルトの名無しさん2014/12/11(木) 11:12:15.04ID:u3d/vbqo
☆☆☆☆☆
               /  /     /   |      \ ヽ
               / /  /   / /    ||  |  i  ヽ i
              i /  / /  / / /    ||  ||  |│ |ノス
               |//  / /___, -一ァ|  /! |ト、|│ | | く」
                |,-‐¬  ̄---┘'7 |!  ハ! |,、-┼十|! | | |
          , -‐ ''"  し' '´_ /,ィ二l |ト、/!ヽト、\_ヽ!|!l | ハ |
       ,r/      __   ,イ|リ ヾハ! ヽ!  ,ィ⌒ヾミリノ!/リ  | ☆ 自民党、グッジョブですわ。 ☆  
      / ||ヽ  -'     / ̄ )` __      |ヒノ:} '` ,イ/ |  |  http://www.soumu.go.jp/senkyo/kokumin_touhyou/index.html
    ,r '   ヾ、  ,-、____ , イ ̄,r==-      ==-'  レ' /|  |  
  / ヽ    `ーソ  ' | |ト、,ヘ ′""          "" / / || | ☆ 日本国民の皆様、12月14日(日)の
. /    \_  /  | ハ ヽ`゙'ヘ       ' '__. ィ  / / | |  |     『衆議院議員総選挙』に必ず投票にいきましょう。 ☆  
           /   / / |  ヽ 川\    ヾ三ニ‐'′//! |  | |  |   
        /    / / 八  \川| |`ト- ..  __ , イ‐ァヘ |  | ||  |!
      /    / / /  \  \ 「`ー- 、    /  .〉  ト、|  ヽ、
     ,イ    /-─=¬ニヘ、_  \   厂\ 厂ヽ /!|   | `ー=ヘ
 -‐  ̄ /─ '  ̄     ├- ヽ\  \ノ\ \ 人 ハ!ヽ ||  |-┤ ヽ
      /          /!‐-- | |\   ト、_`ヽ oヽ  ト、!  ||  |‐┤- ヽ
  // 〉      __ /  ├‐-  ||  | 川-‐  | |  厂7! ハ!  ├:┤  ̄ヽ
  / / ー ─    ̄       ├‐- リ  || ハ!ヘ   | |  ト┤|/′ ヾ,┤   ゙i_
  ‐ '              〉‐-    | / /\ .|o | /ヽ/(′    ∨     \
‐--─ ──-r、___-、    /ー_     {(   '´>、! /ヽ/       |\       \
0309デフォルトの名無しさん2014/12/11(木) 12:10:25.86ID:MNI0BZQ+
>>300
おかしい
製品 -> コンパイラコマンド
Borland C++ -> bcc
MinGW -> gcc
VisualC++(VC) -> cl

念のため、 gcc は MinGW 専用ではない
0310デフォルトの名無しさん2014/12/12(金) 14:22:45.22ID:UyV/8EIN
いろいろggってみましたがそのようなページが見つからなかったため質問させていただきます。

プログラミング初めて数か月の初心者なのですが、
C言語でソースを作りコマンドプロンプトでアプリケーションを実行したとき
普通は一瞬で表示されますが、たまに表示されるまで5秒ほどかかることがあります。

ループ処理などに問題があり起こるものなのでしょうか?
0311デフォルトの名無しさん2014/12/12(金) 14:41:11.40ID:V0+m6fxS
おもーい処理が裏で走ってるだけでは?
0312デフォルトの名無しさん2014/12/12(金) 15:05:53.52ID:Htsdk0RS
ウイルスチェックが走ってるとエスパーしてみる

ていうかビルド工程を知らないというオチでは…
0313デフォルトの名無しさん2014/12/12(金) 15:44:48.88ID:N7ntgF1I
>>310
使用しているOSや環境、コンパイラとかIDEは何を使ってる?
0314デフォルトの名無しさん2014/12/12(金) 18:18:24.83ID:42hxWz7+
ポインタのポインタについて質問です。
ポインタのポインタの使い方すら分からないのですが、これを使うと
メモリが単なるポインタよりより節約できるという事でしょうか?
勝手な想像で滅茶苦茶な質問かもしれませんが、それくらい使い道が分かりません
0315デフォルトの名無しさん2014/12/12(金) 18:21:34.02ID:42hxWz7+
使い道が分かりません
実体のある型のアドレスさえ操作できたら
操作する側であるポインタのアドレスは必要になるのでしょうか?
0316デフォルトの名無しさん2014/12/12(金) 18:26:08.21ID:HWhT8wli
ポインターのポインターの値はアドレス
これさえおさえておけば何の問題もない
0317デフォルトの名無しさん2014/12/12(金) 18:30:26.33ID:42hxWz7+
>>316
確かにそういう認識ではいます。
ポインタのポインタの仕様に適した場面ってありますか?
あれば簡単なコードで示してくださると嬉しいです。
0318デフォルトの名無しさん2014/12/12(金) 19:02:55.31ID:42hxWz7+
すいません入門編なのに高度な質問してしまい申し訳ないです
0319デフォルトの名無しさん2014/12/12(金) 19:04:53.69ID:42hxWz7+
質問取り消します
0320デフォルトの名無しさん2014/12/12(金) 19:29:31.59ID:4w5Gy0hL
くそわろた
0321デフォルトの名無しさん2014/12/12(金) 21:59:17.46ID:Znidw3Lc
そういえば、ポインタのポインタって使ってないな。
使うとすれば関数の引数とかだけど、
最近は構造体にポインタをぶち込んで構造体のアドレス渡しにしたりと、
出来るだけ簡単になるような作り方をしてるんで。
0322デフォルトの名無しさん2014/12/12(金) 23:05:48.30ID:BMYZZ2qA
>>317
つ[qsort()]
つ[bsearch()]
0323デフォルトの名無しさん2014/12/13(土) 00:30:44.79ID:AIdFAM/b
よくあるのは strtok_r みたいにポインタを返したい場合だろうね
あとは、sqlite3_exec の errmsg みたいにポインタが指すデータを返したい場合とか。
0324デフォルトの名無しさん2014/12/13(土) 00:49:04.63ID:7g8Honqy
わしは配列の動的初期化で引数に使うかのう。
あとは、ポインタの付け替えを頻繁にやる場合にそのポインタを変えたくない場合とかかのう。
0325デフォルトの名無しさん2014/12/13(土) 01:09:52.90ID:e5o11uWa
Windowsの場合、実際は配列として扱うことが多いけどコマンドライン引数の文字列の配列も中身はポインタのポインタ。
0326デフォルトの名無しさん2014/12/13(土) 04:31:42.26ID:c6jA9oWU
FormatMessage
0327デフォルトの名無しさん2014/12/13(土) 08:25:41.57ID:6M/8ZIpt
>>152
ポインタfが初期化されてないので不定。
0328デフォルトの名無しさん2014/12/13(土) 09:19:32.74ID:6M/8ZIpt
>>271
cons char* は、ポインタの示した先が char型定数。
ポインタ自体は定数ではない。
0329デフォルトの名無しさん2014/12/13(土) 09:27:01.24ID:xMDeynnI
cで使えるFortran型の配列を操作できるライブラリってないですかね?
0330名無しさん@そうだ選挙に行こう2014/12/14(日) 14:00:33.77ID:cNg2zbjJ
先週くらいからc始めたド素人です。下のプログラムなんですけどビルド時は問題ないのに実行してAを入力するとエラー?が出てプログラムが止まります
なんでですかね?

#include <stdio.h>

//3つの値が等しいかを求める

int main(void)
{
int a,b,c;

puts("3つの整数を入力");
printf("整数A:"); scanf("%d",a);
printf("整数B:"); scanf("%d",b);
printf("整数C:"); scanf("%d",c);

if(a==b==c)
puts("3つの値は等しい");

else if(a==b || b==c || a==c)
puts("2つの値が等しい");

else
puts("等しい値はない");



return(0);
}
0331名無しさん@そうだ選挙に行こう2014/12/14(日) 14:01:43.92ID:GK8MVhpV
scanf("%d",a);
を
scanf("%d",&a);
こうしてみ
0332名無しさん@そうだ選挙に行こう2014/12/14(日) 14:04:24.08ID:yOihHWvh
あ、aだけじゃなくてb,cもね
あと、俺の知ってる限り
if(a==b==c)
っていう書き方は狙い通りに動かないはず
分けてかきなはれ
03333302014/12/14(日) 14:06:20.58ID:cNg2zbjJ
>>331
ちょっと死んできます

スレ汚し大変申し訳ありませんでした
(´・_・`)
0334名無しさん@そうだ選挙に行こう2014/12/14(日) 14:08:15.53ID:B3iNVN48
ええんやで(入門スレだから)
0335名無しさん@そうだ選挙に行こう2014/12/14(日) 14:24:02.50ID:hTLBJWNQ
>>330
こうしたら

if((a & b) == c)
puts("3つの値は等しい");
0336名無しさん@そうだ選挙に行こう2014/12/14(日) 14:33:02.56ID:cNg2zbjJ
>>332
こうしてみたんですけどどうですかね
自分で確認してみた限りでは問題なさそうなんですけど
あとなんで最初のifの使い方だとちゃんと動かないんですか?

if(a==b){
if(b==c)
puts("3つの値は等しい");

else
puts("2つの値が等しい");
}

else if(a==c){
if(c==b)
puts("3つの値が等しい");

else
puts("2つの値が等しい");
}
else if(b==c){
if(c==a)
puts("3つの値が等しい");

else
puts("2つの値が等しい");
}
else
puts("等しい値はない");

>>335
そっちのがぜんぜん簡潔ですね...
0337名無しさん@そうだ選挙に行こう2014/12/14(日) 14:39:00.48ID:kAi2SRVO
>>336
あ、ゴメン。
分けて書くってのは
if(a==b==c) これをif (a == b && b == c && c == a) っていうつもりだった
>>336みたいな書き方は意外と読みにくかったりしないかな?

> あとなんで最初のifの使い方だとちゃんと動かないんですか?

うろ覚えだからあとで自分で確かめてね

まずa==b==は(a==b)==cって解釈されて
a==bは比較演算の結果、1か0の値になったはず
だから0==cか1==cってことになる
これは期待した動きじゃないよね?
03383302014/12/14(日) 14:48:06.85ID:cNg2zbjJ
>>337
なんでこんなややこしいのしか思いつかなかったんだろうw
まだ&の使い方をよく理解してなかったみたいです

なるほどなるほど
だからa1 b1 c1の時はうまく行ってそれ以降の数字は0と1じゃないからうまくいかないのか

初歩の初歩みたいなこと教えさせてすいません、ありがとうございましたm(_ _)m
0339名無しさん@そうだ選挙に行こう2014/12/14(日) 14:54:43.15ID:R9x1i4cI
>>338
やっべ!

知ったかぶって今顔から火が出そうなんだけど
if (a == b && b == c && c == a)
これって意味考えたら実際は
if (a == b && b == c)
これで十分だよね

あばっばばばばばば…
03403302014/12/14(日) 14:56:43.49ID:cNg2zbjJ
>>339
重ね重ねありがとうございますwww
0341デフォルトの名無しさん2014/12/14(日) 20:45:22.96ID:igCzp+zo
>>335
え?
頼むからへんな小手先の工夫(しかも多くはバグ入り)をしようとせずに素直なコードにしてくれ
http://ideone.com/LYB0at
0342デフォルトの名無しさん2014/12/14(日) 21:00:30.90ID:sJIG1Voj
int count;
...

count = ((a==b) ? 1:0)+ ((b==c) ? 1:0)+ ((a==c) ? 1:0);

switch(count){
case 1:
puts("2つの値が等しい");
break;
case 3:
puts("3つの値が等しい");
break;
default:
puts("等しい値はない");
}
0343デフォルトの名無しさん2014/12/14(日) 21:12:55.67ID:2Jvuuix5
>>335
それバグってますやん
0344デフォルトの名無しさん2014/12/14(日) 21:24:46.95ID:hTLBJWNQ
>>341,343

      ∧,,,∧
     (・ω・` ) スマンカッタ・・・
     / y/ ヽ
 ━(m)二フ⊂[_ノ
     (ノノノ l l l )
  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
0345デフォルトの名無しさん2014/12/14(日) 23:07:21.46ID:L2ukMfIz
#include <stdio.h>
int main()
{
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
int count = (a == b) + (b == c) + (c == a);
char msg[][30] = {"等しい値はない", "2つの値が等しい", "", "3つの値が等しい"};
puts(msg[count]);
return 0;
}
0346デフォルトの名無しさん2014/12/15(月) 00:28:13.27ID:jHNOj1Lw
なにこれスゲェ…これがプロか
0347デフォルトの名無しさん2014/12/15(月) 01:40:57.49ID:IJcvwGIK
> char msg[][30] = {"等しい値はない", "2つの値が等しい", "", "3つの値が等しい"};

char *msg[] = {"等しい値はない", "2つの値が等しい", "", "3つの値が等しい"};

でいいと思う
0348デフォルトの名無しさん2014/12/15(月) 06:18:59.45ID:BFl1DIKk
scanfでバグるけど
0349デフォルトの名無しさん2014/12/15(月) 14:38:27.14ID:3amZ0p/t
比較演算子が真なら1を返すのって規格で決まってたっけ?
と思って調べたらC99では1を返すことが書いてあった(6.5.9 等価演算子)
0350デフォルトの名無しさん2014/12/15(月) 14:55:11.73ID:np/IX2C3
BASICが-1だったからその癖が抜けない…>比較演算子
0351デフォルトの名無しさん2014/12/15(月) 17:40:12.00ID:Wa+r9Mlq
>>349
へー
経験的に1を返すのは多くの奴が知ってるだろうけど
結局、規格としてはどうなのかは俺は謎のままだった
0352デフォルトの名無しさん2014/12/15(月) 18:37:23.53ID:tkcj1qgA
再帰を使って
nのn乗の全てのパターンを出すやり方を教えてください
3の場合こういうやつです 階乗はわかるんですが、こっちはわからなくて質問しました
111
112
113

121
122
123
〜〜
〜〜
333
0353デフォルトの名無しさん2014/12/15(月) 19:12:33.49ID:3amZ0p/t
こんな感じ?printf以外の出力だともっと考えないといかん
http://ideone.com/CzsQV8
0354デフォルトの名無しさん2014/12/15(月) 19:28:03.45ID:/SsCOr8K
>>350
「真が1」に頼らないコードを書くべき、<ctype.h> の is*() 系は真のときとんでもない値を返してくる‥
ただし自分で真偽値を返すときは、真のとき1, 偽のとき 0 を返すように書けばいい‥
0355デフォルトの名無しさん2014/12/15(月) 19:39:38.61ID:tkcj1qgA
>>353
そんな感じです
ありがとうございます
コードもキレイで理解できました
0356デフォルトの名無しさん2014/12/15(月) 19:48:30.98ID:tkcj1qgA
*= の存在を初めて知った
ほんとここで聞いてよかったです
0357デフォルトの名無しさん2014/12/16(火) 06:03:04.12ID:OS5+Z4sE
参考書というかそこら辺のサイトで載ってることだと思うけど何見てるんだろう?
0358デフォルトの名無しさん2014/12/16(火) 07:01:42.51ID:JddV/lkN
TRUEと比較しちゃいけない
0359デフォルトの名無しさん2014/12/16(火) 08:15:32.72ID:CudKiy/r
あ、そう…
0360デフォルトの名無しさん2014/12/16(火) 15:41:44.61ID:6dwtmE+E
入力されたキーが通常キーか特殊キーかでメッセージを変えようと
getchで特殊キーが入力された時、最初に返ってくる値が0だったので
if(返ってきた値==0)なら特殊キーと判断させてたのですが
プログラムを動作させる環境によっては返ってくる値が0じゃない場合もあって
上手くいかない時があります、
最初に返ってくる値関係なく通常キーか特殊キーかで処理を変える方法あるでしょうか?
0361デフォルトの名無しさん2014/12/16(火) 16:47:51.15ID:DmUZUC9d
環境依存。
キーが「押された」と「入力された」は別。
0362デフォルトの名無しさん2014/12/16(火) 17:10:15.95ID:vHDhcsvC
特殊キーってShift・Ctrl・Altのこと?
それとも文字数字以外のキー(カーソルとかエンターとか)全般のこと?

前者ってそもそもgetchでとれるんだっけ?
後者だとしたら、通常キーと考えているものを列挙とか範囲指定とかしておいて、それ以外は特殊キーっていう作りにすれば
0363デフォルトの名無しさん2014/12/16(火) 17:28:03.63ID:UekbD/oF
標準入力じゃ パイプで流し込まれた文字列かもしれないしな

キーボード入力から となると
windows 系だと kbhit linux系だと get_tty ?
どちらも非標準の関数だけど、そういう類の環境依存な奴を探すしかない
0364デフォルトの名無しさん2014/12/16(火) 17:33:48.74ID:s73lo1GC
cursesでおk
0365デフォルトの名無しさん2014/12/16(火) 17:55:18.76ID:hwVZaqlZ
入門レベルではないわな。
0366 ◆QZaw55cn4c 2014/12/16(火) 18:53:47.71ID:XCiPpknV
http://hibari.2ch.net/test/read.cgi/tech/1289715349/320
小保方メソッドだ文句あるか?
0367デフォルトの名無しさん2014/12/17(水) 08:17:01.35ID:LQjd3G0D
TCCというコンパイラには最適化オプションってないんですか?
わかる方いたらお願いします。
0368デフォルトの名無しさん2014/12/17(水) 11:10:38.77ID:rf7y+NCO
ttp://bellard.org/tcc/tcc-doc.html#SEC4
ぱっと見、ないみたいですねww
最適化してますが、瓜では
0369デフォルトの名無しさん2014/12/17(水) 19:33:03.48ID:LQjd3G0D
>>368

なさそうですよね。
ありがとうございました!!
0370デフォルトの名無しさん2014/12/17(水) 20:27:06.54ID:b8H2zT1R
http://i.imgur.com/Oxo9iOs.jpg
この画像の続きの引数strの中に指定した文字がいくつ含まれているかを返す関数を教えてください
strlenは使えません
0371デフォルトの名無しさん2014/12/17(水) 20:44:43.97ID:uIUzJbFt
int count_A(char *str, char moji) {
int i = 0;
while(*str) if ( *(str++) == moji ) i++;
return i;
}
0372デフォルトの名無しさん2014/12/17(水) 20:50:37.68ID:b8H2zT1R
>>371
ありがとうございます
感動しました
0373デフォルトの名無しさん2014/12/18(木) 08:57:17.78ID:dWl/cqiV
while(str[i])
if(str[i] >= '0' && str[i] <= '9')
cnt[stri[i] - '0']++;
i++

数字文字列を配列に格納するプログラムだけど
cnt[stri[i] - '0']++ の'0' ってなんの意味があるんですか?
0374デフォルトの名無しさん2014/12/18(木) 09:04:57.49ID:GWJsBoaM
'0'のASCIIコードが48で、1,2,3,と並んでいるのを利用して、
数字を数値に変換している
0375デフォルトの名無しさん2014/12/18(木) 09:10:21.40ID:fxvbSoUE
文字コードをそのまま使ったら int cnt[40] って宣言する必要があるけど、
stri[i] - '0' としておけば int cnt[10] で済むから

後者なら '0' の出現回数は cnt[0] で分かるけど、前者は cnt[30] としないと
いけないし、cnt[0] 〜 cnt[29] が全くの無駄になる
0376デフォルトの名無しさん2014/12/18(木) 09:14:11.29ID:fxvbSoUE
間違えた、、、orz

文字コードをそのまま使ったら int cnt[58] って宣言する必要があるけど、
stri[i] - '0' としておけば int cnt[10] で済むから

後者なら '0' の出現回数は cnt[0] で分かるけど、前者は cnt[48] としないと
いけないし、cnt[0] 〜 cnt[47] が全くの無駄になる
0377デフォルトの名無しさん2014/12/18(木) 09:56:59.58ID:yB61vtqq
Cの言語仕様で0-9が連続したコードである事は保証されてるのか?
0378デフォルトの名無しさん2014/12/18(木) 10:11:17.39ID:PpZ3cpAI
>>376
C のスレだから 0x30 とかでいいよ
0379デフォルトの名無しさん2014/12/18(木) 10:36:45.52ID:ku5Vlr4A
>>377
保証されていた筈。
EBCDICでも数字は連続しているから一応問題ないらしい。
その場合、>376はアウトだけれど。
まぁ、int cnt['0' + 10]とした上でcn['0' + 0]でいいんだけどなw
# で、そんな小細工を弄するなら、素直にstr[i] - '0'でいいわけで。
0380デフォルトの名無しさん2014/12/18(木) 12:36:58.11ID:PpZ3cpAI
>>377
数字は保証されてる
アルファベットは保証されてない
EBCDIC は途中不連続だから
0381デフォルトの名無しさん2014/12/18(木) 12:38:33.19ID:/P3mLKZ0
適当にググったら
ttp://www.kijineko.co.jp/tech/superstitions/A-to-Z-is-sequence.html
[迷信] 'A'〜'Z' の値は連続している

>一方で、数字、すなわち '0'〜'9' の文字コードが連続していることは、C/C++ の規格で保証されています。
0382デフォルトの名無しさん2014/12/18(木) 12:54:19.80ID:7LvNfPgX
よく考えたらアルファベットって英米以外はそれぞれ細かい異同があるんだよな
0383デフォルトの名無しさん2014/12/18(木) 15:10:43.43ID:VQhTeA+S
>>373です
皆様、有難うございました
0384デフォルトの名無しさん2014/12/18(木) 15:28:17.56ID:gNNDPbPh
関数の引数で
f( void **x)
って書いてあるのですが、引数xの型がわかりません
0385デフォルトの名無しさん2014/12/18(木) 15:32:13.85ID:NmnyfhLX
void**型だよ
0386デフォルトの名無しさん2014/12/18(木) 16:03:13.64ID:gNNDPbPh
>>385
void**型
についてもう少し説明をお願いします
0387デフォルトの名無しさん2014/12/18(木) 16:09:02.29ID:NmnyfhLX
void*へのポインタ型です
0388デフォルトの名無しさん2014/12/18(木) 20:08:03.69ID:on3AHD1c
何かを指しているポインタを指しているポインタ型
0389デフォルトの名無しさん2014/12/19(金) 00:58:27.59ID:6yiRzMRA
>>174 により、
int b;
int *a = &b;
int **x = &a;

*x は、int *型の変数 a へのショートカットになり、
さらに *a は、int型の変数 b へのショートカットになる
というショートカットの数珠繋ぎになっている。

で、void** は、このbの型が不明という状態と、とりあえず考えればいい。
実際にはその関数の仕様に基づいてintとか何かの型にキャストして使うんだけどな。
0390デフォルトの名無しさん2014/12/19(金) 01:07:28.86ID:6yiRzMRA
で、その f(void **x) がどういう仕様か分からないが、
例えば、f( int **x ); の場合だと、

int *a;
f( &a );

と呼び出すと、f関数の内部で、
f( int **x )
{
*x = malloc(1024);
}
のように、*xのショートカット先となるaにmallocで確保したメモリのアドレス、という値、
を格納することが出来る。
0391デフォルトの名無しさん2014/12/19(金) 13:56:14.65ID:ycZKbF/w
TurboC って、ウォッチ使って変数の中身見ることができるだろ
これVisualStudio出できないの?
0392デフォルトの名無しさん2014/12/19(金) 16:22:22.80ID:6x5sDQ5c
できるだろ。
0393デフォルトの名無しさん2014/12/19(金) 18:48:53.18ID:vI/DNkqN
#include <stdio.h>
#include <math.h>

double voltage(double t, double f, double vmax)
{
return(f*(vmax*sin(2.0*M_PI*f*t))*(vmax*sin(2.0*M_PI*f*t)));
}
0394デフォルトの名無しさん2014/12/19(金) 18:49:55.36ID:vI/DNkqN
int main(void)
{
int i, n;
double t, a, b, f, v;
double h, sum, result, vrms, vmax;

a = 0.0;
f = 50.0;
b = 1.0 / f;
v = 100.0;
vmax = 100.0*sqrt(2.0);
printf("分割数 n:"); scanf("%d", &n);
0395デフォルトの名無しさん2014/12/19(金) 18:50:49.70ID:vI/DNkqN
h = (b - a)/n;

sum = voltage(a,f,vmax)/2.0;
for(i=1; i<n; i++)
{
t = a + h*i;
sum += voltage(t,f,vmax);
}
sum += voltage(b,f,vmax)/2.0;
result = sum*h;
vrms = sqrt(result);

printf("最大値 %lf の正弦波交流の実効値の計算結果 = %lf\n", vmax, vrms);
printf("理論値 = %lf\n", v);
printf("理論値との誤差 = %lf", vrms - v);
return(0);
}
0396デフォルトの名無しさん2014/12/19(金) 18:53:28.14ID:vI/DNkqN
台形公式で電圧の実効値を求めるプログラムなのですが何度やっても理論値との誤差が0.000000になります

どなたかお力添え頂けないでしょうか(´・ω・`)
0397デフォルトの名無しさん2014/12/19(金) 20:29:45.28ID:ouqnqJMl
紙と鉛筆で計算しとけ
0398デフォルトの名無しさん2014/12/19(金) 20:34:29.20ID:Ak6+g1yP
ここにはプログラムは分かる人は多くいても台形公式とか電圧の実効値だとかの言葉だけで理解できる人はほとんどいません
せめてこの公式をプログラムにしたんですが何が違うんでしょうか?などプログラムが分かる人向けの質問にしましょう
そうでなければ、0が出力される?そりゃあそういうプログラムを書いたからそうなるんでしょ、としか返事が来ないですよ
0399デフォルトの名無しさん2014/12/19(金) 20:47:03.20ID:kXOboZoh
単純に丸めてないだけじゃないの?
0400デフォルトの名無しさん2014/12/19(金) 20:49:12.08ID:DN7z/e4W
誤差が0ならいいじゃねぇか
なにが不満なんだ?
0401デフォルトの名無しさん2014/12/19(金) 23:25:00.22ID:OyBX97fw
書き込むスレを間違えました
レベルが高いスレに移動します(´・ω・`)
0402デフォルトの名無しさん2014/12/20(土) 00:25:20.64ID:+GgZ8JtG
>>395
X printf("理論値との誤差 = %lf", vrms - v);
O printf("理論値との誤差 = %g", vrms - v);
0403デフォルトの名無しさん2014/12/20(土) 01:15:14.26ID:5qXzegsd
それは台形公式じゃなく、rmsの定義である積分を区間を分けて実行しているだけだから、結果に誤差が出るわけないだろ。
0404デフォルトの名無しさん2014/12/20(土) 04:05:10.91ID:I3+T4+Bz
>>398です

レスありがとうございました
なんとか解決できそうです
0405デフォルトの名無しさん2014/12/21(日) 12:41:51.18ID:Hdj7JKbV
int *p;
は型はなんと呼ぶのでしょう?
pはポインタ型、intへのポインタ(型)、int * 型
どう呼ぶのが正しいですか。
0406デフォルトの名無しさん2014/12/21(日) 12:45:58.22ID:2uIIlTTp
pointer to int. イントのポインタって脳内で言ってる
0407デフォルトの名無しさん2014/12/22(月) 00:17:19.33ID:zUGYDvYd
int型ポインタと言ってる。
0408デフォルトの名無しさん2014/12/22(月) 02:13:56.42ID:vbo5gTQH
インポ型
0409デフォルトの名無しさん2014/12/22(月) 03:10:48.21ID:/EfTNU+Y
連す頻度の高い記号の読みは語尾に拗音を持ってくるようにすると呼称しやすい
0410デフォルトの名無しさん2014/12/23(火) 16:46:01.18ID:eZDNRIea
 
お世話になります。
私、責任者の加茂と申します。以後、宜しくお願い致します。
http://www.apamanshop.com/membersite/27009206/images/kamo.jpg
浪速建設様の見解と致しましては、メールによる対応に関しましては
受付しないということで、当初より返信を行っていないようで、今後につい
てもメールや書面での対応は致しかねるというお答えでした。
http://www.o-naniwa.com/index.html 事務員 東条 南野
http://www.o-naniwa.com/company/
このように現在まで6通のメールを送られたとのことですが、結果一度も
返信がないとう状況になっています。
http://www.apamanshop-hd.co.jp/
http://www.data-max.co.jp/2010/10/01/post_11983.html
私どものほうでも現在までのメール履歴は随時削除を致しております
ので実際に11通のメールを頂戴しているか不明なところであります。
  
・ハンガー・ゲーム   http://s-at-e.net/scurl/TheHungerGames-Aircraft.html
・アバター        http://s-at-e.net/scurl/Avatar-Shuttle.html
 
・艦これ   http://s-at-e.net/scurl/KanColle.html
・BRS     http://s-at-e.net/scurl/BRS.html
・ベヨネッタ http://s-at-e.net/scurl/BAYONETTA.html
・風ノ旅ビト http://s-at-e.net/scurl/JOURNEY.html
 
      http://s-at-e.net/scurl/kabetokyojinto.html
 
・2012    http://s-at-e.net/scurl/2012.html
 
大阪府八尾市上之島町南 4-11 クリスタル通り2番館203
に入居の引きこもりニートから長期にわたる執拗な嫌がらせを受けています。
この入居者かその家族、親類などについてご存知の方はお知らせ下さい。
[email protected]
0411デフォルトの名無しさん2014/12/23(火) 17:24:44.21ID:+lmK68Kp
コピペマン参上!まで読んだ。
0412デフォルトの名無しさん2014/12/24(水) 12:12:45.21ID:3XqKPdGM
C言語はじめました!

構造体のありがたみがいまいちわかりません。
どういった場合に構造体あって良かった。ほんとに良かったって思うのでしょうか。
0413デフォルトの名無しさん2014/12/24(水) 12:20:39.17ID:QqT3gjby
>>412
関数の戻り値がたくさん欲しい時。
0414デフォルトの名無しさん2014/12/24(水) 12:41:26.02ID:phVcrnaV
データの管理や受け渡しを纏めて行える。
RPGゲームでキャラのパラメータ等を構造体で一纏めにするのと、個別に変数用意するのとどちらが楽か。
0415デフォルトの名無しさん2014/12/24(水) 14:30:27.38ID:X2i6KVz2
char *abc(void){
char p[] = "ABC";
return(p);
}
int main(void){
printf(""%s\n", abc());
return 0;
}
これうまくコンパイルできないけど、どうしてですか?,
0416デフォルトの名無しさん2014/12/24(水) 14:55:10.83ID:2KMwjQaK
>>415
コンパイルできないことはないと思うぞ。
コンパイルできなかったと言う主張なら、エラーメッセージを貼れ。
まぁ、想定通り動くかと聞かれたら鼻から悪魔だが。
0417デフォルトの名無しさん2014/12/24(水) 14:56:34.19ID:phVcrnaV
エラーメッセージぐらい書きましょう。

>printf(""%s\n", abc());
"が多い
printf("%s\n", abc());

char *abc(void){
char p[] = "ABC";
return(p);
}
pの変数は関数abc()が終了した時点で開放されるので非常に危険。
0418デフォルトの名無しさん2014/12/25(木) 19:50:51.72ID:xrTOXFbF
時計から時間を読むとBCD形式らしく
54分だと→0x54というデータが変数に読み込まれます。
ただこの0x54は10進数では、84なので困っています。

BCD形式→10進数表記の変換でいい方法はありませんか??
考えてみたのは…
・ビットシフトする変換関数を作る
・0〜89の配列のテーブルを作って変換する
こんなのですが、何か手はありませんか??

よろしくお願いします!!
0419片山博文MZ ◆T6xkBnTXz7B0 2014/12/25(木) 19:57:39.39ID:gEw73of1
unsigned int pbcd2dec(unsigned int n)
{
unsigned int lo = (n&0x0F);
unsigned int hi = (n>>4)&0x0F;
return lo + hi*10;
}
0420デフォルトの名無しさん2014/12/25(木) 20:13:18.57ID:xrTOXFbF
>>419
ありがとうございます!!!
0421デフォルトの名無しさん2014/12/26(金) 05:04:03.36ID:p4Lfskne
2次元行列計算のためのプログラムを書こうとしているんですが、なぜかsegmentation errorと怒られます。
簡単に説明すると、行列自体はダブルポインタで表現して、更にfmatrixという行数、列数、行列へのポインタを格納した構造体を定義してます。
main関数でfmatrix型の変数aを作って、関数new_matrixを使って変数aの初期化をしようとしています・・・。

もし分かる方いたら、どうすればいいか教えてください。m(_ _)m


#include <stdio.h>
#include <stdlib.h>

typedef struct{
int row;
int col;
float*** mat;
} fmatrix;
04224212014/12/26(金) 05:05:04.66ID:p4Lfskne
続きです、よろしくお願いします。

void new_matrix(fmatrix* a, int row, int col){
float** matrix = (float**)malloc(row * sizeof(float*));
a->mat = &matrix;

int i,j;
for(i=0; i<row; i++){
(*(a->mat))[i] = (float*)malloc(col * sizeof(float));
}

for(i=0; i<row; i++){
for(j=0; j<col; j++){
(*(a->mat))[i][j] = 0.0;
}
}

a->row = row;
a->col = col;
}

int main(){
fmatrix a;
new_matrix(&a, 2, 2);
(*(a.mat))[0][0] = 1.0;

printf("%f,%f\r\n",(*(a.mat))[0][0],(*(a.mat))[0][1]);
printf("%f,%f\r\n",(*(a.mat))[1][0],(*(a.mat))[1][1]);

return 0;
}
0423デフォルトの名無しさん2014/12/26(金) 05:10:15.65ID:fnDLLhrS
専用ライブラリ使う方があとあと便利だが。
それ自体の開発が必要か。
04244212014/12/26(金) 05:23:44.17ID:p4Lfskne
マイコンに実装することを考えていて、必要な計算は行列の基本演算と逆行列計算くらいなので、自分で作ってみようと思いました。
0425デフォルトの名無しさん2014/12/26(金) 07:28:11.01ID:YUWTiv3s
a->mat が記憶しているのは 変数matrix の位置であって malloc した領域じゃない

typedef struct{
int row;
int col;
float** mat; /* ←!! changed !! */
} fmatrix;

こうして
 a->mat = (float**)malloc(row * sizeof(float*));
以下 そのまま
04264212014/12/26(金) 08:10:41.50ID:p4Lfskne
ご指摘の通りに沿って直したら今度は上手くいきました、ありがとうございます。

ただ、もとのプログラムがなぜダメなのか結局よく理解できていません。
元のほうの発想は、ご指摘の通りmatはmallocした領域を指すポインタ変数として使おうとして、
(*(a->mat))[i][j] のようにすれば行列にアクセスできるのではないかと思ったのですが・・・。

matがfloat***だと、(*(a->mat))はfloat**になりますよね?
0427デフォルトの名無しさん2014/12/26(金) 09:00:59.04ID:PUSaAK8w
>>426
それでいいんじゃない?
float* fpの1番目の要素はfp[1]とアクセスするわけだし
0428デフォルトの名無しさん2014/12/26(金) 11:56:13.32ID:oOKeETov
>>426
(厳密な話はおいといて)
new_matrix() から抜け出した瞬間に new_matrix関数内の変数の存在は無くなる

new_matrix内の変数の位置を a->mat に記憶したとしても
上記のことがあるから、
いざ使おうとした時には、存在の無い変数へのポインタとなり、不正アクセスを起こす
0429あ2014/12/26(金) 12:24:17.14ID:B31hRDon
    /:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::://ヽ:::::::::::::::|
    l:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::// ヽ::::::::::::::l
    l:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::/:::「'ヽ::::::::::://   ヽ:::::::::::|
    |::::::::::::::::::::::::::::::::::::::::::::::::::::::::::ノl:::ノ l:::::::/      ヽ::::::::|
   ノ:::::::::::::::::::::::::::::::::::::::::::::::::::::/ ゙゙  ノ:::/ ,,;;;;;;,,    ,,,,ヽ:::::l
   ):::::::::::::::::::::::::::::::::::::::::::::::/    ノ/ __,'''i: ('''__):::l  
  )::::::::::::::::::::::::::::::::::::::::::::::::::/         ̄ ̄ン:. :「 ̄`ヾ   
 1:::::::::::::::::::::::「 `┤l:::::::::::::::::l          ̄   ,  ヽ ̄ l   
  `l:::::::::::::::::::::ヽ  :l li:::::::::::::/        ヽ  /´   `l  |
  ヽ::::::::::::::::::::::\_」 lヽ::::/         .l  !:-●,__ ノ  /      
  ノ:::::::::::::::::::::::::::ノ | l `゙゙           i ,,;;;;;;;;;;;;;;;;;;;;,  /ヽ       
,/ ヽ::::::::::::::::::::::(  l l::::::::..         /.:''/´ ̄_ソ  /  `ヽ
     ヽ:::::::::::::::ヽ | l:::::::::::...      /::// ̄ ̄_ソ  /    \   ヴッ!!
        ヽ:::::::\| l::::::::::::::::...    / :::.ゝ` ̄ ̄/ /       ヽ
           ヽ:::l l:::::::::::::::::::..      ̄ ̄;;'' /         ヽ
              l l;;;;;;:::::::::::::::.....;;;;............;;;;;;''ノ            l
              l l '''''''''''''''''''''''''''''''''''''' ̄l |             |

http://www.youtube.com/watch?v=z2qK2lhk9O0
0430デフォルトの名無しさん2014/12/26(金) 15:19:02.71ID:gYFf9bfE
大学の課題そのままでわかりづらくてすみません。
コード17行目の発展課題の問題がうまくいきません。
26行目の関数を定義します。
定義した関数は70行目からです。

13行目のscanf関数でdata変数にいれた文字列の整数部分を抜き出す関数を定義したいです。
67行目注釈のローカル変数を一切使用しないの部分で詰まってしまいます。

http://codepad.org/3qrG7JsB

よろしくお願いします。
0431デフォルトの名無しさん2014/12/26(金) 15:32:25.99ID:oOKeETov
int の戻り値を
引数の char *data だけで
あとは、ローカル/グローバル変数使わずになんとかしろと…

return に生で並べるのも無理っぽいし
sizeof(char) と sizeof(int) の差とか どーすんべ?
0432デフォルトの名無しさん2014/12/26(金) 15:40:31.41ID:fRJuoMI0
int a2num(char *data){
return atoi(data);
}
0433デフォルトの名無しさん2014/12/26(金) 15:41:38.37ID:oOKeETov
うはw
再帰で書けないか考えてたけど。。。
0434デフォルトの名無しさん2014/12/26(金) 15:56:53.48ID:XKXMWky3
>>430
修正する前の、元の問題文は?
0435デフォルトの名無しさん2014/12/26(金) 16:38:42.14ID:fzLOFCnj
>>430
とりあえず動くのは確認した。他の部分はそのままな。
まず最初んとこ。これはそのまま。
num = a2num( data );
ふたつめのとこ。continueを勝手に使った。isdigitも勝手に使った。
countの扱いは元の実装を尊重してそのままに。
if(*data == '0' || !isdigit(*data)){
printf("Please re-enter correct number\n");
count = count - 1;
continue;
}
三つ目んとこ。まずaptrを数字が終わったとこまで進めた。
あと、単位名がないときは素の入力として正しいとした。
単位名が微妙に間違ってるときも単に、無いときと同じ処理。
strstrを使ったりせず、とりあえず、aptr進めてのstrcmpだけ。
単位名ない時や間違ってるとき何かしたいなら最後にelseつけてそこに書くこと。
for (aptr = data; isdigit(*aptr) ; aptr++) {}
if (strcmp(aptr, unit1) == 0) {
num = num * 1000;
} else if (strcmp(aptr, unit2) == 0) {
num = num * 1000 * 1000;
} else if (strcmp(aptr, unit3) == 0) {
num = num * 1000 * 1000 * 1000;
}
sum += num;
04364302014/12/26(金) 17:43:57.32ID:gYFf9bfE
>>435
返答ありがとうございます。
もとのソースコードです。
自分の説明の仕方が下手だったので申し訳ないですが、わからない部分は定義した関数
num = a2num( data );
の中身のことです。

もとのソースコード
http://codepad.org/zn4I2Rwe

問題は、
「単位付きの表現を許容した数のデータを任意の個数キー入力で与え、それらの和を計算して出力するプログラムの作成」です。
04374302014/12/26(金) 18:00:03.35ID:gYFf9bfE
一応問題文ものせておきます。
コピペでみづらくてすみません。

http://codepad.org/J1bbKR2c
0438デフォルトの名無しさん2014/12/27(土) 20:18:52.80ID:OgKFx8GG
変数名を考えるときって皆さんどうしてますか?
お手本みたいなサイトがあるのでしょうか?
0439デフォルトの名無しさん2014/12/27(土) 20:21:43.84ID:6PxqP7Pi
>>438
これ俺も気になる
いつも英語翻訳サイトみたり、悩む
0440デフォルトの名無しさん2014/12/27(土) 20:23:09.18ID:kD8p/mFM
自力学習してるなら原則として気にすることはない。
業務で行う場合はコーディングルールで命名規則も決めてあるのが当然。
オープンソースなどの開発に個人的に加わるなら、既にあるコードを参考にすれば良い。

別に悩む必要がある問題だとは思えない。
0441デフォルトの名無しさん2014/12/27(土) 20:25:38.15ID:sU4lvWRv
>>440
極論するが、プログラミングなんて、名前こそが全てだ。
0442デフォルトの名無しさん2014/12/27(土) 20:27:40.22ID:OgKFx8GG
自力学習していて、いつかわgithubにコードを公開したいと考えています
0443デフォルトの名無しさん2014/12/27(土) 20:36:36.62ID:kD8p/mFM
>>441
プログラミングにはアルゴリズムや処理内容を考えるのを優先させた方がいいよ。
変数名や関数名などの名前は、後からどうにでも編集しなおせる。

ちゃんとした処理内容なら名前などどうでもプログラムはちゃんと動作する。
逆に、どんなに美しい名前が使ってあっても、ちゃんとした処理内容でなければ
プログラムはちゃんと動作しない。

ちゃんと動作しないプログラムは無意味どころか有害であり、そんなものを作る
ような人間は無意味どころか有害なのである。

つまり、死んだほうがまし、生きている意味はない。
0444デフォルトの名無しさん2014/12/27(土) 20:39:50.32ID:6PxqP7Pi
ちゃんとした名前じゃないと他人が読めない
0445デフォルトの名無しさん2014/12/27(土) 20:47:29.33ID:PS8qPAgg
>>438
> お手本みたいなサイトがあるのでしょうか?

クラス名・変数名に迷ったら書き込むスレ。Part25 [転載禁止]©2ch.net
http://peace.2ch.net/test/read.cgi/tech/1416550677/

お手本になるかどうかは知らん
0446デフォルトの名無しさん2014/12/27(土) 20:57:01.36ID:kD8p/mFM
>>444
ちゃんとした名前がついていないとコードが読めないような能力なら、
他人のコードを読んではいかん!

世の中の迷惑になる!
0447デフォルトの名無しさん2014/12/27(土) 20:58:29.93ID:6PxqP7Pi
>>446
そういう能力の人にも読みやすいコード書けないのはダメでしょ
一部の天才のみ解読可能な素晴らしいコードは必要とされてないよ…
0448デフォルトの名無しさん2014/12/27(土) 21:27:02.28ID:kD8p/mFM
「俺に理解できないのは俺が劣っているのではなく、そっちが優れ過ぎているんだ!」

どこまで卑屈なんだよ…そんな卑屈な根性で世の中に出ようなんて「甘え」だ!
0449デフォルトの名無しさん2014/12/27(土) 21:32:25.67ID:zG3QCJrf
今でも専門学校ではローマ字変数名で教えているんだろうか……?
英語できない生徒もいるだろうし
0450デフォルトの名無しさん2014/12/27(土) 21:41:22.36ID:OgKFx8GG
ローマ字から脱したい・・・
0451デフォルトの名無しさん2014/12/27(土) 22:08:57.61ID:RtAogloB
英語の変数名はいいけど
スペルミスだけは気をつけろ
保守されるたびに恥をかく事になる
0452デフォルトの名無しさん2014/12/27(土) 22:25:35.60ID:mX32OpPY
誰にもレビューされることなく実運用されるようなプログラムには自分専用の暗号めいた変数名を使う
そうすればそれ以降自分がいないと保守できないという理由でずっと給料がもらえる
0453デフォルトの名無しさん2014/12/27(土) 22:28:44.59ID:IKFUrjms
>>452
甘いというより、仕事した事無いだろ。
0454デフォルトの名無しさん2014/12/27(土) 22:30:02.09ID:PS8qPAgg
>>449
そんな生徒がプログラム言語なんて習得できるんか?
0455デフォルトの名無しさん2014/12/27(土) 22:32:47.38ID:mX32OpPY
誰にもレビューされることなく実運用されるようなプログラムなんてあるの?
0456デフォルトの名無しさん2014/12/27(土) 22:55:10.36ID:9qQU0LAx
自社システムの開発部門でなぁなぁでやってたらレビューなんてせずにコーディングから本番運用まで
なんてことがあるんだな(Cでは無かったけど^^;
0457デフォルトの名無しさん2014/12/27(土) 23:01:33.79ID:zG3QCJrf
>>454
初心者にとってのプログラム言語なんて魔法の呪文と一緒さ
意味は分からないけど書けば動く
0458デフォルトの名無しさん2014/12/27(土) 23:36:30.76ID:jliWhhuZ
>>446
名前を一括で変える機能位、普通の開発環境なら付いてるだろ?
0459デフォルトの名無しさん2014/12/27(土) 23:57:42.32ID:Z5TU2mXJ
>>451
ほぼ完成になった頃にスペルミスに気づいて全部置換したことある
あぶなかった…
04604212014/12/28(日) 04:19:02.47ID:9wCMsq9z
>>428
なるほど。ポインタ渡しだから問題ないやと思ってたら、渡されたポインタに
新しく関数内で生成したポインタを関連づけてたから駄目だったんですね。

ありがとうございました。
0461デフォルトの名無しさん2014/12/28(日) 05:27:52.36ID:z0zOxBOd
勘定系でメモリーキャッシュの処理にcashって書いてあって悩んだことはある

昔のCOBOLソースとかだと変数台帳とかあって
関数とか変数を新設したいときに申請して番号貰うんだけど
FUNC0213でH2987の変数を使うとかでマジ地獄だった
0462デフォルトの名無しさん2014/12/28(日) 05:42:49.56ID:7DhnBLGM
すごい世界だなw
0463デフォルトの名無しさん2014/12/28(日) 08:27:16.34ID:lHLjVUEs
>>458
だったら読む方がその機能で読みやすくすりゃあいいだけだな。
なんだやっぱり作る時に気にする必要ねえじゃんwww
0464デフォルトの名無しさん2014/12/28(日) 10:25:21.46ID:ce638Dr+
>>463はダメな人
0465デフォルトの名無しさん2014/12/28(日) 10:44:16.67ID:uZelGoi1
>>464
理由を添えてどうぞ
0466デフォルトの名無しさん2014/12/28(日) 10:45:18.88ID:ce638Dr+
>>465
最初から読みやすくかけよ
それだけ
0467デフォルトの名無しさん2014/12/28(日) 10:50:08.88ID:lHLjVUEs
>>466
それが他人にものを頼む態度かぁ!バカチンがぁ!
もっと謙虚になれ!お前は所詮物知らずの無能だぁ!
0468デフォルトの名無しさん2014/12/28(日) 11:08:40.03ID:q/uppUq6
>>466
そいつにレスしても面白いこと返ってくるわけじゃないから放置しとき
0469デフォルトの名無しさん2014/12/28(日) 14:01:04.99ID:8lQU0KjQ
>>465
普通書く奴は一人、読む奴は(自分も含めて)多数
どっちが対応すれば効率的かは、アホでもわかる
まあ >>463 が作るソフトを読む奴なんていないと言う可能性もあるけどな w
0470デフォルトの名無しさん2014/12/28(日) 18:53:17.46ID:SJYHrnZm
普通?どこの普通だ?
企業でも開発要員は複数いる事が当然だし、オープンソースに至っては
へたすりゃ不特定多数、こんな状況で「お前がやれば俺が楽できる」とか
傲慢な考え方で2chで吠えるだけ…

冬休みだから厨房が多数跋扈してるな…
0471デフォルトの名無しさん2014/12/28(日) 19:11:17.93ID:gEEplCVC
俺は普通を知ってるアピールキタ━(゚∀゚)━!
0472デフォルトの名無しさん2014/12/28(日) 19:39:40.39ID:AQDitcxr
>>470
> 企業でも開発要員は複数いる事が当然だし

あるコードの一行は、とか書いてないとわからんアホがいるとはな w
0473デフォルトの名無しさん2014/12/28(日) 19:42:18.68ID:SJYHrnZm
ふむ、アホと言えば済むと思ってる馬鹿か…
0474デフォルトの名無しさん2014/12/28(日) 19:51:19.17ID:AQDitcxr
>>473
で、一行は大抵一人で書くことは理解したかね w
0475デフォルトの名無しさん2014/12/28(日) 19:57:25.03ID:SJYHrnZm
なるほど、どこぞで仕入れた煽りテクを試してみてる冬厨だとかなりの
確度で判明してきたね…
しかし、根が馬鹿だからプログラミングやましてやCなど全然分かっては
いないというオチか…
0476デフォルトの名無しさん2014/12/28(日) 20:24:03.47ID:AQDitcxr
>>475
> 根が馬鹿だから

ふむ、馬鹿と言えば済むと思ってるアホか… w
0477デフォルトの名無しさん2014/12/28(日) 20:29:14.26ID:SJYHrnZm
やっとのことでオウム返しまで来たか…
かなり進歩がのろいね、してみると冬厨よりは年食った新参か?
0478デフォルトの名無しさん2014/12/28(日) 20:39:58.63ID:0+6VFReW
「俺の意見を少しでも否定するんじゃねぇ!低能どもが!!」
0479デフォルトの名無しさん2014/12/28(日) 20:47:58.78ID:FC75I7qD
変数は分かりやすい名前を付けましょう で終わり
0480デフォルトの名無しさん2014/12/28(日) 21:08:14.21ID:LtKNqxAk
>>477
返しがつまんないよ
どうせまともな反論できないんだから、もっと面白いレスしろよ
0481デフォルトの名無しさん2014/12/28(日) 21:21:19.01ID:SJYHrnZm
まだレスの仕方の指摘で留まってるのか…
かなり高齢の新参だな。へたすると5〜60台かもしれんね…
0482デフォルトの名無しさん2014/12/28(日) 23:37:15.39ID:2AqgJp2w
C言語と言えば今でもANSI Cなんですかね?
C99とかC11の扱いはどうなってるんでしょう?
0483デフォルトの名無しさん2014/12/28(日) 23:40:23.00ID:uI4zT0fw
専ブラ使ってればNGすればいいだけだしな
0484デフォルトの名無しさん2014/12/29(月) 12:57:47.24ID:2ONkfPMt
>>482
VCならC99だけどgccやIntel C++ならC99が一般的では
0485デフォルトの名無しさん2014/12/29(月) 13:02:11.30ID:Dgi09YwQ
全部C99じゃねーか
0486デフォルトの名無しさん2014/12/29(月) 14:04:40.50ID:2Hhe9fk+
ワロタ
0487デフォルトの名無しさん2014/12/29(月) 18:18:04.21ID:330p/8W6
>>484の文章見て、はて?と思ったじゃねーか
0488デフォルトの名無しさん2014/12/30(火) 20:28:32.39ID:LbwsODz2
年末だね
0489デフォルトの名無しさん2014/12/31(水) 02:59:30.93ID:7wvwAZHy
質問です
最初にメインルーチンで諸々の設定をして構造体に値を突っ込み
サブルーチンに構造体ごと値を渡し、計算して値を返すという普通のプログラムなのですが
コンパイルが通り実行してみると動作が停止してしまいます
デバッグ用に要所でテキスト出力をさせてみたのですがメインルーチンでサブルーチンを呼び出す直前までは正常に動作しており
サブルーチンの変数定義直後のテキストが出力されず動作が停止しているようです

よって変数定義の部分で何か間違いがあるとは思うのですが全く見当がつきません
アバウトな内容で申し訳ないのですが変数定義部分で動作が停止してしまう原因として考えられる事は何があるのでしょうか?
よろしくお願いします
0490デフォルトの名無しさん2014/12/31(水) 03:07:32.10ID:hwPZZsoy
>>489
貼れ
0491デフォルトの名無しさん2014/12/31(水) 03:07:48.06ID:qGDSws/U
多分本質はそこでは無いと思う
同じ現象が起きる、短いコードが書けないかな?
そういうのがあると分かるかも知れんが
0492デフォルトの名無しさん2014/12/31(水) 03:43:27.82ID:7wvwAZHy
>>489 です
#include <stdio.h>
#include <math.h>
*関数のプロトタイプ宣言諸々*
struct node{ int x[256]; int parent[256]; int child[256][256] };
struct Test{ int x1[256]; int parent1[256]; int chlld[256][256];
x2[256]; int parent2[256]; int child[256][256]};//テスト用
int main(){
*変数定義メインルーチン処理*
printf("check:テスト前\n");
Ans = subSearch(Tree,NN,k)// Ans : Test型 Tree : node型 NN,k : int型
*テキスト出力*
}
struct Test subSearch(struct node Tree, int root, int k){
int i,j,r,s;//ループ用変数
struct node subTree1;
struct node subTree2;//部分木2
int nowchild[256];
int nextchild[256];
struct Test Test;//テスト用構造体変数の宣言
printf("check サブルーチン変数宣言直後\n");
*サブルーチン処理*
return Test;
}

こんな感じです
何かおかしなところありませんか?
0493デフォルトの名無しさん2014/12/31(水) 03:49:45.48ID:7wvwAZHy
うっかり1つ目と同じように書いてしまいましたが2つ目の構造体Testは

struct Test{ int x1[256]; int parent1[256]; int chlld[256][256];
x2[256]; int parent2[256]; int child[256][256]};//テスト用

ではなく

struct Test{ int x1[256]; int parent1[256]; x2[256]; int parent2[256];};//テスト用

です
影響はないと思いますが同じ変数の二重定義みたいになっていておかしかったので訂正します
0494デフォルトの名無しさん2014/12/31(水) 04:12:06.24ID:7wvwAZHy
>>489です
ttp://codepad.org/LQBG3Uuw
短いコードで同じ状況を再現できなかったので丸ごとソースを上げます…
よろしくお願いします
0495デフォルトの名無しさん2014/12/31(水) 04:15:45.19ID:AXb0OOQU
Cで構造体の引数は元の領域からスタック領域にコピーされるんじゃなかったかな
構造体のポインタを送ればよろし
0496デフォルトの名無しさん2014/12/31(水) 04:30:35.26ID:avW0I5re
動作が停止しているという意味がよく分からないけど、スタックがオーバーフローして実行時エラーになっている感じかな。
int型で256×256の2次元配列を含む構造体を引数にするのは無茶だと思う。
他の人も言っている通りポインタで渡すのが無難。
0497デフォルトの名無しさん2014/12/31(水) 04:35:47.70ID:7wvwAZHy
>>495
ポインタ*spを宣言しサブルーチンに値を渡す110行目付近の

Test = MaxDSSearch(Tree,NN,k);

を

*sp = Tree;
Test = MaxDSSearch(*sp,NN,k);

にしてみましたが同じところで動作が停止してしまいます
構造体のポインタを送るとはこのやり方って合っていますか?
0498デフォルトの名無しさん2014/12/31(水) 04:37:59.47ID:AXb0OOQU
それ以前にサブ木を自動変数でとってつなげてるっぽい
ガベコレのある言語から移植してきたみたいだ
0499デフォルトの名無しさん2014/12/31(水) 04:48:19.68ID:7wvwAZHy
>>496
child[256][256]の先頭にポインタを置いて引数にするということでしょうか?
すると構造体Treeをx、parentとchildの2つに分ければいいのでしょうか

>>498
自動変数で調べてみましたがインクリメントに使っているrとsの事でしょうか?
あるノードの部分木全てのノードを書き出したかったのですが他の方法が思い浮かばなかったものでこのように記述しました
この方法だと何か問題が起きますか?また何か他に良い方法はないでしょうか?
0500デフォルトの名無しさん2014/12/31(水) 05:45:18.17ID:zWWIKK1Y
Treeを2つの部分木に分割ってとこの
>nextchild[r] = Tree.child[nowchild[i]];
>subTree1.x[s] = Tree.child[nowchild[i]];
の意図が不明だ…
05014892014/12/31(水) 05:54:13.19ID:7wvwAZHy
>>500
nowchild(部分木の現在探索している高さのノードの集合)は左詰めでノード値が入っているはずなのでダミー(-1)でないときに実行します
1行目はnowchildに入っているノード値それぞれのchildを全てをnextchild(次の探索する高さのノードの集合)に値を入れます
2行目は1行目と同様にsubTree1.x(1つ目の部分木のノードの集合)にも追加します
その後のforループでnextchildを次のnowchildとし、同時にnextchildの値を初期化します
これでどうでしょうか?
0502デフォルトの名無しさん2014/12/31(水) 06:22:33.50ID:woC6oG1b
そこバグってないか?
Tree.childは2次元配列として定義しているのに1次元の配列として参照しているからエラーになるんだが。
05034892014/12/31(水) 06:29:38.66ID:7wvwAZHy
>>502
!!本当ですね…
何故気付かなかったのかというのもそうですがこの場合エラー吐いてくれないんですね…
ちょっと修正してみます!ありがとうございます
0504デフォルトの名無しさん2014/12/31(水) 07:39:06.55ID:woC6oG1b
適当に修正してとりあえず実行してみた。
テストデータのデータ構造や処理の中身はよく分からないが、
アルゴリズムの部分のループの最後でgamma**などの配列の
インデックスが負になって実行時エラーが発生しているな。
05054892014/12/31(水) 09:19:04.07ID:7wvwAZHy
>>504
そうですね…処理部分が1ループ余分だったようです
ありがとうございます!
0506デフォルトの名無しさん2014/12/31(水) 09:55:55.32ID:4yI/XMNB
cでコード書いていて自動変数を知らないとは…
0507デフォルトの名無しさん2014/12/31(水) 10:15:51.95ID:aqCI7mJ+
ズコ-
0508デフォルトの名無しさん2014/12/31(水) 12:42:32.67ID:qGDSws/U
>>506
他言語との兼ね合いでローカル変数とだけ教わったんじゃないの
C系以外であれを自動変数って呼ぶ文化あんまないし
0509デフォルトの名無しさん2014/12/31(水) 12:43:40.19ID:U0APx8aX
c++なんてautoの意味変えちゃったし
0510デフォルトの名無しさん2014/12/31(水) 13:30:38.16ID:4yI/XMNB
>>508
今はネット上の断片的な知識だけでcのプログラムが書けてしまうからなぁ。
でも、cはちゃんとした書籍で勉強したほうが良いよ。
0511デフォルトの名無しさん2014/12/31(水) 13:49:25.95ID:vgeDgSob
C では auto 変数はスタック上にあるとはっきりしている(ようだ)からマルチスレッドで書くのもたやすいが、他の言語(Javaとか)ではこのへんどうなってるの?
0512デフォルトの名無しさん2014/12/31(水) 14:27:00.43ID:k5fEX/jC
不勉強なのだけど、マルチスレッドってそこまで意識しなきゃいけないの?
0513デフォルトの名無しさん2014/12/31(水) 14:27:46.25ID:k5fEX/jC
そこまで→アセンブラのレベルまで
0514デフォルトの名無しさん2014/12/31(水) 14:39:19.75ID:4yI/XMNB
>>512
排他の仕組みは、かなり細かいレベルまで理解してないと
必要な所にロックが無かったり、不必要な所に無駄なロックがあったりとかなるんじゃないの?

運良くたまたま問題なく動いているようなマルチスレッドコードを見かける事がある。
0515デフォルトの名無しさん2014/12/31(水) 14:41:15.55ID:4yI/XMNB
個人的にはマルチスレッド使わなくてもなんとかなる所はマルチスレッドは使いたくない。
マルチスレッドを極めてる分けじゃないので自分の知らない落とし穴がありそうでw
0516デフォルトの名無しさん2014/12/31(水) 14:45:53.95ID:k5fEX/jC
なるほど
ちなみに俺はデッドロックの記念にスクショ取るような奴だから
もちろん使いこなせてはいません。。
0517デフォルトの名無しさん2014/12/31(水) 14:57:10.64ID:nAbDlIQV
マルチスレッドとタスクってなにが違うんでしょ…
ついていけない
0518デフォルトの名無しさん2014/12/31(水) 15:07:46.82ID:4yI/XMNB
>>517
マルチタスクと言った場合、マルチスレッドとマルチプロセスの両方を含むんじゃないの?
マルチスレッドは、同じメモリ空間内で複数の処理が同時実行される。
0519デフォルトの名無しさん2014/12/31(水) 15:14:49.52ID:y3Bru/20
>>517
公衆トイレにカギが付いているかいないかの違い
0520デフォルトの名無しさん2014/12/31(水) 15:16:56.14ID:grXbYJWV
言語仕様が考えられた時代によって大変さが変わってくるかな
C#だとかは言語仕様でマルチスレッドが考慮されてて簡単だけど、
CとかはOSが提供するAPIを直接使う必要があって面倒だよな
0521デフォルトの名無しさん2014/12/31(水) 15:40:46.44ID:4yI/XMNB
>>520
そのc#がクセ者なのよ。
一見簡単なので安易に使いたがるヤツがいる。スキルの無いヤツほど使いたがるw
0522デフォルトの名無しさん2014/12/31(水) 15:43:18.04ID:oxyyKCIi
>>517
Linuxによる並行プログラミング入門
http://www.amazon.co.jp/dp/4320123808

これよかった
0523デフォルトの名無しさん2014/12/31(水) 15:46:58.88ID:8O8ksT0R
DOS/UNIXでタスクと言っていた物をWindowsでスレッドと言っているだけだと思う。
ディレクトリ→フォルダみたいに。
0524デフォルトの名無しさん2014/12/31(水) 15:51:52.31ID:oAGy3gWf
タスクとスレッドは別。
マルチタスクはOS機構で、マルチスレッドはプログラム、コンパイラ側の機構では?
0525デフォルトの名無しさん2014/12/31(水) 15:51:58.22ID:grXbYJWV
そして実際に使ってみても簡単だよね

async/awaitなんて、今までの書き方そのままで、
時間のかかる処理にキーワードを付けるだけでその部分をマルチスレッドで
実行してくれるし
linqなんかも配列処理を裏で自動的にマルチスレッド処理してくれるしで、

もはや、こうすれば早くなる程度しか分からない人でも使えるようになってるからな
0526デフォルトの名無しさん2014/12/31(水) 15:53:03.06ID:4yI/XMNB
>>519
カギは付いているが掛けるかどうかは利用者の責任で
0527デフォルトの名無しさん2014/12/31(水) 15:55:02.66ID:4yI/XMNB
>>525
簡単に実装できるがマルチスレッドの罠も継承されてる。
05284892014/12/31(水) 15:58:02.38ID:7wvwAZHy
>>506-508
なるほど、childをメインルーチンで計算して値を渡すよりサブルーチンで適宜計算すればいいのですね
確かにローカル変数、グローバル変数とだけ教わりました
とはいっても「関数実行中のみメモリ上のスタックに確保され、関数の実行が終了するとメモリ上から削除される」を忘れてる時点でダメダメですね…
ちなみにこのプログラムは後々サブルーチンを再帰呼び出しする予定なのですが
サブルーチン中でサブルーチンを呼び出すので結局child配列が複数用意されてしまうことになると思います
この場合childをグローバル変数で定義すれば問題ないのでしょうか?
0529デフォルトの名無しさん2014/12/31(水) 16:01:47.58ID:oAGy3gWf
マルチタスク、マルチプロセスのほうが大昔からある概念では。
たとえば初期のwindowsは疑似マルチタスクだったし、
大昔にはクライアントサーバー型で端末にほとんど計算機能がないコンピュータがあってこれはマルチタスクだろう。
それと比較してマルチスレッドは本格的には2コア以上のパソコンが出てきた事と関係有るだろ。
0530デフォルトの名無しさん2014/12/31(水) 16:09:21.52ID:grXbYJWV
昨今のオブジェクト指向言語だと、
Cの動的確保メモリに対応する、オブジェクトは、
ビルダーパターンで生成専用クラスで確保して、
作成した実体はイミュータブル、すなわちリードオンリーにすることで
それ自体の同期を不要にする、
という設計にするよね。stringクラスとか正にそうだし
0531デフォルトの名無しさん2014/12/31(水) 16:12:04.27ID:oAGy3gWf
端末に計算機能、記録機能を付けないシステムは大昔限定ではなかった。Wikipediaの解説によると。


メインフレーム - Wikipedia

メインフレームの再評価(2000年代)

絶滅するかと思われたメインフレームだが、特に日本では現在でも大規模な企業・組織で使われ続けている。
?特性上、基幹業務での安定性・信頼性はオープンシステムより優れている。
?クローズドな特性もセキュリティやデータ整合性には、かえって好ましい。
?コスト面で価格性能比が向上し、導入後の保守運用 (TCO) を考慮すれば安価である。

メインフレーム大国

日本は世界有数の「メインフレーム大国」である。2007年時点では、日本のサーバー市場の約4分の1を占め、欧米の2倍以上の金額が費やされていると言われていた。
0532デフォルトの名無しさん2014/12/31(水) 16:19:49.32ID:oAGy3gWf
クラウドコンピューティングとか、Googleメールとか、Googleアプリとか、Googleアースとか、
オンラインゲームとか、携帯とか、広義にはインターネットがサーバーがデータ保持、処理しているクライアントサーバー型だな。
どれだけ端末が処理をしないかに差はあるが。
0533デフォルトの名無しさん2014/12/31(水) 16:24:29.02ID:U0APx8aX
>>532
さすがに雑談スレでやったほうがいいわ
0534デフォルトの名無しさん2014/12/31(水) 16:34:42.16ID:VRTLG3DL
「x86CPUはダブルタスクまでOK」とか言ってた時代があった。
その機能使って、割り込み画像キャプソフトが使えないソフトをキャプしてた。
メモリ確保が大変だったけど。
0535デフォルトの名無しさん2014/12/31(水) 17:04:59.79ID:4sDUohW8
>>530
生成専用クラスを使うのにimmutableにできたっけ?friendにするとか?
0536デフォルトの名無しさん2014/12/31(水) 17:17:19.46ID:4yI/XMNB
>>529
マルチスレッドは複数コアCPUが登場する前からあるんだが。
で、マルチコアCPUが出てきたので何でもかんでもスレッドにすれば効率良いんじゃないみたいになってる。
0537デフォルトの名無しさん2014/12/31(水) 17:52:05.53ID:XX+AhETF
>>528
現状のデータ構造のまま再帰呼び出しすると恐らく破綻する。
既に指摘されているように、自動変数に頼った強引な木構造で再帰呼び出しなどすれば
ほぼ間違いなくスタックがオーバーフローする。
構造体メンバをグローバル変数にすることを検討する前に、再起呼び出しに相応しいデータ構造を
検討する方が先決。
一般的にはC言語で木構造を扱う場合、ノードの情報を配列として持つのではなく、
連結リストとして構成して、データの受け渡しはポインタ経由で行うのが一般的な方法。
0538デフォルトの名無しさん2014/12/31(水) 18:32:56.75ID:ylwvJZ8N
>>536
Solaris の native thread でプログラムを組んだ時の事を思い出した…
1 スレッド当たりのスタックサイズがデフォルトでは 2 KB になってて参った
0539デフォルトの名無しさん2015/01/01(木) 13:33:01.41ID:j61NZUAs
>>536
スレッドの方がお手軽だからね、プログラムカウンタとスタックだけ手当てしてあげればいい‥
0540デフォルトの名無しさん2015/01/01(木) 13:42:54.62ID:oXvFvpVM
>>539
スタックの手当とは?
0541デフォルトの名無しさん2015/01/01(木) 14:46:50.15ID:Dc/On1Zo
>>539
スレッドはメモリー空間が同じだから、同期が楽ってだけだろ?
別プロセスだったら共有メモリーとか作らないと行けないし。
0542デフォルトの名無しさん2015/01/01(木) 15:53:39.51ID:BK9p898t
>>541
生成と切替のコストが全然違うよ
0543デフォルトの名無しさん2015/01/01(木) 16:00:25.59ID:oXvFvpVM
>>542
生成はコスト掛かりそうだが切り替えもそんなにコスト掛かるのか?
スレッド同期とプロセス同期だとコストは違うのはわかるが。
0544デフォルトの名無しさん2015/01/01(木) 16:29:18.60ID:BK9p898t
>>543
メモリ空間の切り替えが必要だから
http://d.hatena.ne.jp/naoya/touch/20071010/1192040413
0545 ◆QZaw55cn4c 2015/01/03(土) 22:50:43.61ID:uYlZQYsd
メモリ空間の切り替えはコストが高いからね
現在は粒度の小さいスレッドがもてはやされている時代、Window**s** には fork() はないので、スレッド一択といっていい
C はそういうところがわかりやすいが、他の言語ではどうなっているんだろうね
0546デフォルトの名無しさん2015/01/03(土) 23:06:40.10ID:dcjdSJmc
誰もなにも聞いてないのに何時までこの話題を引っ張るの?
0547デフォルトの名無しさん2015/01/03(土) 23:24:38.54ID:g9tk+6B8
>>545
Chromeはプロセス実装だがなんかメリットあるんのけ?
0548デフォルトの名無しさん2015/01/03(土) 23:37:38.63ID:Mi3y7m+B
安全にプロセスごと落とせるようにじゃないか
0549デフォルトの名無しさん2015/01/04(日) 08:02:28.78ID:PO9jzi2P
同じアドレスのメモリを参照できないとか
参照するためにはそれ特化のコードがいるとか
0550デフォルトの名無しさん2015/01/04(日) 09:51:56.19ID:EjbbMTMU
>>547
バグってても他のプロセスに影響しないし、死ぬのはプロセス単位だから
0551デフォルトの名無しさん2015/01/04(日) 12:52:24.92ID:g1hkc6vC
>>550って>>548と同じこと言ってない?
0552デフォルトの名無しさん2015/01/04(日) 14:17:14.65ID:37hdpDx0
だね
0553デフォルトの名無しさん2015/01/04(日) 19:51:47.45ID:9lboT9rs
C++みたく以下のことを行いたいですが実装可能でしょうか

#include "mystack.h"

int main()
{
    Stack *s1, *s2;
    size_t size = 100;

    s1 = Stack_new(); // 要素を stack.h 内で設定した定数個分確保
    s2 = Stack_new(size); // 要素を size 個確保

    Stack_delete(s1);
    Stack_delete(s2);

    return 0;
}
0554デフォルトの名無しさん2015/01/04(日) 20:12:38.77ID:9lboT9rs
間違えました。こんな感じです
関数のオーバーロードはC言語ではできないと思いますが
擬似的に再現することはできますか

#include "mystack.h"

int main()
{
    Stack *s1, *s2;
    size_t size = 100;

    Stack_init(&s1); // stack.c 内で設定した定数個分確保
    Stack_init(&s2, size); // 要素を size 個確保

    Stack_delete(s1);
    Stack_delete(s2);

    return 0;
}
0555デフォルトの名無しさん2015/01/04(日) 20:12:44.17ID:EjbbMTMU
>>553
基本無理
・C++ を使う
・独自のプリプロセッサもしくはコンパイラを開発する
・s1 = Stack_new(0); // 要素を stack.h 内で設定した定数個分確保
 で我慢する
0556デフォルトの名無しさん2015/01/04(日) 20:15:42.94ID:9lboT9rs
また間違えました…
連投すみません…

#include "mystack.h"

int main()
{
    Stack s1, s2;
    size_t size = 100;

    Stack_init(&s1); // stack.c 内で設定した定数個分確保
    Stack_init(&s2, size); // 要素を size 個確保

    Stack_finish(&s1);
    Stack_finish(&s2);

    return 0;
}
0557デフォルトの名無しさん2015/01/04(日) 20:16:29.02ID:9lboT9rs
>>555
やはり size = 0 のようにするのが普通ですか
ありがとうございます
0558デフォルトの名無しさん2015/01/04(日) 21:37:30.71ID:iUH8ydt/
define の中に含まれた # をそのまま展開する方法ってありますか?
0559デフォルトの名無しさん2015/01/04(日) 21:39:05.39ID:cj3MqVPN
>>554
可変長で受けて振り分ければいけると思う
オススメはしない
0560デフォルトの名無しさん2015/01/04(日) 22:03:19.80ID:9lboT9rs
>>559
おすすめはしないというのは
予期しない変数を受け取った場合の処理が
面倒ということで合ってますか?
0561デフォルトの名無しさん2015/01/04(日) 22:09:37.17ID:cj3MqVPN
>>560
それもあるけど単に面倒でしょ?
init
resize
と2段階踏踏んだほうが簡単じゃない?
マクロになるけどCSTLのソースとか参考になるかもしれない
0562デフォルトの名無しさん2015/01/04(日) 22:28:09.23ID:9lboT9rs
>>561
分けると要素数を指定して確保する場合に
initとresizeを両方書くのが面倒だと思いました(2回確保してますし…)
どのみち足りなくなったらresizeするので両方書くんですが…

CSTLの存在を初めて知りました
見て勉強します
ありがとうございます
0563デフォルトの名無しさん2015/01/04(日) 22:44:12.53ID:Qu74iV3W
面倒なことはやめて、2変数ならFNC2としたらいい。
あとはC++にする。
0564デフォルトの名無しさん2015/01/04(日) 22:45:20.96ID:cj3MqVPN
>>562
reserve的なものを指して言ってるのかと思ったけど
その用途ならまったく気にすること無いよ
足りなくなったら自動で拡張されていくので
resizeする必要はない
0565デフォルトの名無しさん2015/01/04(日) 22:48:42.83ID:EjbbMTMU
>>559
無理でしょ
受ける側組んだことあれば知ってると思うが、最低一つの引数は必要だし、引数の個数を知る方法が必要だから
0566デフォルトの名無しさん2015/01/04(日) 23:22:56.56ID:cj3MqVPN
>>565
C99限定かな
05675662015/01/04(日) 23:31:14.11ID:cj3MqVPN
行けた記憶があったけど
うろ覚えなので分かる人いたらフォローお願いします
0568デフォルトの名無しさん2015/01/04(日) 23:42:24.96ID:9lboT9rs
>>564
reserveで合ってます
今、足りなくなったら自動的に拡張するものを自分で作ってます
0569デフォルトの名無しさん2015/01/05(月) 02:42:46.09ID:R0+uea2O
>>566
可変引数って実態はva_args型のポインタで受けてるだけでしょ?
番兵でもフォーマット文字列でも引数の個数をintで受けるにせよ
可変引数の関数を作るには引数の個数がわかってないといけない
c99とかどうでもいい
0570デフォルトの名無しさん2015/01/05(月) 06:45:55.47ID:9nhxbDze
>>566-567
ああ、すまん
可変引数マクロがサポートされてるんだな、忘れてたわ
http://qiita.com/saltheads/items/e1b0ab54d3d6029c9593
0571デフォルトの名無しさん2015/01/08(木) 08:23:53.45ID:Pb+Bou3I
どこで質問したらいいかわからないので、とりあえずここで質問させてください。
「やさしいC」の第4版26ページで
「試しに、次のコードを入力してから「Sample2.c」という名前で保存してください。さっそく、実行してみましょう。」
ってあるんですが、
ここでいう保存、実行って具体的にどういう操作ですか?
環境はMicrosoft Visual Studio Express 2013 for Windows Desktopです。
できましたら1つ1つ操作手順を教えて頂ければ幸いです。
0572デフォルトの名無しさん2015/01/08(木) 12:56:44.44ID:hmv0dwlG
>>571
スレ違い。VisualStudio関連のスレでどうぞ。
つーか、その本で勉強する積もりならいっそ
ideone辺りでやった方が捗るぞ。
0573デフォルトの名無しさん2015/01/08(木) 18:35:22.86ID:MfzVwljP
>>572
ありがとうございます。
ideone便利そうですね。使ってみます!
VisualStudioの方は眠くてボーとしてたので、もう少し自力で調べたりして
分からなかったらVisualStudio関連のスレ行ってみます。
0574デフォルトの名無しさん2015/01/08(木) 21:29:03.24ID:dQf1lgek
https://www.youtube.com/watch?v=UzXTxYUEytU
すごくいい‥
0575デフォルトの名無しさん2015/01/08(木) 21:30:04.23ID:dQf1lgek
誤爆だすまん
0576デフォルトの名無しさん2015/01/08(木) 21:32:58.90ID:H1OnwSh4
>>571
ゆとりって凄いなw感心したw
0577デフォルトの名無しさん2015/01/08(木) 23:03:54.65ID:ePx2w07M
保存が分からないってのはちょっと
0578デフォルトの名無しさん2015/01/09(金) 00:53:38.67ID:Jq6Ajx8t
意外と、プロジェクトを作って、ソースファイルを作成して、保存するとか実行するとかって、
我々は当たり前にやっているけど、素人には分からないんだよな。

若手への研修に関わってみて、なるほど言われてみればそうかもな、と思う今日この頃。
0579デフォルトの名無しさん2015/01/09(金) 01:00:31.00ID:usGL+LII
それは未経験なだろう。
0580デフォルトの名無しさん2015/01/09(金) 01:01:45.19ID:V7SWMrSz
ちゃんとVCの入門書買え。
0581デフォルトの名無しさん2015/01/09(金) 01:16:16.73ID:Jq6Ajx8t
そういえば、若手にideone教えたら凄い喜ばれたな
0582ビル・ジョブズ2015/01/09(金) 03:11:23.57ID:gYK3gimW
言語レベルで悩んでるうちは幸せだよな
この1スレの1なんだが
05835712015/01/09(金) 08:24:33.86ID:catK9xwH
本読み返したらプロジェクトからやり直すと書いてありました。
その通りにやったら出来ました。
くだらない質問でしたが、皆さんありがとうございました。
0584デフォルトの名無しさん2015/01/10(土) 06:05:51.02ID:FyrZ8dzT
【質問】
『txtファイルから情報を読み込み、各行に応じた処理をするプログラム』
を作りたいのですが、どなたか方法を教えてください。

例えばcolor.txtというファイルで

red1
blue2
green6
blue3
red5
green7
green3
red3

と記述されていたとき、
『redなら右の数値の平均値』、
『blueはその系統の行の出現回数』、
『greenなら右の数値の合計』をそれぞれ求めて
printfで

aka=3
ao=2
midori=16

と出力するようなソースです
0585デフォルトの名無しさん2015/01/10(土) 06:06:40.52ID:FyrZ8dzT
構想では
FILE *fp;
int red=0,blue=0,green=0;

if((fp=fopen("coler.txt","r"))==NULL){//ファイルの読み込みエラーが発生したため中断
printf("ファイルが開けない\n");
}else{//本来の動作

???????

}
fclose(fp);//ファイルクローズ

printf("red=%d\n",red);
printf("blue=%d\n",blue);
printf("green=%d\n",green);


というソースコードの記述で実現できると思いますが、
??????(各行ごとに読み取ってそのタイプからifかswitchで処理を判断)の部分が穴埋めできません
自力で調べたら「fgets」「strtok」「sscanf」などの専用の関数があるらしいのですが、何分今まで整数型変数(int)を弄るプログラムしかしたことがなかったので文字列(char)とかチンプンカンプンで、関数の使い方がわかりません。
0586デフォルトの名無しさん2015/01/10(土) 06:16:36.23ID:FyrZ8dzT
ごめんなさい。
printfの中身の"red%d\n"、"blue%d\n"、"green%d\n"は
"aka%d\n"、"ao%d\n"、"midori%d\n"
の間違いです
0587デフォルトの名無しさん2015/01/10(土) 08:01:51.57ID:lyLN6stF
>>585
/* 配列やポインタの使い方も覚えないと。とりあえず答え書いていく。検証してないから文句はなし。駄目だったら自分で直すかまた聞く。 */
FILE *fp;
int rCnt, rTotal, bCnt, gTotal, i, ret;
char s[6];

fp = fopen("color.txt", "r");
if (fp == NULL) {
perror(NULL); return -1;
}

while ((ret = fscanf(fp, "%5[^0-9]%d\n", s, &i)) == 2) {
if (!strcmp(s, "red")) {
rCnt++; rTotal += i;
} else if (!strcmp(s, "blue"))
bCnt++;
else if (!strcmp(s, "green"))
gTotal += i;
else {
printf("%s: illegal name\n", s); return -1;
}
}

fclose(fp);

/* EOFはエラーの場合にも返される。区別したいのならferror等を用いること。 EOFでも2でもないということは、要素が2個当てはまらなかった、つまり不正な書式ということ。 */
if (ret != EOF) {
printf("illegal format\n"); return -1;
}

printf("aka=%d\nao=%d\nmidori=%d\n", rTotal / rCnt, bCnt, gTotal);
return 0;
0588デフォルトの名無しさん2015/01/10(土) 09:25:20.67ID:8rmNJIUK
「fgets」「strtok」「sscanf」などの専用の関数の使い方を調べるのが面倒なので誰か暇な人調べて下さいって言ってるのと代わらんな
0589デフォルトの名無しさん2015/01/10(土) 10:02:45.89ID:6YXtk3Rd
わからないのは関数の使い方じゃなくてCでの文字列の取扱いだろう
最大サイズを調べるか予測するかしてバッファを用意した後、関数を呼び出すのが原則

C言語でなければ簡単なのになぜわざわざ Cでやろうとするのか
勉強なのか
0590デフォルトの名無しさん2015/01/10(土) 10:33:41.35ID:8rmNJIUK
プログラミングの前にGoogleの使い方を覚えるのが先決
0591デフォルトの名無しさん2015/01/10(土) 10:33:47.25ID:C4apcuaR
学校の宿題っしょ
0592デフォルトの名無しさん2015/01/11(日) 10:23:46.22ID:DcUKGHAk
文字列操作とかは避けて通れないんですよ
苦手意識を無くしたいなら、やりながら慣れていくしか
点数取るためのお勉強では・・・
0593デフォルトの名無しさん2015/01/11(日) 19:34:36.17ID:J04gZGiT
三項演算子は使用しない前提で、

int foo(int hoge)
{
int val = 1;
if (hoge > 0) {
val = 2;
}
return val;
}

と

int foo(int hoge)
{
int val;
if (hoge > 0) {
val = 2;
} else {
val = 1;
}
return val;
}

ではどちらが実行性能がよいですか。
前者はifがtrueのとき代入一回分多くなり遅くなると考えますが合ってますか。
0594デフォルトの名無しさん2015/01/11(日) 20:27:16.86ID:Spj98dsc
>>593
考え方はそれで合ってるが、多分それぐらいならコンパイラ最適化で変わらなくなる。
ただ、読みやすさから考えて後者を選ぶべき。
0595デフォルトの名無しさん2015/01/11(日) 21:47:53.21ID:XNnfmRhD
>>593,594
アセンブラにしてみれば差が分かる
上をfoo、下をfoo2にした
http://ideone.com/OP8Ydf

前者はifがtrueのとき確かに2回代入されるが
後者はifがtrueのときfalseのブロックを越えるためのジャンプ命令が入る

よって実行される命令数はどちらも同じ
また、ジャンプ命令はパイプラインハザードの原因になりうるため、後者の方が通常は遅いと思った方がよい

PC向けなら確かに最適化してくれるかもね 組み込みだと最適化に頼っちゃいけない
0596デフォルトの名無しさん2015/01/11(日) 23:09:21.99ID:3ahz/Tk9
そんな些細な最適化を気にする前に分かりやすいコードを書くべき
0597デフォルトの名無しさん2015/01/12(月) 10:06:53.25ID:EgUK47G+
>>594-595
ありがとうございました。
実行される命令数は同じなんですね。理解できました。
可読性は確かに後者の方が自然な気ががします。
ただ前者の場合も、戻り値が状態を表すものなら自然に理解できるし、
種類のようなものだと分かりづらい気がしました。
感覚的な話で申し訳ありませんが…。

int foo(int hoge)
{
int val = OFF;
if (hoge > 0) {
val = ON;
}
return val;
}

int foo(int hoge)
{
int val = APPLE;
if (hoge > 0) {
val = ORANGE;
}
return val;
}
0598デフォルトの名無しさん2015/01/13(火) 13:05:10.00ID:HY0qfaD9
>>597
俺は593は前者のがいいと思う。特定の場合以外同じ値ということが
わかりやすいし、初期化を明確に行うことはスタイルとしてもいい
というか、後者でも初期値はいれた方がいいね
0599デフォルトの名無しさん2015/01/13(火) 13:22:56.75ID:CAmwtAZe
>>593
int foo(int hoge)
{
return "\001\002"[hoge > 0];
}
0600デフォルトの名無しさん2015/01/13(火) 18:00:41.34ID:H7gF28zb
>>599
これとどっちが効率いいんだろ…

int foo(int hoge)
{
return (hoge > 0) + 1;
}
0601デフォルトの名無しさん2015/01/13(火) 18:54:42.31ID:4E9tx8H3
>>600
読めない。以上。
0602デフォルトの名無しさん2015/01/13(火) 19:00:59.68ID:7wiF5/cE
>>600
メモリーアクセスのない分+1の方が効率良いな。
0603デフォルトの名無しさん2015/01/13(火) 20:16:50.50ID:UH4NPipk
>>598
hoge <= 0も特定の場合だと思う。まあ、好みか。
>>599
メモリ参照するから効率悪そう。アーキテクチャによるかな。
0604デフォルトの名無しさん2015/01/13(火) 21:12:54.89ID:jMPME/xb
保守の効率が悪い
0605デフォルトの名無しさん2015/01/13(火) 22:06:26.11ID:sVbshoKD
>>598
> 特定の場合以外同じ値ということがわかりやすいし

逆に条件が対称(0 以上と負とか)に近いなら、下の方がいいと思う。
0606デフォルトの名無しさん2015/01/13(火) 22:08:17.83ID:sVbshoKD
>>599
符号拡張も要るだろうし、分かりにくいし、こんなの書いてきたら小一時間説教しそうだ
0607デフォルトの名無しさん2015/01/14(水) 02:38:42.15ID:oCBn0OCM
何故かsageしか使ってないのに
メールアドレスが長すぎるとか謎の警告で書き込めない
0608デフォルトの名無しさん2015/01/14(水) 02:39:15.05ID:oCBn0OCM
あ、書き込めた
0609デフォルトの名無しさん2015/01/14(水) 07:06:07.26ID:Z38vlg9A
>>607
俺も同じく書けなかったけど、リトライしたら書けたみたい
0610デフォルトの名無しさん2015/01/15(木) 22:11:06.27ID:BvFMCmmw
ネットワークのバイトオーダー変換で
intやshortのデータはntohlとかntohsとか使えばいいと思うんですが
char配列の文字列を送る場合はどうしたらいいんでしょうか
そもそも変換しなくていいんでしょうか
0611デフォルトの名無しさん2015/01/16(金) 06:52:46.20ID:ccWeS9bn
文字列は文字コード?合わせないといろいろ悩むことになるかも
0612デフォルトの名無しさん2015/01/16(金) 07:15:02.52ID:Fm0qh1Gn
ビットの並び順はドライバーのお仕事
0613デフォルトの名無しさん2015/01/16(金) 12:58:18.10ID:b2lSaBcL
>>610
変換しなくていい。
0614デフォルトの名無しさん2015/01/16(金) 17:43:50.92ID:J4i4Oy5g
エンディアンについて勉強しる
0615デフォルトの名無しさん2015/01/16(金) 19:18:37.81ID:49OvZmoV
C言語ってあれだよな。
配列や関数の名前を参照するとポインタになったりと、
今となってはどうでも良いような謎なこまやかな気配りがあったりする一方で、
switch文にbreakが必要だったりと肝心なところで適当なんだよな。
0616デフォルトの名無しさん2015/01/16(金) 19:28:41.41ID:2x4EEv7M
>>615
そんなC言語が私は好きです。
0617デフォルトの名無しさん2015/01/16(金) 19:46:37.91ID:mZm2rjA/
エンディアン嘘付かない
0618デフォルトの名無しさん2015/01/16(金) 21:50:13.15ID:oLGQ6wLb
>>615
> switch文にbreakが必要だったりと肝心なところで適当なんだよな。

適当じゃなくて、あえて break 無しでやりたいときにできるようになってるだけ
安全性より自由度を優先した結果でしょ
高級アセンブラーだから
0619デフォルトの名無しさん2015/01/16(金) 22:20:07.94ID:49OvZmoV
>>618
フォールスルーしたいときだけ、fall through; って書くようにして、
既定の動作はbreak; で良かったじゃないですか。
つまり今と逆でよかったのでは?
0620デフォルトの名無しさん2015/01/16(金) 22:25:01.11ID:7lc30MOi
>>619
アホすぎる。複数のcaseを並べる使い方を知らんのか?
0621デフォルトの名無しさん2015/01/16(金) 22:27:25.22ID:49OvZmoV
case 0, 1, 2;
って書けるようにすりゃ良いだけじゃん。
0622デフォルトの名無しさん2015/01/16(金) 22:32:55.77ID:49OvZmoV
あーごめん
case 0, 1, 2:
ね。
てか、C言語は配列の初期化とかも={ 0, 1, 2, };って最後のコンマをわざと許してるんだよね。
後から値を追加する時にそのほうが便利だからって。
そういう細かいところまで考えてあるのに、なぜswtich文はああなってしまったのだろう。
後の言語に多大な負の遺産を残してしまった。
0623デフォルトの名無しさん2015/01/16(金) 22:34:24.78ID:7lc30MOi
>>621
そんな余計なことしなくてもいいから、break方式の方がスマートで優れてるんだよ。
0624デフォルトの名無しさん2015/01/16(金) 22:35:13.70ID:oLGQ6wLb
>>619
case 1:
case 3:
case 8:

とかの時に面倒だし、何かを書くと break しなくなると言うのは、違和感あるんじゃね?
0625デフォルトの名無しさん2015/01/16(金) 22:47:38.13ID:49OvZmoV
本来は何も書かなければbreakしないほうが違和感あったはずなのだが。
ちなみにC#ではbreakが無いとコンパイルエラーになるように改善されているので、
Cのswtichの仕様が素晴らしいということはまず無い。
0626デフォルトの名無しさん2015/01/16(金) 22:49:06.07ID:PoJiHUt9
caseってただのラベルだしね
0627デフォルトの名無しさん2015/01/16(金) 22:56:46.77ID:GFSPgIgQ
コマンドプロンプトでcppファイルを″cl″コマンドでコンパイルしたく、visual c++ 2010 expressをインストールしたのですが、ファイルをコンパイルできるようにする設定方法を教えていただきたいです。

スレ違いでしたら、誘導していただけるとありがたいです。
0628デフォルトの名無しさん2015/01/16(金) 23:01:35.93ID:49OvZmoV
>>626
ただのラベルなんだが、それはgoto文のノリで構造化的ではないわ。C言語は一応構造化言語なのに。
例えば関数の最後でreturn忘れたら、フォールスルーして、その下の関数がずら〜と実行されたら嫌だろ?
switch文はまさにそういう状況といえる。
ま、一部の人はたとえCがそういう仕様だったとしても、使い慣れているからという理由で問題視しないんだろうがな。

>>627
googleで "VC++ コマンドライン コンパイル" で検索しれ
0629デフォルトの名無しさん2015/01/16(金) 23:18:08.89ID:obgM8cFp
別にキーワード書いた時だけswitch抜ける仕様でもいいけど
breakを使わないで欲しかったかな
ループでもないのにbreakってなんか違和感
0630デフォルトの名無しさん2015/01/16(金) 23:49:27.20ID:bJx1ILrU
>>625
> 本来は何も書かなければbreakしないほうが違和感あったはずなのだが。

そう言う言語は fall through できない

> ちなみにC#ではbreakが無いとコンパイルエラーになるように改善されているので、

改善かどうかは人によるでしょ

> Cのswtichの仕様が素晴らしいということはまず無い。

嫌なら自分でプリプロセッサでも書けばいいんじゃね?
0631デフォルトの名無しさん2015/01/16(金) 23:54:10.74ID:v+mgY+SK
ああ、ループ中でifで条件判断してbreakはできるけどswitchにしちゃうとできない、
ってのは困りもんだな。
0632デフォルトの名無しさん2015/01/17(土) 00:24:57.29ID:1pj2nXtS
そういうときのgotoだな
0633デフォルトの名無しさん2015/01/17(土) 00:40:41.06ID:MW9qauOG
switchの中で外側のループに対してcontinue出来るくせにbreak出来ない欠陥言語。
0634デフォルトの名無しさん2015/01/17(土) 01:13:00.69ID:L8JHemhf
全部goto使っとけよ
0635デフォルトの名無しさん2015/01/17(土) 02:35:13.21ID:SbteLaC5
>>630
他はともかく

>そう言う言語は fall through できない

という歴史を作ったのはC言語だと思うよ、良い悪いは別として多方面に影響与えた言語だからね
もしCが「fall throughのときはthrough; 書かずにラベルが来たらswitch抜ける」という仕様なら
その仕様が色んな言語に影響を与えていただろう
0636デフォルトの名無しさん2015/01/17(土) 05:41:02.53ID:BHVrc4CM
>>635
> >そう言う言語は fall through できない
> という歴史を作ったのはC言語だと思うよ

C は fall through できるのに、ちょっと何言ってるかよくわからんな w
fall through できない例としては Pascal の case 文とかがある
0637デフォルトの名無しさん2015/01/17(土) 08:07:31.61ID:SbteLaC5
>>636
確かに読み直したら表現がおかしくなってた、ちゃんと推敲しろ俺…
C言語ってのは後の言語に多大な影響を与えたワケで、
もしC言語がfall throughのときだけ指定、無指示ならswitchを抜ける仕様だったら
その仕様もまた後の言語に影響を与えたと思う、くらいの気持ち
「そういう言語はfall throughできない」のはあくまで結果でしかないわけで、無理な仕様だとは思わないしな
0638デフォルトの名無しさん2015/01/17(土) 08:29:36.17ID:QX69Gf/m
if ; else if ; else if ; elseで十分w
0639デフォルトの名無しさん2015/01/17(土) 08:36:33.43ID:BHVrc4CM
>>637
> 無理な仕様だとは思わないしな

>>624
> 何かを書くと break しなくなると言うのは、違和感あるんじゃね?
0640デフォルトの名無しさん2015/01/17(土) 11:45:36.89ID:v4dny9bU
socketをローカル通信用に使う場合データはメモリを介してやり取りされているのでしょうか?
それとも一度ファイルなどに書いてやり取りされているのでしょうか?

後者の場合なら連続で通信すると書き換え回数が多くなりまずいのかなと思ってます
0641デフォルトの名無しさん2015/01/17(土) 13:34:17.13ID:QcVkBDKg
>>631
エキスパートCプログラミングに
それが原因で全米最大の電話停止が発生したサンプルコードがあったな
break書いたらかなり外側に抜けちゃったっていう

その本だとSunのCコンパイラのソースコードを解析したら
フォールスルー使ってたの3%だったからデフォルト実装がおかしいって論調だった

業務系だとフォールスルーあったほうが便利だったりするな。
一行ifの羅列にするときもあるけど
0642デフォルトの名無しさん2015/01/17(土) 16:27:02.18ID:FmY8KQo7
>>641
エキスパートCプログラミング、懐かしい…
そういや + と - を間違えたおかげでマーキュリー3号(だっけか?)が太陽系外へ
スッ飛んでった話も載ってたな
0643デフォルトの名無しさん2015/01/18(日) 08:02:41.67ID:PD/bNw/r
duff's device とか初めて知ったとき驚いたけど。
fall through 必要だが。
0644デフォルトの名無しさん2015/01/18(日) 21:26:28.01ID:Qm+dorGN
ピリオド忘れて彼方に飛んで行った探査機
0645デフォルトの名無しさん2015/01/19(月) 15:27:00.63ID:KaaVf0G8
この俺が、お前の旅にピリオドを打ってやる…!!
0646デフォルトの名無しさん2015/01/19(月) 15:33:43.44ID:mrvGfNgZ
http://i.imgur.com/w4cdMos.jpg
c言語初心者です。
メモ帳に保存した文章をコンパイルしようと試みたのですが、画像のように表示されてしまいます。
ファイルの形式がおかしいでしょうか?

ご指摘よろしくお願いします。
0647デフォルトの名無しさん2015/01/19(月) 15:52:24.46ID:SGKyw0iz
>>646
つdirコマンド
それとPrint Screen使えない環境なのか?
0648デフォルトの名無しさん2015/01/19(月) 18:03:54.66ID:ZB3Ka/3L
06-01-06.cpp.txtが出来てるんだろうな。
0649デフォルトの名無しさん2015/01/19(月) 23:27:24.56ID:lWBd6G4l
エスパー怖い
0650デフォルトの名無しさん2015/01/20(火) 04:56:52.31ID:NtxaKF4n
エスパーは魔美ちゃんです
0651デフォルトの名無しさん2015/01/20(火) 06:54:38.25ID:vt+/jiWm
スネークゲームをつくろうと思ったんですがキー入力をして蛇のようにクネクネ進ませるにはどうしたらいいんですかね?
配列を使って蛇の頭から尻尾まで順番に状態を伝搬させていくのかなとは思ったんですがいまいちコードにできません
教えていただければ嬉しいです。
0652デフォルトの名無しさん2015/01/20(火) 07:50:00.11ID:zL2ZGZ8s
つ 線形リスト
0653デフォルトの名無しさん2015/01/20(火) 11:03:50.47ID:66sje6av
>>647
大学のpcを用いてるので2chへの書き込みは自分のスマホからしかできないです。

>>647
>>648
プログラミングは専門分野では無く、必修単位のためにやっています。
dirコマンドを調べてみたのですが、使い方がよくわからない状態です。
0654デフォルトの名無しさん2015/01/20(火) 11:35:13.56ID:AxVJ3avS
>>653
notepadで作成した後、
「Z:\>」と表示しているところに、続けて「dir」と入力し、リターンキーを押す。
そこにでてくるファイル一覧から、作成したファイルを探し、
拡張子が「.cpp」となっているかを確認する。

>>648さんは、それが「txt」になっていると言う見解。たぶんそうだと思う。

「Z:\>」と表示しているところに、続けて
「rename 06-01-06.cpp.txt 06-01-06.cpp」と入力し、リターンキーを押す。
その後、もう一度コンパイルから。
0655デフォルトの名無しさん2015/01/20(火) 11:42:01.40ID:jGkVNXKd
縦書にメッセージが出るのか珍しいなと思ったら ww
0656デフォルトの名無しさん2015/01/20(火) 13:56:53.49ID:oo8ddG28
dir がわからんとかぬかすのは初心者以前
適性がないから辞めてしまえと強く言いたい所

>>651
クネクネじゃなくて横や縦一線ならできるのかえ?
0657デフォルトの名無しさん2015/01/20(火) 14:37:50.94ID:6Rnv21lv
>>656
横一直線や縦一直線に進ませることはできます!
ただキー入力を記憶して伝搬してクネクネさせるのが難しいです…
0658デフォルトの名無しさん2015/01/20(火) 16:41:25.66ID:rJNm4hf8
>651
配列からデータ読み取る時に先頭より前を読み取ろうとしたら最後に、
最後より後ろを読み取ろうとしたら先頭に廻すよう循環させればいいんじゃね?

でなけりゃ線形リストを循環させるとか。
0659デフォルトの名無しさん2015/01/20(火) 20:10:05.91ID:LXStG+t6
>>653
dir /?
0660デフォルトの名無しさん2015/01/20(火) 20:15:33.31ID:Y9tiW1z+
>>657
エスパーしてみると、スネークの始点と終点だけを保存してる?
もしそうなら、やり方を変えてスネークの最大長(盤面を埋め
尽くす以上にはならない)だけの長さの配列用意したら?
0661デフォルトの名無しさん2015/01/20(火) 21:17:53.42ID:4I0Y1qEs
ごめん、誤爆した
0662デフォルトの名無しさん2015/01/20(火) 22:22:21.93ID:vt+/jiWm
>>658
たとえば頭から方向がRRRRRってなっていたら上を押すとURRRRってなって次にUURRR
ってなって左を押すとLUURR見たいな感じになるようにしたいです!
>>660
一応頭から尻尾まですべてを入れれるだけの配列は用意しています。
0663デフォルトの名無しさん2015/01/20(火) 22:26:52.08ID:mp2703SQ
>>662
http://peace.2ch.net/test/read.cgi/tech/1408962564/401
宿題スレにレスしたよ
0664デフォルトの名無しさん2015/01/20(火) 22:36:35.05ID:vt+/jiWm
>>663
ありがとうございます!
動作確認しました^^
0665デフォルトの名無しさん2015/01/20(火) 23:25:49.48ID:vt+/jiWm
>>663
すいません、読んでみたのですが私大学一年程度の知識しかないのでいくつか分からないところがありました@@;
・snake_dirとは何の変数なのか
・step_snakeとchange_dirとwait_inputが解読できませんでした><
お手隙であればでいいのでどなたか教えていただければうれしいです...
0666デフォルトの名無しさん2015/01/21(水) 00:52:30.52ID:wB45Fkqg
>>662
輪になった循環リストを使えば?
0667デフォルトの名無しさん2015/01/21(水) 03:14:34.06ID:mOiGdMrl
>>665
小学一年程度の知識の間違いですね
0668デフォルトの名無しさん2015/01/21(水) 04:02:33.52ID:wB45Fkqg
知らずに名前だけ見て、勘で答えるので、
合っているとは限らない

dir は、directionかな?
snake_dirは、ヘビの向かう方向
change_dirは方向転換

step_snakeは、ヘビの動きの刻み(最小単位)
wait_inputは、入力待ちの(入力できない)時間
0669デフォルトの名無しさん2015/01/21(水) 04:28:22.92ID:tB8VqgXy
dir /o:d *.txt
0670デフォルトの名無しさん2015/01/21(水) 04:36:16.90ID:R2VIF460
>>654
ご指摘していただき、ありがとうございました。
0671デフォルトの名無しさん2015/01/21(水) 09:51:47.50ID:OFD7hqp5
入出力関数なんだけど、Nullを返さないものってありますか?
0672デフォルトの名無しさん2015/01/21(水) 10:43:42.06ID:ZtHpI46N
NULLってポインタだよね?w
0673デフォルトの名無しさん2015/01/21(水) 11:02:34.06ID:OFD7hqp5
\0こっち
0674デフォルトの名無しさん2015/01/21(水) 11:34:30.13ID:7mv1WtSh
>>671
宿題? あるよ。
0675デフォルトの名無しさん2015/01/21(水) 12:10:43.84ID:2ayQ13oI
>>665
変数関数の意味は>>668で合ってる
snake_dirは0:右 1:下 2:左 3:上
snake_x,y,head,tailはヘビの体1マスずつの位置をリングバッファ形式で持つ
step_snakeでは
 まずヘビの頭からdirの方向の1マス先を見て
 その先が壁か自分の体(どちらも@)だったらゲーム終了
 空いてればそこに体を伸ばす
 しっぽ側はしっぽの先端を空(' ')にして体を縮める
  ただしヘビを成長させる(4ターンに1回の)タイミングではしっぽはそのままにする

change_dirでは
 方向を引数にもらい変更する
  ただし進行方向と逆向き((dir+2)%4)になるような変更は受け付けない

wait_inputでは
 1秒間入力待ちして入力があれば(readしてswitchで)入力に応じた処理
 入力が無ければ-1を返して終わり
 select関数のマニュアル(man select)のサンプルをちょっと変えただけの関数

wait_inputはゲームの入力としてはかなり適当だからとりあえず動きが分かれば別に理解しなくていいんじゃないかな
もともと気にしてるヘビの体の持ち方は「リングバッファ」って構造が理解できればいいと思うよ
0676デフォルトの名無しさん2015/01/21(水) 20:31:47.35ID:Ot8x9oQK
static const QWORD MOTION_PLUS_DETECT = 0x050020a60000ULL;
こういう定義があった場合
0x05 = 符号なし
0020a60000 = 10桁
ULL = Unsigned Long Long型
という解釈でいいのでしょうか
0677デフォルトの名無しさん2015/01/21(水) 23:02:12.66ID:0pZDWm7E
何のライブラリの話か知らんが、単にリテラルの0x050020a60000ULLの話だったら、16進数で050020a60000という値のunsigned long long型という解釈しか出来んな
0678デフォルトの名無しさん2015/01/22(木) 13:20:07.84ID:m1M4F4sp
int* ptr
int *ptr
どっちが正しいの?
0679デフォルトの名無しさん2015/01/22(木) 13:34:23.56ID:DCqYwtoa
どっちも。
0680デフォルトの名無しさん2015/01/22(木) 14:17:50.46ID:lZgdDssG
int *ptr[]
int (*ptr)[]
どっちが正しいの?
0681デフォルトの名無しさん2015/01/22(木) 15:49:36.69ID:HcRqz3u4
c言語初心者です

0〜50の乱数を発生させそれを当てるゲームを
作成したいです
また入力した数字が正解より大きいか
小さいかも表示しなければいけません

お手数ですがよろしくお願いします
0682デフォルトの名無しさん2015/01/22(木) 16:01:30.02ID:aykmNMaC
どっちも。
0683デフォルトの名無しさん2015/01/22(木) 16:13:45.76ID:aykmNMaC
>>681
#include <stdio.h>
#include <stdlib.h>

int main()
{
int i, r;

scanf("%d", &i);
r = rand() % 50;

if (i < r)
printf("Your answer is smaller than correct one.\n");
else (i > r)
printf("Your answer is larger than correct one.\n");
else
printf("Your answer is correct.\n");

return 0;
}
0684デフォルトの名無しさん2015/01/22(木) 16:16:38.75ID:K4+0s9n9
>>681
http://ideone.com/QvLiip
0685デフォルトの名無しさん2015/01/22(木) 22:46:11.62ID:5YbirVjd
>>681
http://ideone.com/Obw7fb
0686デフォルトの名無しさん2015/01/23(金) 07:48:09.87ID:Y9EkAzUz
聞き逃げするやつって文章にそういう雰囲気あるよね。
0687デフォルトの名無しさん2015/01/23(金) 08:07:09.64ID:QCd9PPlm
答える方も好きで回答してるんだから別にいんじゃね
0688デフォルトの名無しさん2015/01/23(金) 08:28:11.00ID:V7xGBncr
>>687
礼が欲しいんじゃなくて、解決したかどうかを書いて欲しいな
答えが合ってかどうかは知りたいところ
0689デフォルトの名無しさん2015/01/23(金) 08:53:58.46ID:+1SZl8V4
>>688
賛同1
0690デフォルトの名無しさん2015/01/23(金) 10:38:20.18ID:u3mMWm3A
ギロチンにセットされた状態で質問してきているんだろ。
だから回答が遅かったりするともう返答できないw
0691デフォルトの名無しさん2015/01/23(金) 11:31:48.84ID:Y9EkAzUz
GAME OVER
0692デフォルトの名無しさん2015/01/23(金) 15:20:40.85ID:UMy8LD5S
テンプレに結果報告する気有り無しを明記するようにすればいいんじゃない?
0693デフォルトの名無しさん2015/01/23(金) 15:26:10.88ID:Mv61dp+a
テンプレ見て従うようなやつならそんなことにならん
せいぜいマルチかどうかがすぐにわかるならいいな
0694 ◆QZaw55cn4c 2015/01/23(金) 20:54:58.67ID:emDRVGKQ
>>672
#define NULL 0
という処理系もあるそうだから、「NULL はポインタ」と決めうちするのはよくない

そもそも NULL なんて使わずに素直に 0 と書いておけばよい
http://www.kouno.jp/home/c_faq/c5.html#10
0695デフォルトの名無しさん2015/01/23(金) 21:34:56.14ID:O1ms15xK
つれますか?
0696デフォルトの名無しさん2015/01/23(金) 22:04:26.60ID:22/uje4h
>>694
ミスリード招くこと書くなよ
CのNULLには存在意義あるぞ
0697デフォルトの名無しさん2015/01/23(金) 22:26:18.17ID:emDRVGKQ
s/NULL/0/g で問題ない以上、あえてマクロ定義する必要性を感じない、C++ では NULL は好まれない
0698デフォルトの名無しさん2015/01/23(金) 22:32:18.46ID:FUl2cYm5
int と ポインターの大きさが異なる系で
execl*() の NULL と 0 は置き換え利くの
0699デフォルトの名無しさん2015/01/23(金) 22:43:27.99ID:emDRVGKQ
>>698
execl*() とかの可変長関数や、またプロトタイプを置かず前方参照をやる場合は、0 と書こうが NULL を使おうがシクることには変わりない
そういう意味では「置き換えは効く」
0700デフォルトの名無しさん2015/01/23(金) 22:50:22.89ID:YOZ8UP4v
ぬるぽ
0701デフォルトの名無しさん2015/01/23(金) 22:52:34.85ID:rPlMaG+2
まるで「C++でもNULLは好まれてなく0って書く」って言ってるように見えるが
C++ではnullptrと書く
C++でNULLが好まれないのはs/NULL/0/g で問題があるから
0702デフォルトの名無しさん2015/01/23(金) 22:54:54.77ID:rPlMaG+2
すまん最後の1行はよくわからんこと言ってしまった
C++でNULLが好まれないのはNULLが (void*)0 でも 0 でも困るからであって、Cの話とは別
0703デフォルトの名無しさん2015/01/23(金) 22:58:35.48ID:emDRVGKQ
>>701
おう、そのとおりだ、C++ の最近の規格のことは念頭になかった‥オーバーロードに失敗するからねえ
でもこれって C の可変長引数関数と通じるところがあるように思うのだが
0704デフォルトの名無しさん2015/01/24(土) 00:01:39.66ID:WdkamIE3
POSIXのいつぞやの規格だとNULLは(void *)0だって明示してた希ガス
0705デフォルトの名無しさん2015/01/24(土) 08:20:22.03ID:2NdyhA7K
NULLは

C言語: (void*)0
C++: 0

じゃなかったっけか
C++でvoid*アドレスをvoid*でないポインタに入れるとエラーか何かになるんだよな確か
0706デフォルトの名無しさん2015/01/24(土) 09:46:17.77ID:7mupMMLa
void *pv = reinterpret_cast<void *>(12345);
int *pi;
pi = pv; // ng
pi = 0; // ok
pi = 1; // ng
0707デフォルトの名無しさん2015/01/24(土) 10:19:44.94ID:pFLcOxRm
>>705
C言語では0。キャストは不要
0708デフォルトの名無しさん2015/01/24(土) 11:06:08.52ID:6Ll+V+b6
>>707
引っ込んでろ。初心者。
0709デフォルトの名無しさん2015/01/24(土) 11:31:50.07ID:lPZWYG3p
ワロタw
0710デフォルトの名無しさん2015/01/24(土) 16:12:56.52ID:louUP+mV
数学関数のsqrtを含むソースファイルtest.cがあって、
それをmain.cの中で呼び出す場合、コンパイル方法は
$gcc -c main.o
$gcc -c test.c -lm
$gcc main.o test.o
ではダメで
$gcc -c main.o
$gcc -c test.c
$gcc main.o test.o -lm
なのは何故だろう。あと、リンクオプションの位置も変えるとダメなのは? × $gcc -lm ...
0711デフォルトの名無しさん2015/01/24(土) 16:14:44.07ID:louUP+mV
↑
× $gcc -c main.o
○ $gcc -c main.c
0712デフォルトの名無しさん2015/01/24(土) 17:03:08.51ID:LdIBiv/J
>>710
-l はリンカーへの指示
位置云々はツール作成者の趣味
0713デフォルトの名無しさん2015/01/24(土) 17:10:30.33ID:9qZykLIl
>>710
man gcc

-l library

It makes a difference where in the command you write this option;
the linker searches and processes libraries and object files in the
order they are specified. Thus, foo.o -lz bar.o searches library z
after file foo.o but before bar.o. If bar.o refers to functions in
z, those functions may not be loaded.
0714デフォルトの名無しさん2015/01/24(土) 18:00:55.45ID:lPZWYG3p
>>712
getoptを使ったコマンドとは違う雰囲気でいやんだよねw
getoptも2周目以降に再突入させられるけど。
0715デフォルトの名無しさん2015/01/24(土) 18:22:04.04ID:louUP+mV
>>712 >>713
ありがとうございます。
もっと man を見るよう習慣づけます
0716デフォルトの名無しさん2015/01/25(日) 22:42:58.52ID:PTRl+LFr
質問です。
自前でPCでプッシュ通知を送り、自前でプッシュ通知を受け取るプログラム考えてますが、やはりwhileなどのループを回しっぱなしで来たかどうかを監視するのが一般的なのでしょうか?
0717デフォルトの名無しさん2015/01/25(日) 22:48:27.55ID:XPwi6yeC
selectが一般的だと思うよ
まあselectもタイムアウト付きにしてwhileでループさせるかもしれんけど
0718デフォルトの名無しさん2015/01/26(月) 01:05:52.65ID:XNIaxWEk
ロックしてしまうと自分を終わらせることができないからね‥
いや、自分で自分の select() にデータを突っ込むのは可能なのか?
0719デフォルトの名無しさん2015/01/26(月) 08:51:33.72ID:DprSVj8N
シグナムさん
0720デフォルトの名無しさん2015/01/26(月) 09:08:56.23ID:7PO1Rygt
>>717
> selectもタイムアウト付きにして

これかな
0721デフォルトの名無しさん2015/01/26(月) 09:37:06.16ID:2d3/GSRW
プロトタイプって、どうしてプロトタイプっていうんですか?
0722デフォルトの名無しさん2015/01/26(月) 10:22:42.13ID:+qRVmOKU
>>721
ENGLISH板へ
0723デフォルトの名無しさん2015/01/26(月) 11:29:46.34ID:2d3/GSRW
for(i = 0; i < 10; i++);
for(j = 0; j < 10; j++);

掛け算のプログラムだけど、まず横に計算していくの?
それとも縦?
0724デフォルトの名無しさん2015/01/26(月) 12:35:42.07ID:WgKUdGET
脳神経科へどうぞ。
0725デフォルトの名無しさん2015/01/26(月) 13:13:49.81ID:2d3/GSRW
スレタイ嫁
0726デフォルトの名無しさん2015/01/26(月) 13:37:05.92ID:VzMYjy2e
>>723
最適化で消える
0727デフォルトの名無しさん2015/01/26(月) 14:26:28.24ID:dPrzH4GQ
>>726
消えきらずに i=10 と j=10 の代入になるっぽい?
0728デフォルトの名無しさん2015/01/26(月) 14:47:01.31ID:+qRVmOKU
もうちょっと言うと
i = 1 * 10
j = 1 * 10
0729デフォルトの名無しさん2015/01/26(月) 15:03:24.71ID:272iy6i0
>>727
そのループ以降i,jが使われるのかどうかによる
0730デフォルトの名無しさん2015/01/26(月) 15:08:51.91ID:dPrzH4GQ
>>729
た、たしかに、、、
0731デフォルトの名無しさん2015/01/26(月) 17:06:28.40ID:Bwdxh3xY
TEST
0732デフォルトの名無しさん2015/01/28(水) 08:09:03.20ID:jpn19UCt
main関数で宣言した配列を引数とした関数で、その配列のサイズをsizeofを使って計りたいんだけどどうしたらいいでしょう
0733デフォルトの名無しさん2015/01/28(水) 09:23:39.03ID:nPDXZ+72
要素数も渡せ。
0734デフォルトの名無しさん2015/01/28(水) 10:02:18.44ID:fH6YMCDV
char str[] = "hello";
p1 = str + strlen(str)-1 //末尾を指す
最初のstrって、なんで必要なんですか?
0735デフォルトの名無しさん2015/01/28(水) 10:03:12.54ID:rr6Q00cW
>>732
無理だから引数としてサイズも渡す。
0736デフォルトの名無しさん2015/01/28(水) 10:06:49.20ID:rr6Q00cW
>>734
というよりかは文全体の意味がわかってないんじゃないか?
p1に代入しているstrは配列の先頭を示すポインタ。
strlen(str)-1はstrの先頭からの最後の文字の位置。
0737デフォルトの名無しさん2015/01/28(水) 10:17:46.75ID:VpMZP1Yi
int i1 = strlen(str)-1; としておいて使うときには str[i1]
char* p1 = str + strlen(str)-1; としておいて使うときには *p1 もしくは p1[0]
0738デフォルトの名無しさん2015/01/28(水) 10:58:47.23ID:g/K+Ovy5
>>734
仮に、str配列の先頭アドレスを、100とすると、
(配列名は、先頭要素のアドレスと同じ)

str=str[0]='h':100
e:101,l:102,l:103,o:104,NUL:105

strlen(str)=5

100+5-1=104 :o
0739デフォルトの名無しさん2015/01/28(水) 12:15:17.49ID:zjrEJgS/
>>735
無理なのか
main関数の配列と引数の配列って何が違うのでしょう
0740デフォルトの名無しさん2015/01/28(水) 12:36:35.89ID:hX+LB9Wp
>>739
main関数の配列と引数の配列
とは何を指しているのでしょう?
0741デフォルトの名無しさん2015/01/28(水) 12:39:07.26ID:Tyuplfcx
別の関数であれば別のコンパイル対象とすることができる。
関数で引き渡すのは配列の先頭位置だけ
宣言した配列のコンパイル作業と配列を受け取る冠すのコンパイルが別だと、そのままでは配列の個数の渡しようがないから自分でプログラムの上で渡すしかない
0742デフォルトの名無しさん2015/01/28(水) 13:29:24.37ID:rr6Q00cW
>>739
呼び出し規約のせいで本来の配列は渡せない。
渡せているのはポインタ。
0743デフォルトの名無しさん2015/01/28(水) 14:03:58.64ID:fH6YMCDV
>>738
ありがとうございます
0744デフォルトの名無しさん2015/01/28(水) 16:00:57.30ID:VpMZP1Yi
>>740
多分
 同一スコープ内だと sizeof とると大きさになるのに
 引数として受け取ったのは sizeof とるとだめなのはなんで?
という意図だろう

固定した大きさであれば 構造体で繰るんでオケだけども
 struct foo { int a[100]; };
 void func( strcut foo* p)
 {
  size_t sz = sizeof p->a;
  .....
 }

任意の大きさには対応できない。
あくまで、sizeof で知ることが出来る値は、
「実行時ではなく、コンパイル時に大きさが確定するもの」なんだよね
0745デフォルトの名無しさん2015/01/28(水) 16:14:10.75ID:tXdxZo2L
最近サンプルソース無し&勘違いしてるっぽい質問おおくて、エスパー技能必須になってきたな。
0746デフォルトの名無しさん2015/01/29(木) 11:24:25.39ID:oB9UXWjJ
質問の仕方すらわからん初心者だけどよろしこ
多分エスパーが必要になる

PIC(16f系)で交流の信号をAD変換してデジタル信号にしたいんだ
以前に直流信号では成功してて、そこからプログラムを弄って、
CPUから定期的に信号を取りに行くようにすれば良いらしいんだけど、
そこをどうやって書くかわからん

とりあえずプログラム http://www.dotup.org/uploda/www.dotup.org132781.txt.html
0747デフォルトの名無しさん2015/01/29(木) 11:55:52.39ID:QiY6CRdb
>>746
交流電源の電圧の実効値をとりたい?
0748デフォルトの名無しさん2015/01/29(木) 13:11:24.80ID:oB9UXWjJ
>>747
実行値取る予定はないけど、AD変換の過程で必要になるなら取りたいと思う
交流信号というか、0〜5Vのサイン波かな
0749デフォルトの名無しさん2015/01/29(木) 13:29:28.37ID:zGbE6mz9
めちゃくちゃなインデントに狂気を感じる

サイン波でいいってことは極端に言えば [1,0,1,2,1,0,1,2] みたいに取れればいいってこと?
それなら直流信号で成功したのそのままでいいんじゃない
プログラムでやることはADコンバータのレジスタを読むことだけだしそれはもうやってるっぽい
0750デフォルトの名無しさん2015/01/29(木) 13:37:25.55ID:QiY6CRdb
AD変換して何やりたいのかわからないとな。
流石にそこまでエスパーできる人はいないだろう。
0751デフォルトの名無しさん2015/01/29(木) 14:01:50.63ID:4Rp6hoR2
シリアル通信みたいなビット列が取りたいってことじゃないの
0752デフォルトの名無しさん2015/01/29(木) 14:03:24.31ID:4Rp6hoR2
ソース見る前に書き込んじまった そのまんまやんけw
0753デフォルトの名無しさん2015/01/29(木) 14:20:13.35ID:4Rp6hoR2
ソース読む前に書き込んじまった とりあえずシリアル変換関係なかったスマン
だがこれ読んでも何一つ分からんw

せいぜい adconv()が返す unsigned int(32bit?) 値を char(8bit) への変換かな
最大5V ==> 255, 最小 0V ==> 0 みたいに定義して比率で置き換える

それ以上はエスパーでは無理
0754デフォルトの名無しさん2015/01/29(木) 16:12:24.93ID:/eP3JLu1
ヌルポインタとNULLと、\0の違いって何?
0755デフォルトの名無しさん2015/01/29(木) 16:15:53.83ID:ZEewO4sk
C言語FAQを見ろ
0756>>7462015/01/29(木) 17:03:47.71ID:oB9UXWjJ
最終的にやりたいのは通信で、そのプログラムは送信側回路のpicで使う
自分でも何言ってるかわかんなくなってきたわ
もう一回考えをまとめまつ
0757デフォルトの名無しさん2015/01/29(木) 18:29:16.84ID:+8ZEFoCx
ちょっと気になったのは、信号のサイン波の周波数はどの程度なの?
そのコードだとサンプリング周期が10ms毎っぽいから、
取り込める信号の最高周波数は50Hz程度が限界だけど問題ないの?
0758デフォルトの名無しさん2015/01/29(木) 18:45:12.03ID:VTa1G/DY
ポートの直読みによる値の取得じゃなく
シリアル通信かなんかで、ADコンバータ側の値をもらってくる
ってんなら、通信レートがボトルネックになるんじゃねーの?

(10ms 未満で送受信が完了するんなら サンプリングレートは 10ms ぐらい って言えるけども
0759デフォルトの名無しさん2015/01/29(木) 19:02:08.96ID:+8ZEFoCx
AD変換の取得値をUSARTの送信レジスタに乗せているから、アナログ入力ポートの電圧値を
外部にシリアルで送りたいんじゃないの?
設定通り19200bpsのボーレートなら通信に関しては10msで充分余裕がある。
0760デフォルトの名無しさん2015/01/29(木) 19:07:50.67ID:nqg27VEb
交流をサンプリングするサンプリングレートはどれくらいなのか
シリアルで外にデータを送っているが、それは何のためなのか
0761>>7462015/01/30(金) 00:20:07.88ID:n97ti0lc
>>757,758,759,760考えてくれてありがとう
サンプリングレート(ディレイ?)については最大値を探れとのことで
明日もう一回詳しいことを確認する予定
0762デフォルトの名無しさん2015/01/30(金) 10:57:11.54ID:hLjQtDl/
int main() {
char *str;
str = func();
printf("%s",str);
return 0;
}
char* func() {
return "kitty on your lap";
}
戻り値と引数って、どれですか?
0763デフォルトの名無しさん2015/01/30(金) 12:24:30.22ID:BNtp6MqM
そこから尋ねる姿勢だと
Cなんか止めとけ 教える方も教わる方も時間のムダ
と切って捨てるしか無い
0764デフォルトの名無しさん2015/01/30(金) 12:43:48.51ID:glbel8Mi
>>762
戻り値 = 関数 ( 引数... )
大雑把に書くとこう
0765デフォルトの名無しさん2015/01/30(金) 13:01:19.98ID:wRwoyNay
理系の大学生って今でもC言語やるもの?
0766デフォルトの名無しさん2015/01/30(金) 13:24:10.63ID:tOjiC4H9
学科によるだろ。
工学科はやらんと思うが情報系はやると思う。
0767デフォルトの名無しさん2015/01/30(金) 14:11:21.16ID:hLjQtDl/
scanf("%ld",&loc);
if(fseek(fp, loc*sizeof(dpuble), SEEK_SET);
scanfで値を変えたらどうなるんですか?
0768デフォルトの名無しさん2015/01/30(金) 14:15:59.90ID:hVjevdcM
>>767
コンパイルエラー
0769デフォルトの名無しさん2015/01/30(金) 15:27:29.83ID:R6bULBBX
ワロタ
0770デフォルトの名無しさん2015/01/30(金) 15:40:53.28ID:hLjQtDl/
どこらへんが?
0771デフォルトの名無しさん2015/01/30(金) 16:09:53.11ID:6p+AukVf
コンパイルできんぞ、ハゲ
0772デフォルトの名無しさん2015/01/30(金) 17:19:22.90ID:/VXTf8yH
関数にポインタを渡して動的に多次元配列を確保しようとしたのですが、実行時に固まってしまいます。
for内の *pointer[i] = (int *)malloc(sizeof(int) * YOKO); を抜いたら動くので、ここが怪しいと思ってますが、私の見た限りではどこが悪いのか分かりませんので、どなたかご助言をお願いします。

#include <stdio.h>
#include <malloc.h>

#define TATE 3
#define YOKO 5

void kakuho(int ***pointer){
int i;

*pointer = (int**)malloc(sizeof(int *) * TATE);
for(i=0;i<TATE;i++){
*pointer[i] = (int *)malloc(sizeof(int) * YOKO);
}
return;
}
int main(void) {
int **p;

kakuho(&p);
printf("Finish\n");
return 0;
}
0773デフォルトの名無しさん2015/01/30(金) 17:21:57.01ID:UnBDdYg/
素人はSTL vectorでいい。
それくらいでつまずくなら、ぼちぼちポインタ使って慣れてから再検証する。
0774デフォルトの名無しさん2015/01/30(金) 17:29:28.58ID:UnBDdYg/
vectorなら一行で確保完了。

vector< vector<int> > p( TATE, vector<int>(YOKO) );

リサイズは p.resize(2*TATE); やp[0].resize(YOKO+10); など。
0775デフォルトの名無しさん2015/01/30(金) 17:36:58.17ID:S7lOnqCz
スレタイw
0776デフォルトの名無しさん2015/01/30(金) 17:38:31.44ID:/VXTf8yH
>>774
STL vector...調べてみたらC++のライブラリ?みたいですね
もし、STLvectorを使っても、C系を扱っているといずれポインタは出てくるので、この機会に理解を深めたいと思い質問しました。
どこが悪いのかお教えいただけますでしょうか?
0777デフォルトの名無しさん2015/01/30(金) 17:40:17.79ID:61zbFarY
(*pointer)[i] = (int *)malloc(sizeof(int) * YOKO);
0778デフォルトの名無しさん2015/01/30(金) 17:43:42.53ID:/VXTf8yH
>>777
計算順序でしたか!
相当初歩的な事を・・・
面倒で、全ては覚えていませんでしたが、この機会に覚えようと思います。
ありがとうございました。
0779デフォルトの名無しさん2015/01/30(金) 17:44:19.82ID:hFayybhW
>>776
勉強頑張ってね
ポインタも自分でいろいろいじってるうちにすぐ理解できるから
0780デフォルトの名無しさん2015/01/30(金) 18:00:53.92ID:vIUweOgI
未初期化変数をprintして現れるものが、そのプログラムを絶対パスで実行するか相対パスで実行するかで異なるのですが、
パスによってメモリの取り方が違ったりするのものなんでしょうか?
パスの違いが影響することなんてあるわけないと思ってました・・・
0781デフォルトの名無しさん2015/01/30(金) 18:17:12.59ID:X02ag5jj
未初期化ローカル変数の初期値なんて気にしても意味ない
というのは置いておくと
printf("%s",argv[0]);でわかるように
mainの引数であるargvには実行時のコマンドが文字列として渡されるわけで
その長さが違うことによってなんらかの違いはでるでしょうね
0782デフォルトの名無しさん2015/01/30(金) 19:12:48.90ID:exnE3lvA
同じ物理メモリ空間に配置されるかどうかも怪しいですしー
0783デフォルトの名無しさん2015/01/30(金) 19:24:54.01ID:vIUweOgI
>>781
なるほど
仰る通り意味はないことは承知ですが、何度実行しても再現性があったので、何かあるのかと思ってしまいました
argvがあるので、両者は必ずしも等価な結果になるとは限らないと分かっただけで良かったです
ありがとうございました
0784デフォルトの名無しさん2015/01/30(金) 19:57:51.91ID:R6bULBBX
mallocが失敗してNULLを返してきた時に気をつけて。
転ばぬ先のぬるぽチェック
0785デフォルトの名無しさん2015/01/30(金) 20:29:59.01ID:C+r/cEaV
>>781
ド素人は引っ込んでなよ。
これでは、argv, argv[0]の指している先がスタックにある事を何も示していない。
0786デフォルトの名無しさん2015/01/30(金) 22:41:12.81ID:rJFIS397
プロセス間通信でポインタの値を送ったら、
送り先のプロセス内では受け取ったポインタのアドレス値は
もはや無意味なデータになっちゃうんだな
今日仕事でえらい恥かいちゃったわw
0787デフォルトの名無しさん2015/01/30(金) 22:50:03.05ID:xE7xovrP
昔のOSや組み込み系ではプロセス間通信で送っても有効なポインタであったりします
0788デフォルトの名無しさん2015/01/30(金) 23:51:58.73ID:Ofydkxe6
そんな環境じゃ開発したくねぇな
何のためのプロセスだよ。それならスレッドでいいじゃん
0789デフォルトの名無しさん2015/01/31(土) 07:30:39.74ID:20MrPVIm
組み込み系でガンガンMMUを使えるとでも?
0790デフォルトの名無しさん2015/01/31(土) 11:08:10.43ID:NVotuPvn
>>789
組み込み系って一言で言われてもなぁ
0791デフォルトの名無しさん2015/01/31(土) 21:54:24.63ID:Eae2x+oN
>>746
は解決できたんだろうか?
やはり途中経過はほしいな
0792デフォルトの名無しさん2015/02/02(月) 14:01:40.18ID:8AyVYO21
ポインタの変数を2つ同時に宣言したいけど、どうすればいい?
(*p)(int a, int b)
これであってるの?
0793デフォルトの名無しさん2015/02/02(月) 14:07:01.40ID:An/kZWGD
int *a, *b;
0794デフォルトの名無しさん2015/02/02(月) 14:55:54.19ID:8AyVYO21
>>793
他には?
0795デフォルトの名無しさん2015/02/02(月) 15:34:44.89ID:vwaX8FNQ
インポ
0796デフォルトの名無しさん2015/02/02(月) 17:06:41.70ID:3TuwLbgE
>>765-766
工学部でも普通にやるわ
むしろハード寄りの工学部こそやる
古い言語だろうが考え方を学ぶ教育上の重要性は変わらん
0797 ◆QZaw55cn4c 2015/02/02(月) 18:38:04.60ID:2aaoC/Ew
え?ポインタとか古臭い仕様をひきづっているというのに‥
やる価値があるのであろうか?
0798デフォルトの名無しさん2015/02/02(月) 18:58:04.14ID:BTw9Mjmb
古臭いといっても、ノイマン型コンピュータのストアドプログラム方式アーキテクチャが廃れない限り
ポインタの考え方は変わらんよ。
最近の言語は表面上を隠蔽してるだけで、根本的なところを理解するにはC言語やるのが結局は近道だよ。
0799デフォルトの名無しさん2015/02/02(月) 19:21:47.34ID:vwaX8FNQ
物理学科だけど数値計算するときはCかFortran
0800デフォルトの名無しさん2015/02/02(月) 21:21:20.66ID:Kg0DUTew
組み込みの世界じゃCは現役だろ
マイコンも弄れない工学部とかないわ
0801デフォルトの名無しさん2015/02/02(月) 21:24:56.20ID:Ce/01Ztg
Fortran配列のメモリ配置はとても嫌だな…
0802デフォルトの名無しさん2015/02/02(月) 23:08:15.29ID:FzJmJvBa
>>800
> マイコンも弄れない工学部とかないわ

高卒の君は知らないだろうが、世の中には工学部金属工学科とか工学部応用科学科なんて学科もあったりするので、全員がマイコン弄るわけじゃないよ
パソコンならわかるけど
0803デフォルトの名無しさん2015/02/02(月) 23:45:32.76ID:rLP+hAQU
とかいう高卒IT土方
0804デフォルトの名無しさん2015/02/03(火) 00:02:12.37ID:UeLVCsE8
実際、半田こて握ってオシロスコープ扱いながらマイコン弄っているのは、電気電子系と情報系、メカトロ周りの機械系ぐらいだろうしなあ
0805デフォルトの名無しさん2015/02/03(火) 00:27:35.82ID:Qzp7B0o1
土木工学科なめんな
0806デフォルトの名無しさん2015/02/03(火) 05:26:24.60ID:KBqqkrL/
もう、文系でもこの手のハイテク系がわからないと落ちこぼれになる時代なんですが
中身作るところまではやらなくてもいいかもですが
0807デフォルトの名無しさん2015/02/03(火) 07:13:01.43ID:Ak6uoSi3
>>803
w
0808デフォルトの名無しさん2015/02/03(火) 07:44:10.01ID:9S3xfl3n
文系だけど趣味グラマとして楽しんでるよ。
0809デフォルトの名無しさん2015/02/03(火) 11:22:45.25ID:RogaT2hh
まあ理系でも文章書くし
0810デフォルトの名無しさん2015/02/03(火) 11:39:08.68ID:BOhQBBy+
文章書くから文系…めちゃおもろいこと言うやん自分w
0811デフォルトの名無しさん2015/02/03(火) 11:40:32.50ID:0TkOOfFT
算数できんから自称文系なんだろ
0812デフォルトの名無しさん2015/02/03(火) 12:32:01.94ID:yGwE0+2u
算数は苦手だ‥というか、数学って哲学の一種だよね
0813デフォルトの名無しさん2015/02/03(火) 12:48:27.37ID:ABhgh/ML
半分正しくて半分間違い。
純粋数学は哲学に通じるものがあるけど、応用数学はただの道具。
プログラム言語も言語理論とか言い出すと哲学的になるし、コーディングの話だとただの道具の使い方。
0814デフォルトの名無しさん2015/02/03(火) 14:59:04.09ID:9S3xfl3n
べ、別に数学ができないからではない。本業は完全に文系仕事なんだぞ…
0815デフォルトの名無しさん2015/02/03(火) 22:46:50.05ID:ftxttBUj
>>762
func()の戻り値は文字列定数の先頭のポインタ
0816デフォルトの名無しさん2015/02/04(水) 18:50:43.86ID:xx4bjisy
数学にもコンパイラがあれば独学も捗るだろうに
0817デフォルトの名無しさん2015/02/04(水) 22:46:42.25ID:qnkRMru3
数学と言えば、自分のなかでは複素数と三角関数がひとつのイメージで結び付いた時、
目から鱗で一気に世界が変わったなあ。
現実世界の実数の世界の裏に、途方もない世界が広がっていることを知って衝撃を受けた。
哲学とまでは言わないが、ただの道具でも世界観を変えるには充分すぎる。
0818デフォルトの名無しさん2015/02/04(水) 23:00:14.84ID:3h7Zr70+
>>817
2次元の回転で三角関数が出てくるのと同様では?
虚数が仮の数で1次元だった実数を2次元へ拡張したようなもので
2次元平面と似てるのは当然では。
0819デフォルトの名無しさん2015/02/04(水) 23:13:03.02ID:+oYTJ+WR
>>818
2次元や3次元の座標変換や写像を扱うのにも三角関数は使うが、実数の範囲の話。
複素関数の範囲まで含めると、フーリエ変換やラプラス変換を通して、
時間と周波数の世界、複素s空間の世界まで視野が広がる。
0820デフォルトの名無しさん2015/02/04(水) 23:20:19.13ID:3h7Zr70+
複素数の三次元版拡張。



四元数(クォータニオン)は複素数を拡張した数体系。

四元数についての最初の記述は、1843年に数学者ウィリアム・ローワン・ハミルトンによってなされ、三次元空間の力学に応用された。

四元数は応用数学、特に3Dグラフィクスやコンピュータビジョンにおいて三次元での回転の計算でも用いられる。

現代数学的な言い方をすれば、四元数の全体は実数体上四次元の結合的ノルム多元体を成す。四元数は最初に発見された非可換多元体。

フロベニウスの定理に従えば、四元数は実数を真の部分環として含む有限次元可除環の二種類しかないうちの一つ(もう一つは複素数の全体)。

従って、単位四元数は三次元球面上の群構造を選んだものとして考えることができて、群Spin(3)を与える。
これは SU(2) に同型、あるいはまた SO(3) の普遍被覆に同型である。

四元数 - Wikipedia
0821デフォルトの名無しさん2015/02/04(水) 23:27:15.15ID:+oYTJ+WR
3次行列だと原点対称以外の回転がうまく表現できないんだよな。
四元数はもっと注目されてもいいと思うんだけど、いまひとつマイナーな存在なんだよなあ。
0822デフォルトの名無しさん2015/02/04(水) 23:40:42.88ID:3h7Zr70+
こういった複素数の特徴や、それが1958年まで知られてなかったことが凄い。


多元体 - Wikipedia

結合的多元体
よく知られる結合的な多元体の例は有限次元実多元体である。
フロベニウスの定理によれば、そのような多元体は同型の違いを除いて三種類、実数体(一次元)・複素数体(二次元)、四元数体(四次元)しかない。

非結合的多元体
実数体上で有限次元の可換単位的多元体は同型を除いてちょうど二つだけ存在する(それは実数体と複素数体で、いずれも結合的)。

実は、任意の有限次元可換実多元体の次元は 1 か 2 のいずれかであることが1940年に証明されており、ハインツ・ホップに因んでホップの定理と呼ばれる。

可換性の仮定を落とすことで、ホップは自身の結果を拡張し「任意の有限次元実多元体の次元は2の冪でなければならない」ということを示した。

さらに後に示された事実として、任意の有限次元実多元体の次元は 1, 2, 4, 8 のいずれかでなければならないことが分かっている。
この事実は、ミシェル・ケルヴェアとジョン・ミルナーによってそれぞれ独立に1958年に証明された。これは代数的位相幾何学、特に K-理論を用いるものである。
0823デフォルトの名無しさん2015/02/04(水) 23:51:21.64ID:+oYTJ+WR
まあ、多元体の概念は位相幾何学に基づいているからな。
古典的な微分幾何学の数学からは生まれてこなくても仕方ない。
0824デフォルトの名無しさん2015/02/05(木) 00:33:26.91ID:FrAPSRmI
>>822
>こういった複素数の特徴や、それが1958年まで知られてなかったことが凄い。

1958年って、Lisp誕生の年だな。
0825デフォルトの名無しさん2015/02/05(木) 02:46:43.97ID:jgxo7Fem
多元体とか抽象的な概念は、純粋数学を研究している学者にでも任せとけばいいんだよ。
応用数学の立場としては、四元数をどう使うかの方が大事なのだから。
難しいこと考えなくても、基底の基本演算さえ理解すれば、後はただの行列演算に落とし込めるだろ。
上手く使えば、平行移動と回転についての複数の演算を大幅に簡単化できる。
厳密な理論より目前の課題への応用。
プログラムを組むなら数学の知識はそのために使うべき。
0826デフォルトの名無しさん2015/02/05(木) 05:12:43.35ID:Iop/4SxL
数学板へ行けよ...
0827デフォルトの名無しさん2015/02/05(木) 07:43:56.26ID:Q9uPwcn4
四元数を利用した座標変換アルゴリズムは、直感的に理解しにくいからほとんど使ってない。
正直言って、過去にチャレンジして挫折した。
今は3次元データは、4次元同次座標で扱うことで凌いでいる状況…orz
このスレ見て、久しぶりに昔を思い出した。
0828デフォルトの名無しさん2015/02/05(木) 16:55:39.16ID:DRERuoEj
size_t strlen (const char *str)
{
const char *p;
for (p = str; *p != '\0'; p++) ;
return p - str;
}
最後の p - str って、どういう意味?
return p じゃダメなの?
0829デフォルトの名無しさん2015/02/05(木) 16:59:00.79ID:Omd6cUWA
>>828
文字列の長さを返すから
先頭アドレスstrと最後のアドレスを仮に
100と108とすると、108 - 100で8を返すような動き
0830デフォルトの名無しさん2015/02/06(金) 12:26:53.51ID:9d0A7+MO
>>829
108を\0とすると、意味ないんじゃ・・・
0831デフォルトの名無しさん2015/02/06(金) 12:37:21.56ID:b3gwE4qm
>>830
地の言葉を使いたまえ、君に合わせよう
0832デフォルトの名無しさん2015/02/06(金) 16:33:48.92ID:bwSv1Q/2
>>830
それは*p
これで分からなかったらもう一度質問。
0833デフォルトの名無しさん2015/02/06(金) 16:44:33.18ID:WgeZDeZC
文字数+1バイト
0834デフォルトの名無しさん2015/02/06(金) 18:47:49.82ID:b3gwE4qm
>>833
http://codepad.org/O8hSJfpt
地の言葉を使いたまえ、君にあわせよう
0835デフォルトの名無しさん2015/02/06(金) 19:22:02.17ID:7NzHbLJD
>>833
まったくもって違う
strlenは'\0'までのバイト数/sizeof(char)
wsclenはL'\0'までのバイト数/sizeof(wchar_t)
0836デフォルトの名無しさん2015/02/06(金) 20:00:09.41ID:oDLDeQ3D
数学は碌にできないんだが、四元数が内積外積より先に発見されたみたいな話聞いて
なおさら分からんと思た
0837デフォルトの名無しさん2015/02/06(金) 20:16:46.87ID:/6bGvltO
>>836
そんな訳ないだろう。
あまり詳しくは知らないが、単純なベクトル演算とかはニュートンやライプニッツの時代からあるだろう。
17〜18世紀頃から使われていたはず。
逆にベクトルの概念を使わずに、運動方程式とか表現できたらその方がびっくりだわ。
0838デフォルトの名無しさん2015/02/06(金) 23:38:38.74ID:ocZrWIDp
>>836
一体どういう思考を経てその結論に達したのかが分からない。
四元数が先に発見されたとか、そんな話あったか?
0839デフォルトの名無しさん2015/02/07(土) 01:40:44.89ID:KcqvBRci
四元数はベクトル解析に先行していますから‥力学と四元数とケーリーハミルトンのハミルトンの最後の閃きなのかもしれない‥
0840デフォルトの名無しさん2015/02/07(土) 17:41:22.56ID:2hPWt1rl
ところで、ここクォータニオンスレや数学スレだったっけか
それのC言語実装とかの話なら分かるんだが
0841デフォルトの名無しさん2015/02/08(日) 06:41:39.25ID:lwCu/p08
そりゃC言語の質問に関する書込みに対して、まともなレスがつかなければ雑談ネタくらいしか残らんわな
ちょっと前のC言語の質問にしても、初心者を小馬鹿にしたような悪意のあるレスの書き込みが目立つだろ
スレの雰囲気が悪すぎる
0842デフォルトの名無しさん2015/02/08(日) 07:08:19.21ID:GJF/AvuK
相手を煽るような露骨なレスもそうだが、結果だけ ポン と放り投げて
ドヤ顔で自己満足に浸っているのも質が悪いな。
初心者には内容が理解できないだろ。
後、質問者も理解できたのか出来ないのか、返答くらいはするべきだろう
と思うがな。
0843デフォルトの名無しさん2015/02/08(日) 10:10:55.72ID:he2fHwkq
雑談してないでネタを投下してくれ
0844デフォルトの名無しさん2015/02/08(日) 10:24:50.79ID:WLLuhFHT
初心者向け質問スレじゃないのかここ
質問者がいなけりゃネタなくていいだろ
0845デフォルトの名無しさん2015/02/08(日) 10:26:24.64ID:jgXa3G6y
extern は要らない子っ!
0846デフォルトの名無しさん2015/02/08(日) 10:33:59.06ID:LtHLQMWI
auto と register が要らない子というのは認める。
だが、extern と static は居ないと困る。
0847デフォルトの名無しさん2015/02/08(日) 10:38:49.08ID:0Aue6GB7
そういえばregisterにしたくない時って、どういう指定をすればいいの?(´・ω・`)
0848デフォルトの名無しさん2015/02/08(日) 10:49:00.16ID:9/BLTlkq
>>847
組み込み系とかだとpragmaで指定できる処理系もあるけど、一般的には無理じゃないかな
0849デフォルトの名無しさん2015/02/08(日) 10:52:43.51ID:jgXa3G6y
>>846
extern を 1 ワードも書かずにすませることは可能
0850デフォルトの名無しさん2015/02/08(日) 11:23:23.18ID:gnj7uFi4
>>849
グローバル変数やgoto文は、できる限り使わずにすませるよう努めるべきではある。
ただ、そのために必要以上に処理が複雑で保守しにくいものになっては本末転倒。
クラスや例外が言語仕様として用意されていないC言語の場合、
extern を要らない子扱いにするのはちょっと厳しい。
0851デフォルトの名無しさん2015/02/08(日) 11:40:39.93ID:oGPjhZSc
>>849
longを1ワードも書かずに済ませる事も可能だし、
doubleを1ワードも書かずに済ませる事も可能だな。
それが何か?
0852デフォルトの名無しさん2015/02/08(日) 12:12:16.67ID:jgXa3G6y
>>850-851
extern を 1ワードを使わずに、しかし分割コンパイル&リンクすることは可能だね
すなわち、既存のプロジェクトにて extern を 1 ワードも使わずに書き直すことは可能だ
0853デフォルトの名無しさん2015/02/08(日) 12:39:35.96ID:2tYJKyjd
ただの理想論者だったか
0854デフォルトの名無しさん2015/02/08(日) 12:46:00.73ID:yX+sD18O
>>852
ある程度の規模のプログラム組んだことがあるなら、それが如何に無謀な努力か分かるだろ。
一から設計するならともかく、既存のプロジェクトを書き直すとか正気か?
0855デフォルトの名無しさん2015/02/08(日) 12:49:39.52ID:e4rj0+Rn
使わずになんて言わず、使ってくれよ
可能だという事で何でも許したら、
支出額にincomeなんて変数名使う奴が必ず出てくる
0856デフォルトの名無しさん2015/02/08(日) 12:50:10.25ID:JKFx7boS
>>847
なんでそういうことをしたいんですか?
0857デフォルトの名無しさん2015/02/08(日) 13:17:34.87ID:yX+sD18O
>>847
本人ではないが横レス。
例えば、組み込み系の場合、特に特定の処理で限定的に処理速度を稼ぎたい場合(ループ内の演算など)
インラインアセンブラを使用してアセンブリ言語で記述する。
この場合、コンパイラに勝手にCPUのレジスタを使われては困る。
そのため、ローカル変数はスタックを使うものとレジスタを使うものを予め指定しておく必要がある。
そこで、上の方のレスにもあるが、#pragmaプリプロセッサディレクティブを使って変数の割当てを指定する。
一般に、組み込み系のpragmaは、register や volatile より強力な支配力を持っている。
08588572015/02/08(日) 13:21:46.90ID:4ONfB8Qz
アンカミス
>>847は>>856の間違い
0859デフォルトの名無しさん2015/02/08(日) 13:33:23.70ID:WLLuhFHT
glibcからしてこういう実装だから、externを追放するのは無理だろう

/* Standard streams. */
extern struct _IO_FILE *stdin; /* Standard input stream. */
extern struct _IO_FILE *stdout; /* Standard output stream. */
extern struct _IO_FILE *stderr; /* Standard error output stream. */
/* C89/C99 say they're macros. Make them happy. */
#define stdin stdin
#define stdout stdout
#define stderr stderr
0860デフォルトの名無しさん2015/02/08(日) 13:50:35.39ID:4qLWMDw1
#define stdin stdin
#define stdout stdout
#define stderr stderr

↑これって何してんの??

*stdin2みたいなんを準備してみたとき
#define stdin stdin2
に差し替えやすくするためにあらかじめ書いてんの?
0861デフォルトの名無しさん2015/02/08(日) 14:14:23.15ID:phJldef5
>>860
コメントすら読めないのかよ。
「C89/C99はこれらをマクロとして宣言している。お気に召すようにしてやる。」って書いてあるだろ。
0862デフォルトの名無しさん2015/02/08(日) 14:48:52.65ID:jgXa3G6y
>>854
既存のプロジェクトでも可能であるというだけであり、
既存のプロジェクトを書き直せと主張しているわけではない

extern が冗長であることを指摘できれば十分だ
0863デフォルトの名無しさん2015/02/08(日) 14:49:39.03ID:jgXa3G6y
>>855
C では extern は使う必要はない
0864デフォルトの名無しさん2015/02/08(日) 14:55:25.42ID:e4rj0+Rn
オレが必要なんだから使えよ
0865デフォルトの名無しさん2015/02/08(日) 14:58:43.60ID:jgXa3G6y
>>864
お前はどうつかっている?
08668572015/02/08(日) 15:19:29.91ID:2x2AjuBP
>>862-863
何故そんな極端な思考に走るんだ。
冗長であることと不要であることは等価ではないぞ。
冗長であってもメリットがあれば使えばいい。
下手に、引数と戻り値が連鎖しまくった解読困難な迷路のようなモジュール構造とするくらいなら
グローバル変数と外部宣言を使った方が遥かに見通しが良くなる場合もある。
使いどころを見極めれば、extern不要とかあり得んだろ。
0867デフォルトの名無しさん2015/02/08(日) 15:21:30.01ID:jgXa3G6y
>>866
グローバル変数は必要に応じて使う立場だ、しかし extern はその場合でも不要
0868デフォルトの名無しさん2015/02/08(日) 15:21:43.90ID:WLLuhFHT
>>865
逆に聞くけど、お前が標準ライブラリを実装するとしたらstdinはどう書くつもりなんだ?
VCみたいなキモい書き方するつもりか?
0869デフォルトの名無しさん2015/02/08(日) 15:25:39.47ID:jgXa3G6y
>>868
>>859 の extern をばっさり削除して無問題
0870デフォルトの名無しさん2015/02/08(日) 15:39:16.03ID:e6wj3tus
なんとなく理解した
externを使わない代償として変数宣言のヘッダーファイルに相当複雑なマクロ仕込んでるな
多重インクルード防止とインクルード順の管理、ダミーの変数宣言とその解放処理…
余計に面倒臭くないか?
0871デフォルトの名無しさん2015/02/08(日) 15:40:43.41ID:jgXa3G6y
>>870
いや、マクロを必要としない
>>859 のような extern はばっさり削って問題ない、ただそれだけだ、ただしこれは C の話で C++ ではだめだ
0872デフォルトの名無しさん2015/02/08(日) 16:33:31.07ID:L/vZKsRK
QZはちゃんと籠手を装備して試合に臨んでくれ
0873デフォルトの名無しさん2015/02/08(日) 17:37:05.24ID:/BdWTHaM
>>852
出来ねーよ。Qzとかいうアホウも同じことほざいてたな。

libhoge.a:
hoge.o

hoge.c:
int hoge[10000];

hoge.h
extern int hoge[10000];

externがないとhoge.hをインクルードしただけで、hogeの領域が
確保されてしまうわけだが。
0874デフォルトの名無しさん2015/02/08(日) 17:53:40.49ID:WLLuhFHT
そうか、初期化されてないグローバル変数はCだと定義じゃないのか
そう考えると確かにいらないっちゃいらない事が多いけな。

でも、例えば文字列の配列をどこかのソースで定義する場合、そのソースをコンパイルしたオブジェクトをリンクし忘れたとすると、ヘッダでexternつけて宣言していない場合勝手にリンカが変数の領域を確保してしまうわけだ。
すると、何らかの文字列が入っているはずの文字配列が、なぜかヌル文字で埋められたものになっているなんてことになりかねない
0875デフォルトの名無しさん2015/02/08(日) 17:55:31.60ID:jgXa3G6y
>>873
本当に確保されるのか?
初期化されない変数はふつう BSS 領域に入るのでオブジェクトファイルのサイズは増えない
たとえ確保されたにしても、リンク時にまとめられる、遅かれ早かれその h[10000] は必要なんだろう?
初期化をローダにまかせずに記述するようにすれば、君の hoge.c には h の定義すら必要ない
0876デフォルトの名無しさん2015/02/08(日) 17:58:59.21ID:jgXa3G6y
>>874
共通のグローバル変数はヘッダに書くようにすればよい
これは定義ではなくて仮定義だから、慣れれば抵抗はない、無論オブジェクトファイルサイズも増えない
初期化をローダにまかせず、記述するようになるからお行儀もよくなる
グローバル変数を消極的にスコーピングできるようになる

欠点は、この手法はオブジェクトファイルとリンカ依存であることw
0877デフォルトの名無しさん2015/02/08(日) 18:00:23.38ID:phJldef5
変数を宣言したヘッダを複数のソースファイルでincludeできるのはGNU拡張と知らない人たちのスレですか?
0878デフォルトの名無しさん2015/02/08(日) 18:09:13.19ID:jgXa3G6y
>>877
残念ながら仮定義というやつだ、gcc 拡張ではない
0879デフォルトの名無しさん2015/02/08(日) 18:12:31.74ID:WLLuhFHT
>>877
俺もさっきまで勘違いしてたんだが、-pedantic-errors付けてもこれは通る。
http://melpon.org/wandbox/permlink/LCE81Q3GGE520jPh

ただし、それでもextern使った方がいいと思う

exten使わない場合
hoge.c:
const char* hoge = "hoge";

hoge.h:
const char* hoge;

main.c:
#include <stdio.h>
int main() { printf("%s\n", hoge); }

# gcc main.c -lhoge
# ./a.out
hoge

# gcc main.c
# ./a.out
libhoge.aをリンクし忘れ、hogeがヌルポインタなので未定義動作。エラー終了するかもしれない

externを付ける
hoge.h:
extern const char* hoge;

# gcc main.c
hogeがの定義が見つからないのでリンカエラー。libhoge.aをリンクし忘れていることが分かる
0880デフォルトの名無しさん2015/02/08(日) 18:15:32.73ID:WLLuhFHT
main.c間違えた

#include <stdio.h>
#include "hoge.h"
int main() { printf("%s\n", hoge); }

だわ
0881デフォルトの名無しさん2015/02/08(日) 18:19:13.07ID:jgXa3G6y
>>879
たしかにライブラリ .lib, .a あるいは .so に添付するヘッダに関しては extern をつけたほうがいいかもしれない
無論、ライブラリたるもの、グローバル変数を持つのは避けたいものだね
0882デフォルトの名無しさん2015/02/08(日) 18:21:18.39ID:phJldef5
>>879
そらそうよ。リンカの仕事だから。
0883デフォルトの名無しさん2015/02/08(日) 18:48:04.56ID:jgXa3G6y
>>882
gnu 拡張だと思った理由は?
0884デフォルトの名無しさん2015/02/08(日) 19:49:46.61ID:/BdWTHaM
>>875
> 本当に確保されるのか?
当たり前だ、アホウ。

> たとえ確保されたにしても、リンク時にまとめられる、遅かれ早かれその h[10000] は必要なんだろう?
参照しなけりゃ不要だ。アホウ。

お前、あの時から未だに理解してないのか。wwww

えいっ
system("ls -l ./prog"); wwww
0885デフォルトの名無しさん2015/02/08(日) 20:13:34.60ID:/BdWTHaM
ネタで言ってるんだと思ってた。今まで本気で言っていたとは。アキレカエル wwww
ちなみに、プログラムのサイズはls -lじゃなくてsizeで見るんだよ。wwww

hoge.h:
#ifdef QZ
int hoge[10000];
#else
extern int hoge[10000];
#endif
extern int hage(void);

hoge.c:
#include "hoge.h"
int hoge[10000];

hage.c:
#include "hoge.h"
int hage(void) { return 0; }

main.c:
#include "hoge.h"
int main(int argc, char **argv){ return hage(); }
0886デフォルトの名無しさん2015/02/08(日) 20:14:29.53ID:/BdWTHaM
$ cc -c hoge.c hage.c
$ ar cr libhoge.a hoge.o hage.o
$ cc main.c -L. -lhoge
$ size a.out
text data bss dec hex filename
1187 552 8 1747 6d3 a.out
$ rm *.[ao]
$ cc -c -DQZ hoge.c hage.c
$ ar cr libhoge.a hoge.o hage.o
$ cc -DQZ main.c -L. -lhoge
$ size a.out
text data bss dec hex filename
1187 552 40064 41803 a34b a.out
0887デフォルトの名無しさん2015/02/08(日) 21:36:13.41ID:Z5I8sNs2
gotoなんて存在悪扱いなのに…
0888デフォルトの名無しさん2015/02/08(日) 21:46:34.01ID:dodlVyA9
例外処理(try-catch)系の構文を持たない言語では、案外エラー処理で使われたりする。
正常系と異常系に明確に処理を分離する設計が大前提だが…
0889デフォルトの名無しさん2015/02/08(日) 21:47:58.33ID:0Aue6GB7
gotoは便利だし、無意味に余分な条件分岐を追加しなくても済む。
gotoを使えない奴って、Cを使えない奴と同義語だよね?(´・ω・`)
0890デフォルトの名無しさん2015/02/08(日) 22:03:34.41ID:dfaBeDkW
かなり馬鹿な質問かもしれないけど、
CにできてC++はできないことある?その逆はありそうだけど
0891デフォルトの名無しさん2015/02/08(日) 22:09:10.44ID:qm5Q9UjT
C++の構文をエラーにすること
0892デフォルトの名無しさん2015/02/08(日) 22:12:00.03ID:zA4VCWHn
変数名に C++で追加された予約語を使うこと
new とか delete とか
0893デフォルトの名無しさん2015/02/08(日) 22:34:47.54ID:0DBFwuJA
ちょっとニュアンスが違うけど、C++に対してC言語が圧倒的に有利なのは、
リソースの貧弱な環境でもそれなりに軽快な動作が期待できること。
OSすら搭載していない程にCPUパワーやメモリ容量の制約が厳しい組み込み系ではほぼC言語一択。
0894デフォルトの名無しさん2015/02/08(日) 22:55:24.54ID:c5AH8EK3
C++の全機能を使わなくても、C++をちょっと便利なCとして使えば組み込みでも変わらないが。
コンパイラがあればの話だけど。
0895デフォルトの名無しさん2015/02/08(日) 22:58:24.63ID:sDEInvQO
逆にそういう限られた状況以外であえてC言語使うような状況ってあるの?
C言語と言っても、皆gccやVC++とか
のC++処理系使っているんじゃないの?
0896デフォルトの名無しさん2015/02/08(日) 23:11:31.40ID:jgXa3G6y
>>885
>ネタで言ってるんだと思ってた。

ちっ、ライブラリアンを持ち出してくるとは
この場合、使わない(リンクしない)外部名を削除できないか‥まあ前回みているが‥

extern は要らない子ぉ!
0897デフォルトの名無しさん2015/02/09(月) 00:44:01.06ID:AazwEOnB
extern あったら困る状況ってあるの?
0898 ◆QZaw55cn4c 2015/02/09(月) 00:44:49.46ID:/6o1xue1
ない
0899デフォルトの名無しさん2015/02/09(月) 01:47:16.62ID:oFXCK2gH
>>895
各メーカー製のCコンパイラがある
0900デフォルトの名無しさん2015/02/09(月) 01:50:08.88ID:oFXCK2gH
Z80用Cコンパイラ
Z80 Development Tools
http://www.x1center.org/devtool.html
0901デフォルトの名無しさん2015/02/09(月) 03:18:37.01ID:yfa27kPw
趣味以外でわざわざ使う人いるの?
実用するには無理があるだろう。
現在、組み込み以外で8/16bitCPUとか使う状況はないのでは?
逆に組み込み系チップを製造しているメーカは自社製品用のCコンパイラを提供しているだろうが…
0902デフォルトの名無しさん2015/02/09(月) 09:23:16.83ID:RDXDFFuM
何人かexternが要らないっていってるけど、外部の変数参照するために必要でしょ
::::::::::::::
aaa.c
::::::::::::::
main()
{
extern int my_errno;
func();
printf("myerr=%d\n", my_errno);
}
::::::::::::::
bbb.c
::::::::::::::
int my_errno;

func()
{
my_errno = 3;
}
0903デフォルトの名無しさん2015/02/09(月) 09:30:23.68ID:fPRadUBa
関数内のスコープで宣言するなら
(スコープの飛び越しのために) extern キーワードは必須だわな
0904デフォルトの名無しさん2015/02/09(月) 09:53:36.26ID:FAf8Hiv4
他言語で作ったオブジェクトファイルとリンクする場合でもexternは必要ないの?
0905デフォルトの名無しさん2015/02/09(月) 10:06:57.78ID:tv87py8a
関数内でグローバル変数の宣言をするのは、あまりよい作法ではないけどな


 
 

   
0906デフォルトの名無しさん2015/02/09(月) 10:08:40.70ID:tv87py8a
無用な改行が入った。失礼。
0907デフォルトの名無しさん2015/02/09(月) 10:31:53.74ID:im2SOP7p
グローバル変数の使い方次第で
わけわかにする人がいるから・・・
gotoも同じ
0908デフォルトの名無しさん2015/02/09(月) 18:52:38.18ID:f69VnbTc
>>902
externが要らないとか言ってるアホウはQzとか言うゴミクズだけだよ
0909デフォルトの名無しさん2015/02/09(月) 20:19:31.51ID:/6o1xue1
>>902
その例なら int my_error と両方に書いて問題ない
問題になるのはライブラリに添付するヘッダにてライブラリ固有の外部静的変数を設けるときだけだ
0910デフォルトの名無しさん2015/02/09(月) 20:29:33.88ID:dMqS5RFC
extern外したらただの未初期化のローカル変数になってしまうんですがそれは……
0911デフォルトの名無しさん2015/02/09(月) 20:41:06.85ID:U/1UCdd/
>>891
間違った構文がエラーになる保証はない
0912デフォルトの名無しさん2015/02/09(月) 20:46:17.70ID:QLXrqJxU
>>909
言語仕様的に、ライブラリ固有の外部静的変数と、ユーザ定義の外部静的変数に区別はないだろ。
グローバル変数の意味わかってるのか?
0913デフォルトの名無しさん2015/02/09(月) 20:49:57.58ID:QLXrqJxU
グローバル変数は関数外で宣言すれば問題はない。
そのため外部参照はexternで明確にしないと混乱を招く。
0914デフォルトの名無しさん2015/02/09(月) 21:37:17.43ID:f69VnbTc
>>909
>問題になるのはライブラリに添付するヘッダにてライブラリ固有の外部静的変数を設けるときだけだ
ぷぷぷっ これだけ時間かけても、まだここまでしか理解できてないのか。アキレカエル。wwww
ちげーよ。アホウ。wwww
0915デフォルトの名無しさん2015/02/09(月) 22:27:45.77ID:v6QwQG1G
配列で*(str+1)と間接参照演算子を利用出来るのに*str++では出来ないのはなぜでしょうか?
0916デフォルトの名無しさん2015/02/09(月) 22:30:44.02ID:tSHJtUbI
>>915
演算子の優先順位を考えるべし。
0917デフォルトの名無しさん2015/02/09(月) 22:40:11.87ID:BDPeZr7+
配列(変数)に対して、ポインタのインクリメント・デクリメント等のアドレス操作を許すと
その後の大きさが状況依存になってしまうから じゃないか?

int a[10];
sizeof a ⇒ sizeof(int) * 10


a++ を許すとする
a++ 以降 sizeof a は sizeof(int)*9 になるのか?

a-- を許すとする
以降 sizeof a は sizeof(int) * 11 なのか?
0918デフォルトの名無しさん2015/02/09(月) 22:41:02.95ID:v6QwQG1G
>>916
右結合でstr++が先に評価されstrの指す次のアドレスに間接参照できないのでしょうか?
0919デフォルトの名無しさん2015/02/09(月) 22:53:17.39ID:BDPeZr7+
配列は(指してる要素じゃなくて)
そのもののインクリメント・デクリメントできない

char str[10]; str++; /* error */

char *str; str++; /* OK */
0920デフォルトの名無しさん2015/02/09(月) 22:55:21.09ID:tSHJtUbI
>>918
そうはならないんだな。
*(str++)とするか*++strとしなければいけない。
あるいは、別の文に分けてしまってもいい。一つの文で複数のことをやるのはあまり良くない。
0921デフォルトの名無しさん2015/02/09(月) 22:57:44.53ID:v6QwQG1G
>>917
配列を別の関数に参照渡しで受け取った場合コンパイルエラーにならいのは何故でしょうか?
char str1[100]="Hello, World";
test(str1);
〜〜〜〜〜〜〜
void test(char str2[]){
printf("%c", *++str2);
}

eと出力されます
0922デフォルトの名無しさん2015/02/09(月) 23:01:13.49ID:BDPeZr7+
>>921
それ ポインタになってる 配列じゃない
0923デフォルトの名無しさん2015/02/09(月) 23:04:52.89ID:v6QwQG1G
>>920
main関数ないで*++str、*(str++)でも同じくコンパイルエラーになります。

コンパイラはborland c++ 5.5.1です。
エラー内容は"左返値が必要"です。
0924デフォルトの名無しさん2015/02/09(月) 23:08:10.11ID:dMqS5RFC
>>920
後置++って単項*より優先順位高くなかったか?
*str++と*(str++)は同じ意味だったと思うぞ
ただ、後置++は式の最後に評価されるって決まりがあるから、*str; str++;と同じ動作になるけど。

まあそもそも配列とポインタ変数の区別が付いてないっぽいけど
0925デフォルトの名無しさん2015/02/09(月) 23:10:58.17ID:v6QwQG1G
>>922
この場合、配列ではなくポインタになるのでね。
それでは配列で*(str+1)は出来て*str++が出来ない要因はなんでしょうか?

無知ですみません。
0926デフォルトの名無しさん2015/02/09(月) 23:14:39.33ID:BDPeZr7+
文法上での仕様 (規格提示できれば良いんだけども)
0927デフォルトの名無しさん2015/02/09(月) 23:15:14.90ID:ctAnPJrw
K&Rが
(*++argv)[0] == '-'
とか
c = *++argv[0]
とか書くから・・・
0928デフォルトの名無しさん2015/02/09(月) 23:56:08.84ID:ctAnPJrw
>>925
K&R p127
>char amessage[] = "now is the time"; /* 配列 */
>char *pmessage = "now is the time"; /* ポインタ */
>ここでamessageは、それの初期値となる文字列と\0をぴったり保持するだけの大きさ
>を持つ配列である。この配列の中の個々の文字は変わり得るが、それでもamessage
>は同じメモリ位置を指す。他方、pmessageは文字列定数を指すよう初期化された
>ポインタである。したがって、このポインタを他の場所を指すように後で変えること
>ができる。

>>919が解説してくれていること。

また、式の中では(関数の仮引数宣言を含めて)配列はポインタに読み替えられるので、
>>921の関数は
void test(char *str2){
printf("%c", *++str2);
}
と書いても同じ。配列str1の先頭アドレス(ポインタ)をポインタstr2に代入して
ポインタを介して操作しているので問題ない。
0929デフォルトの名無しさん2015/02/10(火) 01:59:59.44ID:v4EqnwDr
>>928
インクリメントで配列名の指し示す先頭アドレスを書き換えようとしていたのが原因なんですね

有難うございました
0930デフォルトの名無しさん2015/02/10(火) 06:54:47.14ID:nUBvAJ0t
>>923
Borlandワカンネ(投げた
0931デフォルトの名無しさん2015/02/10(火) 17:21:25.67ID:TB/K9hZ4
>>909
お前のタワゴトの最大の欠陥は、仕様書に「ポータブルではない」と明記されている事だ。
0932デフォルトの名無しさん2015/02/11(水) 00:32:08.53ID:s2JRlohk
初心者です
#include <stdio.h>
int olympic(int);
int main(void)
{
int year,hold;

scanf("%d",&year);
hold = olympic(year);
switch(hold)
{
case 0: printf("その年はオリンピックは行われなかった"); break;
case 1: printf("その年は夏季オリンピックが行われた"); break;
case 2: printf("その年は冬季オリンピックが行われた"); break;


int olympic(int year)
{
    if((year >= 2000) && (year % 2 == 0))
        {
           if(year % 4 == 0)
                {
                return 1;
           }else{
                return 2;
           }else{
                return 0;
    }
        }
}    
↑のプログラムがうまくいかないんだけど原因がわからない…エラー内容を見るとどうも下の関数がうまく認識?されてない気がする
コピペしたらなんか見にくくなっちゃったスマン
0933片山博文MZ ◆T6xkBnTXz7B0 2015/02/11(水) 00:36:10.85ID:zXogh88K
>>932
関数の中に関数を定義するな。
{ }の対応をきっちりと。
0934デフォルトの名無しさん2015/02/11(水) 00:38:05.68ID:ducu+T9E
>>932
まずはここにエラーになるというコードを貼ってみようか
http://ideone.com/
0935デフォルトの名無しさん2015/02/11(水) 00:38:48.72ID:8xnZ6D3Q
elseが2個あるとか、結構無茶苦茶だな……
0936デフォルトの名無しさん2015/02/11(水) 00:44:59.84ID:w+p6CXuc
正解は、プロトタイプ宣言でした。 とかw
0937デフォルトの名無しさん2015/02/11(水) 00:53:46.76ID:s2JRlohk
>>933
ごめんもう少し簡単に教えていただけないでしょうか…

>>934
貼って実行?したけどやっぱりエラー出たっぽい
0938デフォルトの名無しさん2015/02/11(水) 00:59:26.75ID:xS/oPZFt
>>932 こうしたいんじゃないの?
#include <stdio.h>
int olympic(int);

int main(void)
{
int year,hold;
scanf("%d",&year);
hold = olympic(year);
switch(hold)
{
case 0: printf("その年はオリンピックは行われなかった"); break;
case 1: printf("その年は夏季オリンピックが行われた"); break;
case 2: printf("その年は冬季オリンピックが行われた"); break;
}

return 0;
}

int olympic(int year)
{
if((year >= 2000) && (year % 2 == 0)) {
if(year % 4 == 0) {
return 1;
}else{
return 2;
}
}else{
return 0;
}
}
09393302015/02/11(水) 01:06:02.58ID:s2JRlohk
>>938
その通りですありがとう

タブの部分が消えちゃって修正しようと思ったら汚くなってしまった
0940デフォルトの名無しさん2015/02/11(水) 09:02:49.46ID:yrYT/hzd
>>939
コードが汚かったり非効率的に思えるのはともかく、普通に動いた。
http://ideone.com/o92PN0
0941デフォルトの名無しさん2015/02/11(水) 09:34:47.79ID:s2JRlohk
>>940
あっれー?
じゃあコンパイラ側の問題かな

ちょっと他のコンパイラで試してみます
ありがとうございます
0942デフォルトの名無しさん2015/02/11(水) 09:42:31.13ID:NCwBJrvr
初心者はなぜコンパイラ側の問題と決めつけるのだろう……
0943デフォルトの名無しさん2015/02/11(水) 09:57:47.86ID:s2JRlohk
初心者的にはソースコードのミスかコンパイラの問題かの二通りしか思い当たらないから

他になにかあるの?
0944デフォルトの名無しさん2015/02/11(水) 10:00:08.50ID:r/0eDyUI
>>941
え?
>>938のコードでも、まだ動かないの?
コンパイラはなに使ってるの?
0945デフォルトの名無しさん2015/02/11(水) 10:07:12.72ID:yrYT/hzd
>>943
クソなコードにコンパイラが警告を出しまくってるとか。
0946デフォルトの名無しさん2015/02/11(水) 10:18:47.71ID:jxK+Uck3
クソかどうかはともかく、最近のコンパイラだと scanf 使えば警告くらいは出すのが普通。
VC++だとコンパイラオプションで警告レベル変更するか、ソースの先頭に

#define _CRT_SECURE_NO_WARNIGS

で警告抑制マクロ定義しないとコードを吐いてくれない。
0947デフォルトの名無しさん2015/02/11(水) 10:35:10.78ID:g8RVwTic
ほとんど?の本やサイトではCを十分に学んでからC++を学ぶべきと書いてあるが実際どうなの?
やっぱりCを一通りやった方がC++習得しやすくなるのかな?
0948デフォルトの名無しさん2015/02/11(水) 10:41:32.40ID:D0nqSOkg
>>946
#define _USE_MATH_DEFINES を入れておかないと M_PI とか使えないのには参ったぜ…トホホ
0949デフォルトの名無しさん2015/02/11(水) 10:51:34.26ID:s2JRlohk
>>944
ごめんなさい動きました
見やすく書き直してくれただけかとおもってた、、、

どこがおかしかったか教えていただけると嬉しいです
0950デフォルトの名無しさん2015/02/11(水) 10:56:21.98ID:s2JRlohk
自己解決しました

普通にいろいろ抜け落ちてましたすいません
お騒がせしましたm(_ _)m
0951デフォルトの名無しさん2015/02/11(水) 11:56:40.96ID:zO3T1ON+
>>947
一応、C++からいきなり学ぶ書籍なんかもあるにはある…のだが
C++の詳しいところを学ぼうとすると大概C言語由来の部分で詰まると思うよ
そしてC++はC由来の部分だけでなく、今は物凄い拡張された言語でもあるから、なかなか消化しきれない
そういう意味ではある程度仕様が限られてるC言語の範囲を学んでおくのはベターなのかなと
0952デフォルトの名無しさん2015/02/11(水) 12:01:34.06ID:g8RVwTic
>>951
なるほど
0953デフォルトの名無しさん2015/02/11(水) 12:32:12.25ID:yrYT/hzd
>>947
C言語使えるだけでも楽しいもんだぞ。順々に覚えても損はない。
0954デフォルトの名無しさん2015/02/11(水) 12:40:55.63ID:LbwtxuPp
>>942
初心者あるある

・なぜかコンパイラを疑う
・なぜかコンパイラの実装を批判
・なぜか言語仕様を批判
・なぜかOSを批判

なぜだか、初心者ほど、こういうことになる
0955デフォルトの名無しさん2015/02/11(水) 12:45:12.39ID:2YbZ9jaX
>>954
初心者は批判する能力は無い。ただ疑うのみ。
0956デフォルトの名無しさん2015/02/11(水) 17:03:33.12ID:uMI9EsOb
C++の後にCをやってハマる事とかもあるよね。
初期化されないとかw
0957デフォルトの名無しさん2015/02/11(水) 17:08:14.97ID:VTUkIwUw
>>950
それが自己解決って言うんかヨ!
0958デフォルトの名無しさん2015/02/11(水) 19:07:58.16ID:NCwBJrvr
直前の質問に答えが帰ってくる前に原因が分かったら自己解決になる世界の人らしい
0959デフォルトの名無しさん2015/02/12(木) 00:06:25.50ID:tZzaZ5PR
>>949については自己解決したって意味じゃないの?
0960デフォルトの名無しさん2015/02/12(木) 07:33:39.78ID:gk0AlyzN
コンパイラを疑いたくなる気持ちはわかるかな
今ではコンパイラに調教されちゃったけど俺は
0961デフォルトの名無しさん2015/02/12(木) 07:42:53.30ID:r7IlduRS
エキスパートが作って世界中で動作検証しているコンパイラと
素人の自分が一人だけで悩んでる
どちらが間違えている確率が高いか?

この事実に気付いた時から処理系やOSのせいにするのを止める
0962デフォルトの名無しさん2015/02/12(木) 08:44:12.39ID:ExYm7geR
間違ってないと思い込みたいのは最初の頃はよくあること
でも、だいたい、ご本人様の間違いでちゃんちゃんです
0963デフォルトの名無しさん2015/02/12(木) 09:07:43.45ID:D8Qo7IfR
30年以上コード書いてるけど、コンパイラのバグ見つけたのは X68000 用の GCC だけだな
0964デフォルトの名無しさん2015/02/12(木) 09:24:04.30ID:NNFkXciW
俺はMIPSのGCCで-O3にした時に不具合が出た事があったな。
まあ-O3だしな。
0965デフォルトの名無しさん2015/02/12(木) 18:52:42.09ID:zUM2O0bM
elseが二つあってもオッケーなんや(笑)
知らんかった
0966デフォルトの名無しさん2015/02/12(木) 19:20:15.61ID:Rk3YDU9i
>>931
おうよくきたな

>お前のタワゴトの最大の欠陥は、仕様書に「ポータブルではない」と明記されている事だ。
それは >>876 でことわっているだろう、このメクラが
>欠点は、この手法はオブジェクトファイルとリンカ依存であることw

しかしウェルカムだ、またなにかあったらコメントをくれ
http://peace.2ch.net/test/read.cgi/tech/1418073244/371
0967デフォルトの名無しさん2015/02/12(木) 21:19:49.96ID:r7IlduRS
>>966
欠点ではない、「最大の欠陥」だ。アホウ。
これまで指摘した以外にも、まだ欠陥がある。
0968デフォルトの名無しさん2015/02/12(木) 21:25:49.38ID:Rk3YDU9i
>>967
ところ、MASM には EXTERNDEF というものがあるが、これをどう説明する?
0969デフォルトの名無しさん2015/02/12(木) 22:00:25.62ID:r7IlduRS
>>968
MASMがCの規格にどう関係してるんだ? アホウ。
0970デフォルトの名無しさん2015/02/12(木) 22:01:28.21ID:rkSTHNg7
ほう、ここはC言語のスレじゃなくてMASMのスレだったのか
0971デフォルトの名無しさん2015/02/12(木) 22:29:21.16ID:IX7zjOl+
たまには NASM のことも思い出してあげて下さい
0972デフォルトの名無しさん2015/02/12(木) 22:49:39.29ID:Rk3YDU9i
>>969
必要があるから ver6 からの MASM にそのようなディレクティブが存在するのだろう
それが C にあってもいいのでは?というか、それが「仮定義」の心なのでは?とてもべんりだしね
0973デフォルトの名無しさん2015/02/12(木) 22:59:08.80ID:rkSTHNg7
俺はMASMについて詳しくないからよく分からんが、説明を見る限り仮定義じゃなくてexternに対応するもののように思えるが
0974デフォルトの名無しさん2015/02/12(木) 23:03:05.21ID:Rk3YDU9i
>>973
いや、public と extern が C に対応するものだが、それとは別に externdef があって、状況によって public にも extern にも使えるというやつだ
0975デフォルトの名無しさん2015/02/12(木) 23:08:53.85ID:rkSTHNg7
MASMについてはスレ違いだしちゃんと調べてみないと分からんからこれ以上のコメントは避けるとして、
> 必要があるから ver6 からの MASM にそのようなディレクティブが存在するのだろう
必要があるからexternが存在するとは思わないんですかねぇ……
0976デフォルトの名無しさん2015/02/12(木) 23:14:17.16ID:Rk3YDU9i
まあネタなんだが‥そろそろ賞味期限はきれてしまったようだ、次を探そう‥
0977デフォルトの名無しさん2015/02/12(木) 23:22:51.60ID:2kUwxM+t
extern論争とそれに応じてるやつは
このスレ荒らしてるのかよ
0978デフォルトの名無しさん2015/02/13(金) 00:05:08.25ID:zNwxzzgt
1992年リリースのmasm6で導入されたexterndefが、c89(あるいはそれ以前)の仮定義に影響を及ぼしたのか。
そりゃ、スゲーな。wwww
0979デフォルトの名無しさん2015/02/13(金) 07:09:12.51ID:ezlWA653
どこをたてよみすれば
0980デフォルトの名無しさん2015/02/16(月) 18:26:15.05ID:59sd9PV9
http://cooelgame.web.fc2.com/lecture_ex2.html
このページの//迷路初期化という所なんですがそのままVC++2010に通すとスタイルキャストに関するエラーがでます
switch(kind)
{
case PATH:
 maze[i].kind = PATH;
 maze[i].flag = FALSE;
...省略
という形で書いたら動いたのですがこれはサイトのコードが間違っているのでしょうか
GoogleでC言語 ゲームと検索すると上位に出るのでそんなことはないと思うのですが
0981デフォルトの名無しさん2015/02/16(月) 18:58:01.97ID:rzBZ3TL9
コードの質は評価基準じゃないので、上位だからといって正しいとは限らない。
でも、CじゃなくてC++でコンパイルしてるだろ。
0982デフォルトの名無しさん2015/02/16(月) 21:02:40.33ID:l4d0IMMY
うめ
0983デフォルトの名無しさん2015/02/16(月) 22:07:22.39ID:sV2TdEmn
>>981
理解できました
ありがとうございます
0984デフォルトの名無しさん2015/02/17(火) 05:59:27.19ID:ZFpu07nN
うめ
0985デフォルトの名無しさん2015/02/17(火) 07:03:20.25ID:NGo27G1P
もも
0986デフォルトの名無しさん2015/02/17(火) 20:58:23.36ID:9pmimCtR
うめ
0987デフォルトの名無しさん2015/02/17(火) 21:41:32.60ID:Fk3ZHsId
まつ
0988デフォルトの名無しさん2015/02/17(火) 21:42:59.49ID:xgmY9b+s
たけ
0989デフォルトの名無しさん2015/02/17(火) 22:00:40.17ID:Fk3ZHsId
つる
0990デフォルトの名無しさん2015/02/17(火) 23:55:03.03ID:vdudd8Dx
かめ
0991デフォルトの名無しさん2015/02/18(水) 00:03:02.57ID:jcJgiA8X
ぼうず
0992デフォルトの名無しさん2015/02/18(水) 02:14:42.84ID:u0qlpATY
びでぶ
0993デフォルトの名無しさん2015/02/18(水) 02:19:52.44ID:y6/Z4Lk1
う
0994デフォルトの名無しさん2015/02/18(水) 05:33:35.06ID:GmxPl0V4
め
0995デフォルトの名無しさん2015/02/18(水) 12:32:20.24ID:/l9qjBka
ぼ
0996デフォルトの名無しさん2015/02/18(水) 15:40:00.12ID:G395GlE9
し
0997デフォルトの名無しさん2015/02/18(水) 16:32:48.45ID:s5Vrc8eg
次スレ
C言語なら俺に聞け(入門編)Part 127(c)2ch.net
http://peace.2ch.net/test/read.cgi/tech/1424244688/
0998デフォルトの名無しさん2015/02/18(水) 16:48:32.86ID:y67hweeT
殿下
0999デフォルトの名無しさん2015/02/18(水) 18:02:06.92ID:gPZA2ZnI
ん
1000デフォルトの名無しさん2015/02/18(水) 18:03:00.89ID:gPZA2ZnI
ん
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。