C言語なら俺に聞け(入門篇) Part 12 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
07/05/08 19:39:26
C言語の入門者向け解説スレです。 
・C++言語はスレ違いです。 
・分からない事をなるべく詳しく書いて下さい。 
・ソースコードを晒すと答えやすくなるかもしれません。 
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 

前スレ 
C言語なら俺に聞け(入門篇) Part 11
スレリンク(tech板)

過去スレ
Part 1 スレリンク(tech板) Part 2 スレリンク(tech板)
Part 3 スレリンク(tech板) Part 4 スレリンク(tech板)
Part 5 スレリンク(tech板) Part 6 スレリンク(tech板)
Part 7 スレリンク(tech板) Part 8 スレリンク(tech板)
Part 9 スレリンク(tech板) Part 10 スレリンク(tech板)

関連スレ
C/C++の宿題を片付けます 86代目
スレリンク(tech板)
くだすれC言語(初心者用) Part.2
スレリンク(tech板)
スレを勃てるまでもないC/C++の質問はここで 2
スレリンク(tech板)l50
はきだめC/C++下級者の質問箱 2
スレリンク(tech板)l50

【C 関数検索 man on WWW】 URLリンク(www.linux.or.jp)

2:デフォルトの名無しさん
07/05/08 19:41:30
前スレ>>996
char c;
char str[100];
もしかしてこのcとstrが同じだと思ってるとか?

3:デフォルトの名無しさん
07/05/08 19:45:33
996じゃないけど

C言語の場合
char c; /* 文字型の宣言 */
char str[100]; /* 文字列型の宣言 */

Java とか C# とか
char c;
string str;

こういうことなのかな?なんか変なかんじがする…

4:デフォルトの名無しさん
07/05/08 19:47:26
その本はstrがポインタというような事を言ってるはず。
さすがにcがポインタだとは言わないだろ。

5:デフォルトの名無しさん
07/05/08 19:48:20
>>2
違うんですか?

6:デフォルトの名無しさん
07/05/08 19:48:38
str はある意味ポインタと言えなくはないが、
少なくともポインタ変数ではないし、
ポインタと説明してる紛らわしい本はあって欲しくない。

文字列をポインタを通して渡す、程度の話をしてるんでないかな。

7:デフォルトの名無しさん
07/05/08 19:50:27
前スレ975は期待する動作と実際の動作を書けよ。
上手く動かないだけじゃ何を意味してるのか曖昧だぞ。

8:デフォルトの名無しさん
07/05/08 19:52:17
>>3
Cには文字型も文字列型もない

9:デフォルトの名無しさん
07/05/08 19:56:10
>>7
期待している動作
printf ("%d\t%d\n",ran,kai);を10回実行し、11回目のループ時にEndを吐き出す

表示例は、以下の様な感じ
32  1
1   2
176 3
43  4
22  5
11  6
299 7
231 8
32  9
98  10
End

実際の動作
何も表示されない

やっぱりgotoじゃ無理なんですかね?

10:デフォルトの名無しさん
07/05/08 19:56:59
前スレ>>990
授業とかはあくまで補助や学習スケジュール管理と考えたほうがいい
専門学校なんかは1年〜数年単位ですべてが学べるようになっているはずだから
教え方や進歩速度に不満があるならとりあえず教科書読んで池
ポインタもそのうちしっかりやるだろ

11:デフォルトの名無しさん
07/05/08 19:58:55
全ての制御文は if と goto で書けるから
goto で無理なんてことはあり得ない。

12:デフォルトの名無しさん
07/05/08 20:05:00
プロンプトのコピペ

C:\KD\sk\practis\goto>bcc32 goto.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
goto.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

C:\KD\sk\practis\goto>goto

C:\KD\sk\practis\goto>goto

C:\KD\sk\practis\goto>

13:デフォルトの名無しさん
07/05/08 20:11:09
practisだから失格

14:デフォルトの名無しさん
07/05/08 20:11:52
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
 int ran;
 int kai;

 srand((unsigned)time(NULL));

 kai = 0;
LOOP:
 if(kai >= 10) { goto END; }
  ran = rand() % 300 + 1;
  printf("%d\t%d\n", ran, kai);
  ++kai;
 goto LOOP;
END:
 puts("End");

 return 0;
}

15:デフォルトの名無しさん
07/05/08 20:17:03
>>14
>>12と同じ状況になりますが・・・

16:デフォルトの名無しさん
07/05/08 20:18:16
ちゃんとコンパイルしてるか?

17:デフォルトの名無しさん
07/05/08 20:19:16
どうせどっか書き写し間違えてんじゃないの?

18:デフォルトの名無しさん
07/05/08 20:19:48
>>15
っ .\goto
っ goto.exe

19:デフォルトの名無しさん
07/05/08 20:20:51
訂正
goto.exe

.\goto.exe

20:デフォルトの名無しさん
07/05/08 20:21:36
>>16-17
してますよw
証拠
URLリンク(www.imgup.org)

因みにclでコンパイルしても結果は同じでした
これがVISTA QUALITY?

21:デフォルトの名無しさん
07/05/08 20:23:51
>>18-19
しまった、gotoはコマンドなのか・・・
これで解決しました

済みませんでしたあああ(ノ-`)

22:デフォルトの名無しさん
07/05/08 20:24:16
>>20
プロンプトのコマンドと被るような名前をやめればおk
copy dir del mkdir などなど

23:デフォルトの名無しさん
07/05/08 20:25:54
そういうオチかw
なるほど

24:デフォルトの名無しさん
07/05/08 20:26:06
さすがにファイル名をgotoにしてるとは誰も予想できなかったなw

25:デフォルトの名無しさん
07/05/08 20:29:01
いやいや、>>12 で気づくべきだった。
俺も失念してたぜ。

26:デフォルトの名無しさん
07/05/08 20:29:27
完全に予想外だったぜ…

27:デフォルトの名無しさん
07/05/08 20:30:45
.exeつけたら全スレのソースでも動きました!!
感激です><

因みに、ファイル名の8割が関数名なので、こういうことは偶にあったんですが
今回はコマンドエラーが出なかったので全然気付きませんでした(ノ-`)

