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

C言語なら俺に聞け(入門篇) Part 12

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2007/05/08(火) 19:39:26
C言語の入門者向け解説スレです。 
・C++言語はスレ違いです。 
・分からない事をなるべく詳しく書いて下さい。 
・ソースコードを晒すと答えやすくなるかもしれません。 
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 

前スレ 
C言語なら俺に聞け(入門篇) Part 11
http://pc11.2ch.net/test/read.cgi/tech/1176800483/

過去スレ
Part 1 ttp://pc8.2ch.net/test/read.cgi/tech/1146700389/ Part 2 ttp://pc8.2ch.net/test/read.cgi/tech/1153818463/
Part 3 ttp://pc8.2ch.net/test/read.cgi/tech/1160682950/ Part 4 ttp://pc8.2ch.net/test/read.cgi/tech/1162999861/
Part 5 ttp://pc8.2ch.net/test/read.cgi/tech/1165022193/ Part 6 ttp://pc10.2ch.net/test/read.cgi/tech/1167325490/
Part 7 ttp://pc10.2ch.net/test/read.cgi/tech/1170064980/ Part 8 ttp://pc11.2ch.net/test/read.cgi/tech/1171946674/
Part 9 ttp://pc11.2ch.net/test/read.cgi/tech/1173284217/ Part 10 ttp://pc11.2ch.net/test/read.cgi/tech/1174290325/

関連スレ
C/C++の宿題を片付けます 86代目
http://pc11.2ch.net/test/read.cgi/tech/1176996941/
くだすれC言語(初心者用) Part.2
http://pc11.2ch.net/test/read.cgi/tech/1172099763/
スレを勃てるまでもないC/C++の質問はここで 2
http://pc11.2ch.net/test/read.cgi/tech/1178503366/l50
はきだめC/C++下級者の質問箱 2
http://pc11.2ch.net/test/read.cgi/tech/1156206091/l50

【C 関数検索 man on WWW】 http://www.linux.or.jp/JM/index.html
0002デフォルトの名無しさん2007/05/08(火) 19:41:30
前スレ>>996
char c;
char str[100];
もしかしてこのcとstrが同じだと思ってるとか?
0003デフォルトの名無しさん2007/05/08(火) 19:45:33
996じゃないけど

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

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

こういうことなのかな?なんか変なかんじがする…
0004デフォルトの名無しさん2007/05/08(火) 19:47:26
その本はstrがポインタというような事を言ってるはず。
さすがにcがポインタだとは言わないだろ。
0005デフォルトの名無しさん2007/05/08(火) 19:48:20
>>2
違うんですか?
0006デフォルトの名無しさん2007/05/08(火) 19:48:38
str はある意味ポインタと言えなくはないが、
少なくともポインタ変数ではないし、
ポインタと説明してる紛らわしい本はあって欲しくない。

文字列をポインタを通して渡す、程度の話をしてるんでないかな。
0007デフォルトの名無しさん2007/05/08(火) 19:50:27
前スレ975は期待する動作と実際の動作を書けよ。
上手く動かないだけじゃ何を意味してるのか曖昧だぞ。
0008デフォルトの名無しさん2007/05/08(火) 19:52:17
>>3
Cには文字型も文字列型もない
0009デフォルトの名無しさん2007/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じゃ無理なんですかね?
0010デフォルトの名無しさん2007/05/08(火) 19:56:59
前スレ>>990
授業とかはあくまで補助や学習スケジュール管理と考えたほうがいい
専門学校なんかは1年〜数年単位ですべてが学べるようになっているはずだから
教え方や進歩速度に不満があるならとりあえず教科書読んで池
ポインタもそのうちしっかりやるだろ
0011デフォルトの名無しさん2007/05/08(火) 19:58:55
全ての制御文は if と goto で書けるから
goto で無理なんてことはあり得ない。
0012デフォルトの名無しさん2007/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>
0013デフォルトの名無しさん2007/05/08(火) 20:11:09
practisだから失格
0014デフォルトの名無しさん2007/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;
}
0015デフォルトの名無しさん2007/05/08(火) 20:17:03
>>14
>>12と同じ状況になりますが・・・
0016デフォルトの名無しさん2007/05/08(火) 20:18:16
ちゃんとコンパイルしてるか?
0017デフォルトの名無しさん2007/05/08(火) 20:19:16
どうせどっか書き写し間違えてんじゃないの?
0018デフォルトの名無しさん2007/05/08(火) 20:19:48
>>15
っ .\goto
っ goto.exe
0019デフォルトの名無しさん2007/05/08(火) 20:20:51
訂正
goto.exe
↓
.\goto.exe
0020デフォルトの名無しさん2007/05/08(火) 20:21:36
>>16-17
してますよw
証拠
http://www.imgup.org/iup378065.png