28:デフォルトの名無しさん
07/05/08 20:32:04
なるほど べんきょうになったw
ついでにpractisも直したといたほうがいいぞw

29:デフォルトの名無しさん
07/05/08 20:39:29
>>27
全スレ→前すれ

>>28
>>13で言われて気付いたので直そうとしたんですが
システム系統以外、全部落としてもシステムから蹴られるので
今度再起動した時にでも直しておきます

30:デフォルトの名無しさん
07/05/08 20:53:51
神代刹那?

31:デフォルトの名無しさん
07/05/08 21:14:36
webマトリックスにて、
セッションによるページ間のデータの転送の仕方がわからないのですが・・・

例えば、BMP(体脂肪の奴)を測定するプログラムで、
1ページ目で体重・身長を入力して
2ページ目で結果を表すという流れなんですが・・・


色々調べたり試行錯誤してみても全くわかりません。
ご教授願えませんか??

32:デフォルトの名無しさん
07/05/08 21:22:56
>>31
C関係ない気がするが適当にエスパーして答えとく
・1ページ目で入力されたデータを何らかの識別子と共に保持しておく
・2ページ目にその識別子を埋め込んでおく
・2ページ目からの入力がきたら、識別子から保存してるデータと関連づける

33:デフォルトの名無しさん
07/05/08 21:25:16
BMI?

34:デフォルトの名無しさん
07/05/08 21:44:19

       FOX★公認!!!

俺たちのクリックで日本を一位にしようぜ!!
“30年は日本に手は出せないな”という勝ち方をしたい
スレリンク(news4vip板)

1. ポーランド  139,797,680
2. チリ     137,040,439
3. ★日本    86,475,213★
4. イスラエル  80,930,530
5. スロベニア  57,137,042
6. フィンランド  40,857,499

石を投げる戦争から人は進化・進歩を遂げ、剣や槍などの武器をもって戦うようになった
人間はさらに発展し兵器を使う戦争を始めた
そして今、指先一つを武器とした電脳戦争が勃発したのであった・・・
皇国を勝利へと導くには貴様らの参戦が不可欠である

・戦場
URLリンク(www.clickclickclick.com)
・まとめサイト
URLリンク(www33.atwiki.jp)


35:デフォルトの名無しさん
07/05/08 23:50:42
URLリンク(www.uploda.org)
配列の大きさをただしく認識してくれないのですが、どこが間違っていますか?
内積を計算するプログラムです。
C言語むずい^^;

36:デフォルトの名無しさん
07/05/08 23:52:25
>>35
スコープ外で宣言された配列の大きさは取得できない
関数引数で渡されるのはあくまで配列先頭へのポインタのみ

それができるならライブラリ関数でわざわざバッファサイズ指定したりしないだろ?

37:デフォルトの名無しさん
07/05/08 23:53:06
>>35
URLリンク(www.kouno.jp)

38:デフォルトの名無しさん
07/05/09 00:02:12
しかしout ofの方のsizeof(v1)でいれてるv1というのもポインタのはずだ。
だったらこっちも4とでるべきなのでは?

39:デフォルトの名無しさん
07/05/09 00:05:53
>38
>36

40:デフォルトの名無しさん
07/05/09 00:07:39
サブルーチン限定仕様なんですね。
では、実際この関数で配列の大きさを求めるにはどうしたらいいのでしょう?
rubyでは.sizeでよかったんですが・・計算系はruby遅すぎて;;

41:デフォルトの名無しさん
07/05/09 00:09:49
関数内で求めなければいい

42:デフォルトの名無しさん
07/05/09 00:11:32
それじゃ関数じゃありません。

43:デフォルトの名無しさん
07/05/09 00:14:02
ruby でもやってろw

44:デフォルトの名無しさん
07/05/09 00:18:10
いやlinuxをしててC言語が必要なのでここは譲れません。
関数内でもいけるはずです。どうしたらいいでしょう?
もしやひとつひとつ取得していく系?

45:デフォルトの名無しさん
07/05/09 00:19:06
>関数内でもいけるはずです
だからできんといっとろーが

46:デフォルトの名無しさん
07/05/09 00:20:20
完全に不可能なんですか?

47:デフォルトの名無しさん
07/05/09 00:21:01
不可能です。

48:デフォルトの名無しさん
07/05/09 00:23:10
だから普通は配列の要素数も引数に与える

49:デフォルトの名無しさん
07/05/09 00:23:18
count = 0

for(i=0; a[0]!=null; i++){
count++;
}

などは?

50:デフォルトの名無しさん
07/05/09 00:23:44
null って何だよ。

51:デフォルトの名無しさん
07/05/09 00:24:11
>>48
配列の要素数が未定なのですが?
ベクトルとベクトルを渡したら内積が得られる。
引数は2つのはずです。

52:デフォルトの名無しさん
07/05/09 00:25:12
nilか。
nullじゃなかった・・・

53:デフォルトの名無しさん
07/05/09 00:27:39
何言ってるか分からんが
無理なもんは無理 まじで無理

54:デフォルトの名無しさん
07/05/09 00:27:45
疲れるなあ・・・。
政府の Ruby 計画が心配になってきたぞ。

>>51
要素数はどこかで分かってるはずだ。
inner_product 内に入ってしまうとどうやっても分からないから、
inner_product に要素数を渡すようにするしかない。

55:デフォルトの名無しさん
07/05/09 00:27:46
nilって何だよ。

56:デフォルトの名無しさん
07/05/09 00:30:17
(sizeof(配列)/sizeof(配列の要素))を引数に入れとけばいいんじゃ?

57:デフォルトの名無しさん
07/05/09 00:30:17
>>51
ならその2つの要素数を渡す


58:デフォルトの名無しさん
07/05/09 00:31:21
>>52
Cに nil はない


59:デフォルトの名無しさん
07/05/09 00:31:24
引数が増えるのが嫌だったら、
値と要素数を持った構造体を作って管理しとけ。