因みにclでコンパイルしても結果は同じでした
これがVISTA QUALITY?
0021デフォルトの名無しさん2007/05/08(火) 20:23:51
>>18-19
しまった、gotoはコマンドなのか・・・
これで解決しました

済みませんでしたあああ(ノ-`)
0022デフォルトの名無しさん2007/05/08(火) 20:24:16
>>20
プロンプトのコマンドと被るような名前をやめればおk
copy dir del mkdir などなど
0023デフォルトの名無しさん2007/05/08(火) 20:25:54
そういうオチかw
なるほど
0024デフォルトの名無しさん2007/05/08(火) 20:26:06
さすがにファイル名をgotoにしてるとは誰も予想できなかったなw
0025デフォルトの名無しさん2007/05/08(火) 20:29:01
いやいや、>>12 で気づくべきだった。
俺も失念してたぜ。
0026デフォルトの名無しさん2007/05/08(火) 20:29:27
完全に予想外だったぜ…
0027デフォルトの名無しさん2007/05/08(火) 20:30:45
.exeつけたら全スレのソースでも動きました!!
感激です><

因みに、ファイル名の8割が関数名なので、こういうことは偶にあったんですが
今回はコマンドエラーが出なかったので全然気付きませんでした(ノ-`)
0028デフォルトの名無しさん2007/05/08(火) 20:32:04
なるほど べんきょうになったw
ついでにpractisも直したといたほうがいいぞw
0029デフォルトの名無しさん2007/05/08(火) 20:39:29
>>27
全スレ→前すれ

>>28
>>13で言われて気付いたので直そうとしたんですが
システム系統以外、全部落としてもシステムから蹴られるので
今度再起動した時にでも直しておきます
0030デフォルトの名無しさん2007/05/08(火) 20:53:51
神代刹那?
0031デフォルトの名無しさん2007/05/08(火) 21:14:36
webマトリックスにて、
セッションによるページ間のデータの転送の仕方がわからないのですが・・・

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


色々調べたり試行錯誤してみても全くわかりません。
ご教授願えませんか??
0032デフォルトの名無しさん2007/05/08(火) 21:22:56
>>31
C関係ない気がするが適当にエスパーして答えとく
・1ページ目で入力されたデータを何らかの識別子と共に保持しておく
・2ページ目にその識別子を埋め込んでおく
・2ページ目からの入力がきたら、識別子から保存してるデータと関連づける
0033デフォルトの名無しさん2007/05/08(火) 21:25:16
BMI?
0034デフォルトの名無しさん2007/05/08(火) 21:44:19

       FOX★公認!!!

俺たちのクリックで日本を一位にしようぜ!!
“30年は日本に手は出せないな”という勝ち方をしたい
http://wwwww.2ch.net/test/read.cgi/news4vip/1178602852/

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

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