60:デフォルトの名無しさん
07/05/09 00:34:12
もうvectorクラスみたいなの自作するしか

61:デフォルトの名無しさん
07/05/09 00:34:51
自作っつーか、ライブラリ拾ってこい。

62:デフォルトの名無しさん
07/05/09 00:34:53
何こいつ
理解力無さ杉

63:デフォルトの名無しさん
07/05/09 00:40:54
rubyのようにCもできると思っているんだろうね
rubyに汚染されすぎ

64:デフォルトの名無しさん
07/05/09 00:44:37
rubyでは隠蔽されていた色々な事に全く気づいてなかったんだねぇ

65:デフォルトの名無しさん
07/05/09 00:55:38
Cじゃそういったことはすべて自分で実装するかライブラリ使わなきゃいけないってのに
動的に確保したメモリも開放しなさそう

66:デフォルトの名無しさん
07/05/09 00:59:23
自分で実装ってインラインアセンブラ使ったりするの?

と初心者が申しております

67:デフォルトの名無しさん
07/05/09 01:03:26
そうそう、便利≒隠蔽の対価として、性能のトレードオフ
性能を求めるならば、対価の代償として、より低級言語のしがらみ、
メモリの動き、キャッシュの動き、CPUのプリフェッチぐあいを理解しないと速くはならないね

68:デフォルトの名無しさん
07/05/09 01:10:57
もうおとなしくC++ & STL使うといいよ

#include <vector>
#include <iostream>

typedef std::vector<double> vec_t;
typedef unsigned int UINT;

double inner_product (const vec_t& a, const vec_t& b) {
typedef vec_t::size_type vec_sz;
vec_sz len(a.size());
std::cout << "length of a:" << (UINT)len << ", size of a[0]:" << (UINT)sizeof(a[0]) << '\n';
if (len != b.size()) {
std::cerr << "can not define inner product of these vectors" << std::endl;
return 0;
}
double ip(0);
for (vec_sz i = 0; i < len; ++i)
ip += a[i]*b[i];
return ip;
}
int main () {
// 1.3,0,1
vec_t v1;
v1.push_back(1.3); v1.push_back(0); v1.push_back(1);
vec_t v2;
v2.push_back(2); v2.push_back(3); v2.push_back(4);
std::cout << "length of a:" << (UINT)v1.size() << ", size of a[0]:" << (UINT)sizeof(v1[0]) << '\n';
std::cout << inner_product(v1,v2);
return 0;
}

69:デフォルトの名無しさん
07/05/09 01:13:11
>>51
何言いたいのか意味不明だが、これで納得できないなら、そういうことが出来る他の言語使ってろ
読みづらいがJISのホームページでPDF化された奴も見れるから確認なり好きにしろ

6.5.3.4 sizeof演算子の注釈(84)
配列型又は関数型をもつと宣言された仮引数に適用する場合、sizeof演算子は、
型調整された(ポインタ)型の大きさを与える(6.9.1参照)。
                                    (JIS X 3010:2003より引用)

70:デフォルトの名無しさん
07/05/09 01:29:15
>>68
要素数が欲しければtemplate使って配列の参照を引数にするだけでいいだろ。

まぁ俺ならそれ以前にstd::inner_product使うけど。

71:デフォルトの名無しさん
07/05/09 02:47:13
テンプレート使ってやってみました
漏れの知識の程度じゃ読みにくくなるだけしたまる
#include <stdio.h>
#include <numeric>
#define ARRAY_SIZE(X) (sizeof(X)/(sizeof(X[0])))
#define INNER_PRODUCT(x,y) ( g( (x),(y), ( f((x),(y)) ) ) )
template <class T> size_t f(const T& a, const T& b) {
size_t len=0;
len = (ARRAY_SIZE(a));
if (len != ARRAY_SIZE(b)) {
puts("can not define inner product of these vectors");
return -1;
}
else
return len;
}
float g(const float a[], const float b[], size_t len) {
if (len == -1)
return 0;
float ip(0);
for (size_t i = 0; i <len; ++i)
ip += a[i]*b[i];
return ip;
}
int main (void){
float v1[3]={1.3f,0,1}; float v2[3]={2,3,4};
printf("out of function: %d,%d\n", sizeof(v1), sizeof(v1[0]));
printf("%f\n", INNER_PRODUCT(v1,v2) ) ;
return 0;
}


72:デフォルトの名無しさん
07/05/09 02:48:49
float なんて精度悪いもの使うなよ。
double 使え、double 。

73:デフォルトの名無しさん
07/05/09 07:18:26
>>71
訳の分からん自作マクロ使って可読性落とすぐらいなら
上で書かれてるように、Vector型とstd::inner_product()使えばいいだろ
なんのための標準ライブラリだと思ってるんだ

74:デフォルトの名無しさん
07/05/09 08:02:10
先にJavaを試してみたら?
正直、Ruby→C はキツいだろ

75:デフォルトの名無しさん
07/05/09 08:12:31
どう見てもこちらのほうが楽です、本当にありがとうございました
ってかこれってC?

#include <vector>
#include <numeric>
#include <iostream>

int main() {
using std::vector;
using std::inner_product;
using std::cout;

// float v1[3]={1.3,0,1}; float v2[3]={2,3,4};
vector<double> v1, v2;
v1.push_back(1.3); v1.push_back(0); v1.push_back(1);
v2.push_back(2); v2.push_back(3); v2.push_back(4);

double ip = inner_product(v1.begin(), v1.end(), v2.begin(), 0.0);
cout << "inner product:" << ip;

return 0;
}

76:デフォルトの名無しさん
07/05/09 08:17:36
namespaceとかClassはC++の仕様ですよね?
Classがあるなら使いますよ。
でもね、C言語じゃないといけないんです。linuxのデフォだからね。
Cを勉強するのは計算が早いからとrubyのライブラリが作りたいから。
あとlinuxプログラミングがしたいから。

77:デフォルトの名無しさん
07/05/09 08:19:29
CがLinuxのデフォってあんた……
それならC++でもいいでしょうが。

78:デフォルトの名無しさん
07/05/09 08:47:03
確定したライブラリがない。
C++はもう終わった言語。手続き型にクラスをくっつけただけの言語でしょ。
純粋なrubyこそソフト開発に向いてるが、やはり速度がネック

79:デフォルトの名無しさん
07/05/09 09:03:56
m9(^д^)プギャー!!

80:デフォルトの名無しさん
07/05/09 10:04:47
勘違いや思い込みが激しいな
こんな奴rubyもたいしてできんだろ

81:デフォルトの名無しさん
07/05/09 11:35:39
ディレクトリ名をジャスティスに変えるとすべてが上手くいく

82:デフォルトの名無しさん
07/05/09 13:37:48
sizeof自体がどうなってるか分かりませんか?
あとC言語って自由に配列数を増やしたり減らしたり出来ない?
出来たらうれしい

83:デフォルトの名無しさん
07/05/09 13:45:54
rubyじゃないんだから・・・

84:デフォルトの名無しさん
07/05/09 13:59:39
>>82
sizeofは、コンパイル時にコンパイラが計算する。

配列要素数の増減はできないので、realloc()したりC++のvectorを使っ
たり。


85:デフォルトの名無しさん
07/05/09 14:11:39
reallocというのは確保領域を変えるってことですか?
それなら手間が増えるだけで増減可能ですね。

sizeofはライブラリではないんですか?
sizeofはどうやって書かれているかを聞いています。

86:デフォルトの名無しさん
07/05/09 14:13:08
C++は使わないことにしています。
なぜならC++はC言語の拡張とはいえないからです。
オブジェクト指向としてはrubyがもっとも純粋であることは確かですし
Cとの互換性が消えたので、linuxで使えません

87:デフォルトの名無しさん
07/05/09 14:28:35
オブジェクト指向としての純粋性を追求する事に何の意味が?
Cとの互換性が不完全でもLinuxでC++は使えるが?

88:デフォルトの名無しさん
07/05/09 14:32:47
>>85
sizeof はコンパイラが解釈する演算子の内のひとつです。関数ではありません。


89:デフォルトの名無しさん
07/05/09 14:33:51
システムはCで書かれている。
C++では書かれていない。これは互換性が消えたことによるものである。
linuxといえばC言語
C++は窓用言語
rubyはクロスプラットフォームの純粋オブジェクト指向型言語

90:デフォルトの名無しさん
07/05/09 14:45:57
つまりLinuxのシステムだけを書くためにCを勉強中って事?

91:デフォルトの名無しさん
07/05/09 14:49:08
>>85
reallocはただの動的確保で配列関係ないから
配列の要素数増減は不可でFA

92:デフォルトの名無しさん
07/05/09 14:52:21
rubyではどうやって配列の要素数増減ができると見せかけられたかを考えてみるといいよ。

93:デフォルトの名無しさん
07/05/09 15:44:37
どうせRubyの事も大して分かってないんだろうな

94:デフォルトの名無しさん
07/05/09 16:05:07
それは俺も思った

95:デフォルトの名無しさん
07/05/09 16:06:07
突っ込みどころがあり過ぎるが、たぶん釣りだからガマン。
うちの会社に来ないことを祈る。


96:デフォルトの名無しさん
07/05/09 18:09:22
>>91
メモリ確保した所を配列として扱うなら可能だと思うが。


97:デフォルトの名無しさん
07/05/09 18:52:22
高級言語から入るとこれだからいかんな。
アセンブリ言語の洗礼を受けてくるといい。

98:デフォルトの名無しさん
07/05/09 18:59:53
>>97
すいません。8080, Z80, 6502, 6800, 68000 ぐらいまでしかやってません。
この頃の x86 系についてはよく分かりません。


99:デフォルトの名無しさん
07/05/09 19:00:42
釣り来た

100:デフォルトの名無しさん
07/05/09 19:26:05
rubyはかなり分かってます。
linuxの為にCを勉強しています。当然です。ちなみにVine


101:デフォルトの名無しさん
07/05/09 19:27:04
釣りくせー

102:デフォルトの名無しさん
07/05/09 19:29:37
「かなり分かっています」 と自信を持って言う奴の 99% は、大して分かっていない。
なぜなら、言語の奥深さを知ってる者は、おいそれとそんな事は言えないからだ。
ほんの一握りのエキスパートか、Ruby 処理系の開発者か、
そうでなければ見栄っ張りの小物にしかそんな事は言えん。

103:デフォルトの名無しさん
07/05/09 19:48:15
というかこういうやつほどコテつけて欲しいな
ただの騙りの可能性も否定できないし
もしすべて本人だったらかなり・・・


104:デフォルトの名無しさん
07/05/09 20:05:58
Linux上で動くアプリケーションを作りたいだけなら、g++使えばいいだろうし、
Linuxのメジャーなディストリビュージョンなら、
g++がない(gccや下手したらccだけしかない)なんて状況を仮定する必要なんてないはず。

また、完全な互換性がない今のC++でも、それなりにCらしいコードも書けるし。
このスレで出てくるようなコードなら、ほとんどvoid*周りしか問題にならないと思う。

105:デフォルトの名無しさん
07/05/09 20:30:07
なんか勘違いしている香具師が多いようだが、Cでも可変長配列はあるぞ。
それから、malloc()などで確保した領域を配列のように運用することはできてもそれは配列じゃないぞ。
#まぁ、可変長配列も伸び縮みできるわけじゃないがな。

106:デフォルトの名無しさん
07/05/09 20:32:41
C99 なんてあってないような規格で語られてもな。

107:デフォルトの名無しさん
07/05/09 20:33:53
意味わからん

108:デフォルトの名無しさん
07/05/09 20:38:23
>>106
身近なところではgcc, icc, SunのccがC99準拠なんだが。
後二者はデフォルトだし。

109:デフォルトの名無しさん
07/05/09 20:39:02
しかし、ほとんど使われていないのもまた事実。