・戦場
http://www.clickclickclick.com/default.asp
・まとめサイト
http://www33.atwiki.jp/clickvip/
0035デフォルトの名無しさん2007/05/08(火) 23:50:42
http://www.uploda.org/uporg802717.c.html
配列の大きさをただしく認識してくれないのですが、どこが間違っていますか?
内積を計算するプログラムです。
C言語むずい^^;
0036デフォルトの名無しさん2007/05/08(火) 23:52:25
>>35
スコープ外で宣言された配列の大きさは取得できない
関数引数で渡されるのはあくまで配列先頭へのポインタのみ

それができるならライブラリ関数でわざわざバッファサイズ指定したりしないだろ?
0037デフォルトの名無しさん2007/05/08(火) 23:53:06
>>35
ttp://www.kouno.jp/home/c_faq/c6.html#21
0038デフォルトの名無しさん2007/05/09(水) 00:02:12
しかしout ofの方のsizeof(v1)でいれてるv1というのもポインタのはずだ。
だったらこっちも4とでるべきなのでは?
0039デフォルトの名無しさん2007/05/09(水) 00:05:53
>38
>36
0040デフォルトの名無しさん2007/05/09(水) 00:07:39
サブルーチン限定仕様なんですね。
では、実際この関数で配列の大きさを求めるにはどうしたらいいのでしょう?
rubyでは.sizeでよかったんですが・・計算系はruby遅すぎて;;
0041デフォルトの名無しさん2007/05/09(水) 00:09:49
関数内で求めなければいい
0042デフォルトの名無しさん2007/05/09(水) 00:11:32
それじゃ関数じゃありません。
0043デフォルトの名無しさん2007/05/09(水) 00:14:02
ruby でもやってろw
0044デフォルトの名無しさん2007/05/09(水) 00:18:10
いやlinuxをしててC言語が必要なのでここは譲れません。
関数内でもいけるはずです。どうしたらいいでしょう?
もしやひとつひとつ取得していく系?
0045デフォルトの名無しさん2007/05/09(水) 00:19:06
>関数内でもいけるはずです
だからできんといっとろーが
0046デフォルトの名無しさん2007/05/09(水) 00:20:20
完全に不可能なんですか?
0047デフォルトの名無しさん2007/05/09(水) 00:21:01
不可能です。
0048デフォルトの名無しさん2007/05/09(水) 00:23:10
だから普通は配列の要素数も引数に与える
0049デフォルトの名無しさん2007/05/09(水) 00:23:18
count = 0

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

などは?
0050デフォルトの名無しさん2007/05/09(水) 00:23:44
null って何だよ。
0051デフォルトの名無しさん2007/05/09(水) 00:24:11
>>48
配列の要素数が未定なのですが?
ベクトルとベクトルを渡したら内積が得られる。
引数は2つのはずです。
0052デフォルトの名無しさん2007/05/09(水) 00:25:12
nilか。
nullじゃなかった・・・
0053デフォルトの名無しさん2007/05/09(水) 00:27:39
何言ってるか分からんが
無理なもんは無理 まじで無理
0054デフォルトの名無しさん2007/05/09(水) 00:27:45
疲れるなあ・・・。
政府の Ruby 計画が心配になってきたぞ。