110:デフォルトの名無しさん
07/05/09 20:40:00
自分が使えないからといって、無闇に否定するのは如何な最中と。

111:デフォルトの名無しさん
07/05/09 20:40:08
お前が使ったこと無いだけ

112:デフォルトの名無しさん
07/05/09 20:42:20
>>105
どうやるんですか?可変長配列

113:デフォルトの名無しさん
07/05/09 20:42:49
VC が準拠しない限り、使用人口は増えない。

114:デフォルトの名無しさん
07/05/09 20:43:57
C99がOKでC++駄目ってのがよくわからん

115:デフォルトの名無しさん
07/05/09 20:43:59
>>112
URLリンク(seclan.dll.jp)

つーか、なんで「C99」ってキーワードまで書かれてるのに
自分で調べようとしないんだろうな

116:デフォルトの名無しさん
07/05/09 20:46:11
使った事ないんじゃなくて、使う気がしないだけ。

117:デフォルトの名無しさん
07/05/09 21:24:47
#include <stdio.h>

int main (void){
int a[3]={1,2,3};
a[3] = 4;
printf("%d\n", sizeof(a)/sizeof(a[0]));
printf("%d\n", a[3]);
return 0;
}

どうしてだお?


118:デフォルトの名無しさん
07/05/09 21:27:47
>>117
printf("%d\n", a[3]); // Access Violation

119:デフォルトの名無しさん
07/05/09 21:28:22
でないお
gccだけど

120:デフォルトの名無しさん
07/05/09 21:29:30
どっちかっつーとこっちのがヤバい。
a[3] = 4;

121:デフォルトの名無しさん
07/05/09 21:30:05
size is 3
a[3] is 4

こうなったお

122:デフォルトの名無しさん
07/05/09 21:30:16
a[0] = 1;
a[1] = 2;
a[2] = 3]

a[3] = ?

123:デフォルトの名無しさん
07/05/09 21:30:19
どうしてって何が?

124:デフォルトの名無しさん
07/05/09 21:31:27
不変な表明ってこういうときに役に立つの?

125:デフォルトの名無しさん
07/05/09 21:37:05
Cに不変表明なんかないだろ。

126:デフォルトの名無しさん
07/05/10 00:32:21
assertがそれにあたるんじゃ

127:デフォルトの名無しさん
07/05/10 00:37:21
>>117のなんて、そもそもインデックスと要素数の関係自体理解できてないんだから
assertとかそういう次元の問題じゃないだろ
あれは何かの拍子で変な値がインデックス用の変数に入り込んだりするのを発見するため

128:31
07/05/10 02:07:35
>>32
それはわかるんだけど、それから先が全くわからなくて・・・
というかまず何を書けばいいのかもわからない・・・ド素人でスマン。

助けて・・・

129:デフォルトの名無しさん
07/05/10 02:09:41
きもちわる・・・

130:デフォルトの名無しさん
07/05/10 02:23:34
webマトリックスてなんすか?
とりあえずGET,POSTとだけ言ってこ

131:デフォルトの名無しさん
07/05/10 09:18:45
アク禁

132:デフォルトの名無しさん
07/05/10 14:51:22
>>117
もしや a[3] = 4; の所で何かエラーが出て欲しかったのか?
ま、しかし、C言語は元々そんな生易しい言語ではないのだよ。


133:デフォルトの名無しさん
07/05/10 15:03:16
だろうな
しかしなんでコンパイラ通っちゃうのかよくわからん


134:デフォルトの名無しさん
07/05/10 15:04:13
そういうのでもコンパイルを通すように作られてるから

135:デフォルトの名無しさん
07/05/10 15:06:30
文法的には正しいから

136:デフォルトの名無しさん
07/05/10 15:13:46
>>117
JavaとかC#とかしかやったことが無い人?

137:デフォルトの名無しさん
07/05/10 15:19:34
>>133
エラー出すようにするとコンパイラ作るのが面倒だろ

138:デフォルトの名無しさん
07/05/10 15:24:15
なるほどw
先頭要素のポインタさえありゃ動くからあとはシラネってことか

139:デフォルトの名無しさん
07/05/10 15:59:43
仕様通り

140:デフォルトの名無しさん
07/05/10 15:59:53
indexに変数が入ってる場合に、その変数が取り得る値をチェックするには実行してみないと
わからないんじゃ?

141:デフォルトの名無しさん
07/05/10 16:01:47
これを応用(悪用?)した技もあったしな
構造体の最後の要素を [1] にして、使いたい配列の大きさ分大きめにallocして使う

いつからか 1 無くてもコンパイル通るようになってたっけな

142:デフォルトの名無しさん
07/05/10 16:18:20
JavaとかC#の配列だと境界チェックしてるから範囲外なら例外が投げられるけどCではそういうのが無いからね。
C#はLengthプロパティ使ってループ回す場合はチェックはオフになったり
monoのC#コンパイラには配列境界チェックをしないようにするオプションがあったりするけど
Cは常にチェック無し。
まぁチェックがある分安全で遅いか、無い分危険で速いかだな。Cは後者。

143:デフォルトの名無しさん
07/05/10 16:48:32
switchが上手く動作しないのですけれど、何処が可笑しいのか教えて下さい

/*
    もし小文字なら大文字を、大文字なら小文字を出力し
    エラーの後に再入力可否選択を要求する
*/

#include <stdio.h>
#include <ctype.h> // islowerやtoupperなどが含まれる

main () {
    char text;

first:

    printf ("アルファベットを入力して下さい\n");
    text = getchar ();
    
    // 大文字変換処理
    
    if (islower(text)) { // islower = 小文字であるかを判定
    text = toupper (text); // toupper = 大文字変換
    printf ("入力されたアルファベットの大文字は %c です。"
                ,text);
        } else if (isupper(text)) { // isupper = 大文字であるかを判定
    


144: ◆awSK7mC37A
07/05/10 16:49:33
    // 小文字変換処理
    
    text = tolower (text); // tolower = 小文字変換
    printf ("入力されたアルファベットの小文字は %c です。"
                ,text);
        } else {
        
        // エラー処理
        
    printf ("エラー\n"
                "アルファベット以外の値が入力されました。"
                "\n"
                "継続して入力しますか?\n"
                "Y/N");
    text = getchar ();
    


145:デフォルトの名無しさん
07/05/10 16:50:09
        switch (text) {
        /*
            switchが何故か機能しない
            書式ミス?
        */
        case 'Y':   goto first;
        break;
        
        case 'N':   goto end;
        break;
        }
    }

end:

    return 0;
    }

>>144の名前は気にしないでください。。

146:デフォルトの名無しさん
07/05/10 16:59:12
switchの式って整数型に限られるんじゃ無かったっけ?

147:デフォルトの名無しさん
07/05/10 17:00:40
textはどう見ても整数型だろ

148:デフォルトの名無しさん
07/05/10 17:00:50
いや、別にこれでいいけど、2回目のgetchar() では最初のgetchar()時に
入力した2文字目を取ってきてるからこうなる。
具体的には改行だな。それ以外でも2つ以上入れてりゃ同じだ

149:デフォルトの名無しさん
07/05/10 17:51:56
alphabet以外の文字、たとえば 1 を入力してテストしてみると
swtich文に入って行かない。きっと1の後ろに"\0"とかあって
うまくゆかないのだろう。

text = getchar (); // ここで "\0" を喰わせる
text = getchar (); // きっと入力待ち状態になるはず

とか思ってしまったトーシローなのは俺だけでいいと思うんだ…orz

150:デフォルトの名無しさん
07/05/10 18:18:00
わざわざそんなこと書かなくてもいいよ

151:デフォルトの名無しさん
07/05/10 18:25:13
>>148
つまりどういうことですか?

152:デフォルトの名無しさん
07/05/10 18:36:47
>>151
つまり、余分な入力バッファはクリアする必要がある。
getchar() なら、'\n' が来るまで読み捨てるとか。
while (getchar() != '\n')
  ;
例えばこんな感じで。 fflush(stdin); は物議をかもしそうなのでお試しでw
あとは、switch - case にdefault: は必要だと思うぞ、特に今回のは。

153:デフォルトの名無しさん
07/05/10 19:35:06
>>151
scanf(" %c", ...) を使う。

154:デフォルトの名無しさん
07/05/10 19:38:20
goto の使い所がダメな感じするな。
goto 使って見辛くしてどうする。
お前は昔の BASIC かと言いたい。


155:デフォルトの名無しさん
07/05/10 19:48:39
どうでもいいけどgotoつかったらbreak;いらなくね?

156:デフォルトの名無しさん
07/05/10 19:55:41
いらないが付けるクセはつけといてもいいかも
あとそれ以前に慣れないうちはdefault付けるクセをつけといたほうがいいと思う

157:デフォルトの名無しさん
07/05/10 21:41:52
ANSI-Cを勉強してまだ日も浅いのですが

四則計算の 23 / 3 =7 アマリ 1

という風にアマリを出すにはどのようにすればいいのでしょうか?

158:デフォルトの名無しさん
07/05/10 21:42:09
mod

159:デフォルトの名無しさん
07/05/10 21:42:37
普通に%じゃあかんのか?

160:デフォルトの名無しさん
07/05/10 21:42:46
%dane

161:デフォルトの名無しさん
07/05/10 21:43:44
%d姉

162:デフォルトの名無しさん
07/05/10 21:46:32
〜〜省略〜〜

int a,b,c;

scanf("%d",&a);
scanf("%d",&b);

c= a % b ;

printf("%d % %d =%d\n",a,b,c);

return 0;


でいいのでしょうか?

163:デフォルトの名無しさん
07/05/10 21:47:58
だめ

164:デフォルトの名無しさん
07/05/10 21:48:10
> printf("%d % %d =%d\n",a,b,c);
printf("%d %% %d =%d\n",a,b,c);

165:デフォルトの名無しさん
07/05/10 21:51:08
あとbが0かどうかもチェックしたほうがいいな。

166:デフォルトの名無しさん
07/05/10 21:51:31
>>162
bが0の場合どうするんだ?

167:デフォルトの名無しさん
07/05/10 21:53:19
分岐か何かが必要なんですね、if 0〜〜とかそういう感じなんでしょうか

168:デフォルトの名無しさん
07/05/10 21:58:04
聞く前にとりあえずコード書いてコンパイルしてみろ。

169:デフォルトの名無しさん
07/05/10 22:05:35
if (*s && isalpha(*s)) {...}
が LinuxとSolarisで動作が違うのでgcc -Eで確認したらSolatisではisalpha(c)が
((__ctype+1)[c] & (0x01 | 0x02)) に展開されててLinuxではライブラリ関数呼んでました。
動作が違ったのは*sが負数になってたせいのようでした。(なぜ負のインデックスで__ctype配列
参照してcore吐かなかったか不思議ですが...)*sに入る整数値がなんでもありと
すると、ここは普通どう書きますか?
if (isascii(*s) && isalpha(*s)){...}
とかすればOK?

170:デフォルトの名無しさん
07/05/10 22:11:18
>>164
%% って \n とかのエスケープシーケンスと同じものと考えておkですか?

171:デフォルトの名無しさん
07/05/10 22:12:19
>>170
エスケープシーケンスで例えるなら \\ やね。

172:デフォルトの名無しさん
07/05/10 22:13:43
>>169
is系関数に渡すときは unsigned char でキャストするのは定石。
もう多すぎて面倒なら、char を符号無しにするコンパイラのフラグを指定汁。

173:デフォルトの名無しさん
07/05/10 22:29:09
UNIX環境でCを書いています。

FILE *fp
fp = popen("gnuplot", "w");
fprintf(fp, "plot sin(x) w lines \n");
pclose(fp);

としてgnuplotを呼び出すプログラムを作りました。
今の状態では、gnuplotが立ち上がってsin(x)の関数が一瞬だけ表示され、
gnuplotが直ちに終了してしまいます。
どこにどのような処理をすれば、gnuplotを表示させたままに出来るのでしょうか?