>>51
要素数はどこかで分かってるはずだ。
inner_product 内に入ってしまうとどうやっても分からないから、
inner_product に要素数を渡すようにするしかない。
0055デフォルトの名無しさん2007/05/09(水) 00:27:46
nilって何だよ。
0056デフォルトの名無しさん2007/05/09(水) 00:30:17
(sizeof(配列)/sizeof(配列の要素))を引数に入れとけばいいんじゃ?
0057デフォルトの名無しさん2007/05/09(水) 00:30:17
>>51
ならその2つの要素数を渡す
0058デフォルトの名無しさん2007/05/09(水) 00:31:21
>>52
Cに nil はない
0059デフォルトの名無しさん2007/05/09(水) 00:31:24
引数が増えるのが嫌だったら、
値と要素数を持った構造体を作って管理しとけ。
0060デフォルトの名無しさん2007/05/09(水) 00:34:12
もうvectorクラスみたいなの自作するしか
0061デフォルトの名無しさん2007/05/09(水) 00:34:51
自作っつーか、ライブラリ拾ってこい。
0062デフォルトの名無しさん2007/05/09(水) 00:34:53
何こいつ
理解力無さ杉
0063デフォルトの名無しさん2007/05/09(水) 00:40:54
rubyのようにCもできると思っているんだろうね
rubyに汚染されすぎ
0064デフォルトの名無しさん2007/05/09(水) 00:44:37
rubyでは隠蔽されていた色々な事に全く気づいてなかったんだねぇ
0065デフォルトの名無しさん2007/05/09(水) 00:55:38
Cじゃそういったことはすべて自分で実装するかライブラリ使わなきゃいけないってのに
動的に確保したメモリも開放しなさそう
0066デフォルトの名無しさん2007/05/09(水) 00:59:23
自分で実装ってインラインアセンブラ使ったりするの?

と初心者が申しております
0067デフォルトの名無しさん2007/05/09(水) 01:03:26
そうそう、便利≒隠蔽の対価として、性能のトレードオフ
性能を求めるならば、対価の代償として、より低級言語のしがらみ、
メモリの動き、キャッシュの動き、CPUのプリフェッチぐあいを理解しないと速くはならないね
0068デフォルトの名無しさん2007/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;
}
0069デフォルトの名無しさん2007/05/09(水) 01:13:11
>>51
何言いたいのか意味不明だが、これで納得できないなら、そういうことが出来る他の言語使ってろ
読みづらいがJISのホームページでPDF化された奴も見れるから確認なり好きにしろ

6.5.3.4 sizeof演算子の注釈(84)
配列型又は関数型をもつと宣言された仮引数に適用する場合、sizeof演算子は、
型調整された(ポインタ)型の大きさを与える(6.9.1参照)。
                                    (JIS X 3010:2003より引用)
0070デフォルトの名無しさん2007/05/09(水) 01:29:15
>>68
要素数が欲しければtemplate使って配列の参照を引数にするだけでいいだろ。

まぁ俺ならそれ以前にstd::inner_product使うけど。
0071デフォルトの名無しさん2007/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;
}
0072デフォルトの名無しさん2007/05/09(水) 02:48:49
float なんて精度悪いもの使うなよ。
double 使え、double 。
0073デフォルトの名無しさん2007/05/09(水) 07:18:26
>>71
訳の分からん自作マクロ使って可読性落とすぐらいなら
上で書かれてるように、Vector型とstd::inner_product()使えばいいだろ
なんのための標準ライブラリだと思ってるんだ
0074デフォルトの名無しさん2007/05/09(水) 08:02:10
先にJavaを試してみたら?
正直、Ruby→C はキツいだろ
0075デフォルトの名無しさん2007/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;
}
0076デフォルトの名無しさん2007/05/09(水) 08:17:36
namespaceとかClassはC++の仕様ですよね?
Classがあるなら使いますよ。
でもね、C言語じゃないといけないんです。linuxのデフォだからね。
Cを勉強するのは計算が早いからとrubyのライブラリが作りたいから。
あとlinuxプログラミングがしたいから。
0077デフォルトの名無しさん2007/05/09(水) 08:19:29
CがLinuxのデフォってあんた……
それならC++でもいいでしょうが。
0078デフォルトの名無しさん2007/05/09(水) 08:47:03
確定したライブラリがない。
C++はもう終わった言語。手続き型にクラスをくっつけただけの言語でしょ。
純粋なrubyこそソフト開発に向いてるが、やはり速度がネック
0079デフォルトの名無しさん2007/05/09(水) 09:03:56
m9(^д^)プギャー!!
0080デフォルトの名無しさん2007/05/09(水) 10:04:47
勘違いや思い込みが激しいな
こんな奴rubyもたいしてできんだろ
0081デフォルトの名無しさん2007/05/09(水) 11:35:39
ディレクトリ名をジャスティスに変えるとすべてが上手くいく
0082デフォルトの名無しさん2007/05/09(水) 13:37:48
sizeof自体がどうなってるか分かりませんか?
あとC言語って自由に配列数を増やしたり減らしたり出来ない?
出来たらうれしい
0083デフォルトの名無しさん2007/05/09(水) 13:45:54
rubyじゃないんだから・・・
0084デフォルトの名無しさん2007/05/09(水) 13:59:39
>>82
sizeofは、コンパイル時にコンパイラが計算する。

配列要素数の増減はできないので、realloc()したりC++のvectorを使っ
たり。
0085デフォルトの名無しさん2007/05/09(水) 14:11:39
reallocというのは確保領域を変えるってことですか?
それなら手間が増えるだけで増減可能ですね。

sizeofはライブラリではないんですか?
sizeofはどうやって書かれているかを聞いています。
0086デフォルトの名無しさん2007/05/09(水) 14:13:08
C++は使わないことにしています。
なぜならC++はC言語の拡張とはいえないからです。
オブジェクト指向としてはrubyがもっとも純粋であることは確かですし
Cとの互換性が消えたので、linuxで使えません
0087デフォルトの名無しさん2007/05/09(水) 14:28:35
オブジェクト指向としての純粋性を追求する事に何の意味が?
Cとの互換性が不完全でもLinuxでC++は使えるが?
0088デフォルトの名無しさん2007/05/09(水) 14:32:47
>>85
sizeof はコンパイラが解釈する演算子の内のひとつです。関数ではありません。
0089デフォルトの名無しさん2007/05/09(水) 14:33:51
システムはCで書かれている。
C++では書かれていない。これは互換性が消えたことによるものである。
linuxといえばC言語
C++は窓用言語
rubyはクロスプラットフォームの純粋オブジェクト指向型言語
0090デフォルトの名無しさん2007/05/09(水) 14:45:57
つまりLinuxのシステムだけを書くためにCを勉強中って事?
0091デフォルトの名無しさん2007/05/09(水) 14:49:08
>>85
reallocはただの動的確保で配列関係ないから
配列の要素数増減は不可でFA
0092デフォルトの名無しさん2007/05/09(水) 14:52:21
rubyではどうやって配列の要素数増減ができると見せかけられたかを考えてみるといいよ。
0093デフォルトの名無しさん2007/05/09(水) 15:44:37
どうせRubyの事も大して分かってないんだろうな
0094デフォルトの名無しさん2007/05/09(水) 16:05:07
それは俺も思った
0095デフォルトの名無しさん2007/05/09(水) 16:06:07
突っ込みどころがあり過ぎるが、たぶん釣りだからガマン。
うちの会社に来ないことを祈る。
0096デフォルトの名無しさん2007/05/09(水) 18:09:22
>>91
メモリ確保した所を配列として扱うなら可能だと思うが。
0097デフォルトの名無しさん2007/05/09(水) 18:52:22
高級言語から入るとこれだからいかんな。
アセンブリ言語の洗礼を受けてくるといい。
0098デフォルトの名無しさん2007/05/09(水) 18:59:53
>>97
すいません。8080, Z80, 6502, 6800, 68000 ぐらいまでしかやってません。
この頃の x86 系についてはよく分かりません。
0099デフォルトの名無しさん2007/05/09(水) 19:00:42
釣り来た
0100デフォルトの名無しさん2007/05/09(水) 19:26:05
rubyはかなり分かってます。
linuxの為にCを勉強しています。当然です。ちなみにVine
0101デフォルトの名無しさん2007/05/09(水) 19:27:04
釣りくせー
■ このスレッドは過去ログ倉庫に格納されています