Enterキーなどを押すことで終了するようにしたいです。
よろしくおねがいします。

174:デフォルトの名無しさん
07/05/10 22:32:14
>>172
それだけだとSJIS の時は、
全角文字の2バイト目で真になる可能性があるな。
リードバイトの判定とかした方がいい。
>>169 は EUC みたいだから大丈夫だとは思うが。

175:デフォルトの名無しさん
07/05/10 22:48:20
>>173
system("gnuplot < data.txt");

とかじゃだめかな?
data.txtはあらかじめ作っておく。

176:デフォルトの名無しさん
07/05/10 22:49:27
>>172,174
ありがとうございます。m(_;_)m
>is系関数に渡すときは unsigned char でキャストするのは定石。
助かります。

177:デフォルトの名無しさん
07/05/10 23:27:12
>>173
とりあえず表示を残すだけなら "gnuplot -persist" とすれば良いけど、
グラフを表示しているプロセス(gnuplot_x11)のIDを
外部プログラムを使わずに見付けて殺す方法が分からん。

178:デフォルトの名無しさん
07/05/10 23:50:48
system("gnuplot ... &")ではダメ?
真面目にプロセス管理したいならfork()/exec*()を使う羽目になるけど。

179:デフォルトの名無しさん
07/05/11 06:20:36
初歩的な質問ですがお願いします。
strlenなどの文字列を扱う関数は引数としてchar型の文字列への先頭ポインタをとります。
つまり、strlen(s)とすると配列sの先頭アドレスが渡され、結果が返ります。
しかし、strlen("test")とした際も結果は出力されます。
この"test"という文字列はどのようにプログラム内部で扱われるのでしょうか?
自動的に一時的にメモリに確保されるのでしょうか?

では宜しくお願いします。

180:デフォルトの名無しさん
07/05/11 07:31:33
>>179
exeファイルの中に入ってるでしょ
実行時にどう配置されるかはシステムによる
プログラム上ではポインタとして扱われる

181:デフォルトの名無しさん
07/05/11 07:44:13
>>179
ほぼ、static const char foo[] = {'t', 'e', 's', 't', '\0', }; strlen(foo);と同じ。

182:デフォルトの名無しさん
07/05/11 15:35:08
クリリンのAAきぼん

183:183
07/05/11 20:29:09
↓のソースで、☆印の行は何か意味があるでしょうか。
 あってもなくても変わらない気がするのですが...
( 環境:Windows Vista , Visual Studio C++ Express Edition )

#include <stdio.h>
#include <windows.h>

#define THREAD_NUM 4
#define DATA_NUM 12

typedef struct _thread_type {
int thread_no;
int *data;
CRITICAL_SECTION *cs;
} thread_arg_t;

void thread_func(void *arg) {
thread_arg_t* targ = (thread_arg_t *)arg;
int i, result;

for (i = 0; i < DATA_NUM; i++) {
// EnterCriticalSection(targ->cs);
result = targ->data[i] + 1;
Sleep(0); ☆
targ->data[i] = result;
// LeaveCriticalSection(targ->cs);
}
}



184:183
07/05/11 20:30:00
int main() {
HANDLE handle[THREAD_NUM];
thread_arg_t targ[THREAD_NUM];
int data[DATA_NUM];
int i;
CRITICAL_SECTION cs;

/* データの初期化 */
for (i = 0; i < DATA_NUM; i++) data[i] = 0;

InitializeCriticalSection(&cs);

for (i = 0; i < THREAD_NUM; i++) {
targ[i].thread_no = i;
targ[i].data = data;
targ[i].cs = &cs;
handle[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread_func,
(void *)&targ[i], 0, NULL);
}
WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE);
DeleteCriticalSection(&cs);
for (i = 0; i < DATA_NUM; i++) printf("data%d : %d\n", i, data[i]);
return 0;
}


あとSleepは、
 ・0ミリ(引数の分)秒ウェイト状態にする。
 ・0はMPUを他の優先度のスレッドにのみ譲る。
 ということでしたよね?


185:デフォルトの名無しさん
07/05/11 20:30:46
>>183
Win32では 「0を指定した場合、 スレッドは、 実行準備ができている同じ優先順位のほかのスレッドにタイム スライスの残りを譲ります。」

186:デフォルトの名無しさん
07/05/11 20:39:55
なんでMSDN Libraryで調べれば直ぐ分かるような事を質問するんだろうな

187:183
07/05/11 20:40:06
>>185
おーありがとございますー!!

188:デフォルトの名無しさん
07/05/12 00:12:06
printf("%s/n","Hello World");

上のprintf文の%sでどのように"Hello World"を処理しているのか分かりません。
どなたかご教授して下さい。


189:デフォルトの名無しさん
07/05/12 00:14:46
意味が分からん。

190:デフォルトの名無しさん
07/05/12 00:15:28
>>188
マルチうざい

191:デフォルトの名無しさん
07/05/12 00:25:14
>>190
すみません

192:デフォルトの名無しさん
07/05/12 00:33:48
>>190
ごめんなさい、でも教えてください蟹

  Viiv  
 ミ(エ)ミ....


193:デフォルトの名無しさん
07/05/12 00:35:48
あのーコールバックの書き方が解からないのですが
助けてください。動作するサンプル提示してくれませんか?

194:デフォルトの名無しさん
07/05/12 00:37:14
何のコールバックだよ…

195:デフォルトの名無しさん
07/05/12 00:37:38
URLリンク(www.google.co.jp)

196:蟹NIC
07/05/12 00:37:47
printf("%p/n","Hello World");

上のprintf文の%pでどのように"Hello World"を処理しているのか分かりません。
どなたか教えてください。 

  Viiv  
 ミ(エ)ミ....

197:デフォルトの名無しさん
07/05/12 00:49:14
>>188
可変長引数でも調べて推測してください。

様は第一引数の中を読んでいって、%フラグに当たったら対応する引数をフラグに従って変換した上で元の文字列に挿入してるんだと思う。


198:デフォルトの名無しさん
07/05/12 00:56:33
別に挿入なんかしてないけどね。

199:デフォルトの名無しさん
07/05/12 01:55:15
>>197
ご教授ありがとうございます。

200:デフォルトの名無しさん
07/05/12 02:30:45
そんなに知りたいならglibcのソースでも読めばいいのにな

201:デフォルトの名無しさん
07/05/12 02:37:18
ソースリーディングは初心者には難しい

202:デフォルトの名無しさん
07/05/12 02:45:10
>>196
------------------------------------------------------------
60 名前: デフォルトの名無しさん 投稿日: 2007/05/12(土) 00:10:17
printf("%s/n","Hello World");

上のprintf文の%sでどのように"Hello World"を処理しているのか分かりません。
どなたかご教授して下さい。
------------------------------------------------------------

この質問って流行ってるのか?

203:デフォルトの名無しさん
07/05/12 02:49:12
馬鹿がマルチしてるだけじゃない?

204:蟹NIC
07/05/12 03:16:31
>>202 いいえ、まマイブームレベル位かな

  Viiv  
 ミ(エ)ミ....


205:デフォルトの名無しさん
07/05/12 06:53:20
>>117
配列は番兵を使うために便宜的に要素+1の部分にアクセスできるんだぜ?



206:デフォルトの名無しさん
07/05/12 07:27:03
>>205
ねーよwwwwwwwwwwwwwwwwwwwwwwwwwww

#include <stdio.h>

int main() {
int a[4] = { 0, 0, 0, 0 };
int b = 0;

a[4] = 3;
printf("%d\n", b);

return 0;
}

で 3 が表示されたぜ(gcc 4.0.1 for Mac)。

207:デフォルトの名無しさん
07/05/12 07:33:50
ポインタを向けるだけなら未定義動作にならないってだけでしょ

208:デフォルトの名無しさん
07/05/12 07:43:23
>アクセスできる
をどう好意的に解釈しても、ポインタを向けるだけ、にはならん罠。

209:デフォルトの名無しさん
07/05/12 07:45:46
どちらかというと205宛てに書いたレスなのだが…

210:デフォルトの名無しさん
07/05/12 08:50:05
>>205
>配列は番兵を使うために便宜的に要素+1の部分にアクセスできるんだぜ?
マジレスするとそれは文字列のときだけな。
char a[] = {1, 2, 3}; // sizeof a == 3
char b[] = "123"; // sizeof b == 4


211:デフォルトの名無しさん
07/05/12 08:50:21
釣りだって

212:デフォルトの名無しさん
07/05/12 08:51:17
知ってるよ

213:デフォルトの名無しさん
07/05/12 08:52:22
char c[3] = "123";

214:デフォルトの名無しさん
07/05/12 09:00:47
charの配列だけchar配列じゃなくて文字配列って言うことが多いし
文字配列には後ろに'\0'が付くみたいな覚え方をしてたから
なんかcharの配列だけは特別な代物のように思ってた過去

215:デフォルトの名無しさん
07/05/12 09:01:56
文字配列とは言わんなあ。
文字列としか。

216:デフォルトの名無しさん
07/05/12 11:26:20
私の処で文字配列といった場合、それはナルターミネートされていない。

217:デフォルトの名無しさん
07/05/12 11:35:24
相変わらず嘘と無価値な雑談でしか伸びないスレだな

218:デフォルトの名無しさん
07/05/12 11:36:38
君も仲間だ、歓迎するよ

219:デフォルトの名無しさん
07/05/12 13:01:15
質問です。
#include <stdio.h>
int main(void)
{
float a,b;
char e;
printf("変数a=");
scanf("%f",&a);
printf("変数b=");
     scanf("%f",&b);
printf("文字=");
scanf("%c",&e);
printf("変数a=%f 変数b=%f 文字列d=%c\n",a,b,e);
return 0;
}
これをコンパイルすると文字列データを読みこんでくれません。。
おそらくprintfかscanfの仕様に問題があるのでしょうがこれの理由と回避方法をご教示願いたいです。

220:デフォルトの名無しさん
07/05/12 13:17:40
>>219
・文字と文字列の違いを理解しよう。
・scanf()の仕様に気をつけよう。

221:デフォルトの名無しさん
07/05/12 13:20:11
演算子を使わないで割り算や掛け算ってどうやるんですか?たとえば9÷3

222:デフォルトの名無しさん
07/05/12 13:22:43
演算子を使わないで演算するには、関数を使えばいい。

223:デフォルトの名無しさん
07/05/12 13:25:01
>>222
関数を自分でつくるということですかね?

224:デフォルトの名無しさん
07/05/12 13:25:16
>>219
scanf("%c",&e);

scanf("%*[ \t\n]");
scanf("%c",&e);

変数b を読み込んだ後、改行文字がバッファに残っている
バッファに残った改行文字を次の scanf("%c",&e); で読み込んだため
変数e には改行文字が入ってしまった

この問題を回避するには、バッファに残っている改行文字を読み飛ばせば良い

225:デフォルトの名無しさん
07/05/12 13:27:18
つか入門書安易にscanf使いすぎ。
エラーチェックしなさすぎ。

226:デフォルトの名無しさん
07/05/12 13:38:59
>>223
つ[div()]

227:デフォルトの名無しさん
07/05/12 13:54:31
>>224なるほど ありがとうございます。

228:デフォルトの名無しさん
07/05/12 14:22:00
>>222
数学を一度勉強した方がいいですね。
具体的には線形空間というやつですよ・・・

229:デフォルトの名無しさん
07/05/12 14:27:06
数学の話じゃないだろ・・・常識的に考えて。

230:デフォルトの名無しさん
07/05/12 14:27:32
>>228
演算子を使わずにできる?
もちろんシフト演算も無しで

>>221
関数以外だとインラインアセンブラ使えば
演算子を使ったとは言われないとか?


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5215日前に更新/240 KB
担当:undef